]> xenbits.xensource.com Git - qemu-xen.git/commit
hw/arm/boot: Set SME and SVE EL3 vector lengths when booting kernel
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 3 Nov 2022 13:10:40 +0000 (13:10 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Fri, 4 Nov 2022 10:58:58 +0000 (10:58 +0000)
commit2b39abb2d6ed022c62eba2d124432d91c52a9d22
treed7f9a52e0daab806ea32275140b6b74b09a2d524
parentece5f8374d0416a339f0c0a9399faa2c42d4ad6f
hw/arm/boot: Set SME and SVE EL3 vector lengths when booting kernel

When we direct boot a kernel on a CPU which emulates EL3, we need
to set up the EL3 system registers as the Linux kernel documentation
specifies:
 https://www.kernel.org/doc/Documentation/arm64/booting.rst

For SVE and SME this includes:
    - ZCR_EL3.LEN must be initialised to the same value for all CPUs the
      kernel is executed on.
    - SMCR_EL3.LEN must be initialised to the same value for all CPUs the
      kernel will execute on.

Although we are technically compliant with this, the "same value" we
currently use by default is the reset value of 0.  This will end up
forcing the guest kernel's SVE and SME vector length to be only the
smallest supported length.

Initialize the vector length fields to their maximum possible value,
which is 0xf. If the implementation doesn't actually support that
vector length then the effective vector length will be constrained
down to the maximum supported value at point of use.

This allows the guest to use all the vector lengths the emulated CPU
supports (by programming the _EL2 and _EL1 versions of these
registers.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20221027140207.413084-2-peter.maydell@linaro.org
hw/arm/boot.c