This is a proof-of-concept for the '-smp cores=1' feature which restricts the cores brought online on reset.
The u-boot binary is old and from an untrusted source, but I don't want to add the build machinery in QEMU, so it is enough to demonstrate the feature works reliably. By default this test is not run: $ avocado run -t machine:raspi3 tests/acceptance/ (1/1) tests/acceptance/boot_linux_console.py:BootLinuxConsole.test_arm_raspi3_uboot: SKIP: untrusted code RESULTS : PASS 0 | ERROR 0 | FAIL 0 | SKIP 1 | WARN 0 | INTERRUPT 0 | CANCEL 0 JOB TIME : 0.23 s We can run it setting the AVOCADO_ALLOW_UNTRUSTED_CODE variable: $ AVOCADO_ALLOW_UNTRUSTED_CODE=1 ./tests/venv/bin/avocado --show=app,console run -t machine:raspi3 tests/acceptance/ (1/1) tests/acceptance/boot_linux_console.py:BootLinuxConsole.test_arm_raspi3_uboot: console: U-Boot 2016.05-rc1-gd36dcaf (Apr 28 2016 - 23:29:29 +0200) console: DRAM: 960 MiB console: RPI 3 Model B (0xa02082) console: boot regs: 0x00000000 0x00000000 0x00000000 0x00000000 console: MMC: bcm2835_sdhci: 0 console: Card did not respond to voltage select! console: ** Bad device mmc 0 ** console: Using default environment console: In: serial console: Out: lcd console: Err: lcd console: Net: Net Initialization Skipped console: No ethernet found. PASS (0.30 s) Then test QEMU: $ qemu-system-aarch64 \ -M raspi3 -smp 4,cores=1 \ -kernel u-boot.bin \ -serial null -serial stdio U-Boot 2016.05-rc1-gd36dcaf (Apr 28 2016 - 23:29:29 +0200) DRAM: 960 MiB RPI 3 Model B (0xa02082) boot regs: 0x00000000 0x00000000 0x00000000 0x00000000 MMC: bcm2835_sdhci: 0 Card did not respond to voltage select! ** Bad device mmc 0 ** Using default environment In: serial Out: lcd Err: lcd Net: Net Initialization Skipped No ethernet found. starting USB... USB0: Core Release: 0.000 SNPSID invalid (not DWC2 OTG device): 00000000 Port not available. Autoboot in 2 seconds Card did not respond to voltage select! starting USB... USB0: Core Release: 0.000 SNPSID invalid (not DWC2 OTG device): 00000000 Port not available. USB is stopped. Please issue 'usb start' first. starting USB... USB0: Core Release: 0.000 SNPSID invalid (not DWC2 OTG device): 00000000 Port not available. No ethernet found. missing environment variable: pxeuuid missing environment variable: bootfile Retrieving file: pxelinux.cfg/00000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/00000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/00 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default-arm-bcm283x No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default-arm No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default No ethernet found. Config file not found starting USB... USB0: Core Release: 0.000 SNPSID invalid (not DWC2 OTG device): 00000000 Port not available. No ethernet found. U-Boot> version U-Boot 2016.05-rc1-gd36dcaf (Apr 28 2016 - 23:29:29 +0200) aarch64-unknown-linux-gnu-gcc (Gentoo 5.3.0 p1.0, pie-0.6.5) 5.3.0 GNU ld (Gentoo 2.25.1 p1.1) 2.25.1 U-Boot> ^C qemu-system-aarch64: terminating on signal 2 We can also build a recent U-boot with: u-boot$ export CROSS_COMPILE=aarch64-linux-gnu- u-boot$ make rpi_3_defconfig u-boot$ make -j8 And test it: $ qemu-system-aarch64 \ -M raspi3 -smp 4,cores=1 \ -kernel u-boot.bin \ -serial null -serial stdio MMC: mmc@7e202000: 0, sdhci@7e300000: 1 Loading Environment from FAT... WARNING at drivers/mmc/bcm2835_sdhost.c:410/bcm2835_send_command()! WARNING at drivers/mmc/bcm2835_sdhost.c:410/bcm2835_send_command()! Card did not respond to voltage select! In: serial Out: vidconsole Err: vidconsole Net: No ethernet found. starting USB... Bus usb@7e980000: Port not available. Hit any key to stop autoboot: 0 WARNING at drivers/mmc/bcm2835_sdhost.c:410/bcm2835_send_command()! WARNING at drivers/mmc/bcm2835_sdhost.c:410/bcm2835_send_command()! WARNING at drivers/mmc/bcm2835_sdhost.c:410/bcm2835_send_command()! Card did not respond to voltage select! MMC: no card present starting USB... Bus usb@7e980000: Port not available. USB is stopped. Please issue 'usb start' first. starting USB... Bus usb@7e980000: Port not available. No ethernet found. missing environment variable: pxeuuid missing environment variable: bootfile Retrieving file: pxelinux.cfg/00000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/000000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/00000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/000 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/00 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/0 No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default-arm-bcm283x-rpi No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default-arm-bcm283x No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default-arm No ethernet found. missing environment variable: bootfile Retrieving file: pxelinux.cfg/default No ethernet found. Config file not found starting USB... Bus usb@7e980000: Port not available. No ethernet found. No ethernet found. U-Boot> version U-Boot 2019.10-rc4-dirty (Oct 19 2019 - 22:02:10 +0000) aarch64-linux-gnu-gcc (Debian 8.3.0-2) 8.3.0 GNU ld (GNU Binutils for Debian) 2.31.1 U-Boot> reset resetting ... U-Boot> ^C qemu-system-aarch64: terminating on signal 2 Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- tests/acceptance/boot_linux_console.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/acceptance/boot_linux_console.py b/tests/acceptance/boot_linux_console.py index 8a9a314ab4..7c73051a9a 100644 --- a/tests/acceptance/boot_linux_console.py +++ b/tests/acceptance/boot_linux_console.py @@ -14,6 +14,7 @@ import lzma import gzip import shutil +from avocado import skipUnless from avocado_qemu import Test from avocado.utils import process from avocado.utils import archive @@ -316,6 +317,28 @@ class BootLinuxConsole(Test): self.vm.launch() self.wait_for_console_pattern('init started: BusyBox') + @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code') + def test_arm_raspi3_uboot(self): + """ + :avocado: tags=arch:aarch64 + :avocado: tags=machine:raspi3 + :avocado: tags=endian:little + """ + uboot_url = ('https://github.com/poinck/piii64/raw/bf3e070d/' + 'boot/u-boot.bin') + uboot_hash = 'cd2ab2a24589a5b9d177af172af8b39998e5f93f' + uboot_path = self.fetch_asset(uboot_url, asset_hash=uboot_hash) + + self.vm.set_machine('raspi3') + self.vm.set_console(console_index=1) + kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + self.vm.add_args('-kernel', uboot_path, + '-smp', '4,cores=1', # start 3 cores disabled + '-no-reboot') + self.vm.launch() + self.wait_for_console_pattern('RPI 3 Model B') + self.wait_for_console_pattern('No ethernet found.') + def test_s390x_s390_ccw_virtio(self): """ :avocado: tags=arch:s390x -- 2.21.0