Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/hexagon/include/uapi/asm/registers.h
49147 views
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
231