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