diff options
Diffstat (limited to 'arch/powerpc/kernel/signal_64.c')
-rw-r--r-- | arch/powerpc/kernel/signal_64.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index f93ec2835a13..b3c615764c9b 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -103,7 +103,8 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
103 | if (current->thread.used_vr) { | 103 | if (current->thread.used_vr) { |
104 | flush_altivec_to_thread(current); | 104 | flush_altivec_to_thread(current); |
105 | /* Copy 33 vec registers (vr0..31 and vscr) to the stack */ | 105 | /* Copy 33 vec registers (vr0..31 and vscr) to the stack */ |
106 | err |= __copy_to_user(v_regs, current->thread.vr, 33 * sizeof(vector128)); | 106 | err |= __copy_to_user(v_regs, ¤t->thread.vr_state, |
107 | 33 * sizeof(vector128)); | ||
107 | /* set MSR_VEC in the MSR value in the frame to indicate that sc->v_reg) | 108 | /* set MSR_VEC in the MSR value in the frame to indicate that sc->v_reg) |
108 | * contains valid data. | 109 | * contains valid data. |
109 | */ | 110 | */ |
@@ -195,18 +196,18 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, | |||
195 | if (current->thread.used_vr) { | 196 | if (current->thread.used_vr) { |
196 | flush_altivec_to_thread(current); | 197 | flush_altivec_to_thread(current); |
197 | /* Copy 33 vec registers (vr0..31 and vscr) to the stack */ | 198 | /* Copy 33 vec registers (vr0..31 and vscr) to the stack */ |
198 | err |= __copy_to_user(v_regs, current->thread.vr, | 199 | err |= __copy_to_user(v_regs, ¤t->thread.vr_state, |
199 | 33 * sizeof(vector128)); | 200 | 33 * sizeof(vector128)); |
200 | /* If VEC was enabled there are transactional VRs valid too, | 201 | /* If VEC was enabled there are transactional VRs valid too, |
201 | * else they're a copy of the checkpointed VRs. | 202 | * else they're a copy of the checkpointed VRs. |
202 | */ | 203 | */ |
203 | if (msr & MSR_VEC) | 204 | if (msr & MSR_VEC) |
204 | err |= __copy_to_user(tm_v_regs, | 205 | err |= __copy_to_user(tm_v_regs, |
205 | current->thread.transact_vr, | 206 | ¤t->thread.transact_vr, |
206 | 33 * sizeof(vector128)); | 207 | 33 * sizeof(vector128)); |
207 | else | 208 | else |
208 | err |= __copy_to_user(tm_v_regs, | 209 | err |= __copy_to_user(tm_v_regs, |
209 | current->thread.vr, | 210 | ¤t->thread.vr_state, |
210 | 33 * sizeof(vector128)); | 211 | 33 * sizeof(vector128)); |
211 | 212 | ||
212 | /* set MSR_VEC in the MSR value in the frame to indicate | 213 | /* set MSR_VEC in the MSR value in the frame to indicate |
@@ -349,10 +350,10 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
349 | return -EFAULT; | 350 | return -EFAULT; |
350 | /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ | 351 | /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ |
351 | if (v_regs != NULL && (msr & MSR_VEC) != 0) | 352 | if (v_regs != NULL && (msr & MSR_VEC) != 0) |
352 | err |= __copy_from_user(current->thread.vr, v_regs, | 353 | err |= __copy_from_user(¤t->thread.vr_state, v_regs, |
353 | 33 * sizeof(vector128)); | 354 | 33 * sizeof(vector128)); |
354 | else if (current->thread.used_vr) | 355 | else if (current->thread.used_vr) |
355 | memset(current->thread.vr, 0, 33 * sizeof(vector128)); | 356 | memset(¤t->thread.vr_state, 0, 33 * sizeof(vector128)); |
356 | /* Always get VRSAVE back */ | 357 | /* Always get VRSAVE back */ |
357 | if (v_regs != NULL) | 358 | if (v_regs != NULL) |
358 | err |= __get_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); | 359 | err |= __get_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); |
@@ -374,7 +375,7 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
374 | err |= copy_vsx_from_user(current, v_regs); | 375 | err |= copy_vsx_from_user(current, v_regs); |
375 | else | 376 | else |
376 | for (i = 0; i < 32 ; i++) | 377 | for (i = 0; i < 32 ; i++) |
377 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; | 378 | current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0; |
378 | #endif | 379 | #endif |
379 | return err; | 380 | return err; |
380 | } | 381 | } |
@@ -468,14 +469,14 @@ static long restore_tm_sigcontexts(struct pt_regs *regs, | |||
468 | return -EFAULT; | 469 | return -EFAULT; |
469 | /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ | 470 | /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ |
470 | if (v_regs != NULL && tm_v_regs != NULL && (msr & MSR_VEC) != 0) { | 471 | if (v_regs != NULL && tm_v_regs != NULL && (msr & MSR_VEC) != 0) { |
471 | err |= __copy_from_user(current->thread.vr, v_regs, | 472 | err |= __copy_from_user(¤t->thread.vr_state, v_regs, |
472 | 33 * sizeof(vector128)); | 473 | 33 * sizeof(vector128)); |
473 | err |= __copy_from_user(current->thread.transact_vr, tm_v_regs, | 474 | err |= __copy_from_user(¤t->thread.transact_vr, tm_v_regs, |
474 | 33 * sizeof(vector128)); | 475 | 33 * sizeof(vector128)); |
475 | } | 476 | } |
476 | else if (current->thread.used_vr) { | 477 | else if (current->thread.used_vr) { |
477 | memset(current->thread.vr, 0, 33 * sizeof(vector128)); | 478 | memset(¤t->thread.vr_state, 0, 33 * sizeof(vector128)); |
478 | memset(current->thread.transact_vr, 0, 33 * sizeof(vector128)); | 479 | memset(¤t->thread.transact_vr, 0, 33 * sizeof(vector128)); |
479 | } | 480 | } |
480 | /* Always get VRSAVE back */ | 481 | /* Always get VRSAVE back */ |
481 | if (v_regs != NULL && tm_v_regs != NULL) { | 482 | if (v_regs != NULL && tm_v_regs != NULL) { |
@@ -507,8 +508,8 @@ static long restore_tm_sigcontexts(struct pt_regs *regs, | |||
507 | err |= copy_transact_vsx_from_user(current, tm_v_regs); | 508 | err |= copy_transact_vsx_from_user(current, tm_v_regs); |
508 | } else { | 509 | } else { |
509 | for (i = 0; i < 32 ; i++) { | 510 | for (i = 0; i < 32 ; i++) { |
510 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; | 511 | current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0; |
511 | current->thread.transact_fpr[i][TS_VSRLOWOFFSET] = 0; | 512 | current->thread.transact_fp.fpr[i][TS_VSRLOWOFFSET] = 0; |
512 | } | 513 | } |
513 | } | 514 | } |
514 | #endif | 515 | #endif |
@@ -747,7 +748,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
747 | goto badframe; | 748 | goto badframe; |
748 | 749 | ||
749 | /* Make sure signal handler doesn't get spurious FP exceptions */ | 750 | /* Make sure signal handler doesn't get spurious FP exceptions */ |
750 | current->thread.fpscr.val = 0; | 751 | current->thread.fp_state.fpscr = 0; |
751 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 752 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
752 | /* Remove TM bits from thread's MSR. The MSR in the sigcontext | 753 | /* Remove TM bits from thread's MSR. The MSR in the sigcontext |
753 | * just indicates to userland that we were doing a transaction, but we | 754 | * just indicates to userland that we were doing a transaction, but we |
@@ -773,8 +774,9 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
773 | 774 | ||
774 | /* Set up "regs" so we "return" to the signal handler. */ | 775 | /* Set up "regs" so we "return" to the signal handler. */ |
775 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | 776 | err |= get_user(regs->nip, &funct_desc_ptr->entry); |
776 | /* enter the signal handler in big-endian mode */ | 777 | /* enter the signal handler in native-endian mode */ |
777 | regs->msr &= ~MSR_LE; | 778 | regs->msr &= ~MSR_LE; |
779 | regs->msr |= (MSR_KERNEL & MSR_LE); | ||
778 | regs->gpr[1] = newsp; | 780 | regs->gpr[1] = newsp; |
779 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | 781 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); |
780 | regs->gpr[3] = signr; | 782 | regs->gpr[3] = signr; |