diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2015-04-13 10:01:37 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-04-13 10:01:37 -0400 |
commit | 98b0429b7abd5c05efdb23f3eba02ec3f696748e (patch) | |
tree | 44e6028c3be974dd42665510ada6a09fb5f8f1be /arch/mips/kernel | |
parent | 3cf29543413207d3ab1c3f62a88c09bb46f2264e (diff) | |
parent | 1f3a2c6e229ccb8df8115b04d16ad4832767cf3a (diff) |
Merge branch '4.1-fp' into mips-for-linux-next
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/asm-offsets.c | 66 | ||||
-rw-r--r-- | arch/mips/kernel/genex.S | 11 | ||||
-rw-r--r-- | arch/mips/kernel/ptrace.c | 30 | ||||
-rw-r--r-- | arch/mips/kernel/r4k_fpu.S | 2 |
4 files changed, 35 insertions, 74 deletions
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index 750d67ac41e9..3ee1565c5be3 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
@@ -167,72 +167,6 @@ void output_thread_fpu_defines(void) | |||
167 | OFFSET(THREAD_FPR30, task_struct, thread.fpu.fpr[30]); | 167 | OFFSET(THREAD_FPR30, task_struct, thread.fpu.fpr[30]); |
168 | OFFSET(THREAD_FPR31, task_struct, thread.fpu.fpr[31]); | 168 | OFFSET(THREAD_FPR31, task_struct, thread.fpu.fpr[31]); |
169 | 169 | ||
170 | /* the least significant 64 bits of each FP register */ | ||
171 | OFFSET(THREAD_FPR0_LS64, task_struct, | ||
172 | thread.fpu.fpr[0].val64[FPR_IDX(64, 0)]); | ||
173 | OFFSET(THREAD_FPR1_LS64, task_struct, | ||
174 | thread.fpu.fpr[1].val64[FPR_IDX(64, 0)]); | ||
175 | OFFSET(THREAD_FPR2_LS64, task_struct, | ||
176 | thread.fpu.fpr[2].val64[FPR_IDX(64, 0)]); | ||
177 | OFFSET(THREAD_FPR3_LS64, task_struct, | ||
178 | thread.fpu.fpr[3].val64[FPR_IDX(64, 0)]); | ||
179 | OFFSET(THREAD_FPR4_LS64, task_struct, | ||
180 | thread.fpu.fpr[4].val64[FPR_IDX(64, 0)]); | ||
181 | OFFSET(THREAD_FPR5_LS64, task_struct, | ||
182 | thread.fpu.fpr[5].val64[FPR_IDX(64, 0)]); | ||
183 | OFFSET(THREAD_FPR6_LS64, task_struct, | ||
184 | thread.fpu.fpr[6].val64[FPR_IDX(64, 0)]); | ||
185 | OFFSET(THREAD_FPR7_LS64, task_struct, | ||
186 | thread.fpu.fpr[7].val64[FPR_IDX(64, 0)]); | ||
187 | OFFSET(THREAD_FPR8_LS64, task_struct, | ||
188 | thread.fpu.fpr[8].val64[FPR_IDX(64, 0)]); | ||
189 | OFFSET(THREAD_FPR9_LS64, task_struct, | ||
190 | thread.fpu.fpr[9].val64[FPR_IDX(64, 0)]); | ||
191 | OFFSET(THREAD_FPR10_LS64, task_struct, | ||
192 | thread.fpu.fpr[10].val64[FPR_IDX(64, 0)]); | ||
193 | OFFSET(THREAD_FPR11_LS64, task_struct, | ||
194 | thread.fpu.fpr[11].val64[FPR_IDX(64, 0)]); | ||
195 | OFFSET(THREAD_FPR12_LS64, task_struct, | ||
196 | thread.fpu.fpr[12].val64[FPR_IDX(64, 0)]); | ||
197 | OFFSET(THREAD_FPR13_LS64, task_struct, | ||
198 | thread.fpu.fpr[13].val64[FPR_IDX(64, 0)]); | ||
199 | OFFSET(THREAD_FPR14_LS64, task_struct, | ||
200 | thread.fpu.fpr[14].val64[FPR_IDX(64, 0)]); | ||
201 | OFFSET(THREAD_FPR15_LS64, task_struct, | ||
202 | thread.fpu.fpr[15].val64[FPR_IDX(64, 0)]); | ||
203 | OFFSET(THREAD_FPR16_LS64, task_struct, | ||
204 | thread.fpu.fpr[16].val64[FPR_IDX(64, 0)]); | ||
205 | OFFSET(THREAD_FPR17_LS64, task_struct, | ||
206 | thread.fpu.fpr[17].val64[FPR_IDX(64, 0)]); | ||
207 | OFFSET(THREAD_FPR18_LS64, task_struct, | ||
208 | thread.fpu.fpr[18].val64[FPR_IDX(64, 0)]); | ||
209 | OFFSET(THREAD_FPR19_LS64, task_struct, | ||
210 | thread.fpu.fpr[19].val64[FPR_IDX(64, 0)]); | ||
211 | OFFSET(THREAD_FPR20_LS64, task_struct, | ||
212 | thread.fpu.fpr[20].val64[FPR_IDX(64, 0)]); | ||
213 | OFFSET(THREAD_FPR21_LS64, task_struct, | ||
214 | thread.fpu.fpr[21].val64[FPR_IDX(64, 0)]); | ||
215 | OFFSET(THREAD_FPR22_LS64, task_struct, | ||
216 | thread.fpu.fpr[22].val64[FPR_IDX(64, 0)]); | ||
217 | OFFSET(THREAD_FPR23_LS64, task_struct, | ||
218 | thread.fpu.fpr[23].val64[FPR_IDX(64, 0)]); | ||
219 | OFFSET(THREAD_FPR24_LS64, task_struct, | ||
220 | thread.fpu.fpr[24].val64[FPR_IDX(64, 0)]); | ||
221 | OFFSET(THREAD_FPR25_LS64, task_struct, | ||
222 | thread.fpu.fpr[25].val64[FPR_IDX(64, 0)]); | ||
223 | OFFSET(THREAD_FPR26_LS64, task_struct, | ||
224 | thread.fpu.fpr[26].val64[FPR_IDX(64, 0)]); | ||
225 | OFFSET(THREAD_FPR27_LS64, task_struct, | ||
226 | thread.fpu.fpr[27].val64[FPR_IDX(64, 0)]); | ||
227 | OFFSET(THREAD_FPR28_LS64, task_struct, | ||
228 | thread.fpu.fpr[28].val64[FPR_IDX(64, 0)]); | ||
229 | OFFSET(THREAD_FPR29_LS64, task_struct, | ||
230 | thread.fpu.fpr[29].val64[FPR_IDX(64, 0)]); | ||
231 | OFFSET(THREAD_FPR30_LS64, task_struct, | ||
232 | thread.fpu.fpr[30].val64[FPR_IDX(64, 0)]); | ||
233 | OFFSET(THREAD_FPR31_LS64, task_struct, | ||
234 | thread.fpu.fpr[31].val64[FPR_IDX(64, 0)]); | ||
235 | |||
236 | OFFSET(THREAD_FCR31, task_struct, thread.fpu.fcr31); | 170 | OFFSET(THREAD_FCR31, task_struct, thread.fpu.fcr31); |
237 | OFFSET(THREAD_MSA_CSR, task_struct, thread.fpu.msacsr); | 171 | OFFSET(THREAD_MSA_CSR, task_struct, thread.fpu.msacsr); |
238 | BLANK(); | 172 | BLANK(); |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index 07c4a25b16ea..50e9db6f6cba 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -368,6 +368,15 @@ NESTED(nmi_handler, PT_SIZE, sp) | |||
368 | STI | 368 | STI |
369 | .endm | 369 | .endm |
370 | 370 | ||
371 | .macro __build_clear_msa_fpe | ||
372 | _cfcmsa a1, MSA_CSR | ||
373 | li a2, ~(0x3f << 12) | ||
374 | and a1, a1, a2 | ||
375 | _ctcmsa MSA_CSR, a1 | ||
376 | TRACE_IRQS_ON | ||
377 | STI | ||
378 | .endm | ||
379 | |||
371 | .macro __build_clear_ade | 380 | .macro __build_clear_ade |
372 | MFC0 t0, CP0_BADVADDR | 381 | MFC0 t0, CP0_BADVADDR |
373 | PTR_S t0, PT_BVADDR(sp) | 382 | PTR_S t0, PT_BVADDR(sp) |
@@ -426,7 +435,7 @@ NESTED(nmi_handler, PT_SIZE, sp) | |||
426 | BUILD_HANDLER cpu cpu sti silent /* #11 */ | 435 | BUILD_HANDLER cpu cpu sti silent /* #11 */ |
427 | BUILD_HANDLER ov ov sti silent /* #12 */ | 436 | BUILD_HANDLER ov ov sti silent /* #12 */ |
428 | BUILD_HANDLER tr tr sti silent /* #13 */ | 437 | BUILD_HANDLER tr tr sti silent /* #13 */ |
429 | BUILD_HANDLER msa_fpe msa_fpe sti silent /* #14 */ | 438 | BUILD_HANDLER msa_fpe msa_fpe msa_fpe silent /* #14 */ |
430 | BUILD_HANDLER fpe fpe fpe silent /* #15 */ | 439 | BUILD_HANDLER fpe fpe fpe silent /* #15 */ |
431 | BUILD_HANDLER ftlb ftlb none silent /* #16 */ | 440 | BUILD_HANDLER ftlb ftlb none silent /* #16 */ |
432 | BUILD_HANDLER msa msa sti silent /* #21 */ | 441 | BUILD_HANDLER msa msa sti silent /* #21 */ |
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 6d1e3f8005f7..d544e774eea6 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
@@ -47,6 +47,26 @@ | |||
47 | #define CREATE_TRACE_POINTS | 47 | #define CREATE_TRACE_POINTS |
48 | #include <trace/events/syscalls.h> | 48 | #include <trace/events/syscalls.h> |
49 | 49 | ||
50 | static void init_fp_ctx(struct task_struct *target) | ||
51 | { | ||
52 | /* If FP has been used then the target already has context */ | ||
53 | if (tsk_used_math(target)) | ||
54 | return; | ||
55 | |||
56 | /* Begin with data registers set to all 1s... */ | ||
57 | memset(&target->thread.fpu.fpr, ~0, sizeof(target->thread.fpu.fpr)); | ||
58 | |||
59 | /* ...and FCSR zeroed */ | ||
60 | target->thread.fpu.fcr31 = 0; | ||
61 | |||
62 | /* | ||
63 | * Record that the target has "used" math, such that the context | ||
64 | * just initialised, and any modifications made by the caller, | ||
65 | * aren't discarded. | ||
66 | */ | ||
67 | set_stopped_child_used_math(target); | ||
68 | } | ||
69 | |||
50 | /* | 70 | /* |
51 | * Called by kernel/ptrace.c when detaching.. | 71 | * Called by kernel/ptrace.c when detaching.. |
52 | * | 72 | * |
@@ -146,6 +166,7 @@ int ptrace_setfpregs(struct task_struct *child, __u32 __user *data) | |||
146 | if (!access_ok(VERIFY_READ, data, 33 * 8)) | 166 | if (!access_ok(VERIFY_READ, data, 33 * 8)) |
147 | return -EIO; | 167 | return -EIO; |
148 | 168 | ||
169 | init_fp_ctx(child); | ||
149 | fregs = get_fpu_regs(child); | 170 | fregs = get_fpu_regs(child); |
150 | 171 | ||
151 | for (i = 0; i < 32; i++) { | 172 | for (i = 0; i < 32; i++) { |
@@ -445,6 +466,8 @@ static int fpr_set(struct task_struct *target, | |||
445 | 466 | ||
446 | /* XXX fcr31 */ | 467 | /* XXX fcr31 */ |
447 | 468 | ||
469 | init_fp_ctx(target); | ||
470 | |||
448 | if (sizeof(target->thread.fpu.fpr[i]) == sizeof(elf_fpreg_t)) | 471 | if (sizeof(target->thread.fpu.fpr[i]) == sizeof(elf_fpreg_t)) |
449 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 472 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
450 | &target->thread.fpu, | 473 | &target->thread.fpu, |
@@ -666,12 +689,7 @@ long arch_ptrace(struct task_struct *child, long request, | |||
666 | case FPR_BASE ... FPR_BASE + 31: { | 689 | case FPR_BASE ... FPR_BASE + 31: { |
667 | union fpureg *fregs = get_fpu_regs(child); | 690 | union fpureg *fregs = get_fpu_regs(child); |
668 | 691 | ||
669 | if (!tsk_used_math(child)) { | 692 | init_fp_ctx(child); |
670 | /* FP not yet used */ | ||
671 | memset(&child->thread.fpu, ~0, | ||
672 | sizeof(child->thread.fpu)); | ||
673 | child->thread.fpu.fcr31 = 0; | ||
674 | } | ||
675 | #ifdef CONFIG_32BIT | 693 | #ifdef CONFIG_32BIT |
676 | if (test_thread_flag(TIF_32BIT_FPREGS)) { | 694 | if (test_thread_flag(TIF_32BIT_FPREGS)) { |
677 | /* | 695 | /* |
diff --git a/arch/mips/kernel/r4k_fpu.S b/arch/mips/kernel/r4k_fpu.S index 676c5030a953..1d88af26ba82 100644 --- a/arch/mips/kernel/r4k_fpu.S +++ b/arch/mips/kernel/r4k_fpu.S | |||
@@ -34,7 +34,6 @@ | |||
34 | .endm | 34 | .endm |
35 | 35 | ||
36 | .set noreorder | 36 | .set noreorder |
37 | .set MIPS_ISA_ARCH_LEVEL_RAW | ||
38 | 37 | ||
39 | LEAF(_save_fp_context) | 38 | LEAF(_save_fp_context) |
40 | .set push | 39 | .set push |
@@ -103,6 +102,7 @@ LEAF(_save_fp_context) | |||
103 | /* Save 32-bit process floating point context */ | 102 | /* Save 32-bit process floating point context */ |
104 | LEAF(_save_fp_context32) | 103 | LEAF(_save_fp_context32) |
105 | .set push | 104 | .set push |
105 | .set MIPS_ISA_ARCH_LEVEL_RAW | ||
106 | SET_HARDFLOAT | 106 | SET_HARDFLOAT |
107 | cfc1 t1, fcr31 | 107 | cfc1 t1, fcr31 |
108 | 108 | ||