hw/intc/arm_gicv3_its: Drop TableDesc and CmdQDesc valid fields
[qemu.git] / tests / avocado / replay_kernel.py
blobc68a9537301df03b01c869dfa6afe4a3acd68c32
1 # Record/replay test that boots a Linux kernel
3 # Copyright (c) 2020 ISP RAS
5 # Author:
6 # Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
8 # This work is licensed under the terms of the GNU GPL, version 2 or
9 # later. See the COPYING file in the top-level directory.
11 import os
12 import lzma
13 import shutil
14 import logging
15 import time
17 from avocado import skip
18 from avocado import skipIf
19 from avocado import skipUnless
20 from avocado_qemu import wait_for_console_pattern
21 from avocado.utils import archive
22 from avocado.utils import process
23 from boot_linux_console import LinuxKernelTest
25 class ReplayKernelBase(LinuxKernelTest):
26 """
27 Boots a Linux kernel in record mode and checks that the console
28 is operational and the kernel command line is properly passed
29 from QEMU to the kernel.
30 Then replays the same scenario and verifies, that QEMU correctly
31 terminates.
32 """
34 timeout = 120
35 KERNEL_COMMON_COMMAND_LINE = 'printk.time=1 panic=-1 '
37 def run_vm(self, kernel_path, kernel_command_line, console_pattern,
38 record, shift, args, replay_path):
39 logger = logging.getLogger('replay')
40 start_time = time.time()
41 vm = self.get_vm()
42 vm.set_console()
43 if record:
44 logger.info('recording the execution...')
45 mode = 'record'
46 else:
47 logger.info('replaying the execution...')
48 mode = 'replay'
49 vm.add_args('-icount', 'shift=%s,rr=%s,rrfile=%s' %
50 (shift, mode, replay_path),
51 '-kernel', kernel_path,
52 '-append', kernel_command_line,
53 '-net', 'none',
54 '-no-reboot')
55 if args:
56 vm.add_args(*args)
57 vm.launch()
58 self.wait_for_console_pattern(console_pattern, vm)
59 if record:
60 vm.shutdown()
61 logger.info('finished the recording with log size %s bytes'
62 % os.path.getsize(replay_path))
63 else:
64 vm.wait()
65 logger.info('successfully finished the replay')
66 elapsed = time.time() - start_time
67 logger.info('elapsed time %.2f sec' % elapsed)
68 return elapsed
70 def run_rr(self, kernel_path, kernel_command_line, console_pattern,
71 shift=7, args=None):
72 replay_path = os.path.join(self.workdir, 'replay.bin')
73 t1 = self.run_vm(kernel_path, kernel_command_line, console_pattern,
74 True, shift, args, replay_path)
75 t2 = self.run_vm(kernel_path, kernel_command_line, console_pattern,
76 False, shift, args, replay_path)
77 logger = logging.getLogger('replay')
78 logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1))
80 class ReplayKernelNormal(ReplayKernelBase):
81 @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
82 def test_x86_64_pc(self):
83 """
84 :avocado: tags=arch:x86_64
85 :avocado: tags=machine:pc
86 """
87 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
88 '/linux/releases/29/Everything/x86_64/os/images/pxeboot'
89 '/vmlinuz')
90 kernel_hash = '23bebd2680757891cf7adedb033532163a792495'
91 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
93 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
94 console_pattern = 'VFS: Cannot open root device'
96 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5)
98 def test_mips_malta(self):
99 """
100 :avocado: tags=arch:mips
101 :avocado: tags=machine:malta
102 :avocado: tags=endian:big
104 deb_url = ('http://snapshot.debian.org/archive/debian/'
105 '20130217T032700Z/pool/main/l/linux-2.6/'
106 'linux-image-2.6.32-5-4kc-malta_2.6.32-48_mips.deb')
107 deb_hash = 'a8cfc28ad8f45f54811fc6cf74fc43ffcfe0ba04'
108 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
109 kernel_path = self.extract_from_deb(deb_path,
110 '/boot/vmlinux-2.6.32-5-4kc-malta')
111 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
112 console_pattern = 'Kernel command line: %s' % kernel_command_line
114 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5)
116 def test_mips64el_malta(self):
118 This test requires the ar tool to extract "data.tar.gz" from
119 the Debian package.
121 The kernel can be rebuilt using this Debian kernel source [1] and
122 following the instructions on [2].
124 [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/
125 #linux-source-2.6.32_2.6.32-48
126 [2] https://kernel-team.pages.debian.net/kernel-handbook/
127 ch-common-tasks.html#s-common-official
129 :avocado: tags=arch:mips64el
130 :avocado: tags=machine:malta
132 deb_url = ('http://snapshot.debian.org/archive/debian/'
133 '20130217T032700Z/pool/main/l/linux-2.6/'
134 'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb')
135 deb_hash = '1aaec92083bf22fda31e0d27fa8d9a388e5fc3d5'
136 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
137 kernel_path = self.extract_from_deb(deb_path,
138 '/boot/vmlinux-2.6.32-5-5kc-malta')
139 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
140 console_pattern = 'Kernel command line: %s' % kernel_command_line
141 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5)
143 def test_aarch64_virt(self):
145 :avocado: tags=arch:aarch64
146 :avocado: tags=machine:virt
147 :avocado: tags=cpu:cortex-a53
149 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
150 '/linux/releases/29/Everything/aarch64/os/images/pxeboot'
151 '/vmlinuz')
152 kernel_hash = '8c73e469fc6ea06a58dc83a628fc695b693b8493'
153 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
155 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
156 'console=ttyAMA0')
157 console_pattern = 'VFS: Cannot open root device'
159 self.run_rr(kernel_path, kernel_command_line, console_pattern)
161 def test_arm_virt(self):
163 :avocado: tags=arch:arm
164 :avocado: tags=machine:virt
166 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
167 '/linux/releases/29/Everything/armhfp/os/images/pxeboot'
168 '/vmlinuz')
169 kernel_hash = 'e9826d741b4fb04cadba8d4824d1ed3b7fb8b4d4'
170 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
172 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
173 'console=ttyAMA0')
174 console_pattern = 'VFS: Cannot open root device'
176 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=1)
178 @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
179 def test_arm_cubieboard_initrd(self):
181 :avocado: tags=arch:arm
182 :avocado: tags=machine:cubieboard
184 deb_url = ('https://apt.armbian.com/pool/main/l/'
185 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
186 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
187 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
188 kernel_path = self.extract_from_deb(deb_path,
189 '/boot/vmlinuz-5.10.16-sunxi')
190 dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb'
191 dtb_path = self.extract_from_deb(deb_path, dtb_path)
192 initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
193 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
194 'arm/rootfs-armv5.cpio.gz')
195 initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
196 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
197 initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
198 archive.gzip_uncompress(initrd_path_gz, initrd_path)
200 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
201 'console=ttyS0,115200 '
202 'usbcore.nousb '
203 'panic=-1 noreboot')
204 console_pattern = 'Boot successful.'
205 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=1,
206 args=('-dtb', dtb_path,
207 '-initrd', initrd_path,
208 '-no-reboot'))
210 def test_s390x_s390_ccw_virtio(self):
212 :avocado: tags=arch:s390x
213 :avocado: tags=machine:s390-ccw-virtio
215 kernel_url = ('https://archives.fedoraproject.org/pub/archive'
216 '/fedora-secondary/releases/29/Everything/s390x/os/images'
217 '/kernel.img')
218 kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313'
219 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
221 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0'
222 console_pattern = 'Kernel command line: %s' % kernel_command_line
223 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=9)
225 def test_alpha_clipper(self):
227 :avocado: tags=arch:alpha
228 :avocado: tags=machine:clipper
230 kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/'
231 'installer-alpha/20090123lenny10/images/cdrom/vmlinuz')
232 kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3'
233 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
235 uncompressed_kernel = archive.uncompress(kernel_path, self.workdir)
237 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
238 console_pattern = 'Kernel command line: %s' % kernel_command_line
239 self.run_rr(uncompressed_kernel, kernel_command_line, console_pattern, shift=9,
240 args=('-nodefaults', ))
242 def test_ppc64_pseries(self):
244 :avocado: tags=arch:ppc64
245 :avocado: tags=machine:pseries
247 kernel_url = ('https://archives.fedoraproject.org/pub/archive'
248 '/fedora-secondary/releases/29/Everything/ppc64le/os'
249 '/ppc/ppc64/vmlinuz')
250 kernel_hash = '3fe04abfc852b66653b8c3c897a59a689270bc77'
251 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
253 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
254 # icount is not good enough for PPC64 for complete boot yet
255 console_pattern = 'Kernel command line: %s' % kernel_command_line
256 self.run_rr(kernel_path, kernel_command_line, console_pattern)
258 def test_m68k_q800(self):
260 :avocado: tags=arch:m68k
261 :avocado: tags=machine:q800
263 deb_url = ('https://snapshot.debian.org/archive/debian-ports'
264 '/20191021T083923Z/pool-m68k/main'
265 '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb')
266 deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1'
267 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
268 kernel_path = self.extract_from_deb(deb_path,
269 '/boot/vmlinux-5.3.0-1-m68k')
271 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
272 'console=ttyS0 vga=off')
273 console_pattern = 'No filesystem could mount root'
274 self.run_rr(kernel_path, kernel_command_line, console_pattern)
276 def do_test_advcal_2018(self, file_path, kernel_name, args=None):
277 archive.extract(file_path, self.workdir)
279 for entry in os.scandir(self.workdir):
280 if entry.name.startswith('day') and entry.is_dir():
281 kernel_path = os.path.join(entry.path, kernel_name)
282 break
284 kernel_command_line = ''
285 console_pattern = 'QEMU advent calendar'
286 self.run_rr(kernel_path, kernel_command_line, console_pattern,
287 args=args)
289 def test_arm_vexpressa9(self):
291 :avocado: tags=arch:arm
292 :avocado: tags=machine:vexpress-a9
294 tar_hash = '32b7677ce8b6f1471fb0059865f451169934245b'
295 tar_url = ('https://www.qemu-advent-calendar.org'
296 '/2018/download/day16.tar.xz')
297 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
298 dtb_path = self.workdir + '/day16/vexpress-v2p-ca9.dtb'
299 self.do_test_advcal_2018(file_path, 'winter.zImage',
300 args=('-dtb', dtb_path))
302 def test_m68k_mcf5208evb(self):
304 :avocado: tags=arch:m68k
305 :avocado: tags=machine:mcf5208evb
307 tar_hash = 'ac688fd00561a2b6ce1359f9ff6aa2b98c9a570c'
308 tar_url = ('https://www.qemu-advent-calendar.org'
309 '/2018/download/day07.tar.xz')
310 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
311 self.do_test_advcal_2018(file_path, 'sanity-clause.elf')
313 @skip("Test currently broken") # Console stuck as of 5.2-rc1
314 def test_microblaze_s3adsp1800(self):
316 :avocado: tags=arch:microblaze
317 :avocado: tags=machine:petalogix-s3adsp1800
319 tar_hash = '08bf3e3bfb6b6c7ce1e54ab65d54e189f2caf13f'
320 tar_url = ('https://www.qemu-advent-calendar.org'
321 '/2018/download/day17.tar.xz')
322 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
323 self.do_test_advcal_2018(file_path, 'ballerina.bin')
325 def test_ppc64_e500(self):
327 :avocado: tags=arch:ppc64
328 :avocado: tags=machine:ppce500
329 :avocado: tags=cpu:e5500
331 tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
332 tar_url = ('https://www.qemu-advent-calendar.org'
333 '/2018/download/day19.tar.xz')
334 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
335 self.do_test_advcal_2018(file_path, 'uImage')
337 def test_or1k_sim(self):
339 :avocado: tags=arch:or1k
340 :avocado: tags=machine:or1k-sim
342 tar_hash = '20334cdaf386108c530ff0badaecc955693027dd'
343 tar_url = ('https://www.qemu-advent-calendar.org'
344 '/2018/download/day20.tar.xz')
345 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
346 self.do_test_advcal_2018(file_path, 'vmlinux')
348 def test_nios2_10m50(self):
350 :avocado: tags=arch:nios2
351 :avocado: tags=machine:10m50-ghrd
353 tar_hash = 'e4251141726c412ac0407c5a6bceefbbff018918'
354 tar_url = ('https://www.qemu-advent-calendar.org'
355 '/2018/download/day14.tar.xz')
356 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
357 self.do_test_advcal_2018(file_path, 'vmlinux.elf')
359 def test_ppc_g3beige(self):
361 :avocado: tags=arch:ppc
362 :avocado: tags=machine:g3beige
364 tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
365 tar_url = ('https://www.qemu-advent-calendar.org'
366 '/2018/download/day15.tar.xz')
367 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
368 self.do_test_advcal_2018(file_path, 'invaders.elf',
369 args=('-M', 'graphics=off'))
371 def test_ppc_mac99(self):
373 :avocado: tags=arch:ppc
374 :avocado: tags=machine:mac99
376 tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
377 tar_url = ('https://www.qemu-advent-calendar.org'
378 '/2018/download/day15.tar.xz')
379 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
380 self.do_test_advcal_2018(file_path, 'invaders.elf',
381 args=('-M', 'graphics=off'))
383 def test_sparc_ss20(self):
385 :avocado: tags=arch:sparc
386 :avocado: tags=machine:SS-20
388 tar_hash = 'b18550d5d61c7615d989a06edace051017726a9f'
389 tar_url = ('https://www.qemu-advent-calendar.org'
390 '/2018/download/day11.tar.xz')
391 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
392 self.do_test_advcal_2018(file_path, 'zImage.elf')
394 def test_xtensa_lx60(self):
396 :avocado: tags=arch:xtensa
397 :avocado: tags=machine:lx60
398 :avocado: tags=cpu:dc233c
400 tar_hash = '49e88d9933742f0164b60839886c9739cb7a0d34'
401 tar_url = ('https://www.qemu-advent-calendar.org'
402 '/2018/download/day02.tar.xz')
403 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
404 self.do_test_advcal_2018(file_path, 'santas-sleigh-ride.elf')
406 @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
407 class ReplayKernelSlow(ReplayKernelBase):
408 # Override the timeout, because this kernel includes an inner
409 # loop which is executed with TB recompilings during replay,
410 # making it very slow.
411 timeout = 180
413 def test_mips_malta_cpio(self):
415 :avocado: tags=arch:mips
416 :avocado: tags=machine:malta
417 :avocado: tags=endian:big
418 :avocado: tags=slowness:high
420 deb_url = ('http://snapshot.debian.org/archive/debian/'
421 '20160601T041800Z/pool/main/l/linux/'
422 'linux-image-4.5.0-2-4kc-malta_4.5.5-1_mips.deb')
423 deb_hash = 'a3c84f3e88b54e06107d65a410d1d1e8e0f340f8'
424 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
425 kernel_path = self.extract_from_deb(deb_path,
426 '/boot/vmlinux-4.5.0-2-4kc-malta')
427 initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
428 '8584a59ed9e5eb5ee7ca91f6d74bbb06619205b8/rootfs/'
429 'mips/rootfs.cpio.gz')
430 initrd_hash = 'bf806e17009360a866bf537f6de66590de349a99'
431 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
432 initrd_path = self.workdir + "rootfs.cpio"
433 archive.gzip_uncompress(initrd_path_gz, initrd_path)
435 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
436 'console=ttyS0 console=tty '
437 'rdinit=/sbin/init noreboot')
438 console_pattern = 'Boot successful.'
439 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5,
440 args=('-initrd', initrd_path))
442 @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
443 def test_mips64el_malta_5KEc_cpio(self):
445 :avocado: tags=arch:mips64el
446 :avocado: tags=machine:malta
447 :avocado: tags=endian:little
448 :avocado: tags=slowness:high
449 :avocado: tags=cpu:5KEc
451 kernel_url = ('https://github.com/philmd/qemu-testing-blob/'
452 'raw/9ad2df38/mips/malta/mips64el/'
453 'vmlinux-3.19.3.mtoman.20150408')
454 kernel_hash = '00d1d268fb9f7d8beda1de6bebcc46e884d71754'
455 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
456 initrd_url = ('https://github.com/groeck/linux-build-test/'
457 'raw/8584a59e/rootfs/'
458 'mipsel64/rootfs.mipsel64r1.cpio.gz')
459 initrd_hash = '1dbb8a396e916847325284dbe2151167'
460 initrd_path_gz = self.fetch_asset(initrd_url, algorithm='md5',
461 asset_hash=initrd_hash)
462 initrd_path = self.workdir + "rootfs.cpio"
463 archive.gzip_uncompress(initrd_path_gz, initrd_path)
465 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
466 'console=ttyS0 console=tty '
467 'rdinit=/sbin/init noreboot')
468 console_pattern = 'Boot successful.'
469 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5,
470 args=('-initrd', initrd_path))
472 def do_test_mips_malta32el_nanomips(self, kernel_path_xz):
473 kernel_path = self.workdir + "kernel"
474 with lzma.open(kernel_path_xz, 'rb') as f_in:
475 with open(kernel_path, 'wb') as f_out:
476 shutil.copyfileobj(f_in, f_out)
478 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
479 'mem=256m@@0x0 '
480 'console=ttyS0')
481 console_pattern = 'Kernel command line: %s' % kernel_command_line
482 self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=5)
484 def test_mips_malta32el_nanomips_4k(self):
486 :avocado: tags=arch:mipsel
487 :avocado: tags=machine:malta
488 :avocado: tags=endian:little
489 :avocado: tags=cpu:I7200
491 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
492 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
493 'generic_nano32r6el_page4k.xz')
494 kernel_hash = '477456aafd2a0f1ddc9482727f20fe9575565dd6'
495 kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
496 self.do_test_mips_malta32el_nanomips(kernel_path_xz)
498 def test_mips_malta32el_nanomips_16k_up(self):
500 :avocado: tags=arch:mipsel
501 :avocado: tags=machine:malta
502 :avocado: tags=endian:little
503 :avocado: tags=cpu:I7200
505 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
506 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
507 'generic_nano32r6el_page16k_up.xz')
508 kernel_hash = 'e882868f944c71c816e832e2303b7874d044a7bc'
509 kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
510 self.do_test_mips_malta32el_nanomips(kernel_path_xz)
512 def test_mips_malta32el_nanomips_64k_dbg(self):
514 :avocado: tags=arch:mipsel
515 :avocado: tags=machine:malta
516 :avocado: tags=endian:little
517 :avocado: tags=cpu:I7200
519 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
520 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
521 'generic_nano32r6el_page64k_dbg.xz')
522 kernel_hash = '18d1c68f2e23429e266ca39ba5349ccd0aeb7180'
523 kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
524 self.do_test_mips_malta32el_nanomips(kernel_path_xz)