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 | ||
