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