qemu/hw/arm
Peter Maydell 3a45f4f537 target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL
The code for powering on a CPU in arm-powerctl.c has two separate
use cases:
 * emulation of a real hardware power controller
 * emulation of firmware interfaces (primarily PSCI) with
   CPU on/off APIs

For the first case, we only need to reset the CPU and set its
starting PC and X0.  For the second case, because we're emulating the
firmware we need to ensure that it's in the state that the firmware
provides.  In particular, when we reset to a lower EL than the
highest one we are emulating, we need to put the CPU into a state
that permits correct running at that lower EL.  We already do a
little of this in arm-powerctl.c (for instance we set SCR_HCE to
enable the HVC insn) but we don't do enough of it.  This means that
in the case where we are emulating EL3 but also providing emulated
PSCI the guest will crash when a secondary core tries to use a
feature that needs an SCR_EL3 bit to be set, such as MTE or PAuth.

The hw/arm/boot.c code also has to support this "start guest code in
an EL that's lower than the highest emulated EL" case in order to do
direct guest kernel booting; it has all the necessary initialization
code to set the SCR_EL3 bits.  Pull the relevant boot.c code out into
a separate function so we can share it between there and
arm-powerctl.c.

This refactoring has a few code changes that look like they
might be behaviour changes but aren't:
 * if info->secure_boot is false and info->secure_board_setup is
   true, then the old code would start the first CPU in Hyp
   mode but without changing SCR.NS and NSACR.{CP11,CP10}.
   This was wrong behaviour because there's no such thing
   as Secure Hyp mode. The new code will leave the CPU in SVC.
   (There is no board which sets secure_boot to false and
   secure_board_setup to true, so this isn't a behaviour
   change for any of our boards.)
 * we don't explicitly clear SCR.NS when arm-powerctl.c
   does a CPU-on to EL3. This was a no-op because CPU reset
   will reset to NS == 0.

And some real behaviour changes:
 * we no longer set HCR_EL2.RW when booting into EL2: the guest
   can and should do that themselves before dropping into their
   EL1 code. (arm-powerctl and boot did this differently; I
   opted to use the logic from arm-powerctl, which only sets
   HCR_EL2.RW when it's directly starting the guest in EL1,
   because it's more correct, and I don't expect guests to be
   accidentally depending on our having set the RW bit for them.)
 * if we are booting a CPU into AArch32 Secure SVC then we won't
   set SCR.HCE any more. This affects only the vexpress-a15 and
   raspi2b machine types. Guests booting in this case will either:
    - be able to set SCR.HCE themselves as part of moving from
      Secure SVC into NS Hyp mode
    - will move from Secure SVC to NS SVC, and won't care about
      behaviour of the HVC insn
    - will stay in Secure SVC, and won't care about HVC
 * on an arm-powerctl CPU-on we will now set the SCR bits for
   pauth/mte/sve/sme/hcx/fgt features

The first two of these are very minor and I don't expect guest
code to trip over them, so I didn't judge it worth convoluting
the code in an attempt to keep exactly the same boot.c behaviour.
The third change fixes issue 1899.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1899
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20230926155619.4028618-1-peter.maydell@linaro.org
2023-10-19 14:32:13 +01:00
..
allwinner-a10.c hw/arm: Add WDT to Allwinner-A10 and Cubieboard 2023-04-20 10:21:13 +01:00
allwinner-h3.c hw/arm: Add WDT to Allwinner-H3 and Orangepi-PC 2023-04-20 10:21:14 +01:00
allwinner-r40.c hw/arm/allwinner: Clean up local variable shadowing 2023-09-29 10:07:15 +02:00
armsse.c hw/arm/armv7m: Clean up local variable shadowing 2023-09-29 10:07:15 +02:00
armv7m.c hw/arm/armv7m: Clean up local variable shadowing 2023-09-29 10:07:15 +02:00
aspeed_ast10x0.c hw/arm/aspeed_ast10x0: Add TODO comment to use Cortex-M4F 2023-02-07 09:02:05 +01:00
aspeed_ast2600.c aspeed: Clean up local variable shadowing 2023-09-29 10:07:19 +02:00
aspeed_eeprom.c hw/arm/aspeed: Add VPD data for Rainier machine 2023-06-15 18:35:57 +02:00
aspeed_eeprom.h hw/arm/aspeed: Add VPD data for Rainier machine 2023-06-15 18:35:57 +02:00
aspeed_soc.c aspeed: Introduce a spi_boot region under the SoC 2023-03-02 13:57:50 +01:00
aspeed.c aspeed: Get the BlockBackend of FMC0 from the flash device 2023-09-01 11:40:04 +02:00
bananapi_m2u.c hw: arm: allwinner-r40: Add emac and gmac support 2023-06-06 10:19:33 +01:00
bcm2835_peripherals.c hw/arm/bcm2835_property: Implement "get command line" message 2023-05-02 15:47:40 +01:00
bcm2836.c hw/arm/bcm2835_property: Implement "get command line" message 2023-05-02 15:47:40 +01:00
boot.c target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL 2023-10-19 14:32:13 +01:00
collie.c *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
cubieboard.c *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
digic_boards.c hw/arm: Don't include qemu-common.h unnecessarily 2021-12-15 10:35:26 +00:00
digic.c arm/digic: replace snprintf() with g_strdup_printf() 2022-04-21 17:03:51 +04:00
exynos4_boards.c hw/arm/boot: Drop nb_cpus field from arm_boot_info 2022-02-08 10:56:28 +00:00
exynos4210.c hw/arm: Fix some typos in comments (most found by codespell) 2023-04-20 10:21:13 +01:00
fby35.c aspeed: Use the boot_rom region of the fby35 machine 2023-06-15 18:35:58 +02:00
fsl-imx6.c fsl-imx6: Add SNVS support for i.MX6 boards 2023-05-30 13:02:53 +01:00
fsl-imx6ul.c Add i.MX6UL missing devices. 2023-08-31 09:45:16 +01:00
fsl-imx7.c Add i.MX7 SRC device implementation 2023-08-31 09:45:17 +01:00
fsl-imx25.c Do not include exec/address-spaces.h if it's not really necessary 2021-05-02 17:24:51 +02:00
fsl-imx31.c Do not include cpu.h if it's not really necessary 2021-05-02 17:24:51 +02:00
gumstix.c hw/arm: Remove unreachable code calling pflash_cfi01_register() 2023-01-12 17:03:14 +00:00
highbank.c hw/arm/boot: Drop nb_cpus field from arm_boot_info 2022-02-08 10:56:28 +00:00
imx25_pdk.c hw/arm/boot: Drop nb_cpus field from arm_boot_info 2022-02-08 10:56:28 +00:00
integratorcp.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
Kconfig hw/arm/sbsa-ref: use XHCI to replace EHCI 2023-07-04 14:08:47 +01:00
kzm.c hw/arm/boot: Drop nb_cpus field from arm_boot_info 2022-02-08 10:56:28 +00:00
mainstone.c hw/arm: Remove unreachable code calling pflash_cfi01_register() 2023-01-12 17:03:14 +00:00
mcimx6ul-evk.c arm/mcimx6ul-evk: Set fec1-phy-connected property to false 2023-04-20 10:46:29 +01:00
mcimx7d-sabre.c arm/mcimx7d-sabre: Set fec2-phy-connected property to false 2023-04-20 10:46:43 +01:00
meson.build hw/xen: cleanup sourcesets 2023-10-18 10:01:01 +02:00
microbit.c target/arm: Make boards pass base address to armv7m_load_kernel() 2022-09-14 11:19:40 +01:00
mps2-tz.c hw/arm: Set number of MPU regions correctly for an505, an521, an524 2023-08-31 11:07:02 +01:00
mps2.c hw/char/cmsdk-apb-uart: Open-code cmsdk_apb_uart_create() 2023-02-27 13:27:05 +00:00
msf2-soc.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
msf2-som.c tests/avocado: Truncate M2S-FG484 SOM SPI flash to 16MiB 2023-02-07 09:02:04 +01:00
musca.c target/arm: Make boards pass base address to armv7m_load_kernel() 2022-09-14 11:19:40 +01:00
musicpal.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
netduino2.c target/arm: Make boards pass base address to armv7m_load_kernel() 2022-09-14 11:19:40 +01:00
netduinoplus2.c target/arm: Make boards pass base address to armv7m_load_kernel() 2022-09-14 11:19:40 +01:00
npcm7xx_boards.c *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
npcm7xx.c hw/arm: Attach PSPI module to NPCM7XX SoC 2023-02-16 16:00:48 +00:00
nrf51_soc.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
nseries.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
olimex-stm32-h405.c hw/arm: Add Olimex H405 2023-01-12 16:50:19 +00:00
omap1.c hw/arm: Fix some typos in comments (most found by codespell) 2023-04-20 10:21:13 +01:00
omap2.c audio: propagate Error * out of audio_init 2023-10-03 10:29:40 +02:00
omap_sx1.c *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
orangepi.c *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
palm.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
pxa2xx_gpio.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
pxa2xx_pic.c target/arm: Replace sentinels with ARRAY_SIZE in cpregs.h 2022-05-05 09:35:50 +01:00
pxa2xx.c hw/arm/pxa2xx: Simplify pxa270_init() 2023-01-12 17:03:14 +00:00
raspi.c hw/arm/raspi: Use arm_write_bootloader() to write boot code 2023-05-02 15:47:41 +01:00
realview.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
sabrelite.c hw/arm/boot: Drop nb_cpus field from arm_boot_info 2022-02-08 10:56:28 +00:00
sbsa-ref.c hw/arm/sbsa-ref: use bsa.h for PPI definitions 2023-10-19 14:32:13 +01:00
smmu-common.c hw/arm/smmu: Handle big-endian hosts correctly 2023-07-25 10:56:51 +01:00
smmu-internal.h hw/arm/smmuv3: Add VMID to TLB tagging 2023-05-30 15:50:16 +01:00
smmuv3-internal.h hw/arm/smmuv3: Update ID register bit field definitions 2023-10-19 14:32:13 +01:00
smmuv3.c hw/arm/smmuv3: Advertise SMMUv3.1-XNX feature 2023-10-19 14:32:13 +01:00
spitz.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
stellaris.c hw/sd: Introduce a "sd-card" SPI variant model 2023-09-01 11:40:04 +02:00
stm32f100_soc.c hw/arm/stm32f100: Wire up sysclk and refclk 2021-09-01 11:08:19 +01:00
stm32f205_soc.c hw/arm/stm32f205: Wire up sysclk and refclk 2021-09-01 11:08:19 +01:00
stm32f405_soc.c hw/arm/stm32f405: correctly describe the memory layout 2023-01-12 16:50:18 +00:00
stm32vldiscovery.c target/arm: Make boards pass base address to armv7m_load_kernel() 2022-09-14 11:19:40 +01:00
strongarm.c bulk: Rename TARGET_FMT_plx -> HWADDR_FMT_plx 2023-01-18 11:14:34 +01:00
strongarm.h hw/arm/collie: Create the RAM in the board 2019-10-22 17:44:01 +01:00
tosa.c hw/arm/pxa2xx: Simplify pxa255_init() 2023-01-12 17:03:14 +00:00
trace-events hw/arm/smmuv3: Add stage-2 support in iova notifier 2023-05-30 15:50:16 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
versatilepb.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
vexpress.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
virt-acpi-build.c {include/}hw/arm: refactor virt PPI logic 2023-10-19 14:32:12 +01:00
virt.c {include/}hw/arm: refactor virt PPI logic 2023-10-19 14:32:12 +01:00
xen_arm.c xen_arm: Initialize RAM and add hi/low memory regions 2023-08-30 18:23:08 -07:00
xilinx_zynq.c hw/ssi: Check for duplicate CS indexes 2023-09-01 11:40:04 +02:00
xlnx-versal-virt.c hw/ssi: Check for duplicate CS indexes 2023-09-01 11:40:04 +02:00
xlnx-versal.c hw/arm/versal: Connect the CFRAME_REG and CFRAME_BCAST_REG 2023-09-08 16:41:35 +01:00
xlnx-zcu102.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00
xlnx-zynqmp.c hw/arm/xlnx-zynqmp: fix unsigned error when checking the RPUs number 2023-05-30 15:50:16 +01:00
z2.c hw/arm: Support machine-default audiodev with fallback 2023-10-03 10:29:39 +02:00