aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_rmhandlers.S
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/powerpc/kvm/book3s_rmhandlers.S
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'arch/powerpc/kvm/book3s_rmhandlers.S')
-rw-r--r--arch/powerpc/kvm/book3s_rmhandlers.S45
1 files changed, 28 insertions, 17 deletions
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S
index 506d5c316c96..1a1b34487e71 100644
--- a/arch/powerpc/kvm/book3s_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_rmhandlers.S
@@ -35,9 +35,7 @@
35 35
36#if defined(CONFIG_PPC_BOOK3S_64) 36#if defined(CONFIG_PPC_BOOK3S_64)
37 37
38#define LOAD_SHADOW_VCPU(reg) \ 38#define LOAD_SHADOW_VCPU(reg) GET_PACA(reg)
39 mfspr reg, SPRN_SPRG_PACA
40
41#define SHADOW_VCPU_OFF PACA_KVM_SVCPU 39#define SHADOW_VCPU_OFF PACA_KVM_SVCPU
42#define MSR_NOIRQ MSR_KERNEL & ~(MSR_IR | MSR_DR) 40#define MSR_NOIRQ MSR_KERNEL & ~(MSR_IR | MSR_DR)
43#define FUNC(name) GLUE(.,name) 41#define FUNC(name) GLUE(.,name)
@@ -72,7 +70,7 @@
72.global kvmppc_trampoline_\intno 70.global kvmppc_trampoline_\intno
73kvmppc_trampoline_\intno: 71kvmppc_trampoline_\intno:
74 72
75 mtspr SPRN_SPRG_SCRATCH0, r13 /* Save r13 */ 73 SET_SCRATCH0(r13) /* Save r13 */
76 74
77 /* 75 /*
78 * First thing to do is to find out if we're coming 76 * First thing to do is to find out if we're coming
@@ -91,7 +89,7 @@ kvmppc_trampoline_\intno:
91 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13) 89 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
92 mtcr r12 90 mtcr r12
93 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13) 91 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
94 mfspr r13, SPRN_SPRG_SCRATCH0 /* r13 = original r13 */ 92 GET_SCRATCH0(r13) /* r13 = original r13 */
95 b kvmppc_resume_\intno /* Get back original handler */ 93 b kvmppc_resume_\intno /* Get back original handler */
96 94
97 /* Now we know we're handling a KVM guest */ 95 /* Now we know we're handling a KVM guest */
@@ -114,6 +112,9 @@ INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_MACHINE_CHECK
114INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE 112INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE
115INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE 113INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE
116INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL 114INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL
115#ifdef CONFIG_PPC_BOOK3S_64
116INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL_HV
117#endif
117INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT 118INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT
118INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM 119INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM
119INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_FP_UNAVAIL 120INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_FP_UNAVAIL
@@ -158,7 +159,7 @@ kvmppc_handler_skip_ins:
158 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13) 159 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
159 mtcr r12 160 mtcr r12
160 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13) 161 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
161 mfspr r13, SPRN_SPRG_SCRATCH0 162 GET_SCRATCH0(r13)
162 163
163 /* And get back into the code */ 164 /* And get back into the code */
164 RFI 165 RFI
@@ -202,8 +203,25 @@ _GLOBAL(kvmppc_rmcall)
202 203
203#if defined(CONFIG_PPC_BOOK3S_32) 204#if defined(CONFIG_PPC_BOOK3S_32)
204#define STACK_LR INT_FRAME_SIZE+4 205#define STACK_LR INT_FRAME_SIZE+4
206
207/* load_up_xxx have to run with MSR_DR=0 on Book3S_32 */
208#define MSR_EXT_START \
209 PPC_STL r20, _NIP(r1); \
210 mfmsr r20; \
211 LOAD_REG_IMMEDIATE(r3, MSR_DR|MSR_EE); \
212 andc r3,r20,r3; /* Disable DR,EE */ \
213 mtmsr r3; \
214 sync
215
216#define MSR_EXT_END \
217 mtmsr r20; /* Enable DR,EE */ \
218 sync; \
219 PPC_LL r20, _NIP(r1)
220
205#elif defined(CONFIG_PPC_BOOK3S_64) 221#elif defined(CONFIG_PPC_BOOK3S_64)
206#define STACK_LR _LINK 222#define STACK_LR _LINK
223#define MSR_EXT_START
224#define MSR_EXT_END
207#endif 225#endif
208 226
209/* 227/*
@@ -215,19 +233,12 @@ _GLOBAL(kvmppc_load_up_ ## what); \
215 PPC_STLU r1, -INT_FRAME_SIZE(r1); \ 233 PPC_STLU r1, -INT_FRAME_SIZE(r1); \
216 mflr r3; \ 234 mflr r3; \
217 PPC_STL r3, STACK_LR(r1); \ 235 PPC_STL r3, STACK_LR(r1); \
218 PPC_STL r20, _NIP(r1); \ 236 MSR_EXT_START; \
219 mfmsr r20; \
220 LOAD_REG_IMMEDIATE(r3, MSR_DR|MSR_EE); \
221 andc r3,r20,r3; /* Disable DR,EE */ \
222 mtmsr r3; \
223 sync; \
224 \ 237 \
225 bl FUNC(load_up_ ## what); \ 238 bl FUNC(load_up_ ## what); \
226 \ 239 \
227 mtmsr r20; /* Enable DR,EE */ \ 240 MSR_EXT_END; \
228 sync; \
229 PPC_LL r3, STACK_LR(r1); \ 241 PPC_LL r3, STACK_LR(r1); \
230 PPC_LL r20, _NIP(r1); \
231 mtlr r3; \ 242 mtlr r3; \
232 addi r1, r1, INT_FRAME_SIZE; \ 243 addi r1, r1, INT_FRAME_SIZE; \
233 blr 244 blr
@@ -242,10 +253,10 @@ define_load_up(vsx)
242 253
243.global kvmppc_trampoline_lowmem 254.global kvmppc_trampoline_lowmem
244kvmppc_trampoline_lowmem: 255kvmppc_trampoline_lowmem:
245 .long kvmppc_handler_lowmem_trampoline - CONFIG_KERNEL_START 256 PPC_LONG kvmppc_handler_lowmem_trampoline - CONFIG_KERNEL_START
246 257
247.global kvmppc_trampoline_enter 258.global kvmppc_trampoline_enter
248kvmppc_trampoline_enter: 259kvmppc_trampoline_enter:
249 .long kvmppc_handler_trampoline_enter - CONFIG_KERNEL_START 260 PPC_LONG kvmppc_handler_trampoline_enter - CONFIG_KERNEL_START
250 261
251#include "book3s_segment.S" 262#include "book3s_segment.S"