223 lines
5.2 KiB
C
223 lines
5.2 KiB
C
/* switch.h
|
|
* Definitions needed for implementing context switching.
|
|
*
|
|
* Context switching is inherently machine dependent, since
|
|
* the registers to be saved, how to set up an initial
|
|
* call frame, etc, are all specific to a processor architecture.
|
|
*
|
|
* This file currently supports the DEC MIPS and SUN SPARC architectures.
|
|
*/
|
|
|
|
/*
|
|
Copyright (c) 1992-1993 The Regents of the University of California.
|
|
All rights reserved. See copyright.h for copyright notice and limitation
|
|
of liability and disclaimer of warranty provisions.
|
|
*/
|
|
|
|
#ifndef SWITCH_H
|
|
#define SWITCH_H
|
|
|
|
#include "copyright.h"
|
|
|
|
#ifdef HOST_MIPS
|
|
|
|
/* Registers that must be saved during a context switch.
|
|
* These are the offsets from the beginning of the Thread object,
|
|
* in bytes, used in switch.s
|
|
*/
|
|
#define SP 0
|
|
#define S0 4
|
|
#define S1 8
|
|
#define S2 12
|
|
#define S3 16
|
|
#define S4 20
|
|
#define S5 24
|
|
#define S6 28
|
|
#define S7 32
|
|
#define FP 36
|
|
#define PC 40
|
|
|
|
/* To fork a thread, we set up its saved register state, so that
|
|
* when we switch to the thread, it will start running in ThreadRoot.
|
|
*
|
|
* The following are the initial registers we need to set up to
|
|
* pass values into ThreadRoot (for instance, containing the procedure
|
|
* for the thread to run). The first set is the registers as used
|
|
* by ThreadRoot; the second set is the locations for these initial
|
|
* values in the Thread object -- used in Thread::AllocateStack().
|
|
*/
|
|
|
|
#define InitialPC s0
|
|
#define InitialArg s1
|
|
#define WhenDonePC s2
|
|
#define StartupPC s3
|
|
|
|
#define PCState (PC/4-1)
|
|
#define FPState (FP/4-1)
|
|
#define InitialPCState (S0/4-1)
|
|
#define InitialArgState (S1/4-1)
|
|
#define WhenDonePCState (S2/4-1)
|
|
#define StartupPCState (S3/4-1)
|
|
|
|
#endif // HOST_MIPS
|
|
|
|
#ifdef HOST_SPARC
|
|
|
|
/* Registers that must be saved during a context switch. See comment above. */
|
|
#define I0 4
|
|
#define I1 8
|
|
#define I2 12
|
|
#define I3 16
|
|
#define I4 20
|
|
#define I5 24
|
|
#define I6 28
|
|
#define I7 32
|
|
|
|
/* Aliases used for clearing code. */
|
|
#define FP I6
|
|
#define PC I7
|
|
|
|
/* Registers for ThreadRoot. See comment above. */
|
|
#define InitialPC %o0
|
|
#define InitialArg %o1
|
|
#define WhenDonePC %o2
|
|
#define StartupPC %o3
|
|
|
|
#define PCState (PC/4-1)
|
|
#define InitialPCState (I0/4-1)
|
|
#define InitialArgState (I1/4-1)
|
|
#define WhenDonePCState (I2/4-1)
|
|
#define StartupPCState (I3/4-1)
|
|
#endif // HOST_SPARC
|
|
|
|
#ifdef HOST_SNAKE
|
|
|
|
/* Registers that must be saved during a context switch. See comment above. */
|
|
#define SP 0
|
|
#define S0 4
|
|
#define S1 8
|
|
#define S2 12
|
|
#define S3 16
|
|
#define S4 20
|
|
#define S5 24
|
|
#define S6 28
|
|
#define S7 32
|
|
#define S8 36
|
|
#define S9 40
|
|
#define S10 44
|
|
#define S11 48
|
|
#define S12 52
|
|
#define S13 56
|
|
#define S14 60
|
|
#define S15 64
|
|
#define PC 68
|
|
|
|
/* Registers for ThreadRoot. See comment above. */
|
|
#define InitialPC %r3 /* S0 */
|
|
#define InitialArg %r4
|
|
#define WhenDonePC %r5
|
|
#define StartupPC %r6
|
|
|
|
#define PCState (PC/4-1)
|
|
#define InitialPCState (S0/4-1)
|
|
#define InitialArgState (S1/4-1)
|
|
#define WhenDonePCState (S2/4-1)
|
|
#define StartupPCState (S3/4-1)
|
|
#endif // HOST_SNAKE
|
|
|
|
#ifdef HOST_PPC
|
|
|
|
#define R0 4
|
|
#define R1 0 // SP must be the first field of the Thread struct!
|
|
#define R2 8
|
|
#define R3 12
|
|
#define R4 16
|
|
#define R5 20
|
|
#define R6 24
|
|
#define R7 28
|
|
#define R8 32
|
|
#define R9 36
|
|
#define R10 40
|
|
#define R11 44
|
|
#define R12 48
|
|
#define R13 52
|
|
#define R14 56
|
|
#define R15 60
|
|
#define R16 64
|
|
#define R17 68
|
|
#define R18 72
|
|
|
|
/* Registers for ThreadRoot. See comment above. */
|
|
#define InitialPC %r5
|
|
#define InitialArg %r6
|
|
#define WhenDonePC %r7
|
|
#define StartupPC %r8
|
|
|
|
/* WARNING: SP is not part of machineState! */
|
|
#define PCState 0
|
|
#define InitialPCState 4
|
|
#define InitialArgState 5
|
|
#define WhenDonePCState 6
|
|
#define StartupPCState 7
|
|
|
|
#endif // HOST_PPC
|
|
|
|
#ifdef HOST_i386
|
|
|
|
/* the offsets of the registers from the beginning of the thread object */
|
|
#define _ESP 0
|
|
#define _EAX 4
|
|
#define _EBX 8
|
|
#define _ECX 12
|
|
#define _EDX 16
|
|
#define _EBP 20
|
|
#define _ESI 24
|
|
#define _EDI 28
|
|
#define _PC 32
|
|
|
|
/* These definitions are used in Thread::AllocateStack(). */
|
|
#define PCState (_PC/4-1)
|
|
#define FPState (_EBP/4-1)
|
|
#define InitialPCState (_ESI/4-1)
|
|
#define InitialArgState (_EDX/4-1)
|
|
#define WhenDonePCState (_EDI/4-1)
|
|
#define StartupPCState (_ECX/4-1)
|
|
|
|
#define InitialPC %esi
|
|
#define InitialArg %edx
|
|
#define WhenDonePC %edi
|
|
#define StartupPC %ecx
|
|
#endif
|
|
|
|
#ifdef HOST_x86_64
|
|
|
|
/* the offsets of the registers from the beginning of the thread object */
|
|
#define _RSP 0
|
|
#define _RAX 8
|
|
#define _RBX 16
|
|
#define _RCX 24
|
|
#define _RDX 32
|
|
#define _RBP 40
|
|
#define _RSI 48
|
|
#define _RDI 56
|
|
#define _R12 64
|
|
#define _R13 72
|
|
#define _R14 80
|
|
#define _R15 88
|
|
#define _PC 96
|
|
|
|
/* These definitions are used in Thread::AllocateStack(). */
|
|
#define PCState (_PC/8-1)
|
|
#define FPState (_RBP/8-1)
|
|
#define InitialPCState (_RSI/8-1)
|
|
#define InitialArgState (_RDX/8-1)
|
|
#define WhenDonePCState (_RDI/8-1)
|
|
#define StartupPCState (_RCX/8-1)
|
|
|
|
#define InitialPC %rsi
|
|
#define InitialArg %rdx
|
|
#define WhenDonePC %rdi
|
|
#define StartupPC %rcx
|
|
#endif
|
|
|
|
#endif // SWITCH_H
|