lkml.org 
[lkml]   [2021]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[RFC PATCH v2 20/26] KVM: arm64: Set host stage 2 using kvm_nvhe_init_params
    From
    Move the registers relevant to host stage 2 enablement to
    kvm_nvhe_init_params to prepare the ground for enabling it in later
    patches.

    Signed-off-by: Quentin Perret <qperret@google.com>
    ---
    arch/arm64/include/asm/kvm_asm.h | 3 +++
    arch/arm64/kernel/asm-offsets.c | 3 +++
    arch/arm64/kvm/arm.c | 5 +++++
    arch/arm64/kvm/hyp/nvhe/hyp-init.S | 9 +++++++++
    arch/arm64/kvm/hyp/nvhe/switch.c | 5 +----
    5 files changed, 21 insertions(+), 4 deletions(-)

    diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
    index 4fc27ac08836..5354b05eb9e2 100644
    --- a/arch/arm64/include/asm/kvm_asm.h
    +++ b/arch/arm64/include/asm/kvm_asm.h
    @@ -158,6 +158,9 @@ struct kvm_nvhe_init_params {
    unsigned long tpidr_el2;
    unsigned long stack_hyp_va;
    phys_addr_t pgd_pa;
    + unsigned long hcr_el2;
    + unsigned long vttbr;
    + unsigned long vtcr;
    };

    /* Translate a kernel address @ptr into its equivalent linear mapping */
    diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
    index 5e82488f1b82..9cf7736e31db 100644
    --- a/arch/arm64/kernel/asm-offsets.c
    +++ b/arch/arm64/kernel/asm-offsets.c
    @@ -114,6 +114,9 @@ int main(void)
    DEFINE(NVHE_INIT_TPIDR_EL2, offsetof(struct kvm_nvhe_init_params, tpidr_el2));
    DEFINE(NVHE_INIT_STACK_HYP_VA, offsetof(struct kvm_nvhe_init_params, stack_hyp_va));
    DEFINE(NVHE_INIT_PGD_PA, offsetof(struct kvm_nvhe_init_params, pgd_pa));
    + DEFINE(NVHE_INIT_HCR_EL2, offsetof(struct kvm_nvhe_init_params, hcr_el2));
    + DEFINE(NVHE_INIT_VTTBR, offsetof(struct kvm_nvhe_init_params, vttbr));
    + DEFINE(NVHE_INIT_VTCR, offsetof(struct kvm_nvhe_init_params, vtcr));
    #endif
    #ifdef CONFIG_CPU_PM
    DEFINE(CPU_CTX_SP, offsetof(struct cpu_suspend_ctx, sp));
    diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
    index e524682c2ccf..00cee4489cd7 100644
    --- a/arch/arm64/kvm/arm.c
    +++ b/arch/arm64/kvm/arm.c
    @@ -1413,6 +1413,11 @@ static void cpu_prepare_hyp_mode(int cpu)

    params->stack_hyp_va = kern_hyp_va(per_cpu(kvm_arm_hyp_stack_page, cpu) + PAGE_SIZE);
    params->pgd_pa = kvm_mmu_get_httbr();
    + if (is_protected_kvm_enabled())
    + params->hcr_el2 = HCR_HOST_NVHE_PROTECTED_FLAGS;
    + else
    + params->hcr_el2 = HCR_HOST_NVHE_FLAGS;
    + params->vttbr = params->vtcr = 0;

    /*
    * Flush the init params from the data cache because the struct will
    diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-init.S b/arch/arm64/kvm/hyp/nvhe/hyp-init.S
    index ad943966c39f..b1341bb4b453 100644
    --- a/arch/arm64/kvm/hyp/nvhe/hyp-init.S
    +++ b/arch/arm64/kvm/hyp/nvhe/hyp-init.S
    @@ -102,6 +102,15 @@ alternative_else_nop_endif
    ldr x1, [x0, #NVHE_INIT_MAIR_EL2]
    msr mair_el2, x1

    + ldr x1, [x0, #NVHE_INIT_HCR_EL2]
    + msr hcr_el2, x1
    +
    + ldr x1, [x0, #NVHE_INIT_VTTBR]
    + msr vttbr_el2, x1
    +
    + ldr x1, [x0, #NVHE_INIT_VTCR]
    + msr vtcr_el2, x1
    +
    ldr x1, [x0, #NVHE_INIT_PGD_PA]
    phys_to_ttbr x2, x1
    alternative_if ARM64_HAS_CNP
    diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c
    index f3d0e9eca56c..979a76cdf9fb 100644
    --- a/arch/arm64/kvm/hyp/nvhe/switch.c
    +++ b/arch/arm64/kvm/hyp/nvhe/switch.c
    @@ -97,10 +97,7 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
    mdcr_el2 |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;

    write_sysreg(mdcr_el2, mdcr_el2);
    - if (is_protected_kvm_enabled())
    - write_sysreg(HCR_HOST_NVHE_PROTECTED_FLAGS, hcr_el2);
    - else
    - write_sysreg(HCR_HOST_NVHE_FLAGS, hcr_el2);
    + write_sysreg(this_cpu_ptr(&kvm_init_params)->hcr_el2, hcr_el2);
    write_sysreg(CPTR_EL2_DEFAULT, cptr_el2);
    write_sysreg(__kvm_hyp_host_vector, vbar_el2);
    }
    --
    2.30.0.284.gd98b1dd5eaa7-goog
    \
     
     \ /
      Last update: 2021-01-08 13:21    [W:4.255 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site