qemu/hw/arm
David Hildenbrand 6c2b24d1d2 acpi: Set proper maximum size for "etc/table-loader" blob
The resizeable memory region / RAMBlock that is created for the cmd blob
has a maximum size of whole host pages (e.g., 4k), because RAMBlocks
work on full host pages. In addition, in i386 ACPI code:
  acpi_align_size(tables->linker->cmd_blob, ACPI_BUILD_ALIGN_SIZE);
makes sure to align to multiples of 4k, padding with 0.

For example, if our cmd_blob is created with a size of 2k, the maximum
size is 4k - we cannot grow beyond that. Growing might be required
due to guest action when rebuilding the tables, but also on incoming
migration.

This automatic generation of the maximum size used to be sufficient,
however, there are cases where we cross host pages now when growing at
runtime: we exceed the maximum size of the RAMBlock and can crash QEMU when
trying to resize the resizeable memory region / RAMBlock:
  $ build/qemu-system-x86_64 --enable-kvm \
      -machine q35,nvdimm=on \
      -smp 1 \
      -cpu host \
      -m size=2G,slots=8,maxmem=4G \
      -object memory-backend-file,id=mem0,mem-path=/tmp/nvdimm,size=256M \
      -device nvdimm,label-size=131072,memdev=mem0,id=nvdimm0,slot=1 \
      -nodefaults \
      -device vmgenid \
      -device intel-iommu

Results in:
  Unexpected error in qemu_ram_resize() at ../softmmu/physmem.c:1850:
  qemu-system-x86_64: Size too large: /rom@etc/table-loader:
    0x2000 > 0x1000: Invalid argument

In this configuration, we consume exactly 4k (32 entries, 128 bytes each)
when creating the VM. However, once the guest boots up and maps the MCFG,
we also create the MCFG table and end up consuming 2 additional entries
(pointer + checksum) -- which is where we try resizing the memory region
/ RAMBlock, however, the maximum size does not allow for it.

Currently, we get the following maximum sizes for our different
mutable tables based on behavior of resizeable RAMBlock:

  hw       table                max_size
  -------  ---------------------------------------------------------

  virt     "etc/acpi/tables"    ACPI_BUILD_TABLE_MAX_SIZE (0x200000)
  virt     "etc/table-loader"   HOST_PAGE_ALIGN(initial_size)
  virt     "etc/acpi/rsdp"      HOST_PAGE_ALIGN(initial_size)

  i386     "etc/acpi/tables"    ACPI_BUILD_TABLE_MAX_SIZE (0x200000)
  i386     "etc/table-loader"   HOST_PAGE_ALIGN(initial_size)
  i386     "etc/acpi/rsdp"      HOST_PAGE_ALIGN(initial_size)

  microvm  "etc/acpi/tables"    ACPI_BUILD_TABLE_MAX_SIZE (0x200000)
  microvm  "etc/table-loader"   HOST_PAGE_ALIGN(initial_size)
  microvm  "etc/acpi/rsdp"      HOST_PAGE_ALIGN(initial_size)

Let's set the maximum table size for "etc/table-loader" to 64k, so we
can properly grow at runtime, which should be good enough for the future.

Migration is not concerned with the maximum size of a RAMBlock, only
with the used size - so existing setups are not affected. Of course, we
cannot migrate a VM that would have crash when started on older QEMU from
new QEMU to older QEMU without failing early on the destination when
synchronizing the RAM state:
    qemu-system-x86_64: Size too large: /rom@etc/table-loader: 0x2000 > 0x1000: Invalid argument
    qemu-system-x86_64: error while loading state for instance 0x0 of device 'ram'
    qemu-system-x86_64: load of migration failed: Invalid argument

We'll refactor the code next, to make sure we get rid of this implicit
behavior for "etc/acpi/rsdp" as well and to make the code easier to
grasp.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Cc: Alistair Francis <alistair.francis@xilinx.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Shannon Zhao <shannon.zhaosl@gmail.com>
Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20210304105554.121674-2-david@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2021-03-22 18:58:19 -04:00
..
allwinner-a10.c hw/sd/allwinner-sdhost: Use AddressSpace for DMA transfers 2020-08-28 10:02:45 +01:00
allwinner-h3.c target-arm queue: 2020-08-28 15:14:40 +01:00
armsse.c hw/arm/armsse: Add SSE-300 support 2021-03-08 17:20:03 +00:00
armv7m.c qtest: delete superfluous inclusions of qtest.h 2021-03-09 06:03:53 +01:00
aspeed_ast2600.c hw/misc: Model KCS devices in the Aspeed LPC controller 2021-03-09 12:01:28 +01:00
aspeed_soc.c hw/misc: Model KCS devices in the Aspeed LPC controller 2021-03-09 12:01:28 +01:00
aspeed.c arm: do not use ram_size global 2020-12-10 12:15:07 -05:00
bcm2835_peripherals.c hw/arm/bcm2835_peripherals: connect the UART clock 2020-10-27 11:10:44 +00:00
bcm2836.c hw/arm/bcm2836: Introduce the BCM2835 SoC 2020-10-27 11:10:44 +00:00
boot.c vl: make qemu_get_machine_opts static 2020-12-15 12:51:55 -05:00
collie.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
cubieboard.c arm: remove bios_name 2020-12-10 12:15:04 -05:00
digic_boards.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
digic.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
exynos4_boards.c sysbus: Convert qdev_set_parent_bus() use with Coccinelle, part 1 2020-06-15 22:06:04 +02:00
exynos4210.c qom: simplify object_find_property / object_class_find_property 2020-09-22 16:45:16 -04:00
fsl-imx6.c Add the ability to change the FEC PHY MDIO device number on i.MX6 processor 2020-07-13 14:36:08 +01:00
fsl-imx6ul.c qom: Put name parameter before value / visitor parameter 2020-07-10 15:18:08 +02:00
fsl-imx7.c Add the ability to change the FEC PHY MDIO devices numbers on i.MX7 processor 2020-07-13 14:36:08 +01:00
fsl-imx25.c Add the ability to change the FEC PHY MDIO device number on i.MX25 processor 2020-07-13 14:36:07 +01:00
fsl-imx31.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
gumstix.c hw/arm/gumstix: Simplify since the machines are little-endian only 2020-03-05 16:09:14 +00:00
highbank.c hw/arm/highbank: Drop dead KVM support code 2021-01-08 15:13:38 +00:00
imx25_pdk.c qdev: Make qdev_prop_set_drive() match the other helpers 2020-06-23 16:07:07 +02:00
integratorcp.c qom: simplify object_find_property / object_class_find_property 2020-09-22 16:45:16 -04:00
Kconfig hw/arm: xlnx-zynqmp: Connect a Xilinx CSU DMA module for QSPI 2021-03-10 13:54:51 +00:00
kzm.c qdev: Convert bus-less devices to qdev_realize() with Coccinelle 2020-06-15 22:06:04 +02:00
mainstone.c qtest: delete superfluous inclusions of qtest.h 2021-03-09 06:03:53 +01:00
mcimx6ul-evk.c qom: Put name parameter before value / visitor parameter 2020-07-10 15:18:08 +02:00
mcimx7d-sabre.c qdev: Make qdev_prop_set_drive() match the other helpers 2020-06-23 16:07:07 +02:00
meson.build hw/arm: Add two NPCM7xx-based machines 2020-09-14 14:24:58 +01:00
microbit.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
mps2-tz.c hw/arm/mps2-tz: Add new mps3-an547 board 2021-03-08 17:20:03 +00:00
mps2.c hw/misc/mps2-scc: Support configurable number of OSCCLK values 2021-03-06 13:30:38 +00:00
msf2-soc.c msf2-soc, stellaris: Don't wire up SYSRESETREQ 2020-08-03 17:55:03 +01:00
msf2-som.c qdev: Make qdev_prop_set_drive() match the other helpers 2020-06-23 16:07:07 +02:00
musca.c arm: Update infocenter.arm.com URLs 2021-02-11 11:50:14 +00:00
musicpal.c hw/arm/musicpal: Remove dead code for non-32-bit-RGB surfaces 2021-03-05 15:17:35 +00:00
netduino2.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
netduinoplus2.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
npcm7xx_boards.c hw/arm: Connect PWM fans in NPCM7XX boards 2021-03-12 12:50:36 +00:00
npcm7xx.c hw/arm: Add MFT device to NPCM7xx Soc 2021-03-12 12:50:29 +00:00
nrf51_soc.c hw/arm/nrf51_soc: Set system_clock_scale 2020-08-03 17:55:31 +01:00
nseries.c hw/arm/nseries: Check return value from load_image_targphys() 2020-11-10 11:03:48 +00:00
omap1.c hw/arm/omap1:Remove redundant statement in omap_clkdsp_read() 2020-09-01 11:53:44 +02:00
omap2.c sysbus: Convert to sysbus_realize() etc. with Coccinelle 2020-06-15 22:05:28 +02:00
omap_sx1.c hw/arm: Use memory_region_init_rom() with read-only regions 2020-03-17 15:18:46 +01:00
orangepi.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
palm.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
pxa2xx_gpio.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
pxa2xx_pic.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
pxa2xx.c qdev: Move softmmu properties to qdev-properties-system.h 2020-12-18 15:20:17 -05:00
raspi.c hw/arm/raspi: Add the Raspberry Pi 3 model A+ 2020-10-27 11:10:44 +00:00
realview.c qom: simplify object_find_property / object_class_find_property 2020-09-22 16:45:16 -04:00
sabrelite.c hw/arm: sabrelite: Connect the Ethernet PHY at address 6 2021-01-08 15:13:39 +00:00
sbsa-ref.c sbsa-ref: add 'max' to list of allowed cpus 2021-03-05 15:17:33 +00:00
smmu-common.c hw/arm/smmuv3: Enforce invalidation on a power of two range 2021-03-12 12:40:10 +00:00
smmu-internal.h hw/arm/smmuv3: Fix SMMU_CMD_CFGI_STE_RANGE handling 2021-03-12 12:40:10 +00:00
smmuv3-internal.h hw/arm/smmuv3: Fix up L1STD_SPAN decoding 2020-12-10 11:30:44 +00:00
smmuv3.c hw/arm/smmuv3: Fix SMMU_CMD_CFGI_STE_RANGE handling 2021-03-12 12:40:10 +00:00
spitz.c hw/ssi: Rename SSI 'slave' as 'peripheral' 2020-12-10 12:15:03 -05:00
stellaris.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
stm32f205_soc.c hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ 2020-11-10 11:03:48 +00:00
stm32f405_soc.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
strongarm.c qdev: Move softmmu properties to qdev-properties-system.h 2020-12-18 15:20:17 -05:00
strongarm.h hw/arm/collie: Create the RAM in the board 2019-10-22 17:44:01 +01:00
sysbus-fdt.c hw/arm/virt: vTPM support 2020-03-05 12:18:16 -05:00
tosa.c hw/ssi: Rename SSI 'slave' as 'peripheral' 2020-12-10 12:15:03 -05:00
trace-events hw/arm/smmuv3: Uniformize sid traces 2021-03-12 12:40:10 +00:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
versatilepb.c qom: simplify object_find_property / object_class_find_property 2020-09-22 16:45:16 -04:00
vexpress.c vexpress-a15: Register "virtualization" as class property 2020-12-14 14:25:44 -05:00
virt-acpi-build.c acpi: Set proper maximum size for "etc/table-loader" blob 2021-03-22 18:58:19 -04:00
virt.c hw/arm/virt: KVM: The IPA lower bound is 32 2021-03-12 12:47:11 +00:00
xilinx_zynq.c hw: Replace anti-social QOM type names 2021-03-19 15:18:43 +01:00
xlnx-versal-virt.c arm: xlnx-versal: Connect usb to virt-versal 2020-12-15 12:04:30 +00:00
xlnx-versal.c hw/arm: versal: Add support for the XRAMs 2021-03-12 12:40:09 +00:00
xlnx-zcu102.c qtest: delete superfluous inclusions of qtest.h 2021-03-09 06:03:53 +01:00
xlnx-zynqmp.c hw/arm: xlnx-zynqmp: Connect a Xilinx CSU DMA module for QSPI 2021-03-10 13:54:51 +00:00
z2.c qtest: delete superfluous inclusions of qtest.h 2021-03-09 06:03:53 +01:00