Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
1/*
2 * Register definitions for the Hexagon architecture
3 */
4
5
6#ifndef _ASM_REGISTERS_H
7#define _ASM_REGISTERS_H
8
9#ifndef __ASSEMBLY__
10
11/* See kernel/entry.S for further documentation. */
12
13/*
14 * Entry code copies the event record out of guest registers into
15 * this structure (which is on the stack).
16 */
17
18struct hvm_event_record {
19 unsigned long vmel; /* Event Linkage (return address) */
20 unsigned long vmest; /* Event context - pre-event SSR values */
21 unsigned long vmpsp; /* Previous stack pointer */
22 unsigned long vmbadva; /* Bad virtual address for addressing events */
23};
24
25struct pt_regs {
26 long restart_r0; /* R0 checkpoint for syscall restart */
27 long syscall_nr; /* Only used in system calls */
28 union {
29 struct {
30 unsigned long usr;
31 unsigned long preds;
32 };
33 long long int predsusr;
34 };
35 union {
36 struct {
37 unsigned long m0;
38 unsigned long m1;
39 };
40 long long int m1m0;
41 };
42 union {
43 struct {
44 unsigned long sa1;
45 unsigned long lc1;
46 };
47 long long int lc1sa1;
48 };
49 union {
50 struct {
51 unsigned long sa0;
52 unsigned long lc0;
53 };
54 long long int lc0sa0;
55 };
56 union {
57 struct {
58 unsigned long ugp;
59 unsigned long gp;
60 };
61 long long int gpugp;
62 };
63 union {
64 struct {
65 unsigned long cs0;
66 unsigned long cs1;
67 };
68 long long int cs1cs0;
69 };
70 /*
71 * Be extremely careful with rearranging these, if at all. Some code
72 * assumes the 32 registers exist exactly like this in memory;
73 * e.g. kernel/ptrace.c
74 * e.g. kernel/signal.c (restore_sigcontext)
75 */
76 union {
77 struct {
78 unsigned long r00;
79 unsigned long r01;
80 };
81 long long int r0100;
82 };
83 union {
84 struct {
85 unsigned long r02;
86 unsigned long r03;
87 };
88 long long int r0302;
89 };
90 union {
91 struct {
92 unsigned long r04;
93 unsigned long r05;
94 };
95 long long int r0504;
96 };
97 union {
98 struct {
99 unsigned long r06;
100 unsigned long r07;
101 };
102 long long int r0706;
103 };
104 union {
105 struct {
106 unsigned long r08;
107 unsigned long r09;
108 };
109 long long int r0908;
110 };
111 union {
112 struct {
113 unsigned long r10;
114 unsigned long r11;
115 };
116 long long int r1110;
117 };
118 union {
119 struct {
120 unsigned long r12;
121 unsigned long r13;
122 };
123 long long int r1312;
124 };
125 union {
126 struct {
127 unsigned long r14;
128 unsigned long r15;
129 };
130 long long int r1514;
131 };
132 union {
133 struct {
134 unsigned long r16;
135 unsigned long r17;
136 };
137 long long int r1716;
138 };
139 union {
140 struct {
141 unsigned long r18;
142 unsigned long r19;
143 };
144 long long int r1918;
145 };
146 union {
147 struct {
148 unsigned long r20;
149 unsigned long r21;
150 };
151 long long int r2120;
152 };
153 union {
154 struct {
155 unsigned long r22;
156 unsigned long r23;
157 };
158 long long int r2322;
159 };
160 union {
161 struct {
162 unsigned long r24;
163 unsigned long r25;
164 };
165 long long int r2524;
166 };
167 union {
168 struct {
169 unsigned long r26;
170 unsigned long r27;
171 };
172 long long int r2726;
173 };
174 union {
175 struct {
176 unsigned long r28;
177 unsigned long r29;
178 };
179 long long int r2928;
180 };
181 union {
182 struct {
183 unsigned long r30;
184 unsigned long r31;
185 };
186 long long int r3130;
187 };
188 /* VM dispatch pushes event record onto stack - we can build on it */
189 struct hvm_event_record hvmer;
190};
191
192/* Defines to conveniently access the values */
193
194/*
195 * As of the VM spec 0.5, these registers are now set/retrieved via a
196 * VM call. On the in-bound side, we just fetch the values
197 * at the entry points and stuff them into the old record in pt_regs.
198 * However, on the outbound side, probably at VM rte, we set the
199 * registers back.
200 */
201
202#define pt_elr(regs) ((regs)->hvmer.vmel)
203#define pt_set_elr(regs, val) ((regs)->hvmer.vmel = (val))
204#define pt_cause(regs) ((regs)->hvmer.vmest & (HVM_VMEST_CAUSE_MSK))
205#define user_mode(regs) \
206 (((regs)->hvmer.vmest & (HVM_VMEST_UM_MSK << HVM_VMEST_UM_SFT)) != 0)
207#define ints_enabled(regs) \
208 (((regs)->hvmer.vmest & (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT)) != 0)
209#define pt_psp(regs) ((regs)->hvmer.vmpsp)
210#define pt_badva(regs) ((regs)->hvmer.vmbadva)
211
212#define pt_set_singlestep(regs) ((regs)->hvmer.vmest |= (1<<HVM_VMEST_SS_SFT))
213#define pt_clr_singlestep(regs) ((regs)->hvmer.vmest &= ~(1<<HVM_VMEST_SS_SFT))
214
215#define pt_set_rte_sp(regs, sp) do {\
216 pt_psp(regs) = (regs)->r29 = (sp);\
217 } while (0)
218
219#define pt_set_kmode(regs) \
220 (regs)->hvmer.vmest = (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT)
221
222#define pt_set_usermode(regs) \
223 (regs)->hvmer.vmest = (HVM_VMEST_UM_MSK << HVM_VMEST_UM_SFT) \
224 | (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT)
225
226#endif /* ifndef __ASSEMBLY */
227
228#endif