arm64: Prevent the use of is_kernel_in_hyp_mode() in hypervisor code
authorMarc Zyngier <maz@kernel.org>
Fri, 9 Jun 2023 16:21:45 +0000 (17:21 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 12 Jun 2023 23:17:23 +0000 (23:17 +0000)
Using is_kernel_in_hyp_mode() in hypervisor code is a pretty bad
mistake. This helper only checks for CurrentEL being EL2, which
is always true.

Make the compilation fail if using the helper in hypervisor context
Whilst we're at it, flag the helper as __always_inline, which it
really should be.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20230609162200.2024064-3-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/virt.h

index 4eb601e7de507615de61e1925c460f8856b5b00d..21e94068804da27666a77ed2a7b4b0ab589c373d 100644 (file)
@@ -110,8 +110,10 @@ static inline bool is_hyp_mode_mismatched(void)
        return __boot_cpu_mode[0] != __boot_cpu_mode[1];
 }
 
-static inline bool is_kernel_in_hyp_mode(void)
+static __always_inline bool is_kernel_in_hyp_mode(void)
 {
+       BUILD_BUG_ON(__is_defined(__KVM_NVHE_HYPERVISOR__) ||
+                    __is_defined(__KVM_VHE_HYPERVISOR__));
        return read_sysreg(CurrentEL) == CurrentEL_EL2;
 }