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
229