NachOS/code/threads/switch.h

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