KVM: arm64: Extract __do_hyp_init into a helper function
authorDavid Brazdil <dbrazdil@google.com>
Wed, 2 Dec 2020 18:41:15 +0000 (18:41 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 4 Dec 2020 10:08:35 +0000 (10:08 +0000)
In preparation for adding a CPU entry point in nVHE hyp code, extract
most of __do_hyp_init hypervisor initialization code into a common
helper function. This will be invoked by the entry point to install KVM
on the newly booted CPU.

Signed-off-by: David Brazdil <dbrazdil@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201202184122.26046-20-dbrazdil@google.com
arch/arm64/kvm/hyp/nvhe/hyp-init.S

index 712f572..b0856b0 100644 (file)
@@ -68,17 +68,36 @@ __do_hyp_init:
        mov     x0, #SMCCC_RET_NOT_SUPPORTED
        eret
 
-1:     ldr     x0, [x1, #NVHE_INIT_TPIDR_EL2]
-       msr     tpidr_el2, x0
+1:     mov     x0, x1
+       mov     x4, lr
+       bl      ___kvm_hyp_init
+       mov     lr, x4
 
-       ldr     x0, [x1, #NVHE_INIT_MAIR_EL2]
-       msr     mair_el2, x0
+       /* Hello, World! */
+       mov     x0, #SMCCC_RET_SUCCESS
+       eret
+SYM_CODE_END(__kvm_hyp_init)
+
+/*
+ * Initialize the hypervisor in EL2.
+ *
+ * Only uses x0..x3 so as to not clobber callee-saved SMCCC registers
+ * and leave x4 for the caller.
+ *
+ * x0: struct kvm_nvhe_init_params PA
+ */
+SYM_CODE_START_LOCAL(___kvm_hyp_init)
+       ldr     x1, [x0, #NVHE_INIT_TPIDR_EL2]
+       msr     tpidr_el2, x1
+
+       ldr     x1, [x0, #NVHE_INIT_STACK_HYP_VA]
+       mov     sp, x1
 
-       ldr     x0, [x1, #NVHE_INIT_STACK_HYP_VA]
-       mov     sp, x0
+       ldr     x1, [x0, #NVHE_INIT_MAIR_EL2]
+       msr     mair_el2, x1
 
-       ldr     x0, [x1, #NVHE_INIT_PGD_PA]
-       phys_to_ttbr x2, x0
+       ldr     x1, [x0, #NVHE_INIT_PGD_PA]
+       phys_to_ttbr x2, x1
 alternative_if ARM64_HAS_CNP
        orr     x2, x2, #TTBR_CNP_BIT
 alternative_else_nop_endif
@@ -87,9 +106,9 @@ alternative_else_nop_endif
        /*
         * Set the PS bits in TCR_EL2.
         */
-       ldr     x0, [x1, #NVHE_INIT_TCR_EL2]
-       tcr_compute_pa_size x0, #TCR_EL2_PS_SHIFT, x1, x2
-       msr     tcr_el2, x0
+       ldr     x1, [x0, #NVHE_INIT_TCR_EL2]
+       tcr_compute_pa_size x1, #TCR_EL2_PS_SHIFT, x2, x3
+       msr     tcr_el2, x1
 
        isb
 
@@ -117,10 +136,8 @@ alternative_else_nop_endif
        kimg_hyp_va x0, x1
        msr     vbar_el2, x0
 
-       /* Hello, World! */
-       mov     x0, #SMCCC_RET_SUCCESS
-       eret
-SYM_CODE_END(__kvm_hyp_init)
+       ret
+SYM_CODE_END(___kvm_hyp_init)
 
 SYM_CODE_START(__kvm_handle_stub_hvc)
        cmp     x0, #HVC_SOFT_RESTART