tests/functional: skip memaddr tests on 32-bit builds

If the QEMU binary was built for a 32-bit ELF target we cannot run the
memory address space tests as they all require ability to address more
RAM that can be represented on 32-bit.

We can't use a decorator to skip the tests as we need setUp() to run to
pick the QEMU binary, thus we must call a method at the start of each
test to check and skip it. The functional result is effectively the
same as using a decorator, just less pretty. This code will go away when
32-bit hosts are full dropped from QEMU.

The code allows any non-ELF target since all macOS versions supported
at 64-bit only and we already dropped support for 32-bit Windows.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20250228102738.3064045-6-berrange@redhat.com>
[thuth: Add missing byteorder='little' to from_bytes()]
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2025-02-28 10:27:36 +00:00 committed by Thomas Huth
parent 188f719295
commit 42ea7f782a

View file

@ -20,6 +20,25 @@ class MemAddrCheck(QemuSystemTest):
# this reason. # this reason.
DELAY_Q35_BOOT_SEQUENCE = 1 DELAY_Q35_BOOT_SEQUENCE = 1
# This helper can go away when the 32-bit host deprecation
# turns into full & final removal of support.
def ensure_64bit_binary(self):
with open(self.qemu_bin, "rb") as fh:
ident = fh.read(4)
# "\x7fELF"
if ident != bytes([0x7f, 0x45, 0x4C, 0x46]):
# Non-ELF file implies macOS or Windows which
# we already assume to be 64-bit only
return
# bits == 1 -> 32-bit; bits == 2 -> 64-bit
bits = int.from_bytes(fh.read(1), byteorder='little')
if bits != 2:
# 32-bit ELF builds won't be able to address sufficient
# RAM to run the tests
self.skipTest("64-bit build host is required")
# first, lets test some 32-bit processors. # first, lets test some 32-bit processors.
# for all 32-bit cases, pci64_hole_size is 0. # for all 32-bit cases, pci64_hole_size is 0.
def test_phybits_low_pse36(self): def test_phybits_low_pse36(self):
@ -38,6 +57,7 @@ class MemAddrCheck(QemuSystemTest):
If maxmem is set to 59.5G with all other QEMU parameters identical, QEMU If maxmem is set to 59.5G with all other QEMU parameters identical, QEMU
should start fine. should start fine.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'q35', '-m', self.vm.add_args('-S', '-machine', 'q35', '-m',
'512,slots=1,maxmem=59.6G', '512,slots=1,maxmem=59.6G',
'-cpu', 'pentium,pse36=on', '-display', 'none', '-cpu', 'pentium,pse36=on', '-display', 'none',
@ -55,6 +75,7 @@ class MemAddrCheck(QemuSystemTest):
access up to a maximum of 64GiB of memory. Rest is the same as the case access up to a maximum of 64GiB of memory. Rest is the same as the case
with pse36 above. with pse36 above.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'q35', '-m', self.vm.add_args('-S', '-machine', 'q35', '-m',
'512,slots=1,maxmem=59.6G', '512,slots=1,maxmem=59.6G',
'-cpu', 'pentium,pae=on', '-display', 'none', '-cpu', 'pentium,pae=on', '-display', 'none',
@ -71,6 +92,7 @@ class MemAddrCheck(QemuSystemTest):
Setting maxmem to 59.5G and making sure that QEMU can start with the Setting maxmem to 59.5G and making sure that QEMU can start with the
same options as the failing case above with pse36 cpu feature. same options as the failing case above with pse36 cpu feature.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-machine', 'q35', '-m', self.vm.add_args('-machine', 'q35', '-m',
'512,slots=1,maxmem=59.5G', '512,slots=1,maxmem=59.5G',
'-cpu', 'pentium,pse36=on', '-display', 'none', '-cpu', 'pentium,pse36=on', '-display', 'none',
@ -88,6 +110,7 @@ class MemAddrCheck(QemuSystemTest):
Setting maxmem to 59.5G and making sure that QEMU can start fine Setting maxmem to 59.5G and making sure that QEMU can start fine
with the same options as the case above. with the same options as the case above.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-machine', 'q35', '-m', self.vm.add_args('-machine', 'q35', '-m',
'512,slots=1,maxmem=59.5G', '512,slots=1,maxmem=59.5G',
'-cpu', 'pentium,pae=on', '-display', 'none', '-cpu', 'pentium,pae=on', '-display', 'none',
@ -104,6 +127,7 @@ class MemAddrCheck(QemuSystemTest):
Pentium2 has 36 bits of addressing, so its same as pentium Pentium2 has 36 bits of addressing, so its same as pentium
with pse36 ON. with pse36 ON.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-machine', 'q35', '-m', self.vm.add_args('-machine', 'q35', '-m',
'512,slots=1,maxmem=59.5G', '512,slots=1,maxmem=59.5G',
'-cpu', 'pentium2', '-display', 'none', '-cpu', 'pentium2', '-display', 'none',
@ -123,6 +147,7 @@ class MemAddrCheck(QemuSystemTest):
message because the region for memory hotplug is always placed message because the region for memory hotplug is always placed
above 4 GiB due to the PCI hole and simplicity. above 4 GiB due to the PCI hole and simplicity.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'q35', '-m', self.vm.add_args('-S', '-machine', 'q35', '-m',
'512,slots=1,maxmem=4G', '512,slots=1,maxmem=4G',
'-cpu', 'pentium', '-display', 'none', '-cpu', 'pentium', '-display', 'none',
@ -150,6 +175,7 @@ class MemAddrCheck(QemuSystemTest):
which is equal to 987.5 GiB. Setting the value to 988 GiB should which is equal to 987.5 GiB. Setting the value to 988 GiB should
make QEMU fail with the error message. make QEMU fail with the error message.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m', self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m',
'512,slots=1,maxmem=988G', '512,slots=1,maxmem=988G',
'-display', 'none', '-display', 'none',
@ -170,6 +196,7 @@ class MemAddrCheck(QemuSystemTest):
Make sure QEMU fails when maxmem size is 976 GiB (12 GiB less Make sure QEMU fails when maxmem size is 976 GiB (12 GiB less
than 988 GiB). than 988 GiB).
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m', self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m',
'512,slots=1,maxmem=976G', '512,slots=1,maxmem=976G',
'-display', 'none', '-display', 'none',
@ -186,6 +213,7 @@ class MemAddrCheck(QemuSystemTest):
Same as q35-7.0 AMD case except that here we check that QEMU can Same as q35-7.0 AMD case except that here we check that QEMU can
successfully start when maxmem is < 988G. successfully start when maxmem is < 988G.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m', self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m',
'512,slots=1,maxmem=987.5G', '512,slots=1,maxmem=987.5G',
'-display', 'none', '-display', 'none',
@ -202,6 +230,7 @@ class MemAddrCheck(QemuSystemTest):
Same as q35-7.1 AMD case except that here we check that QEMU can Same as q35-7.1 AMD case except that here we check that QEMU can
successfully start when maxmem is < 976G. successfully start when maxmem is < 976G.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m', self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m',
'512,slots=1,maxmem=975.5G', '512,slots=1,maxmem=975.5G',
'-display', 'none', '-display', 'none',
@ -219,6 +248,7 @@ class MemAddrCheck(QemuSystemTest):
Intel cpu instead. QEMU should start fine in this case as Intel cpu instead. QEMU should start fine in this case as
"above_4G" memory starts at 4G. "above_4G" memory starts at 4G.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-cpu', 'Skylake-Server', self.vm.add_args('-S', '-cpu', 'Skylake-Server',
'-machine', 'pc-q35-7.1', '-m', '-machine', 'pc-q35-7.1', '-m',
'512,slots=1,maxmem=976G', '512,slots=1,maxmem=976G',
@ -243,6 +273,7 @@ class MemAddrCheck(QemuSystemTest):
memory for the VM (1024 - 32 - 1 + 0.5). With 992 GiB, QEMU should memory for the VM (1024 - 32 - 1 + 0.5). With 992 GiB, QEMU should
fail to start. fail to start.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41', self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41',
'-machine', 'pc-q35-7.1', '-m', '-machine', 'pc-q35-7.1', '-m',
'512,slots=1,maxmem=992G', '512,slots=1,maxmem=992G',
@ -261,6 +292,7 @@ class MemAddrCheck(QemuSystemTest):
Same as above but by setting maxram between 976 GiB and 992 Gib, Same as above but by setting maxram between 976 GiB and 992 Gib,
QEMU should start fine. QEMU should start fine.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41', self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41',
'-machine', 'pc-q35-7.1', '-m', '-machine', 'pc-q35-7.1', '-m',
'512,slots=1,maxmem=990G', '512,slots=1,maxmem=990G',
@ -281,6 +313,7 @@ class MemAddrCheck(QemuSystemTest):
So maxmem here should be at most 986 GiB considering all memory boundary So maxmem here should be at most 986 GiB considering all memory boundary
alignment constraints with 40 bits (1 TiB) of processor physical bits. alignment constraints with 40 bits (1 TiB) of processor physical bits.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40', self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40',
'-machine', 'q35,cxl=on', '-m', '-machine', 'q35,cxl=on', '-m',
'512,slots=1,maxmem=987G', '512,slots=1,maxmem=987G',
@ -299,6 +332,7 @@ class MemAddrCheck(QemuSystemTest):
with the exact same parameters as above, QEMU should start fine even with the exact same parameters as above, QEMU should start fine even
with cxl enabled. with cxl enabled.
""" """
self.ensure_64bit_binary()
self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40', self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40',
'-machine', 'q35,cxl=on', '-m', '-machine', 'q35,cxl=on', '-m',
'512,slots=1,maxmem=987G', '512,slots=1,maxmem=987G',