Skip to content

Commit afa9b48

Browse files
author
Marc Zyngier
committed
KVM: arm64: Shave a few bytes from the EL2 idmap code
Our idmap is becoming too big, to the point where it doesn't fit in a 4kB page anymore. There are some low-hanging fruits though, such as the el2_init_state horror that is expanded 3 times in the kernel. Let's at least limit ourselves to two copies, which makes the kernel link again. At some point, we'll have to have a better way of doing this. Reported-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20241009204903.GA3353168@thelio-3990X
1 parent df5fd75 commit afa9b48

File tree

3 files changed

+31
-23
lines changed

3 files changed

+31
-23
lines changed

arch/arm64/include/asm/kvm_asm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ struct kvm_nvhe_init_params {
178178
unsigned long hcr_el2;
179179
unsigned long vttbr;
180180
unsigned long vtcr;
181+
unsigned long tmp;
181182
};
182183

183184
/*

arch/arm64/kernel/asm-offsets.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ int main(void)
146146
DEFINE(NVHE_INIT_HCR_EL2, offsetof(struct kvm_nvhe_init_params, hcr_el2));
147147
DEFINE(NVHE_INIT_VTTBR, offsetof(struct kvm_nvhe_init_params, vttbr));
148148
DEFINE(NVHE_INIT_VTCR, offsetof(struct kvm_nvhe_init_params, vtcr));
149+
DEFINE(NVHE_INIT_TMP, offsetof(struct kvm_nvhe_init_params, tmp));
149150
#endif
150151
#ifdef CONFIG_CPU_PM
151152
DEFINE(CPU_CTX_SP, offsetof(struct cpu_suspend_ctx, sp));

arch/arm64/kvm/hyp/nvhe/hyp-init.S

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,25 @@
2424
.align 11
2525

2626
SYM_CODE_START(__kvm_hyp_init)
27-
ventry __invalid // Synchronous EL2t
28-
ventry __invalid // IRQ EL2t
29-
ventry __invalid // FIQ EL2t
30-
ventry __invalid // Error EL2t
27+
ventry . // Synchronous EL2t
28+
ventry . // IRQ EL2t
29+
ventry . // FIQ EL2t
30+
ventry . // Error EL2t
3131

32-
ventry __invalid // Synchronous EL2h
33-
ventry __invalid // IRQ EL2h
34-
ventry __invalid // FIQ EL2h
35-
ventry __invalid // Error EL2h
32+
ventry . // Synchronous EL2h
33+
ventry . // IRQ EL2h
34+
ventry . // FIQ EL2h
35+
ventry . // Error EL2h
3636

3737
ventry __do_hyp_init // Synchronous 64-bit EL1
38-
ventry __invalid // IRQ 64-bit EL1
39-
ventry __invalid // FIQ 64-bit EL1
40-
ventry __invalid // Error 64-bit EL1
38+
ventry . // IRQ 64-bit EL1
39+
ventry . // FIQ 64-bit EL1
40+
ventry . // Error 64-bit EL1
4141

42-
ventry __invalid // Synchronous 32-bit EL1
43-
ventry __invalid // IRQ 32-bit EL1
44-
ventry __invalid // FIQ 32-bit EL1
45-
ventry __invalid // Error 32-bit EL1
46-
47-
__invalid:
48-
b .
42+
ventry . // Synchronous 32-bit EL1
43+
ventry . // IRQ 32-bit EL1
44+
ventry . // FIQ 32-bit EL1
45+
ventry . // Error 32-bit EL1
4946

5047
/*
5148
* Only uses x0..x3 so as to not clobber callee-saved SMCCC registers.
@@ -76,6 +73,13 @@ __do_hyp_init:
7673
eret
7774
SYM_CODE_END(__kvm_hyp_init)
7875

76+
SYM_CODE_START_LOCAL(__kvm_init_el2_state)
77+
/* Initialize EL2 CPU state to sane values. */
78+
init_el2_state // Clobbers x0..x2
79+
finalise_el2_state
80+
ret
81+
SYM_CODE_END(__kvm_init_el2_state)
82+
7983
/*
8084
* Initialize the hypervisor in EL2.
8185
*
@@ -102,9 +106,12 @@ SYM_CODE_START_LOCAL(___kvm_hyp_init)
102106
// TPIDR_EL2 is used to preserve x0 across the macro maze...
103107
isb
104108
msr tpidr_el2, x0
105-
init_el2_state
106-
finalise_el2_state
109+
str lr, [x0, #NVHE_INIT_TMP]
110+
111+
bl __kvm_init_el2_state
112+
107113
mrs x0, tpidr_el2
114+
ldr lr, [x0, #NVHE_INIT_TMP]
108115

109116
1:
110117
ldr x1, [x0, #NVHE_INIT_TPIDR_EL2]
@@ -199,9 +206,8 @@ SYM_CODE_START_LOCAL(__kvm_hyp_init_cpu)
199206

200207
2: msr SPsel, #1 // We want to use SP_EL{1,2}
201208

202-
/* Initialize EL2 CPU state to sane values. */
203-
init_el2_state // Clobbers x0..x2
204-
finalise_el2_state
209+
bl __kvm_init_el2_state
210+
205211
__init_el2_nvhe_prepare_eret
206212

207213
/* Enable MMU, set vectors and stack. */

0 commit comments

Comments
 (0)