tests/functional/s390x: Add test for booting from a disk with 4k sectors
The DASD disks on s390x have a different sector size (4k) and use a different layout of the boot loader data compared to the usual "SCSI"-style disks with 512 sectors that are used with most modern guests. To make sure that there are no regressions with 4k disk booting, add a test case that uses a disk image with these 4k sectors and check that we can successfully show the boot menu and and load the right kernel in all supported cases. Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Eric Farman <farman@linux.ibm.com> Message-ID: <20260323171423.112205-1-thuth@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Thomas Huth committed
Mar 23, 2026 at 18:14 UTC
3cd0312cfb0ddbbc133d1c207fb2983bcc594f81
2 files changed
+139
tests/functional/s390x/meson.build
+1
@@ -10,6 +10,7 @@ tests_s390x_system_quick = [
10
]
11
12
tests_s390x_system_thorough = [
13
+ 'boot_4k',
14
'ccw_virtio',
15
'pxelinux',
16
'replay',
tests/functional/s390x/test_boot_4k.py
new
+138
@@ -0,0 +1,138 @@
1
+#!/usr/bin/env python3
2
+#
3
+# SPDX-License-Identifier: GPL-2.0-or-later
4
+#
5
+# Copyright 2026 Red Hat, Inc.
6
+#
7
+# Author:
8
+# Thomas Huth <thuth@redhat.com>
9
+'''
10
+Functional test that boots from a (incomplete) disk with 4k sectors
11
+(DASD/ECKD geometry) and multiple kernels installed, so we can check
12
+the boot menu and various LOADPARM options.
13
+'''
14
+
15
+from qemu_test import QemuSystemTest, Asset, skipFlakyTest
16
+from qemu_test import wait_for_console_pattern
17
+
18
+
19
+class S390Boot4k(QemuSystemTest):
20
+
21
+ # This disk image has been taken from a DASD with 4k sectors.
22
+ # Note: It's incomplete (to keep it small), it contains just enough
23
+ # data for booting the kernels that are installed on the disk image
24
+ ASSET_DISK = Asset(
25
+ ('https://github.com/huth/qemu-paddock/raw/refs/heads/main/s390x/'
26
+ 'f32-4k-bootmenu.raw.xz'),
27
+ 'f4e2c91b4ec50a4756e8816b7a7c8ca01cc0d929f7a711cfd8124640c304ea41')
28
+
29
+ def wait_for_pattern(self, success_message, vm=None):
30
+ wait_for_console_pattern(self, success_message, vm=vm,
31
+ failure_message='panic')
32
+
33
+ def basic_machine_setup(self):
34
+ self.set_machine('s390-ccw-virtio')
35
+ disk_path = self.uncompress(self.ASSET_DISK, format="xz")
36
+
37
+ self.vm.set_console()
38
+ self.vm.add_args("-nographic", "-no-shutdown", "-blockdev",
39
+ f"driver=file,filename={disk_path},node-name=d1")
40
+
41
+ def test_default(self):
42
+ '''
43
+ Check that the default kernel boots up correctly from a ccw device
44
+ '''
45
+ self.basic_machine_setup()
46
+ self.vm.add_args("-device", "virtio-blk-ccw,drive=d1")
47
+ self.vm.launch()
48
+ self.wait_for_pattern("Linux version 5.8.15-301.fc33.s390x")
49
+ self.wait_for_pattern("Trying to unpack rootfs image as initramfs")
50
+
51
+ def test_loadparm_machine(self):
52
+ '''
53
+ Check that we can select a kernel via "-machine loadparm=..."
54
+ '''
55
+ self.basic_machine_setup()
56
+ self.vm.add_args("-device", "virtio-blk-ccw,drive=d1",
57
+ "-machine", "loadparm=2")
58
+ self.vm.launch()
59
+ self.wait_for_pattern("Linux version 5.6.6-300.fc32.s390x")
60
+
61
+ def test_loadparm_device(self):
62
+ '''
63
+ Check that we can select a kernel via "-device ...,loadparm=..."
64
+ '''
65
+ self.basic_machine_setup()
66
+ self.vm.add_args("-device",
67
+ "virtio-blk-ccw,drive=d1,bootindex=1,loadparm=3")
68
+ self.vm.launch()
69
+ self.wait_for_pattern("Linux version 5.6.6-300.fc32.s390x")
70
+
71
+ @skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/work_items/3350")
72
+ def test_loadparm_pci(self):
73
+ '''
74
+ Check that we can select a kernel via "-device ...-pci,loadparm=..."
75
+ '''
76
+ self.require_device('virtio-blk-pci')
77
+ self.basic_machine_setup()
78
+ self.vm.add_args("-device",
79
+ "virtio-blk-pci,drive=d1,bootindex=1,loadparm=2")
80
+ self.vm.launch()
81
+ self.wait_for_pattern("Linux version 5.6.6-300.fc32.s390x")
82
+
83
+ def test_scsi_default(self):
84
+ '''
85
+ Check that we can boot via SCSI, too (need to set logical block size
86
+ here to avoid that the auto-detection in the bios fails)
87
+ '''
88
+ self.basic_machine_setup()
89
+ self.vm.add_args("-device", "virtio-scsi", "-device",
90
+ "scsi-hd,drive=d1,physical_block_size=4096,logical_block_size=4096")
91
+ self.vm.launch()
92
+ self.wait_for_pattern("Linux version 5.8.15-301.fc33.s390x")
93
+
94
+ def test_scsi_loadparm(self):
95
+ '''
96
+ Check that we can boot via SCSI with loadparm
97
+ '''
98
+ self.basic_machine_setup()
99
+ self.vm.add_args("-device", "virtio-scsi", "-device",
100
+ ("scsi-hd,drive=d1,bootindex=1,loadparm=3,"
101
+ "physical_block_size=4096,logical_block_size=4096"))
102
+ self.vm.launch()
103
+ self.wait_for_pattern("Linux version 5.6.6-300.fc32.s390x")
104
+
105
+ def test_menu(self):
106
+ '''
107
+ Check that boot menu shows up correctly
108
+ '''
109
+ self.basic_machine_setup()
110
+ self.vm.add_args("-device", "virtio-blk-ccw,drive=d1,bootindex=1",
111
+ "-boot", "menu=on")
112
+ self.vm.launch()
113
+ self.wait_for_pattern("1. Fedora (5.8.15-301.fc33.s390x) 33")
114
+ self.wait_for_pattern("2. Fedora (5.6.6-300.fc32.s390x) 32")
115
+ self.wait_for_pattern("3. Fedora (0-rescue-b7218f0092704c5a9")
116
+ self.wait_for_pattern("Please choose:")
117
+ # For some unknown reason, sending a key to the bios does not work
118
+ # in the testing framework yet:
119
+ # exec_command_and_wait_for_pattern(self, '2',
120
+ # "Linux version 5.6.6-300.fc32.s390x")
121
+
122
+ def test_menu_timeout(self):
123
+ '''
124
+ Check that boot menu shows up and boot continues automatically
125
+ when a timeout has been specified
126
+ '''
127
+ self.basic_machine_setup()
128
+ self.vm.add_args("-device", "virtio-blk-ccw,drive=d1,bootindex=1",
129
+ "-boot", "menu=on,splash-time=1")
130
+ self.vm.launch()
131
+ self.wait_for_pattern("s390-ccw zIPL Boot Menu")
132
+ self.wait_for_pattern("0. default (Fedora (5.8.15-301.fc33.s390x)")
133
+ self.wait_for_pattern("(default will boot in 0 seconds)")
134
+ self.wait_for_pattern("Linux version 5.8.15-301.fc33.s390x")
135
+
136
+
137
+if __name__ == '__main__':
138
+ QemuSystemTest.main()