diff options
Diffstat (limited to 'include/asm-powerpc/processor.h')
| -rw-r--r-- | include/asm-powerpc/processor.h | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/include/asm-powerpc/processor.h b/include/asm-powerpc/processor.h index cf83f2d7e2a..101ed87f7d8 100644 --- a/include/asm-powerpc/processor.h +++ b/include/asm-powerpc/processor.h | |||
| @@ -12,6 +12,12 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm/reg.h> | 13 | #include <asm/reg.h> |
| 14 | 14 | ||
| 15 | #ifdef CONFIG_VSX | ||
| 16 | #define TS_FPRWIDTH 2 | ||
| 17 | #else | ||
| 18 | #define TS_FPRWIDTH 1 | ||
| 19 | #endif | ||
| 20 | |||
| 15 | #ifndef __ASSEMBLY__ | 21 | #ifndef __ASSEMBLY__ |
| 16 | #include <linux/compiler.h> | 22 | #include <linux/compiler.h> |
| 17 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
| @@ -78,9 +84,14 @@ extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | |||
| 78 | /* Lazy FPU handling on uni-processor */ | 84 | /* Lazy FPU handling on uni-processor */ |
| 79 | extern struct task_struct *last_task_used_math; | 85 | extern struct task_struct *last_task_used_math; |
| 80 | extern struct task_struct *last_task_used_altivec; | 86 | extern struct task_struct *last_task_used_altivec; |
| 87 | extern struct task_struct *last_task_used_vsx; | ||
| 81 | extern struct task_struct *last_task_used_spe; | 88 | extern struct task_struct *last_task_used_spe; |
| 82 | 89 | ||
| 83 | #ifdef CONFIG_PPC32 | 90 | #ifdef CONFIG_PPC32 |
| 91 | |||
| 92 | #if CONFIG_TASK_SIZE > CONFIG_KERNEL_START | ||
| 93 | #error User TASK_SIZE overlaps with KERNEL_START address | ||
| 94 | #endif | ||
| 84 | #define TASK_SIZE (CONFIG_TASK_SIZE) | 95 | #define TASK_SIZE (CONFIG_TASK_SIZE) |
| 85 | 96 | ||
| 86 | /* This decides where the kernel will search for a free chunk of vm | 97 | /* This decides where the kernel will search for a free chunk of vm |
| @@ -136,6 +147,10 @@ typedef struct { | |||
| 136 | unsigned long seg; | 147 | unsigned long seg; |
| 137 | } mm_segment_t; | 148 | } mm_segment_t; |
| 138 | 149 | ||
| 150 | #define TS_FPROFFSET 0 | ||
| 151 | #define TS_VSRLOWOFFSET 1 | ||
| 152 | #define TS_FPR(i) fpr[i][TS_FPROFFSET] | ||
| 153 | |||
| 139 | struct thread_struct { | 154 | struct thread_struct { |
| 140 | unsigned long ksp; /* Kernel stack pointer */ | 155 | unsigned long ksp; /* Kernel stack pointer */ |
| 141 | unsigned long ksp_limit; /* if ksp <= ksp_limit stack overflow */ | 156 | unsigned long ksp_limit; /* if ksp <= ksp_limit stack overflow */ |
| @@ -152,8 +167,9 @@ struct thread_struct { | |||
| 152 | unsigned long dbcr0; /* debug control register values */ | 167 | unsigned long dbcr0; /* debug control register values */ |
| 153 | unsigned long dbcr1; | 168 | unsigned long dbcr1; |
| 154 | #endif | 169 | #endif |
| 155 | double fpr[32]; /* Complete floating point set */ | 170 | /* FP and VSX 0-31 register set */ |
| 156 | struct { /* fpr ... fpscr must be contiguous */ | 171 | double fpr[32][TS_FPRWIDTH]; |
| 172 | struct { | ||
| 157 | 173 | ||
| 158 | unsigned int pad; | 174 | unsigned int pad; |
| 159 | unsigned int val; /* Floating point status */ | 175 | unsigned int val; /* Floating point status */ |
| @@ -173,6 +189,10 @@ struct thread_struct { | |||
| 173 | unsigned long vrsave; | 189 | unsigned long vrsave; |
| 174 | int used_vr; /* set if process has used altivec */ | 190 | int used_vr; /* set if process has used altivec */ |
| 175 | #endif /* CONFIG_ALTIVEC */ | 191 | #endif /* CONFIG_ALTIVEC */ |
| 192 | #ifdef CONFIG_VSX | ||
| 193 | /* VSR status */ | ||
| 194 | int used_vsr; /* set if process has used altivec */ | ||
| 195 | #endif /* CONFIG_VSX */ | ||
| 176 | #ifdef CONFIG_SPE | 196 | #ifdef CONFIG_SPE |
| 177 | unsigned long evr[32]; /* upper 32-bits of SPE regs */ | 197 | unsigned long evr[32]; /* upper 32-bits of SPE regs */ |
| 178 | u64 acc; /* Accumulator */ | 198 | u64 acc; /* Accumulator */ |
| @@ -202,7 +222,7 @@ struct thread_struct { | |||
| 202 | .ksp_limit = INIT_SP_LIMIT, \ | 222 | .ksp_limit = INIT_SP_LIMIT, \ |
| 203 | .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \ | 223 | .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \ |
| 204 | .fs = KERNEL_DS, \ | 224 | .fs = KERNEL_DS, \ |
| 205 | .fpr = {0}, \ | 225 | .fpr = {{0}}, \ |
| 206 | .fpscr = { .val = 0, }, \ | 226 | .fpscr = { .val = 0, }, \ |
| 207 | .fpexc_mode = 0, \ | 227 | .fpexc_mode = 0, \ |
| 208 | } | 228 | } |
| @@ -214,6 +234,8 @@ struct thread_struct { | |||
| 214 | #define thread_saved_pc(tsk) \ | 234 | #define thread_saved_pc(tsk) \ |
| 215 | ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) | 235 | ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) |
| 216 | 236 | ||
| 237 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.regs) | ||
| 238 | |||
| 217 | unsigned long get_wchan(struct task_struct *p); | 239 | unsigned long get_wchan(struct task_struct *p); |
| 218 | 240 | ||
| 219 | #define KSTK_EIP(tsk) ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) | 241 | #define KSTK_EIP(tsk) ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) |
