This source file includes following definitions.
- disable_fpu
- enable_fpu
1
2 #ifndef __ASM_SH_PROCESSOR_64_H
3 #define __ASM_SH_PROCESSOR_64_H
4
5
6
7
8
9
10
11
12 #ifndef __ASSEMBLY__
13
14 #include <linux/compiler.h>
15 #include <asm/page.h>
16 #include <asm/types.h>
17 #include <cpu/registers.h>
18
19 #endif
20
21
22
23
24 #define TASK_SIZE 0x7ffff000UL
25
26 #define STACK_TOP TASK_SIZE
27 #define STACK_TOP_MAX STACK_TOP
28
29
30
31
32 #define TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3)
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #if defined(CONFIG_SH64_SR_WATCH)
49 #define SR_MMU 0x84000000
50 #else
51 #define SR_MMU 0x80000000
52 #endif
53
54 #define SR_IMASK 0x000000f0
55 #define SR_FD 0x00008000
56 #define SR_SSTEP 0x08000000
57
58 #ifndef __ASSEMBLY__
59
60
61
62
63
64
65 struct sh_fpu_hard_struct {
66 unsigned long fp_regs[64];
67 unsigned int fpscr;
68
69 };
70
71
72 struct sh_fpu_soft_struct {
73 unsigned long fp_regs[64];
74 unsigned int fpscr;
75 unsigned char lookahead;
76 unsigned long entry_pc;
77 };
78
79 union thread_xstate {
80 struct sh_fpu_hard_struct hardfpu;
81 struct sh_fpu_soft_struct softfpu;
82
83
84
85
86 unsigned long long alignment_dummy;
87 };
88
89 struct thread_struct {
90 unsigned long sp;
91 unsigned long pc;
92
93
94 unsigned long flags;
95
96
97
98
99
100 struct pt_regs *kregs;
101
102
103
104 struct pt_regs *uregs;
105
106 unsigned long address;
107
108
109
110 union thread_xstate *xstate;
111
112
113
114
115
116
117
118
119
120 unsigned char fpu_counter;
121 };
122
123 #define INIT_MMAP \
124 { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL }
125
126 #define INIT_THREAD { \
127 .sp = sizeof(init_stack) + \
128 (long) &init_stack, \
129 .pc = 0, \
130 .kregs = &fake_swapper_regs, \
131 .uregs = NULL, \
132 .address = 0, \
133 .flags = 0, \
134 }
135
136
137
138
139 #define SR_USER (SR_MMU | SR_FD)
140
141 #define start_thread(_regs, new_pc, new_sp) \
142 _regs->sr = SR_USER; \
143 _regs->pc = new_pc - 4; \
144 _regs->pc |= 1; \
145 _regs->regs[18] = 0; \
146 _regs->regs[15] = new_sp
147
148
149 struct task_struct;
150 struct mm_struct;
151
152
153 extern void release_thread(struct task_struct *);
154
155
156
157
158
159 static inline void disable_fpu(void)
160 {
161 unsigned long long __dummy;
162
163
164 __asm__ __volatile__("getcon " __SR ", %0\n\t"
165 "or %0, %1, %0\n\t"
166 "putcon %0, " __SR "\n\t"
167 : "=&r" (__dummy)
168 : "r" (SR_FD));
169 }
170
171 static inline void enable_fpu(void)
172 {
173 unsigned long long __dummy;
174
175
176 __asm__ __volatile__("getcon " __SR ", %0\n\t"
177 "and %0, %1, %0\n\t"
178 "putcon %0, " __SR "\n\t"
179 : "=&r" (__dummy)
180 : "r" (~SR_FD));
181 }
182
183
184
185
186 #if defined(CONFIG_SH64_FPU_DENORM_FLUSH)
187 #define FPSCR_INIT 0x00040000
188 #else
189 #define FPSCR_INIT 0x00000000
190 #endif
191
192 #ifdef CONFIG_SH_FPU
193
194 void fpinit(struct sh_fpu_hard_struct *fpregs);
195 #else
196 #define fpinit(fpregs) do { } while (0)
197 #endif
198
199 extern struct task_struct *last_task_used_math;
200
201
202
203
204 #define thread_saved_pc(tsk) (tsk->thread.pc)
205
206 extern unsigned long get_wchan(struct task_struct *p);
207
208 #define KSTK_EIP(tsk) ((tsk)->thread.pc)
209 #define KSTK_ESP(tsk) ((tsk)->thread.sp)
210
211 #endif
212 #endif