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
104#define ARCH_MIN_TASKALIGN 8
105
106struct thread_struct {
107 struct pt_regs regs;
108 unsigned long task_size;
109 unsigned long map_base;
110 unsigned long flags;
111};
112
113#define task_pt_regs(tsk) ((struct pt_regs *)&((tsk)->thread.regs))
114
115
116#define PARISC_UAC_NOPRINT (1UL << 0)
117#define PARISC_UAC_SIGBUS (1UL << 1)
118#define PARISC_KERNEL_DEATH (1UL << 31)
119
120#define PARISC_UAC_SHIFT 0
121#define PARISC_UAC_MASK (PARISC_UAC_NOPRINT|PARISC_UAC_SIGBUS)
122
123#define SET_UNALIGN_CTL(task,value) \
124 ({ \
125 (task)->thread.flags = (((task)->thread.flags & ~PARISC_UAC_MASK) \
126 | (((value) << PARISC_UAC_SHIFT) & \
127 PARISC_UAC_MASK)); \
128 0; \
129 })
130
131#define GET_UNALIGN_CTL(task,addr) \
132 ({ \
133 put_user(((task)->thread.flags & PARISC_UAC_MASK) \
134 >> PARISC_UAC_SHIFT, (int __user *) (addr)); \
135 })
136
137#define INIT_THREAD { \
138 .regs = { .gr = { 0, }, \
139 .fr = { 0, }, \
140 .sr = { 0, }, \
141 .iasq = { 0, }, \
142 .iaoq = { 0, }, \
143 .cr27 = 0, \
144 }, \
145 .task_size = DEFAULT_TASK_SIZE, \
146 .map_base = DEFAULT_MAP_BASE, \
147 .flags = 0 \
148 }
149
150struct task_struct;
151void show_trace(struct task_struct *task, unsigned long *stack);
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168typedef unsigned int elf_caddr_t;
169
170
171
172
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#define USER_WIDE_MODE (!is_32bit_task())
241
242#define start_thread(regs, new_pc, new_sp) do { \
243 elf_addr_t *sp = (elf_addr_t *)new_sp; \
244 __u32 spaceid = (__u32)current->mm->context; \
245 elf_addr_t pc = (elf_addr_t)new_pc | 3; \
246 elf_caddr_t *argv = (elf_caddr_t *)bprm->exec + 1; \
247 \
248 regs->iasq[0] = spaceid; \
249 regs->iasq[1] = spaceid; \
250 regs->iaoq[0] = pc; \
251 regs->iaoq[1] = pc + 4; \
252 regs->sr[2] = LINUX_GATEWAY_SPACE; \
253 regs->sr[3] = 0xffff; \
254 regs->sr[4] = spaceid; \
255 regs->sr[5] = spaceid; \
256 regs->sr[6] = spaceid; \
257 regs->sr[7] = spaceid; \
258 regs->gr[ 0] = USER_PSW | (USER_WIDE_MODE ? PSW_W : 0); \
259 regs->fr[ 0] = 0LL; \
260 regs->fr[ 1] = 0LL; \
261 regs->fr[ 2] = 0LL; \
262 regs->fr[ 3] = 0LL; \
263 regs->gr[30] = (((unsigned long)sp + 63) &~ 63) | (USER_WIDE_MODE ? 1 : 0); \
264 regs->gr[31] = pc; \
265 \
266 get_user(regs->gr[25], (argv - 1)); \
267 regs->gr[24] = (long) argv; \
268 regs->gr[23] = 0; \
269} while(0)
270
271struct mm_struct;
272
273
274extern void release_thread(struct task_struct *);
275
276extern unsigned long get_wchan(struct task_struct *p);
277
278#define KSTK_EIP(tsk) ((tsk)->thread.regs.iaoq[0])
279#define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30])
280
281#define cpu_relax() barrier()
282
283
284
285
286
287
288#ifdef CONFIG_PA8X00
289extern int _parisc_requires_coherency;
290#define parisc_requires_coherency() _parisc_requires_coherency
291#else
292#define parisc_requires_coherency() (0)
293#endif
294
295extern int running_on_qemu;
296
297#endif
298
299#endif
300