diff options
Diffstat (limited to 'arch/powerpc/kernel/entry_64.S')
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 748e74fcf541..1a3d4de197d2 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -87,15 +87,19 @@ system_call_common: | |||
87 | addi r9,r1,STACK_FRAME_OVERHEAD | 87 | addi r9,r1,STACK_FRAME_OVERHEAD |
88 | ld r11,exception_marker@toc(r2) | 88 | ld r11,exception_marker@toc(r2) |
89 | std r11,-16(r9) /* "regshere" marker */ | 89 | std r11,-16(r9) /* "regshere" marker */ |
90 | li r10,1 | ||
91 | stb r10,PACASOFTIRQEN(r13) | ||
92 | stb r10,PACAHARDIRQEN(r13) | ||
93 | std r10,SOFTE(r1) | ||
90 | #ifdef CONFIG_PPC_ISERIES | 94 | #ifdef CONFIG_PPC_ISERIES |
91 | BEGIN_FW_FTR_SECTION | 95 | BEGIN_FW_FTR_SECTION |
92 | /* Hack for handling interrupts when soft-enabling on iSeries */ | 96 | /* Hack for handling interrupts when soft-enabling on iSeries */ |
93 | cmpdi cr1,r0,0x5555 /* syscall 0x5555 */ | 97 | cmpdi cr1,r0,0x5555 /* syscall 0x5555 */ |
94 | andi. r10,r12,MSR_PR /* from kernel */ | 98 | andi. r10,r12,MSR_PR /* from kernel */ |
95 | crand 4*cr0+eq,4*cr1+eq,4*cr0+eq | 99 | crand 4*cr0+eq,4*cr1+eq,4*cr0+eq |
96 | beq hardware_interrupt_entry | 100 | bne 2f |
97 | lbz r10,PACAPROCENABLED(r13) | 101 | b hardware_interrupt_entry |
98 | std r10,SOFTE(r1) | 102 | 2: |
99 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | 103 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) |
100 | #endif | 104 | #endif |
101 | mfmsr r11 | 105 | mfmsr r11 |
@@ -460,9 +464,9 @@ _GLOBAL(ret_from_except_lite) | |||
460 | #endif | 464 | #endif |
461 | 465 | ||
462 | restore: | 466 | restore: |
467 | ld r5,SOFTE(r1) | ||
463 | #ifdef CONFIG_PPC_ISERIES | 468 | #ifdef CONFIG_PPC_ISERIES |
464 | BEGIN_FW_FTR_SECTION | 469 | BEGIN_FW_FTR_SECTION |
465 | ld r5,SOFTE(r1) | ||
466 | cmpdi 0,r5,0 | 470 | cmpdi 0,r5,0 |
467 | beq 4f | 471 | beq 4f |
468 | /* Check for pending interrupts (iSeries) */ | 472 | /* Check for pending interrupts (iSeries) */ |
@@ -472,21 +476,25 @@ BEGIN_FW_FTR_SECTION | |||
472 | beq+ 4f /* skip do_IRQ if no interrupts */ | 476 | beq+ 4f /* skip do_IRQ if no interrupts */ |
473 | 477 | ||
474 | li r3,0 | 478 | li r3,0 |
475 | stb r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */ | 479 | stb r3,PACASOFTIRQEN(r13) /* ensure we are soft-disabled */ |
476 | ori r10,r10,MSR_EE | 480 | ori r10,r10,MSR_EE |
477 | mtmsrd r10 /* hard-enable again */ | 481 | mtmsrd r10 /* hard-enable again */ |
478 | addi r3,r1,STACK_FRAME_OVERHEAD | 482 | addi r3,r1,STACK_FRAME_OVERHEAD |
479 | bl .do_IRQ | 483 | bl .do_IRQ |
480 | b .ret_from_except_lite /* loop back and handle more */ | 484 | b .ret_from_except_lite /* loop back and handle more */ |
481 | 485 | 4: | |
482 | 4: stb r5,PACAPROCENABLED(r13) | ||
483 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | 486 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) |
484 | #endif | 487 | #endif |
488 | stb r5,PACASOFTIRQEN(r13) | ||
485 | 489 | ||
486 | ld r3,_MSR(r1) | 490 | ld r3,_MSR(r1) |
487 | andi. r0,r3,MSR_RI | 491 | andi. r0,r3,MSR_RI |
488 | beq- unrecov_restore | 492 | beq- unrecov_restore |
489 | 493 | ||
494 | /* extract EE bit and use it to restore paca->hard_enabled */ | ||
495 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ | ||
496 | stb r4,PACAHARDIRQEN(r13) | ||
497 | |||
490 | andi. r0,r3,MSR_PR | 498 | andi. r0,r3,MSR_PR |
491 | 499 | ||
492 | /* | 500 | /* |
@@ -538,25 +546,15 @@ do_work: | |||
538 | /* Check that preempt_count() == 0 and interrupts are enabled */ | 546 | /* Check that preempt_count() == 0 and interrupts are enabled */ |
539 | lwz r8,TI_PREEMPT(r9) | 547 | lwz r8,TI_PREEMPT(r9) |
540 | cmpwi cr1,r8,0 | 548 | cmpwi cr1,r8,0 |
541 | #ifdef CONFIG_PPC_ISERIES | ||
542 | BEGIN_FW_FTR_SECTION | ||
543 | ld r0,SOFTE(r1) | 549 | ld r0,SOFTE(r1) |
544 | cmpdi r0,0 | 550 | cmpdi r0,0 |
545 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | ||
546 | #endif | ||
547 | BEGIN_FW_FTR_SECTION | ||
548 | andi. r0,r3,MSR_EE | ||
549 | END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) | ||
550 | crandc eq,cr1*4+eq,eq | 551 | crandc eq,cr1*4+eq,eq |
551 | bne restore | 552 | bne restore |
552 | /* here we are preempting the current task */ | 553 | /* here we are preempting the current task */ |
553 | 1: | 554 | 1: |
554 | #ifdef CONFIG_PPC_ISERIES | ||
555 | BEGIN_FW_FTR_SECTION | ||
556 | li r0,1 | 555 | li r0,1 |
557 | stb r0,PACAPROCENABLED(r13) | 556 | stb r0,PACASOFTIRQEN(r13) |
558 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | 557 | stb r0,PACAHARDIRQEN(r13) |
559 | #endif | ||
560 | ori r10,r10,MSR_EE | 558 | ori r10,r10,MSR_EE |
561 | mtmsrd r10,1 /* reenable interrupts */ | 559 | mtmsrd r10,1 /* reenable interrupts */ |
562 | bl .preempt_schedule | 560 | bl .preempt_schedule |
@@ -639,8 +637,7 @@ _GLOBAL(enter_rtas) | |||
639 | /* There is no way it is acceptable to get here with interrupts enabled, | 637 | /* There is no way it is acceptable to get here with interrupts enabled, |
640 | * check it with the asm equivalent of WARN_ON | 638 | * check it with the asm equivalent of WARN_ON |
641 | */ | 639 | */ |
642 | mfmsr r6 | 640 | lbz r0,PACASOFTIRQEN(r13) |
643 | andi. r0,r6,MSR_EE | ||
644 | 1: tdnei r0,0 | 641 | 1: tdnei r0,0 |
645 | .section __bug_table,"a" | 642 | .section __bug_table,"a" |
646 | .llong 1b,__LINE__ + 0x1000000, 1f, 2f | 643 | .llong 1b,__LINE__ + 0x1000000, 1f, 2f |
@@ -649,7 +646,13 @@ _GLOBAL(enter_rtas) | |||
649 | 1: .asciz __FILE__ | 646 | 1: .asciz __FILE__ |
650 | 2: .asciz "enter_rtas" | 647 | 2: .asciz "enter_rtas" |
651 | .previous | 648 | .previous |
652 | 649 | ||
650 | /* Hard-disable interrupts */ | ||
651 | mfmsr r6 | ||
652 | rldicl r7,r6,48,1 | ||
653 | rotldi r7,r7,16 | ||
654 | mtmsrd r7,1 | ||
655 | |||
653 | /* Unfortunately, the stack pointer and the MSR are also clobbered, | 656 | /* Unfortunately, the stack pointer and the MSR are also clobbered, |
654 | * so they are saved in the PACA which allows us to restore | 657 | * so they are saved in the PACA which allows us to restore |
655 | * our original state after RTAS returns. | 658 | * our original state after RTAS returns. |
@@ -735,8 +738,6 @@ _STATIC(rtas_restore_regs) | |||
735 | 738 | ||
736 | #endif /* CONFIG_PPC_RTAS */ | 739 | #endif /* CONFIG_PPC_RTAS */ |
737 | 740 | ||
738 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
739 | |||
740 | _GLOBAL(enter_prom) | 741 | _GLOBAL(enter_prom) |
741 | mflr r0 | 742 | mflr r0 |
742 | std r0,16(r1) | 743 | std r0,16(r1) |
@@ -821,5 +822,3 @@ _GLOBAL(enter_prom) | |||
821 | ld r0,16(r1) | 822 | ld r0,16(r1) |
822 | mtlr r0 | 823 | mtlr r0 |
823 | blr | 824 | blr |
824 | |||
825 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||