[Letux-kernel] Bug with KVM: arm64: Avoid setting the upper 32 bits of TCR_EL2 and CPTR_EL2 to 1

H. Nikolaus Schaller hns at goldelico.com
Thu Dec 16 15:30:40 CET 2021


Hi Marc,

> Am 16.12.2021 um 09:43 schrieb Marc Zyngier <maz at kernel.org>:
> 
> Hi Nikolaus,
> 
> On 2021-12-16 06:58, H. Nikolaus Schaller wrote:
>> Hi Catalin,
>>> Am 15.12.2021 um 19:40 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>>> this seems to break build of 5.10.y (and maybe earlier) for me:
>>> CALL    scripts/checksyscalls.sh - due to target missing
>>> CALL    scripts/atomic/check-atomics.sh - due to target missing
>>> CHK     include/generated/compile.h
>>> AS      arch/arm64/kvm/hyp/nvhe/hyp-init.nvhe.o - due to target missing
>>> arch/arm64/kvm/hyp/nvhe/hyp-init.S: Assembler messages:
>>> arch/arm64/kvm/hyp/nvhe/hyp-init.S:87: Error: missing ')'
>>> arch/arm64/kvm/hyp/nvhe/hyp-init.S:87: Error: missing ')'
>>> arch/arm64/kvm/hyp/nvhe/hyp-init.S:87: Error: missing ')'This should somehow be fixed so that arch/arm64/include/asm/kvm_arm.h
>>> can be included by older assemblers.
> 
> GCC versions prior to 5.1 are known to miscompile the kernel,
> and the minimal GCC version was bumped in dca5244d2f5b.

> I am surprised this requirement wasn't backported to 5.10-stable,
> as this results in all sorts of terrible bugs that are hard to
> diagnose (see the horror story in the commit message).

Indeed.

My build system checks for existence of scripts/min-tool-version.sh
and if it exists it chooses the right gcc version. If it does not exist
it assumes that gcc 4.9 is still good enough...

> 
> As for the issue you describe, does the following help?

> 
> Thanks,
> 
>        M.
> 
> diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
> index 01d47c5886dc..d03087308ab5 100644
> --- a/arch/arm64/include/asm/kvm_arm.h
> +++ b/arch/arm64/include/asm/kvm_arm.h
> @@ -91,7 +91,7 @@
> #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
> 
> /* TCR_EL2 Registers bits */
> -#define TCR_EL2_RES1		((1U << 31) | (1 << 23))
> +#define TCR_EL2_RES1		((UL(1) << 31) | (UL(1) << 23))
> #define TCR_EL2_TBI		(1 << 20)
> #define TCR_EL2_PS_SHIFT	16
> #define TCR_EL2_PS_MASK		(7 << TCR_EL2_PS_SHIFT)
> 
> -- 
> Jazz is not dead. It just smells funny...


Yes, it does! This can be compiled with gcc 4.9 (resp. binutils).

So IMHO there are 3 different ways to solve it:
a) your fix applied to 5.10.y
b) someone backports scripts/min-tool-version.sh
to allow for dependable automation...
c) we leave 5.10.y unfixed and I just add a special
rule for arm64 to choose a newer gcc (it is no problem to
use 4.9 for other architectures) in my build setup.

BR and thanks,
Nikolaus




More information about the Letux-kernel mailing list