diff options
author | Mihai Caraman <mihai.caraman@freescale.com> | 2013-08-08 08:56:09 -0400 |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2014-01-07 19:15:29 -0500 |
commit | 228b1a473037c89d524e03a569c688a22241b4ea (patch) | |
tree | 89148336fa415353ad442861ab17d4beda3f8973 | |
parent | dece8ada993e1764a115bdff0f1effffaa5fc8dc (diff) |
powerpc/booke64: Add LRAT error exception handler
LRAT (Logical to Real Address Translation) present in MMU v2 provides hardware
translation from a logical page number (LPN) to a real page number (RPN) when
tlbwe is executed by a guest or when a page table translation occurs from a
guest virtual address.
Add LRAT error exception handler to Booke3E 64-bit kernel and the basic KVM
handler to avoid build breakage. This is a prerequisite for KVM LRAT support
that will follow.
Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
-rw-r--r-- | arch/powerpc/include/asm/kvm_asm.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg_booke.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/cpu_setup_fsl_booke.S | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/exceptions-64e.S | 17 | ||||
-rw-r--r-- | arch/powerpc/kvm/bookehv_interrupts.S | 2 |
5 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index 1bd92fd43cfb..1503d8c7c41b 100644 --- a/arch/powerpc/include/asm/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h | |||
@@ -74,6 +74,7 @@ | |||
74 | #define BOOKE_INTERRUPT_GUEST_DBELL_CRIT 39 | 74 | #define BOOKE_INTERRUPT_GUEST_DBELL_CRIT 39 |
75 | #define BOOKE_INTERRUPT_HV_SYSCALL 40 | 75 | #define BOOKE_INTERRUPT_HV_SYSCALL 40 |
76 | #define BOOKE_INTERRUPT_HV_PRIV 41 | 76 | #define BOOKE_INTERRUPT_HV_PRIV 41 |
77 | #define BOOKE_INTERRUPT_LRAT_ERROR 42 | ||
77 | 78 | ||
78 | /* book3s */ | 79 | /* book3s */ |
79 | 80 | ||
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index 2e31aacd8acc..1f7134dd0946 100644 --- a/arch/powerpc/include/asm/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h | |||
@@ -101,6 +101,7 @@ | |||
101 | #define SPRN_IVOR39 0x1B1 /* Interrupt Vector Offset Register 39 */ | 101 | #define SPRN_IVOR39 0x1B1 /* Interrupt Vector Offset Register 39 */ |
102 | #define SPRN_IVOR40 0x1B2 /* Interrupt Vector Offset Register 40 */ | 102 | #define SPRN_IVOR40 0x1B2 /* Interrupt Vector Offset Register 40 */ |
103 | #define SPRN_IVOR41 0x1B3 /* Interrupt Vector Offset Register 41 */ | 103 | #define SPRN_IVOR41 0x1B3 /* Interrupt Vector Offset Register 41 */ |
104 | #define SPRN_IVOR42 0x1B4 /* Interrupt Vector Offset Register 42 */ | ||
104 | #define SPRN_GIVOR2 0x1B8 /* Guest IVOR2 */ | 105 | #define SPRN_GIVOR2 0x1B8 /* Guest IVOR2 */ |
105 | #define SPRN_GIVOR3 0x1B9 /* Guest IVOR3 */ | 106 | #define SPRN_GIVOR3 0x1B9 /* Guest IVOR3 */ |
106 | #define SPRN_GIVOR4 0x1BA /* Guest IVOR4 */ | 107 | #define SPRN_GIVOR4 0x1BA /* Guest IVOR4 */ |
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S b/arch/powerpc/kernel/cpu_setup_fsl_booke.S index bfb18c7290b7..fa6862db8a02 100644 --- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S +++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S | |||
@@ -57,6 +57,12 @@ _GLOBAL(__setup_cpu_e6500) | |||
57 | mflr r6 | 57 | mflr r6 |
58 | #ifdef CONFIG_PPC64 | 58 | #ifdef CONFIG_PPC64 |
59 | bl .setup_altivec_ivors | 59 | bl .setup_altivec_ivors |
60 | /* Touch IVOR42 only if the CPU supports E.HV category */ | ||
61 | mfspr r10,SPRN_MMUCFG | ||
62 | rlwinm. r10,r10,0,MMUCFG_LPIDSIZE | ||
63 | beq 1f | ||
64 | bl .setup_lrat_ivor | ||
65 | 1: | ||
60 | #endif | 66 | #endif |
61 | bl __setup_cpu_e5500 | 67 | bl __setup_cpu_e5500 |
62 | mtlr r6 | 68 | mtlr r6 |
@@ -119,6 +125,12 @@ _GLOBAL(__setup_cpu_e5500) | |||
119 | _GLOBAL(__restore_cpu_e6500) | 125 | _GLOBAL(__restore_cpu_e6500) |
120 | mflr r5 | 126 | mflr r5 |
121 | bl .setup_altivec_ivors | 127 | bl .setup_altivec_ivors |
128 | /* Touch IVOR42 only if the CPU supports E.HV category */ | ||
129 | mfspr r10,SPRN_MMUCFG | ||
130 | rlwinm. r10,r10,0,MMUCFG_LPIDSIZE | ||
131 | beq 1f | ||
132 | bl .setup_lrat_ivor | ||
133 | 1: | ||
122 | bl __restore_cpu_e5500 | 134 | bl __restore_cpu_e5500 |
123 | mtlr r5 | 135 | mtlr r5 |
124 | blr | 136 | blr |
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S index e7751561fd1d..4d5a0b1034e8 100644 --- a/arch/powerpc/kernel/exceptions-64e.S +++ b/arch/powerpc/kernel/exceptions-64e.S | |||
@@ -308,6 +308,7 @@ interrupt_base_book3e: /* fake trap */ | |||
308 | EXCEPTION_STUB(0x2e0, guest_doorbell_crit) | 308 | EXCEPTION_STUB(0x2e0, guest_doorbell_crit) |
309 | EXCEPTION_STUB(0x300, hypercall) | 309 | EXCEPTION_STUB(0x300, hypercall) |
310 | EXCEPTION_STUB(0x320, ehpriv) | 310 | EXCEPTION_STUB(0x320, ehpriv) |
311 | EXCEPTION_STUB(0x340, lrat_error) | ||
311 | 312 | ||
312 | .globl interrupt_end_book3e | 313 | .globl interrupt_end_book3e |
313 | interrupt_end_book3e: | 314 | interrupt_end_book3e: |
@@ -677,6 +678,17 @@ kernel_dbg_exc: | |||
677 | bl .unknown_exception | 678 | bl .unknown_exception |
678 | b .ret_from_except | 679 | b .ret_from_except |
679 | 680 | ||
681 | /* LRAT Error interrupt */ | ||
682 | START_EXCEPTION(lrat_error); | ||
683 | NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR, | ||
684 | PROLOG_ADDITION_NONE) | ||
685 | EXCEPTION_COMMON(0x340, PACA_EXGEN, INTS_KEEP) | ||
686 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
687 | bl .save_nvgprs | ||
688 | INTS_RESTORE_HARD | ||
689 | bl .unknown_exception | ||
690 | b .ret_from_except | ||
691 | |||
680 | /* | 692 | /* |
681 | * An interrupt came in while soft-disabled; We mark paca->irq_happened | 693 | * An interrupt came in while soft-disabled; We mark paca->irq_happened |
682 | * accordingly and if the interrupt is level sensitive, we hard disable | 694 | * accordingly and if the interrupt is level sensitive, we hard disable |
@@ -859,6 +871,7 @@ BAD_STACK_TRAMPOLINE(0x2e0) | |||
859 | BAD_STACK_TRAMPOLINE(0x300) | 871 | BAD_STACK_TRAMPOLINE(0x300) |
860 | BAD_STACK_TRAMPOLINE(0x310) | 872 | BAD_STACK_TRAMPOLINE(0x310) |
861 | BAD_STACK_TRAMPOLINE(0x320) | 873 | BAD_STACK_TRAMPOLINE(0x320) |
874 | BAD_STACK_TRAMPOLINE(0x340) | ||
862 | BAD_STACK_TRAMPOLINE(0x400) | 875 | BAD_STACK_TRAMPOLINE(0x400) |
863 | BAD_STACK_TRAMPOLINE(0x500) | 876 | BAD_STACK_TRAMPOLINE(0x500) |
864 | BAD_STACK_TRAMPOLINE(0x600) | 877 | BAD_STACK_TRAMPOLINE(0x600) |
@@ -1414,3 +1427,7 @@ _GLOBAL(setup_ehv_ivors) | |||
1414 | SET_IVOR(38, 0x2c0) /* Guest Processor Doorbell */ | 1427 | SET_IVOR(38, 0x2c0) /* Guest Processor Doorbell */ |
1415 | SET_IVOR(39, 0x2e0) /* Guest Processor Doorbell Crit/MC */ | 1428 | SET_IVOR(39, 0x2e0) /* Guest Processor Doorbell Crit/MC */ |
1416 | blr | 1429 | blr |
1430 | |||
1431 | _GLOBAL(setup_lrat_ivor) | ||
1432 | SET_IVOR(42, 0x340) /* LRAT Error */ | ||
1433 | blr | ||
diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S index e8ed7d659c55..a0d6929d8678 100644 --- a/arch/powerpc/kvm/bookehv_interrupts.S +++ b/arch/powerpc/kvm/bookehv_interrupts.S | |||
@@ -319,6 +319,8 @@ kvm_handler BOOKE_INTERRUPT_DEBUG, EX_PARAMS(DBG), \ | |||
319 | SPRN_DSRR0, SPRN_DSRR1, 0 | 319 | SPRN_DSRR0, SPRN_DSRR1, 0 |
320 | kvm_handler BOOKE_INTERRUPT_DEBUG, EX_PARAMS(CRIT), \ | 320 | kvm_handler BOOKE_INTERRUPT_DEBUG, EX_PARAMS(CRIT), \ |
321 | SPRN_CSRR0, SPRN_CSRR1, 0 | 321 | SPRN_CSRR0, SPRN_CSRR1, 0 |
322 | kvm_handler BOOKE_INTERRUPT_LRAT_ERROR, EX_PARAMS(GEN), \ | ||
323 | SPRN_SRR0, SPRN_SRR1, (NEED_EMU | NEED_DEAR | NEED_ESR) | ||
322 | #else | 324 | #else |
323 | /* | 325 | /* |
324 | * For input register values, see arch/powerpc/include/asm/kvm_booke_hv_asm.h | 326 | * For input register values, see arch/powerpc/include/asm/kvm_booke_hv_asm.h |