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