diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_interrupts.S')
-rw-r--r-- | arch/powerpc/kvm/book3s_interrupts.S | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S index 17cfae5497a3..f4dd041c14ea 100644 --- a/arch/powerpc/kvm/book3s_interrupts.S +++ b/arch/powerpc/kvm/book3s_interrupts.S | |||
@@ -26,8 +26,12 @@ | |||
26 | 26 | ||
27 | #if defined(CONFIG_PPC_BOOK3S_64) | 27 | #if defined(CONFIG_PPC_BOOK3S_64) |
28 | #define FUNC(name) GLUE(.,name) | 28 | #define FUNC(name) GLUE(.,name) |
29 | #define GET_SHADOW_VCPU(reg) addi reg, r13, PACA_SVCPU | ||
30 | |||
29 | #elif defined(CONFIG_PPC_BOOK3S_32) | 31 | #elif defined(CONFIG_PPC_BOOK3S_32) |
30 | #define FUNC(name) name | 32 | #define FUNC(name) name |
33 | #define GET_SHADOW_VCPU(reg) lwz reg, (THREAD + THREAD_KVM_SVCPU)(r2) | ||
34 | |||
31 | #endif /* CONFIG_PPC_BOOK3S_XX */ | 35 | #endif /* CONFIG_PPC_BOOK3S_XX */ |
32 | 36 | ||
33 | #define VCPU_LOAD_NVGPRS(vcpu) \ | 37 | #define VCPU_LOAD_NVGPRS(vcpu) \ |
@@ -87,8 +91,14 @@ kvm_start_entry: | |||
87 | VCPU_LOAD_NVGPRS(r4) | 91 | VCPU_LOAD_NVGPRS(r4) |
88 | 92 | ||
89 | kvm_start_lightweight: | 93 | kvm_start_lightweight: |
94 | /* Copy registers into shadow vcpu so we can access them in real mode */ | ||
95 | GET_SHADOW_VCPU(r3) | ||
96 | bl FUNC(kvmppc_copy_to_svcpu) | ||
97 | nop | ||
98 | REST_GPR(4, r1) | ||
90 | 99 | ||
91 | #ifdef CONFIG_PPC_BOOK3S_64 | 100 | #ifdef CONFIG_PPC_BOOK3S_64 |
101 | /* Get the dcbz32 flag */ | ||
92 | PPC_LL r3, VCPU_HFLAGS(r4) | 102 | PPC_LL r3, VCPU_HFLAGS(r4) |
93 | rldicl r3, r3, 0, 63 /* r3 &= 1 */ | 103 | rldicl r3, r3, 0, 63 /* r3 &= 1 */ |
94 | stb r3, HSTATE_RESTORE_HID5(r13) | 104 | stb r3, HSTATE_RESTORE_HID5(r13) |
@@ -111,9 +121,6 @@ kvm_start_lightweight: | |||
111 | * | 121 | * |
112 | */ | 122 | */ |
113 | 123 | ||
114 | .global kvmppc_handler_highmem | ||
115 | kvmppc_handler_highmem: | ||
116 | |||
117 | /* | 124 | /* |
118 | * Register usage at this point: | 125 | * Register usage at this point: |
119 | * | 126 | * |
@@ -125,18 +132,31 @@ kvmppc_handler_highmem: | |||
125 | * | 132 | * |
126 | */ | 133 | */ |
127 | 134 | ||
128 | /* R7 = vcpu */ | 135 | /* Transfer reg values from shadow vcpu back to vcpu struct */ |
129 | PPC_LL r7, GPR4(r1) | 136 | /* On 64-bit, interrupts are still off at this point */ |
137 | PPC_LL r3, GPR4(r1) /* vcpu pointer */ | ||
138 | GET_SHADOW_VCPU(r4) | ||
139 | bl FUNC(kvmppc_copy_from_svcpu) | ||
140 | nop | ||
130 | 141 | ||
131 | #ifdef CONFIG_PPC_BOOK3S_64 | 142 | #ifdef CONFIG_PPC_BOOK3S_64 |
143 | /* Re-enable interrupts */ | ||
144 | ld r3, HSTATE_HOST_MSR(r13) | ||
145 | ori r3, r3, MSR_EE | ||
146 | MTMSR_EERI(r3) | ||
147 | |||
132 | /* | 148 | /* |
133 | * Reload kernel SPRG3 value. | 149 | * Reload kernel SPRG3 value. |
134 | * No need to save guest value as usermode can't modify SPRG3. | 150 | * No need to save guest value as usermode can't modify SPRG3. |
135 | */ | 151 | */ |
136 | ld r3, PACA_SPRG3(r13) | 152 | ld r3, PACA_SPRG3(r13) |
137 | mtspr SPRN_SPRG3, r3 | 153 | mtspr SPRN_SPRG3, r3 |
154 | |||
138 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 155 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
139 | 156 | ||
157 | /* R7 = vcpu */ | ||
158 | PPC_LL r7, GPR4(r1) | ||
159 | |||
140 | PPC_STL r14, VCPU_GPR(R14)(r7) | 160 | PPC_STL r14, VCPU_GPR(R14)(r7) |
141 | PPC_STL r15, VCPU_GPR(R15)(r7) | 161 | PPC_STL r15, VCPU_GPR(R15)(r7) |
142 | PPC_STL r16, VCPU_GPR(R16)(r7) | 162 | PPC_STL r16, VCPU_GPR(R16)(r7) |
@@ -161,7 +181,7 @@ kvmppc_handler_highmem: | |||
161 | 181 | ||
162 | /* Restore r3 (kvm_run) and r4 (vcpu) */ | 182 | /* Restore r3 (kvm_run) and r4 (vcpu) */ |
163 | REST_2GPRS(3, r1) | 183 | REST_2GPRS(3, r1) |
164 | bl FUNC(kvmppc_handle_exit) | 184 | bl FUNC(kvmppc_handle_exit_pr) |
165 | 185 | ||
166 | /* If RESUME_GUEST, get back in the loop */ | 186 | /* If RESUME_GUEST, get back in the loop */ |
167 | cmpwi r3, RESUME_GUEST | 187 | cmpwi r3, RESUME_GUEST |