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