550W Document
550W, a high-end OS
regs.h
浏览该文件的文档.
1 #pragma once
2 
3 #define SAVE(x, y) sd x, OFFSET_REG_##y##(sp)
4 #define LOAD(x, y) ld x, OFFSET_REG_##y##(sp)
5 
6 /* return address */
7 #define reg_ra 0
8 
9 /* pointers */
10 #define reg_sp 1 // stack
11 #define reg_gp 2 // global
12 #define reg_tp 3 // thread
13 
14 /* temporary */
15 #define reg_t0 4
16 #define reg_t1 5
17 #define reg_t2 6
18 
19 /* saved register */
20 #define reg_s0 7
21 #define reg_s1 8
22 
23 /* args */
24 #define reg_a0 9
25 #define reg_a1 10
26 #define reg_a2 11
27 #define reg_a3 12
28 #define reg_a4 13
29 #define reg_a5 14
30 #define reg_a6 15
31 #define reg_a7 16
32 
33 /* saved register */
34 #define reg_s2 17
35 #define reg_s3 18
36 #define reg_s4 19
37 #define reg_s5 20
38 #define reg_s6 21
39 #define reg_s7 22
40 #define reg_s8 23
41 #define reg_s9 24
42 #define reg_s10 25
43 #define reg_s11 26
44 
45 /* temporary register */
46 #define reg_t3 27
47 #define reg_t4 28
48 #define reg_t5 29
49 #define reg_t6 30
50 
51 /* privileged register */
52 #define reg_sstatus 31
53 #define reg_sepc 32
54 #define reg_sbadaddr 33
55 #define reg_scause 34
56 
57 /* offsets */
58 
59 /* return address */
60 #define OFFSET_REG_RA 0
61 
62 /* pointers */
63 #define OFFSET_REG_SP 8 // stack
64 #define OFFSET_REG_GP 16 // global
65 #define OFFSET_REG_TP 24 // thread
66 
67 /* temporary */
68 #define OFFSET_REG_T0 32
69 #define OFFSET_REG_T1 40
70 #define OFFSET_REG_T2 48
71 
72 /* saved register */
73 #define OFFSET_REG_S0 56
74 #define OFFSET_REG_S1 64
75 
76 /* args */
77 #define OFFSET_REG_A0 72
78 #define OFFSET_REG_A1 80
79 #define OFFSET_REG_A2 88
80 #define OFFSET_REG_A3 96
81 #define OFFSET_REG_A4 104
82 #define OFFSET_REG_A5 112
83 #define OFFSET_REG_A6 120
84 #define OFFSET_REG_A7 128
85 
86 /* saved register */
87 #define OFFSET_REG_S2 136
88 #define OFFSET_REG_S3 144
89 #define OFFSET_REG_S4 152
90 #define OFFSET_REG_S5 160
91 #define OFFSET_REG_S6 168
92 #define OFFSET_REG_S7 176
93 #define OFFSET_REG_S8 184
94 #define OFFSET_REG_S9 192
95 #define OFFSET_REG_S10 200
96 #define OFFSET_REG_S11 208
97 
98 /* temporary register */
99 #define OFFSET_REG_T3 216
100 #define OFFSET_REG_T4 224
101 #define OFFSET_REG_T5 232
102 #define OFFSET_REG_T6 240
103 
104 #define OFFSET_REG_SIZE 248
105 
106 /* privileged register */
107 #define OFFSET_REG_SSTATUS 248
108 #define OFFSET_REG_SEPC 256
109 #define OFFSET_REG_SBADADDR 264
110 #define OFFSET_REG_SCAUSE 272
111 
112 /* Size of stack frame, word/double word alignment */
113 #define OFFSET_ALL_REG_SIZE 280
114 
115 #define PCB_KERNEL_SP 0
116 #define PCB_USER_SP 8
117 
118 /* registers in switch_to */
119 #define switch_reg_ra 0
120 #define switch_reg_sp 1
121 #define switch_reg_s0 2
122 #define switch_reg_s1 3
123 #define switch_reg_s2 4
124 #define switch_reg_s3 5
125 #define switch_reg_s4 6
126 #define switch_reg_s5 7
127 #define switch_reg_s6 8
128 #define switch_reg_s7 9
129 #define switch_reg_s8 10
130 #define switch_reg_s9 11
131 #define switch_reg_s10 12
132 #define switch_reg_s11 13
133 
134 /* offset in switch_to */
135 #define SS(x, y) sd x, SWITCH_TO_##y##(t0)
136 #define LS(x, y) ld x, SWITCH_TO_##y##(t0)
137 #define SWITCH_TO_RA 0
138 #define SWITCH_TO_SP 8
139 #define SWITCH_TO_S0 16
140 #define SWITCH_TO_S1 24
141 #define SWITCH_TO_S2 32
142 #define SWITCH_TO_S3 40
143 #define SWITCH_TO_S4 48
144 #define SWITCH_TO_S5 56
145 #define SWITCH_TO_S6 64
146 #define SWITCH_TO_S7 72
147 #define SWITCH_TO_S8 80
148 #define SWITCH_TO_S9 88
149 #define SWITCH_TO_S10 96
150 #define SWITCH_TO_S11 104
151 
152 #define SWITCH_TO_SIZE 112