Skip to content
Snippets Groups Projects
  • Ahmed Genidi's avatar
    3855a7b9
    KVM: arm64: Initialize SCTLR_EL1 in __kvm_hyp_init_cpu() · 3855a7b9
    Ahmed Genidi authored
    
    When KVM is in protected mode, host calls to PSCI are proxied via EL2,
    and cold entries from CPU_ON, CPU_SUSPEND, and SYSTEM_SUSPEND bounce
    through __kvm_hyp_init_cpu() at EL2 before entering the host kernel's
    entry point at EL1. While __kvm_hyp_init_cpu() initializes SPSR_EL2 for
    the exception return to EL1, it does not initialize SCTLR_EL1.
    
    Due to this, it's possible to enter EL1 with SCTLR_EL1 in an UNKNOWN
    state. In practice this has been seen to result in kernel crashes after
    CPU_ON as a result of SCTLR_EL1.M being 1 in violation of the initial
    core configuration specified by PSCI.
    
    Fix this by initializing SCTLR_EL1 for cold entry to the host kernel.
    As it's necessary to write to SCTLR_EL12 in VHE mode, this
    initialization is moved into __kvm_host_psci_cpu_entry() where we can
    use write_sysreg_el1().
    
    The remnants of the '__init_el2_nvhe_prepare_eret' macro are folded into
    its only caller, as this is clearer than having the macro.
    
    Fixes: cdf36719 ("KVM: arm64: Intercept host's CPU_ON SMCs")
    Reported-by: default avatarLeo Yan <leo.yan@arm.com>
    Signed-off-by: default avatarAhmed Genidi <ahmed.genidi@arm.com>
    [ Mark: clarify commit message, handle E2H, move to C, remove macro ]
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Ahmed Genidi <ahmed.genidi@arm.com>
    Cc: Ben Horgan <ben.horgan@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Leo Yan <leo.yan@arm.com>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Oliver Upton <oliver.upton@linux.dev>
    Cc: Will Deacon <will@kernel.org>
    Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
    Link: https://lore.kernel.org/r/20250227180526.1204723-3-mark.rutland@arm.com
    
    
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    3855a7b9
    History
    KVM: arm64: Initialize SCTLR_EL1 in __kvm_hyp_init_cpu()
    Ahmed Genidi authored
    
    When KVM is in protected mode, host calls to PSCI are proxied via EL2,
    and cold entries from CPU_ON, CPU_SUSPEND, and SYSTEM_SUSPEND bounce
    through __kvm_hyp_init_cpu() at EL2 before entering the host kernel's
    entry point at EL1. While __kvm_hyp_init_cpu() initializes SPSR_EL2 for
    the exception return to EL1, it does not initialize SCTLR_EL1.
    
    Due to this, it's possible to enter EL1 with SCTLR_EL1 in an UNKNOWN
    state. In practice this has been seen to result in kernel crashes after
    CPU_ON as a result of SCTLR_EL1.M being 1 in violation of the initial
    core configuration specified by PSCI.
    
    Fix this by initializing SCTLR_EL1 for cold entry to the host kernel.
    As it's necessary to write to SCTLR_EL12 in VHE mode, this
    initialization is moved into __kvm_host_psci_cpu_entry() where we can
    use write_sysreg_el1().
    
    The remnants of the '__init_el2_nvhe_prepare_eret' macro are folded into
    its only caller, as this is clearer than having the macro.
    
    Fixes: cdf36719 ("KVM: arm64: Intercept host's CPU_ON SMCs")
    Reported-by: default avatarLeo Yan <leo.yan@arm.com>
    Signed-off-by: default avatarAhmed Genidi <ahmed.genidi@arm.com>
    [ Mark: clarify commit message, handle E2H, move to C, remove macro ]
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Ahmed Genidi <ahmed.genidi@arm.com>
    Cc: Ben Horgan <ben.horgan@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Leo Yan <leo.yan@arm.com>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Oliver Upton <oliver.upton@linux.dev>
    Cc: Will Deacon <will@kernel.org>
    Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
    Link: https://lore.kernel.org/r/20250227180526.1204723-3-mark.rutland@arm.com
    
    
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>