Commit | Line | Data |
---|---|---|
c8cccbb7 C |
1 | /* align.h 1.1 86/07/20 */ |
2 | ||
3 | #ifndef LOCORE | |
4 | /* | |
5 | * Some special registers definitions. | |
6 | */ | |
7 | ||
8 | #ifndef SLR | |
9 | #define SLR 1 | |
10 | #define P0LR 3 | |
11 | #define P1LR 5 | |
12 | #define P2LR 7 | |
13 | #endif | |
14 | ||
15 | #include "../tahoealign/defs.h" | |
16 | /* | |
17 | * Definitions about the stack frame as seen by the routine | |
18 | * 'alignment' in the kernel. If you ever wondered what's the | |
19 | * meaning of 'machine dependent code', look here :-) | |
20 | * This structure is partly set up by locore.s, for 'alignment', | |
21 | * and partly by the allocation of local variables in 'alignment.c' | |
22 | * itself. | |
23 | * All these things are passed between procedures on the | |
24 | * (current process' kernel) stack. The alternative (static | |
25 | * variables) is a little bit more elegant but it works fine | |
26 | * for one process only. Will not work for multiple processes | |
27 | * with alignment processing or for MP models of HW. | |
28 | * | |
29 | * WARNING : due to the intimate relationships involved, don't | |
30 | * change the process_info structure unless you also | |
31 | * change the alignment trap code in locore.s AND the | |
32 | * allocation of local variables in 'alignment.c' !! | |
33 | */ | |
34 | typedef struct { | |
35 | long Saved_sp; /* For exceptions */ | |
36 | long Saved_pc; | |
37 | long Last_operand; /* Last operand # processed */ | |
38 | long Opcode; /* 'offending' opcode */ | |
39 | struct oprnd Decoded[4]; | |
40 | long REG0; | |
41 | long REG1; | |
42 | long REG2; | |
43 | long REG3; | |
44 | long REG4; | |
45 | long REG5; | |
46 | long REG6; | |
47 | long REG7; | |
48 | long REG8; | |
49 | long REG9; | |
50 | long REG10; | |
51 | long REG11; | |
52 | long REG12; | |
53 | long return_pc; /* Points into locore.s */ | |
54 | long mask_restored; | |
55 | long REG13; /* Original, from the process */ | |
56 | long Sp; /* Alias R14 */ | |
57 | long ret_code; | |
58 | long ret_addr; | |
59 | long ret_exception; /* To tell locore.s about problems */ | |
60 | long Ach; | |
61 | long Acl; | |
62 | unsigned unused:30; | |
63 | unsigned pcb_acc_pnt:1; | |
64 | unsigned acc_dbl:1; | |
65 | long Pc; /* Alias R15 */ | |
66 | long Psl; | |
67 | } process_info; | |
68 | ||
69 | #define saved_pc (infop->Saved_pc) | |
70 | #define saved_sp (infop->Saved_sp) | |
71 | #define last_operand (infop->Last_operand) | |
72 | #define opCODE (infop->Opcode) | |
73 | #define decoded (infop->Decoded) | |
74 | #define r0 (infop->REG0) | |
75 | #define r1 (infop->REG1) | |
76 | #define r2 (infop->REG2) | |
77 | #define r3 (infop->REG3) | |
78 | #define r4 (infop->REG4) | |
79 | #define r5 (infop->REG5) | |
80 | #define r6 (infop->REG6) | |
81 | #define r7 (infop->REG7) | |
82 | #define r8 (infop->REG8) | |
83 | #define r9 (infop->REG9) | |
84 | #define r10 (infop->REG10) | |
85 | #define r11 (infop->REG11) | |
86 | #define r12 (infop->REG12) | |
87 | #define r13 (infop->REG13) | |
88 | #define fp (infop->REG13) | |
89 | #define sp (infop->Sp) | |
90 | #define acc_high (infop->Ach) | |
91 | #define acc_low (infop->Acl) | |
92 | #define pc (infop->Pc) | |
93 | #define psl (infop->Psl) | |
94 | ||
95 | #define PCOUNTER 15 | |
96 | #define SPOINTER 14 | |
97 | ||
98 | ||
99 | /* | |
100 | * Setting new condition codes for the process. | |
101 | #define Set_psl(z) asm(" movl z,r6"); \ | |
102 | asm(" andl2 $15,r6"); \ | |
103 | asm(" mnegl $1,r7"); \ | |
104 | asm(" xorl2 r6,r7"); \ | |
105 | asm(" andl2 $15,r7"); \ | |
106 | asm(" bicpsw r7"); \ | |
107 | asm(" bispsw r6") | |
108 | */ | |
109 | #define Set_psl(z) asm(" andl2 $15,z"); \ | |
110 | asm(" mnegl $1,r6"); \ | |
111 | asm(" xorl2 z,r6"); \ | |
112 | asm(" andl2 $15,r6"); \ | |
113 | asm(" bicpsw r6"); \ | |
114 | asm(" bispsw z") | |
115 | #define New_cc(x) (x) &= PSL_ALLCC; psl = psl & ~PSL_ALLCC | (x) | |
116 | ||
117 | #endif | |
118 | ||
119 | /* | |
120 | * Definitions for ret_code. NOTE : DON"T USE 0 !! locore.s knows that | |
121 | * 0 means OK, no problems ! | |
122 | */ | |
123 | ||
124 | #define ILL_ADDRMOD 1 | |
125 | #define ILL_ACCESS 2 | |
126 | #define ILL_OPRND 3 | |
127 | #define ARITHMETIC 4 | |
128 | #define ALIGNMENT 5 | |
129 | ||
130 | /* | |
131 | * For use in u.u_eosys as a flag. | |
132 | */ | |
133 | #define EMULATEALIGN 0x80 |