269 lines
6.6 KiB
C
269 lines
6.6 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, DEC Alpha, SUN SPARC,
|
|
* HP PARISC, IBM PowerPC, and Intel x86 architectures.
|
|
*/
|
|
|
|
/*
|
|
Copyright (c) 1992-1996 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 DECMIPS
|
|
|
|
/* 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 // DECMIPS
|
|
|
|
#ifdef 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 // SPARC
|
|
|
|
#ifdef PARISC
|
|
|
|
/* 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 // PARISC
|
|
|
|
#ifdef x86
|
|
|
|
/* 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 // x86
|
|
|
|
#ifdef PowerPC
|
|
|
|
#define SP 0 // stack pointer
|
|
#define P1 4 // parameters
|
|
#define P2 8
|
|
#define P3 12
|
|
#define P4 16
|
|
#define GP13 20 // general purpose registers 13-31
|
|
#define GP14 24
|
|
#define GP15 28
|
|
#define GP16 32
|
|
#define GP17 36
|
|
#define GP18 40
|
|
#define GP19 44
|
|
#define GP20 48
|
|
#define GP21 52
|
|
#define GP22 56
|
|
#define GP23 60
|
|
#define GP24 64
|
|
#define GP25 68
|
|
#define GP26 72
|
|
#define GP27 76
|
|
#define GP28 80
|
|
#define GP29 84
|
|
#define GP30 88
|
|
#define GP31 92
|
|
#define FP13 96 // floating point registers 14-31
|
|
#define FP15 104
|
|
#define FP16 112
|
|
#define FP17 120
|
|
#define FP18 128
|
|
#define FP19 136
|
|
#define FP20 144
|
|
#define FP21 152
|
|
#define FP22 160
|
|
#define FP23 168
|
|
#define FP24 176
|
|
#define FP25 184
|
|
#define FP26 192
|
|
#define FP27 200
|
|
#define FP28 208
|
|
#define FP29 216
|
|
#define FP30 224
|
|
#define FP31 232
|
|
#define CR 240 // control register
|
|
#define LR 244 // link register
|
|
#define TOC 248 // Table Of Contents
|
|
|
|
|
|
// for ThreadRoot assembly function
|
|
|
|
#define InitialPCState 0 // (P1/4 - 1) // user function address
|
|
#define InitialArgState 1 // (P2/4 - 1) // user function argument
|
|
#define WhenDonePCState 2 // (P3/4 - 1) // clean up function addr
|
|
#define StartupPCState 3 // (P4/4 - 1) // start up function addr
|
|
#define PCState 60 // (LR/4 - 1) // ThreadRoot addr (first time).
|
|
// Later PC addr when SWITCH
|
|
// occured
|
|
|
|
#define InitialLR 21
|
|
#define InitialArg 22
|
|
#define WhenDoneLR 23
|
|
#define StartupLR 24
|
|
|
|
#endif // PowerPC
|
|
|
|
#ifdef ALPHA
|
|
|
|
/*
|
|
* Porting to Alpha was done by Shuichi Oikawa (shui@sfc.keio.ac.jp).
|
|
*/
|
|
/* 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*8)
|
|
#define S0 (1*8)
|
|
#define S1 (2*8)
|
|
#define S2 (3*8)
|
|
#define S3 (4*8)
|
|
#define S4 (5*8)
|
|
#define S5 (6*8)
|
|
#define S6 (7*8) /* used as FP (Frame Pointer) */
|
|
#define GP (8*8)
|
|
#define PC (9*8)
|
|
|
|
/* 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::StackAllocate().
|
|
*/
|
|
#define InitialPC s0
|
|
#define InitialArg s1
|
|
#define WhenDonePC s2
|
|
#define StartupPC s3
|
|
|
|
#define PCState (PC/8-1)
|
|
#define FPState (S6/8-1)
|
|
#define InitialPCState (S0/8-1)
|
|
#define InitialArgState (S1/8-1)
|
|
#define WhenDonePCState (S2/8-1)
|
|
#define StartupPCState (S3/8-1)
|
|
|
|
#endif // HOST_ALPHA
|
|
|
|
#endif // SWITCH_H
|