diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/powerpc/kvm/book3s_rmhandlers.S | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.S | 45 |
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 |
73 | kvmppc_trampoline_\intno: | 71 | kvmppc_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 | |||
114 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE | 112 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE |
115 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE | 113 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE |
116 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL | 114 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL |
115 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
116 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL_HV | ||
117 | #endif | ||
117 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT | 118 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT |
118 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM | 119 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM |
119 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_FP_UNAVAIL | 120 | INTERRUPT_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 |
244 | kvmppc_trampoline_lowmem: | 255 | kvmppc_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 |
248 | kvmppc_trampoline_enter: | 259 | kvmppc_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" |