]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/sh/include/asm/processor_32.h
sh: provide user_stack_pointer(), needed for tracehook support.
[linux-2.6-omap-h63xx.git] / arch / sh / include / asm / processor_32.h
1 /*
2  * include/asm-sh/processor.h
3  *
4  * Copyright (C) 1999, 2000  Niibe Yutaka
5  * Copyright (C) 2002, 2003  Paul Mundt
6  */
7
8 #ifndef __ASM_SH_PROCESSOR_32_H
9 #define __ASM_SH_PROCESSOR_32_H
10 #ifdef __KERNEL__
11
12 #include <linux/compiler.h>
13 #include <linux/linkage.h>
14 #include <asm/page.h>
15 #include <asm/types.h>
16 #include <asm/cache.h>
17 #include <asm/ptrace.h>
18
19 /*
20  * Default implementation of macro that returns current
21  * instruction pointer ("program counter").
22  */
23 #define current_text_addr() ({ void *pc; __asm__("mova  1f, %0\n.align 2\n1:":"=z" (pc)); pc; })
24
25 /* Core Processor Version Register */
26 #define CCN_PVR         0xff000030
27 #define CCN_CVR         0xff000040
28 #define CCN_PRR         0xff000044
29
30 struct sh_cpuinfo {
31         unsigned int type;
32         int cut_major, cut_minor;
33         unsigned long loops_per_jiffy;
34         unsigned long asid_cache;
35
36         struct cache_info icache;       /* Primary I-cache */
37         struct cache_info dcache;       /* Primary D-cache */
38         struct cache_info scache;       /* Secondary cache */
39
40         unsigned long flags;
41 } __attribute__ ((aligned(L1_CACHE_BYTES)));
42
43 extern struct sh_cpuinfo cpu_data[];
44 #define boot_cpu_data cpu_data[0]
45 #define current_cpu_data cpu_data[smp_processor_id()]
46 #define raw_current_cpu_data cpu_data[raw_smp_processor_id()]
47
48 asmlinkage void __init sh_cpu_init(void);
49
50 /*
51  * User space process size: 2GB.
52  *
53  * Since SH7709 and SH7750 have "area 7", we can't use 0x7c000000--0x7fffffff
54  */
55 #define TASK_SIZE       0x7c000000UL
56
57 #define STACK_TOP       TASK_SIZE
58 #define STACK_TOP_MAX   STACK_TOP
59
60 /* This decides where the kernel will search for a free chunk of vm
61  * space during mmap's.
62  */
63 #define TASK_UNMAPPED_BASE      (TASK_SIZE / 3)
64
65 /*
66  * Bit of SR register
67  *
68  * FD-bit:
69  *     When it's set, it means the processor doesn't have right to use FPU,
70  *     and it results exception when the floating operation is executed.
71  *
72  * IMASK-bit:
73  *     Interrupt level mask
74  */
75 #define SR_DSP          0x00001000
76 #define SR_IMASK        0x000000f0
77 #define SR_FD           0x00008000
78
79 /*
80  * FPU structure and data
81  */
82
83 struct sh_fpu_hard_struct {
84         unsigned long fp_regs[16];
85         unsigned long xfp_regs[16];
86         unsigned long fpscr;
87         unsigned long fpul;
88
89         long status; /* software status information */
90 };
91
92 /* Dummy fpu emulator  */
93 struct sh_fpu_soft_struct {
94         unsigned long fp_regs[16];
95         unsigned long xfp_regs[16];
96         unsigned long fpscr;
97         unsigned long fpul;
98
99         unsigned char lookahead;
100         unsigned long entry_pc;
101 };
102
103 union sh_fpu_union {
104         struct sh_fpu_hard_struct hard;
105         struct sh_fpu_soft_struct soft;
106 };
107
108 struct thread_struct {
109         /* Saved registers when thread is descheduled */
110         unsigned long sp;
111         unsigned long pc;
112
113         /* Hardware debugging registers */
114         unsigned long ubc_pc;
115
116         /* floating point info */
117         union sh_fpu_union fpu;
118 };
119
120 /* Count of active tasks with UBC settings */
121 extern int ubc_usercnt;
122
123 #define INIT_THREAD  {                                          \
124         .sp = sizeof(init_stack) + (long) &init_stack,          \
125 }
126
127 /*
128  * Do necessary setup to start up a newly executed thread.
129  */
130 #define start_thread(regs, new_pc, new_sp)       \
131         set_fs(USER_DS);                         \
132         regs->pr = 0;                            \
133         regs->sr = SR_FD;       /* User mode. */ \
134         regs->pc = new_pc;                       \
135         regs->regs[15] = new_sp
136
137 /* Forward declaration, a strange C thing */
138 struct task_struct;
139 struct mm_struct;
140
141 /* Free all resources held by a thread. */
142 extern void release_thread(struct task_struct *);
143
144 /* Prepare to copy thread state - unlazy all lazy status */
145 #define prepare_to_copy(tsk)    do { } while (0)
146
147 /*
148  * create a kernel thread without removing it from tasklists
149  */
150 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
151
152 /* Copy and release all segment info associated with a VM */
153 #define copy_segments(p, mm)    do { } while(0)
154 #define release_segments(mm)    do { } while(0)
155
156 /*
157  * FPU lazy state save handling.
158  */
159
160 static __inline__ void disable_fpu(void)
161 {
162         unsigned long __dummy;
163
164         /* Set FD flag in SR */
165         __asm__ __volatile__("stc       sr, %0\n\t"
166                              "or        %1, %0\n\t"
167                              "ldc       %0, sr"
168                              : "=&r" (__dummy)
169                              : "r" (SR_FD));
170 }
171
172 static __inline__ void enable_fpu(void)
173 {
174         unsigned long __dummy;
175
176         /* Clear out FD flag in SR */
177         __asm__ __volatile__("stc       sr, %0\n\t"
178                              "and       %1, %0\n\t"
179                              "ldc       %0, sr"
180                              : "=&r" (__dummy)
181                              : "r" (~SR_FD));
182 }
183
184 /* Double presision, NANS as NANS, rounding to nearest, no exceptions */
185 #define FPSCR_INIT  0x00080000
186
187 #define FPSCR_CAUSE_MASK        0x0001f000      /* Cause bits */
188 #define FPSCR_FLAG_MASK         0x0000007c      /* Flag bits */
189
190 /*
191  * Return saved PC of a blocked thread.
192  */
193 #define thread_saved_pc(tsk)    (tsk->thread.pc)
194
195 void show_trace(struct task_struct *tsk, unsigned long *sp,
196                 struct pt_regs *regs);
197 extern unsigned long get_wchan(struct task_struct *p);
198
199 #define KSTK_EIP(tsk)  (task_pt_regs(tsk)->pc)
200 #define KSTK_ESP(tsk)  (task_pt_regs(tsk)->regs[15])
201
202 #define user_stack_pointer(regs)        ((regs)->regs[15])
203
204 #define cpu_sleep()     __asm__ __volatile__ ("sleep" : : : "memory")
205 #define cpu_relax()     barrier()
206
207 #if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH3) || \
208     defined(CONFIG_CPU_SH4)
209 #define PREFETCH_STRIDE         L1_CACHE_BYTES
210 #define ARCH_HAS_PREFETCH
211 #define ARCH_HAS_PREFETCHW
212 static inline void prefetch(void *x)
213 {
214         __asm__ __volatile__ ("pref @%0\n\t" : : "r" (x) : "memory");
215 }
216
217 #define prefetchw(x)    prefetch(x)
218 #endif
219
220 #endif /* __KERNEL__ */
221 #endif /* __ASM_SH_PROCESSOR_32_H */