1
2
3
4
5
6
7
8
9
10
11#ifndef _XTENSA_PROCESSOR_H
12#define _XTENSA_PROCESSOR_H
13
14#include <asm/variant/core.h>
15#include <asm/coprocessor.h>
16
17#include <linux/compiler.h>
18#include <asm/ptrace.h>
19#include <asm/types.h>
20#include <asm/regs.h>
21
22
23
24#if (XCHAL_HAVE_WINDOWED != 1)
25# error Linux requires the Xtensa Windowed Registers Option.
26#endif
27
28
29
30
31
32
33
34
35
36#define TASK_SIZE 0x40000000
37
38
39
40
41
42
43
44
45
46
47#define EXCCAUSE_MAPPED_DEBUG 63
48
49
50
51
52
53
54
55
56
57#define VALID_DOUBLE_EXCEPTION_ADDRESS 64
58
59
60
61
62#define LOCKLEVEL 1
63
64
65
66
67#define WSBITS (XCHAL_NUM_AREGS / 4)
68#define WBBITS (XCHAL_NUM_AREGS_LOG2 - 2)
69
70#ifndef __ASSEMBLY__
71
72
73
74
75#define MAKE_RA_FOR_CALL(ra,ws) (((ra) & 0x3fffffff) | (ws) << 30)
76
77
78
79
80#define MAKE_PC_FROM_RA(ra,sp) (((ra) & 0x3fffffff) | ((sp) & 0xc0000000))
81
82typedef struct {
83 unsigned long seg;
84} mm_segment_t;
85
86struct thread_struct {
87
88
89 unsigned long ra;
90 unsigned long sp;
91
92 mm_segment_t current_ds;
93
94
95
96 unsigned long bad_vaddr;
97 unsigned long bad_uaddr;
98 unsigned long error_code;
99
100 unsigned long ibreak[XCHAL_NUM_IBREAK];
101 unsigned long dbreaka[XCHAL_NUM_DBREAK];
102 unsigned long dbreakc[XCHAL_NUM_DBREAK];
103
104
105 unsigned char cp_save[XTENSA_CP_EXTRA_SIZE]
106 __attribute__ ((aligned(XTENSA_CP_EXTRA_ALIGN)));
107
108
109 int align[0] __attribute__ ((aligned(16)));
110};
111
112
113
114
115
116
117#define current_text_addr() ({ __label__ _l; _l: &&_l;})
118
119
120
121
122
123#define TASK_UNMAPPED_BASE (TASK_SIZE / 2)
124
125#define INIT_THREAD \
126{ \
127 ra: 0, \
128 sp: sizeof(init_stack) + (long) &init_stack, \
129 current_ds: {0}, \
130 \
131 bad_vaddr: 0, \
132 bad_uaddr: 0, \
133 error_code: 0, \
134}
135
136
137
138
139
140
141
142#define USER_PS_VALUE ((1 << PS_WOE_BIT) | \
143 (1 << PS_CALLINC_SHIFT) | \
144 (USER_RING << PS_RING_SHIFT) | \
145 (1 << PS_UM_BIT) | \
146 (1 << PS_EXCM_BIT))
147
148
149#define start_thread(regs, new_pc, new_sp) \
150 regs->pc = new_pc; \
151 regs->ps = USER_PS_VALUE; \
152 regs->areg[1] = new_sp; \
153 regs->areg[0] = 0; \
154 regs->wmask = 1; \
155 regs->depc = 0; \
156 regs->windowbase = 0; \
157 regs->windowstart = 1;
158
159
160struct task_struct;
161struct mm_struct;
162
163
164
165#define release_thread(thread) do { } while(0)
166
167
168
169#define prepare_to_copy(tsk) do { } while (0)
170
171
172
173
174extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
175
176
177
178#define copy_segments(p, mm) do { } while(0)
179#define release_segments(mm) do { } while(0)
180#define forget_segments() do { } while (0)
181
182#define thread_saved_pc(tsk) (task_pt_regs(tsk)->pc)
183
184extern unsigned long get_wchan(struct task_struct *p);
185
186#define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
187#define KSTK_ESP(tsk) (task_pt_regs(tsk)->areg[1])
188
189#define cpu_relax() barrier()
190
191
192
193#define WSR(v,sr) __asm__ __volatile__ ("wsr %0,"__stringify(sr) :: "a"(v));
194#define RSR(v,sr) __asm__ __volatile__ ("rsr %0,"__stringify(sr) : "=a"(v));
195
196#define set_sr(x,sr) ({unsigned int v=(unsigned int)x; WSR(v,sr);})
197#define get_sr(sr) ({unsigned int v; RSR(v,sr); v; })
198
199#endif
200#endif
201