1
2
3
4
5
6
7
8
9#ifndef __ASM_PARISC_PROCESSOR_H
10#define __ASM_PARISC_PROCESSOR_H
11
12#ifndef __ASSEMBLY__
13#include <linux/threads.h>
14
15#include <asm/prefetch.h>
16#include <asm/hardware.h>
17#include <asm/pdc.h>
18#include <asm/ptrace.h>
19#include <asm/types.h>
20#include <asm/percpu.h>
21#endif
22
23#define HAVE_ARCH_PICK_MMAP_LAYOUT
24
25#define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size)
26#define TASK_SIZE TASK_SIZE_OF(current)
27#define TASK_UNMAPPED_BASE (current->thread.map_base)
28
29#define DEFAULT_TASK_SIZE32 (0xFFF00000UL)
30#define DEFAULT_MAP_BASE32 (0x40000000UL)
31
32#ifdef CONFIG_64BIT
33#define DEFAULT_TASK_SIZE (MAX_ADDRESS-0xf000000)
34#define DEFAULT_MAP_BASE (0x200000000UL)
35#else
36#define DEFAULT_TASK_SIZE DEFAULT_TASK_SIZE32
37#define DEFAULT_MAP_BASE DEFAULT_MAP_BASE32
38#endif
39
40#ifdef __KERNEL__
41
42
43
44
45#define STACK_TOP TASK_SIZE
46#define STACK_TOP_MAX DEFAULT_TASK_SIZE
47
48#endif
49
50#ifndef __ASSEMBLY__
51
52unsigned long calc_max_stack_size(unsigned long stack_max);
53
54
55
56
57
58
59
60struct system_cpuinfo_parisc {
61 unsigned int cpu_count;
62 unsigned int cpu_hz;
63 unsigned int hversion;
64 unsigned int sversion;
65 enum cpu_type cpu_type;
66
67 struct {
68 struct pdc_model model;
69 unsigned long versions;
70 unsigned long cpuid;
71 unsigned long capabilities;
72 char sys_model_name[81];
73 } pdc;
74
75 const char *cpu_name;
76 const char *family_name;
77};
78
79
80
81struct cpuinfo_parisc {
82 unsigned long it_value;
83 unsigned long irq_count;
84 unsigned long cpuid;
85 unsigned long hpa;
86 unsigned long txn_addr;
87#ifdef CONFIG_SMP
88 unsigned long pending_ipi;
89#endif
90 unsigned long bh_count;
91 unsigned long fp_rev;
92 unsigned long fp_model;
93 unsigned long cpu_num;
94 unsigned long cpu_loc;
95 unsigned int state;
96 struct parisc_device *dev;
97};
98
99extern struct system_cpuinfo_parisc boot_cpu_data;
100DECLARE_PER_CPU(struct cpuinfo_parisc, cpu_data);
101
102#define CPU_HVERSION ((boot_cpu_data.hversion >> 4) & 0x0FFF)
103
104typedef struct {
105 int seg;
106} mm_segment_t;
107
108#define ARCH_MIN_TASKALIGN 8
109
110struct thread_struct {
111 struct pt_regs regs;
112 unsigned long task_size;
113 unsigned long map_base;
114 unsigned long flags;
115};
116
117#define task_pt_regs(tsk) ((struct pt_regs *)&((tsk)->thread.regs))
118
119
120#define PARISC_UAC_NOPRINT (1UL << 0)
121#define PARISC_UAC_SIGBUS (1UL << 1)
122#define PARISC_KERNEL_DEATH (1UL << 31)
123
124#define PARISC_UAC_SHIFT 0
125#define PARISC_UAC_MASK (PARISC_UAC_NOPRINT|PARISC_UAC_SIGBUS)
126
127#define SET_UNALIGN_CTL(task,value) \
128 ({ \
129 (task)->thread.flags = (((task)->thread.flags & ~PARISC_UAC_MASK) \
130 | (((value) << PARISC_UAC_SHIFT) & \
131 PARISC_UAC_MASK)); \
132 0; \
133 })
134
135#define GET_UNALIGN_CTL(task,addr) \
136 ({ \
137 put_user(((task)->thread.flags & PARISC_UAC_MASK) \
138 >> PARISC_UAC_SHIFT, (int __user *) (addr)); \
139 })
140
141#define INIT_THREAD { \
142 .regs = { .gr = { 0, }, \
143 .fr = { 0, }, \
144 .sr = { 0, }, \
145 .iasq = { 0, }, \
146 .iaoq = { 0, }, \
147 .cr27 = 0, \
148 }, \
149 .task_size = DEFAULT_TASK_SIZE, \
150 .map_base = DEFAULT_MAP_BASE, \
151 .flags = 0 \
152 }
153
154struct task_struct;
155void show_trace(struct task_struct *task, unsigned long *stack);
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172typedef unsigned int elf_caddr_t;
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244#define USER_WIDE_MODE (!is_32bit_task())
245
246#define start_thread(regs, new_pc, new_sp) do { \
247 elf_addr_t *sp = (elf_addr_t *)new_sp; \
248 __u32 spaceid = (__u32)current->mm->context; \
249 elf_addr_t pc = (elf_addr_t)new_pc | 3; \
250 elf_caddr_t *argv = (elf_caddr_t *)bprm->exec + 1; \
251 \
252 regs->iasq[0] = spaceid; \
253 regs->iasq[1] = spaceid; \
254 regs->iaoq[0] = pc; \
255 regs->iaoq[1] = pc + 4; \
256 regs->sr[2] = LINUX_GATEWAY_SPACE; \
257 regs->sr[3] = 0xffff; \
258 regs->sr[4] = spaceid; \
259 regs->sr[5] = spaceid; \
260 regs->sr[6] = spaceid; \
261 regs->sr[7] = spaceid; \
262 regs->gr[ 0] = USER_PSW | (USER_WIDE_MODE ? PSW_W : 0); \
263 regs->fr[ 0] = 0LL; \
264 regs->fr[ 1] = 0LL; \
265 regs->fr[ 2] = 0LL; \
266 regs->fr[ 3] = 0LL; \
267 regs->gr[30] = (((unsigned long)sp + 63) &~ 63) | (USER_WIDE_MODE ? 1 : 0); \
268 regs->gr[31] = pc; \
269 \
270 get_user(regs->gr[25], (argv - 1)); \
271 regs->gr[24] = (long) argv; \
272 regs->gr[23] = 0; \
273} while(0)
274
275struct mm_struct;
276
277
278extern void release_thread(struct task_struct *);
279
280extern unsigned long get_wchan(struct task_struct *p);
281
282#define KSTK_EIP(tsk) ((tsk)->thread.regs.iaoq[0])
283#define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30])
284
285#define cpu_relax() barrier()
286
287
288
289
290
291
292#ifdef CONFIG_PA8X00
293extern int _parisc_requires_coherency;
294#define parisc_requires_coherency() _parisc_requires_coherency
295#else
296#define parisc_requires_coherency() (0)
297#endif
298
299extern int running_on_qemu;
300
301#endif
302
303#endif
304