Skip to content

Commit d3918e7

Browse files
npigginmpe
authored andcommitted
KVM: PPC: Book3S: Change interrupt call to reduce scratch space use on HV
Change the calling convention to put the trap number together with CR in two halves of r12, which frees up HSTATE_SCRATCH2 in the HV handler. The 64-bit PR handler entry translates the calling convention back to match the previous call convention (i.e., shared with 32-bit), for simplicity. Signed-off-by: Nicholas Piggin <[email protected]> Acked-by: Paul Mackerras <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent 49def18 commit d3918e7

File tree

3 files changed

+38
-27
lines changed

3 files changed

+38
-27
lines changed

arch/powerpc/include/asm/exception-64s.h

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
233233

234234
#endif
235235

236-
#define __KVM_HANDLER_PROLOG(area, n) \
236+
#define __KVM_HANDLER(area, h, n) \
237237
BEGIN_FTR_SECTION_NESTED(947) \
238238
ld r10,area+EX_CFAR(r13); \
239239
std r10,HSTATE_CFAR(r13); \
@@ -243,30 +243,28 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
243243
std r10,HSTATE_PPR(r13); \
244244
END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \
245245
ld r10,area+EX_R10(r13); \
246-
stw r9,HSTATE_SCRATCH1(r13); \
247-
ld r9,area+EX_R9(r13); \
248246
std r12,HSTATE_SCRATCH0(r13); \
249-
250-
#define __KVM_HANDLER(area, h, n) \
251-
__KVM_HANDLER_PROLOG(area, n) \
252-
li r12,n; \
247+
sldi r12,r9,32; \
248+
ori r12,r12,(n); \
249+
ld r9,area+EX_R9(r13); \
253250
b kvmppc_interrupt
254251

255252
#define __KVM_HANDLER_SKIP(area, h, n) \
256253
cmpwi r10,KVM_GUEST_MODE_SKIP; \
257-
ld r10,area+EX_R10(r13); \
258254
beq 89f; \
259-
stw r9,HSTATE_SCRATCH1(r13); \
260255
BEGIN_FTR_SECTION_NESTED(948) \
261-
ld r9,area+EX_PPR(r13); \
262-
std r9,HSTATE_PPR(r13); \
256+
ld r10,area+EX_PPR(r13); \
257+
std r10,HSTATE_PPR(r13); \
263258
END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \
264-
ld r9,area+EX_R9(r13); \
259+
ld r10,area+EX_R10(r13); \
265260
std r12,HSTATE_SCRATCH0(r13); \
266-
li r12,n; \
261+
sldi r12,r9,32; \
262+
ori r12,r12,(n); \
263+
ld r9,area+EX_R9(r13); \
267264
b kvmppc_interrupt; \
268265
89: mtocrf 0x80,r9; \
269266
ld r9,area+EX_R9(r13); \
267+
ld r10,area+EX_R10(r13); \
270268
b kvmppc_skip_##h##interrupt
271269

272270
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER

arch/powerpc/kvm/book3s_hv_rmhandlers.S

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,19 +1057,18 @@ hdec_soon:
10571057
kvmppc_interrupt_hv:
10581058
/*
10591059
* Register contents:
1060-
* R12 = interrupt vector
1060+
* R12 = (guest CR << 32) | interrupt vector
10611061
* R13 = PACA
1062-
* guest CR, R12 saved in shadow VCPU SCRATCH1/0
1062+
* guest R12 saved in shadow VCPU SCRATCH0
10631063
* guest R13 saved in SPRN_SCRATCH0
10641064
*/
1065-
std r9, HSTATE_SCRATCH2(r13)
1066-
1065+
std r9, HSTATE_SCRATCH1(r13)
10671066
lbz r9, HSTATE_IN_GUEST(r13)
10681067
cmpwi r9, KVM_GUEST_MODE_HOST_HV
10691068
beq kvmppc_bad_host_intr
10701069
#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
10711070
cmpwi r9, KVM_GUEST_MODE_GUEST
1072-
ld r9, HSTATE_SCRATCH2(r13)
1071+
ld r9, HSTATE_SCRATCH1(r13)
10731072
beq kvmppc_interrupt_pr
10741073
#endif
10751074
/* We're now back in the host but in guest MMU context */
@@ -1089,13 +1088,14 @@ kvmppc_interrupt_hv:
10891088
std r6, VCPU_GPR(R6)(r9)
10901089
std r7, VCPU_GPR(R7)(r9)
10911090
std r8, VCPU_GPR(R8)(r9)
1092-
ld r0, HSTATE_SCRATCH2(r13)
1091+
ld r0, HSTATE_SCRATCH1(r13)
10931092
std r0, VCPU_GPR(R9)(r9)
10941093
std r10, VCPU_GPR(R10)(r9)
10951094
std r11, VCPU_GPR(R11)(r9)
10961095
ld r3, HSTATE_SCRATCH0(r13)
1097-
lwz r4, HSTATE_SCRATCH1(r13)
10981096
std r3, VCPU_GPR(R12)(r9)
1097+
/* CR is in the high half of r12 */
1098+
srdi r4, r12, 32
10991099
stw r4, VCPU_CR(r9)
11001100
BEGIN_FTR_SECTION
11011101
ld r3, HSTATE_CFAR(r13)
@@ -1114,6 +1114,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
11141114
mfspr r11, SPRN_SRR1
11151115
std r10, VCPU_SRR0(r9)
11161116
std r11, VCPU_SRR1(r9)
1117+
/* trap is in the low half of r12, clear CR from the high half */
1118+
clrldi r12, r12, 32
11171119
andi. r0, r12, 2 /* need to read HSRR0/1? */
11181120
beq 1f
11191121
mfspr r10, SPRN_HSRR0

arch/powerpc/kvm/book3s_segment.S

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,20 +167,31 @@ kvmppc_handler_trampoline_enter_end:
167167
* *
168168
*****************************************************************************/
169169

170-
.global kvmppc_handler_trampoline_exit
171-
kvmppc_handler_trampoline_exit:
172-
173170
.global kvmppc_interrupt_pr
174171
kvmppc_interrupt_pr:
172+
/* 64-bit entry. Register usage at this point:
173+
*
174+
* SPRG_SCRATCH0 = guest R13
175+
* R12 = (guest CR << 32) | exit handler id
176+
* R13 = PACA
177+
* HSTATE.SCRATCH0 = guest R12
178+
*/
179+
#ifdef CONFIG_PPC64
180+
/* Match 32-bit entry */
181+
rotldi r12, r12, 32 /* Flip R12 halves for stw */
182+
stw r12, HSTATE_SCRATCH1(r13) /* CR is now in the low half */
183+
srdi r12, r12, 32 /* shift trap into low half */
184+
#endif
175185

186+
.global kvmppc_handler_trampoline_exit
187+
kvmppc_handler_trampoline_exit:
176188
/* Register usage at this point:
177189
*
178-
* SPRG_SCRATCH0 = guest R13
179-
* R12 = exit handler id
180-
* R13 = shadow vcpu (32-bit) or PACA (64-bit)
190+
* SPRG_SCRATCH0 = guest R13
191+
* R12 = exit handler id
192+
* R13 = shadow vcpu (32-bit) or PACA (64-bit)
181193
* HSTATE.SCRATCH0 = guest R12
182194
* HSTATE.SCRATCH1 = guest CR
183-
*
184195
*/
185196

186197
/* Save registers */

0 commit comments

Comments
 (0)