diff options
Diffstat (limited to 'arch/powerpc/kernel/entry_64.S')
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 2cd872b5283b..748e74fcf541 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -27,10 +27,7 @@ | |||
27 | #include <asm/ppc_asm.h> | 27 | #include <asm/ppc_asm.h> |
28 | #include <asm/asm-offsets.h> | 28 | #include <asm/asm-offsets.h> |
29 | #include <asm/cputable.h> | 29 | #include <asm/cputable.h> |
30 | 30 | #include <asm/firmware.h> | |
31 | #ifdef CONFIG_PPC_ISERIES | ||
32 | #define DO_SOFT_DISABLE | ||
33 | #endif | ||
34 | 31 | ||
35 | /* | 32 | /* |
36 | * System calls. | 33 | * System calls. |
@@ -91,6 +88,7 @@ system_call_common: | |||
91 | ld r11,exception_marker@toc(r2) | 88 | ld r11,exception_marker@toc(r2) |
92 | std r11,-16(r9) /* "regshere" marker */ | 89 | std r11,-16(r9) /* "regshere" marker */ |
93 | #ifdef CONFIG_PPC_ISERIES | 90 | #ifdef CONFIG_PPC_ISERIES |
91 | BEGIN_FW_FTR_SECTION | ||
94 | /* Hack for handling interrupts when soft-enabling on iSeries */ | 92 | /* Hack for handling interrupts when soft-enabling on iSeries */ |
95 | cmpdi cr1,r0,0x5555 /* syscall 0x5555 */ | 93 | cmpdi cr1,r0,0x5555 /* syscall 0x5555 */ |
96 | andi. r10,r12,MSR_PR /* from kernel */ | 94 | andi. r10,r12,MSR_PR /* from kernel */ |
@@ -98,6 +96,7 @@ system_call_common: | |||
98 | beq hardware_interrupt_entry | 96 | beq hardware_interrupt_entry |
99 | lbz r10,PACAPROCENABLED(r13) | 97 | lbz r10,PACAPROCENABLED(r13) |
100 | std r10,SOFTE(r1) | 98 | std r10,SOFTE(r1) |
99 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | ||
101 | #endif | 100 | #endif |
102 | mfmsr r11 | 101 | mfmsr r11 |
103 | ori r11,r11,MSR_EE | 102 | ori r11,r11,MSR_EE |
@@ -462,6 +461,7 @@ _GLOBAL(ret_from_except_lite) | |||
462 | 461 | ||
463 | restore: | 462 | restore: |
464 | #ifdef CONFIG_PPC_ISERIES | 463 | #ifdef CONFIG_PPC_ISERIES |
464 | BEGIN_FW_FTR_SECTION | ||
465 | ld r5,SOFTE(r1) | 465 | ld r5,SOFTE(r1) |
466 | cmpdi 0,r5,0 | 466 | cmpdi 0,r5,0 |
467 | beq 4f | 467 | beq 4f |
@@ -480,6 +480,7 @@ restore: | |||
480 | b .ret_from_except_lite /* loop back and handle more */ | 480 | b .ret_from_except_lite /* loop back and handle more */ |
481 | 481 | ||
482 | 4: stb r5,PACAPROCENABLED(r13) | 482 | 4: stb r5,PACAPROCENABLED(r13) |
483 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | ||
483 | #endif | 484 | #endif |
484 | 485 | ||
485 | ld r3,_MSR(r1) | 486 | ld r3,_MSR(r1) |
@@ -538,18 +539,23 @@ do_work: | |||
538 | lwz r8,TI_PREEMPT(r9) | 539 | lwz r8,TI_PREEMPT(r9) |
539 | cmpwi cr1,r8,0 | 540 | cmpwi cr1,r8,0 |
540 | #ifdef CONFIG_PPC_ISERIES | 541 | #ifdef CONFIG_PPC_ISERIES |
542 | BEGIN_FW_FTR_SECTION | ||
541 | ld r0,SOFTE(r1) | 543 | ld r0,SOFTE(r1) |
542 | cmpdi r0,0 | 544 | cmpdi r0,0 |
543 | #else | 545 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) |
544 | andi. r0,r3,MSR_EE | ||
545 | #endif | 546 | #endif |
547 | BEGIN_FW_FTR_SECTION | ||
548 | andi. r0,r3,MSR_EE | ||
549 | END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) | ||
546 | crandc eq,cr1*4+eq,eq | 550 | crandc eq,cr1*4+eq,eq |
547 | bne restore | 551 | bne restore |
548 | /* here we are preempting the current task */ | 552 | /* here we are preempting the current task */ |
549 | 1: | 553 | 1: |
550 | #ifdef CONFIG_PPC_ISERIES | 554 | #ifdef CONFIG_PPC_ISERIES |
555 | BEGIN_FW_FTR_SECTION | ||
551 | li r0,1 | 556 | li r0,1 |
552 | stb r0,PACAPROCENABLED(r13) | 557 | stb r0,PACAPROCENABLED(r13) |
558 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | ||
553 | #endif | 559 | #endif |
554 | ori r10,r10,MSR_EE | 560 | ori r10,r10,MSR_EE |
555 | mtmsrd r10,1 /* reenable interrupts */ | 561 | mtmsrd r10,1 /* reenable interrupts */ |