diff options
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 31 | ||||
-rw-r--r-- | arch/powerpc/kernel/traps.c | 7 |
2 files changed, 8 insertions, 30 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 4524500f30d6..c04cdf70d487 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -578,34 +578,15 @@ BEGIN_FTR_SECTION | |||
578 | ld r7,DSCR_DEFAULT@toc(2) | 578 | ld r7,DSCR_DEFAULT@toc(2) |
579 | ld r0,THREAD_DSCR(r4) | 579 | ld r0,THREAD_DSCR(r4) |
580 | cmpwi r6,0 | 580 | cmpwi r6,0 |
581 | li r8, FSCR_DSCR | ||
582 | bne 1f | 581 | bne 1f |
583 | ld r0,0(r7) | 582 | ld r0,0(r7) |
584 | b 3f | ||
585 | 1: | 583 | 1: |
586 | BEGIN_FTR_SECTION_NESTED(70) | 584 | BEGIN_FTR_SECTION_NESTED(70) |
587 | mfspr r6, SPRN_FSCR | 585 | mfspr r8, SPRN_FSCR |
588 | or r6, r6, r8 | 586 | rldimi r8, r6, FSCR_DSCR_LG, (63 - FSCR_DSCR_LG) |
589 | mtspr SPRN_FSCR, r6 | 587 | mtspr SPRN_FSCR, r8 |
590 | BEGIN_FTR_SECTION_NESTED(69) | 588 | END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70) |
591 | mfspr r6, SPRN_HFSCR | 589 | cmpd r0,r25 |
592 | or r6, r6, r8 | ||
593 | mtspr SPRN_HFSCR, r6 | ||
594 | END_FTR_SECTION_NESTED(CPU_FTR_HVMODE, CPU_FTR_HVMODE, 69) | ||
595 | b 4f | ||
596 | END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70) | ||
597 | 3: | ||
598 | BEGIN_FTR_SECTION_NESTED(70) | ||
599 | mfspr r6, SPRN_FSCR | ||
600 | andc r6, r6, r8 | ||
601 | mtspr SPRN_FSCR, r6 | ||
602 | BEGIN_FTR_SECTION_NESTED(69) | ||
603 | mfspr r6, SPRN_HFSCR | ||
604 | andc r6, r6, r8 | ||
605 | mtspr SPRN_HFSCR, r6 | ||
606 | END_FTR_SECTION_NESTED(CPU_FTR_HVMODE, CPU_FTR_HVMODE, 69) | ||
607 | END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70) | ||
608 | 4: cmpd r0,r25 | ||
609 | beq 2f | 590 | beq 2f |
610 | mtspr SPRN_DSCR,r0 | 591 | mtspr SPRN_DSCR,r0 |
611 | 2: | 592 | 2: |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 529a9329e8d9..f783c932faeb 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -1342,13 +1342,10 @@ void facility_unavailable_exception(struct pt_regs *regs) | |||
1342 | if (status == FSCR_DSCR_LG) { | 1342 | if (status == FSCR_DSCR_LG) { |
1343 | /* User is acessing the DSCR. Set the inherit bit and allow | 1343 | /* User is acessing the DSCR. Set the inherit bit and allow |
1344 | * the user to set it directly in future by setting via the | 1344 | * the user to set it directly in future by setting via the |
1345 | * H/FSCR DSCR bit. | 1345 | * FSCR DSCR bit. We always leave HFSCR DSCR set. |
1346 | */ | 1346 | */ |
1347 | current->thread.dscr_inherit = 1; | 1347 | current->thread.dscr_inherit = 1; |
1348 | if (hv) | 1348 | mtspr(SPRN_FSCR, value | FSCR_DSCR); |
1349 | mtspr(SPRN_HFSCR, value | HFSCR_DSCR); | ||
1350 | else | ||
1351 | mtspr(SPRN_FSCR, value | FSCR_DSCR); | ||
1352 | return; | 1349 | return; |
1353 | } | 1350 | } |
1354 | 1351 | ||