xref: /qemu/tests/avocado/boot_linux_console.py (revision dcc5c018)
1bbbd9b6eSWillian Rampazzo# Functional test that boots a Linux kernel and checks the console
2bbbd9b6eSWillian Rampazzo#
3bbbd9b6eSWillian Rampazzo# Copyright (c) 2018 Red Hat, Inc.
4bbbd9b6eSWillian Rampazzo#
5bbbd9b6eSWillian Rampazzo# Author:
6bbbd9b6eSWillian Rampazzo#  Cleber Rosa <crosa@redhat.com>
7bbbd9b6eSWillian Rampazzo#
8bbbd9b6eSWillian Rampazzo# This work is licensed under the terms of the GNU GPL, version 2 or
9bbbd9b6eSWillian Rampazzo# later.  See the COPYING file in the top-level directory.
10bbbd9b6eSWillian Rampazzo
11bbbd9b6eSWillian Rampazzoimport os
12bbbd9b6eSWillian Rampazzoimport lzma
13bbbd9b6eSWillian Rampazzoimport gzip
14bbbd9b6eSWillian Rampazzoimport shutil
15bbbd9b6eSWillian Rampazzo
16bbbd9b6eSWillian Rampazzofrom avocado import skip
17bbbd9b6eSWillian Rampazzofrom avocado import skipUnless
189b45cc99SAlex Bennéefrom avocado import skipUnless
192283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest
20bbbd9b6eSWillian Rampazzofrom avocado_qemu import exec_command
21bbbd9b6eSWillian Rampazzofrom avocado_qemu import exec_command_and_wait_for_pattern
22bbbd9b6eSWillian Rampazzofrom avocado_qemu import interrupt_interactive_console_until_pattern
23bbbd9b6eSWillian Rampazzofrom avocado_qemu import wait_for_console_pattern
24bbbd9b6eSWillian Rampazzofrom avocado.utils import process
25bbbd9b6eSWillian Rampazzofrom avocado.utils import archive
26bbbd9b6eSWillian Rampazzo
27bbbd9b6eSWillian Rampazzo"""
28bbbd9b6eSWillian RampazzoRound up to next power of 2
29bbbd9b6eSWillian Rampazzo"""
30bbbd9b6eSWillian Rampazzodef pow2ceil(x):
31bbbd9b6eSWillian Rampazzo    return 1 if x == 0 else 2**(x - 1).bit_length()
32bbbd9b6eSWillian Rampazzo
33ffd0cac7SPhilippe Mathieu-Daudédef file_truncate(path, size):
34ffd0cac7SPhilippe Mathieu-Daudé    if size != os.path.getsize(path):
35ffd0cac7SPhilippe Mathieu-Daudé        with open(path, 'ab+') as fd:
36ffd0cac7SPhilippe Mathieu-Daudé            fd.truncate(size)
37ffd0cac7SPhilippe Mathieu-Daudé
38bbbd9b6eSWillian Rampazzo"""
39bbbd9b6eSWillian RampazzoExpand file size to next power of 2
40bbbd9b6eSWillian Rampazzo"""
41bbbd9b6eSWillian Rampazzodef image_pow2ceil_expand(path):
42bbbd9b6eSWillian Rampazzo        size = os.path.getsize(path)
43bbbd9b6eSWillian Rampazzo        size_aligned = pow2ceil(size)
44bbbd9b6eSWillian Rampazzo        if size != size_aligned:
45bbbd9b6eSWillian Rampazzo            with open(path, 'ab+') as fd:
46bbbd9b6eSWillian Rampazzo                fd.truncate(size_aligned)
47bbbd9b6eSWillian Rampazzo
482283b627SPhilippe Mathieu-Daudéclass LinuxKernelTest(QemuSystemTest):
49bbbd9b6eSWillian Rampazzo    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
50bbbd9b6eSWillian Rampazzo
51bbbd9b6eSWillian Rampazzo    def wait_for_console_pattern(self, success_message, vm=None):
52bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, success_message,
53bbbd9b6eSWillian Rampazzo                                 failure_message='Kernel panic - not syncing',
54bbbd9b6eSWillian Rampazzo                                 vm=vm)
55bbbd9b6eSWillian Rampazzo
56bbbd9b6eSWillian Rampazzo    def extract_from_deb(self, deb, path):
57bbbd9b6eSWillian Rampazzo        """
58bbbd9b6eSWillian Rampazzo        Extracts a file from a deb package into the test workdir
59bbbd9b6eSWillian Rampazzo
60bbbd9b6eSWillian Rampazzo        :param deb: path to the deb archive
61bbbd9b6eSWillian Rampazzo        :param path: path within the deb archive of the file to be extracted
62bbbd9b6eSWillian Rampazzo        :returns: path of the extracted file
63bbbd9b6eSWillian Rampazzo        """
64bbbd9b6eSWillian Rampazzo        cwd = os.getcwd()
65bbbd9b6eSWillian Rampazzo        os.chdir(self.workdir)
66bbbd9b6eSWillian Rampazzo        file_path = process.run("ar t %s" % deb).stdout_text.split()[2]
67bbbd9b6eSWillian Rampazzo        process.run("ar x %s %s" % (deb, file_path))
68bbbd9b6eSWillian Rampazzo        archive.extract(file_path, self.workdir)
69bbbd9b6eSWillian Rampazzo        os.chdir(cwd)
70bbbd9b6eSWillian Rampazzo        # Return complete path to extracted file.  Because callers to
71bbbd9b6eSWillian Rampazzo        # extract_from_deb() specify 'path' with a leading slash, it is
72bbbd9b6eSWillian Rampazzo        # necessary to use os.path.relpath() as otherwise os.path.join()
73bbbd9b6eSWillian Rampazzo        # interprets it as an absolute path and drops the self.workdir part.
74bbbd9b6eSWillian Rampazzo        return os.path.normpath(os.path.join(self.workdir,
75bbbd9b6eSWillian Rampazzo                                             os.path.relpath(path, '/')))
76bbbd9b6eSWillian Rampazzo
77bbbd9b6eSWillian Rampazzo    def extract_from_rpm(self, rpm, path):
78bbbd9b6eSWillian Rampazzo        """
79bbbd9b6eSWillian Rampazzo        Extracts a file from an RPM package into the test workdir.
80bbbd9b6eSWillian Rampazzo
81bbbd9b6eSWillian Rampazzo        :param rpm: path to the rpm archive
82bbbd9b6eSWillian Rampazzo        :param path: path within the rpm archive of the file to be extracted
83bbbd9b6eSWillian Rampazzo                     needs to be a relative path (starting with './') because
84bbbd9b6eSWillian Rampazzo                     cpio(1), which is used to extract the file, expects that.
85bbbd9b6eSWillian Rampazzo        :returns: path of the extracted file
86bbbd9b6eSWillian Rampazzo        """
87bbbd9b6eSWillian Rampazzo        cwd = os.getcwd()
88bbbd9b6eSWillian Rampazzo        os.chdir(self.workdir)
89bbbd9b6eSWillian Rampazzo        process.run("rpm2cpio %s | cpio -id %s" % (rpm, path), shell=True)
90bbbd9b6eSWillian Rampazzo        os.chdir(cwd)
91bbbd9b6eSWillian Rampazzo        return os.path.normpath(os.path.join(self.workdir, path))
92bbbd9b6eSWillian Rampazzo
93bbbd9b6eSWillian Rampazzoclass BootLinuxConsole(LinuxKernelTest):
94bbbd9b6eSWillian Rampazzo    """
95bbbd9b6eSWillian Rampazzo    Boots a Linux kernel and checks that the console is operational and the
96bbbd9b6eSWillian Rampazzo    kernel command line is properly passed from QEMU to the kernel
97bbbd9b6eSWillian Rampazzo    """
98bbbd9b6eSWillian Rampazzo    timeout = 90
99bbbd9b6eSWillian Rampazzo
100bbbd9b6eSWillian Rampazzo    def test_x86_64_pc(self):
101bbbd9b6eSWillian Rampazzo        """
102bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:x86_64
103bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:pc
104bbbd9b6eSWillian Rampazzo        """
105bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
106bbbd9b6eSWillian Rampazzo                      '/linux/releases/29/Everything/x86_64/os/images/pxeboot'
107bbbd9b6eSWillian Rampazzo                      '/vmlinuz')
108bbbd9b6eSWillian Rampazzo        kernel_hash = '23bebd2680757891cf7adedb033532163a792495'
109bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
110bbbd9b6eSWillian Rampazzo
111bbbd9b6eSWillian Rampazzo        self.vm.set_console()
112bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
113bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
114bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
115bbbd9b6eSWillian Rampazzo        self.vm.launch()
116bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
117bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
118bbbd9b6eSWillian Rampazzo
119bbbd9b6eSWillian Rampazzo    def test_mips_malta(self):
120bbbd9b6eSWillian Rampazzo        """
121bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips
122bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
123bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:big
124bbbd9b6eSWillian Rampazzo        """
125bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
126bbbd9b6eSWillian Rampazzo                   '20130217T032700Z/pool/main/l/linux-2.6/'
127bbbd9b6eSWillian Rampazzo                   'linux-image-2.6.32-5-4kc-malta_2.6.32-48_mips.deb')
128bbbd9b6eSWillian Rampazzo        deb_hash = 'a8cfc28ad8f45f54811fc6cf74fc43ffcfe0ba04'
129bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
130bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
131bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-2.6.32-5-4kc-malta')
132bbbd9b6eSWillian Rampazzo
133bbbd9b6eSWillian Rampazzo        self.vm.set_console()
134bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
135bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
136bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
137bbbd9b6eSWillian Rampazzo        self.vm.launch()
138bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
139bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
140bbbd9b6eSWillian Rampazzo
141bbbd9b6eSWillian Rampazzo    def test_mips64el_malta(self):
142bbbd9b6eSWillian Rampazzo        """
143bbbd9b6eSWillian Rampazzo        This test requires the ar tool to extract "data.tar.gz" from
144bbbd9b6eSWillian Rampazzo        the Debian package.
145bbbd9b6eSWillian Rampazzo
146bbbd9b6eSWillian Rampazzo        The kernel can be rebuilt using this Debian kernel source [1] and
147bbbd9b6eSWillian Rampazzo        following the instructions on [2].
148bbbd9b6eSWillian Rampazzo
149bbbd9b6eSWillian Rampazzo        [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/
150bbbd9b6eSWillian Rampazzo            #linux-source-2.6.32_2.6.32-48
151bbbd9b6eSWillian Rampazzo        [2] https://kernel-team.pages.debian.net/kernel-handbook/
152bbbd9b6eSWillian Rampazzo            ch-common-tasks.html#s-common-official
153bbbd9b6eSWillian Rampazzo
154bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
155bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
156bbbd9b6eSWillian Rampazzo        """
157bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
158bbbd9b6eSWillian Rampazzo                   '20130217T032700Z/pool/main/l/linux-2.6/'
159bbbd9b6eSWillian Rampazzo                   'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb')
160bbbd9b6eSWillian Rampazzo        deb_hash = '1aaec92083bf22fda31e0d27fa8d9a388e5fc3d5'
161bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
162bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
163bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-2.6.32-5-5kc-malta')
164bbbd9b6eSWillian Rampazzo
165bbbd9b6eSWillian Rampazzo        self.vm.set_console()
166bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
167bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
168bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
169bbbd9b6eSWillian Rampazzo        self.vm.launch()
170bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
171bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
172bbbd9b6eSWillian Rampazzo
173bbbd9b6eSWillian Rampazzo    def test_mips64el_fuloong2e(self):
174bbbd9b6eSWillian Rampazzo        """
175bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
176bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:fuloong2e
177bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
178bbbd9b6eSWillian Rampazzo        """
179bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.debian.org/debian/pool/main/l/linux/'
180bbbd9b6eSWillian Rampazzo                   'linux-image-3.16.0-6-loongson-2e_3.16.56-1+deb8u1_mipsel.deb')
181bbbd9b6eSWillian Rampazzo        deb_hash = 'd04d446045deecf7b755ef576551de0c4184dd44'
182bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
183bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
184bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-3.16.0-6-loongson-2e')
185bbbd9b6eSWillian Rampazzo
186bbbd9b6eSWillian Rampazzo        self.vm.set_console()
187bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
188bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
189bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
190bbbd9b6eSWillian Rampazzo        self.vm.launch()
191bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
192bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
193bbbd9b6eSWillian Rampazzo
194bbbd9b6eSWillian Rampazzo    def test_mips_malta_cpio(self):
195bbbd9b6eSWillian Rampazzo        """
196bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips
197bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
198bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:big
199bbbd9b6eSWillian Rampazzo        """
200bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
201bbbd9b6eSWillian Rampazzo                   '20160601T041800Z/pool/main/l/linux/'
202bbbd9b6eSWillian Rampazzo                   'linux-image-4.5.0-2-4kc-malta_4.5.5-1_mips.deb')
203bbbd9b6eSWillian Rampazzo        deb_hash = 'a3c84f3e88b54e06107d65a410d1d1e8e0f340f8'
204bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
205bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
206bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-4.5.0-2-4kc-malta')
207bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
208bbbd9b6eSWillian Rampazzo                      '8584a59ed9e5eb5ee7ca91f6d74bbb06619205b8/rootfs/'
209bbbd9b6eSWillian Rampazzo                      'mips/rootfs.cpio.gz')
210bbbd9b6eSWillian Rampazzo        initrd_hash = 'bf806e17009360a866bf537f6de66590de349a99'
211bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
212bbbd9b6eSWillian Rampazzo        initrd_path = self.workdir + "rootfs.cpio"
213bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
214bbbd9b6eSWillian Rampazzo
215bbbd9b6eSWillian Rampazzo        self.vm.set_console()
216bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
217bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0 console=tty '
218bbbd9b6eSWillian Rampazzo                               + 'rdinit=/sbin/init noreboot')
219bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
220bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
221bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
222bbbd9b6eSWillian Rampazzo                         '-no-reboot')
223bbbd9b6eSWillian Rampazzo        self.vm.launch()
224bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
225bbbd9b6eSWillian Rampazzo
226bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
227bbbd9b6eSWillian Rampazzo                                                'BogoMIPS')
228bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'uname -a',
229bbbd9b6eSWillian Rampazzo                                                'Debian')
230bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
231bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
232bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
233bbbd9b6eSWillian Rampazzo        self.vm.wait()
234bbbd9b6eSWillian Rampazzo
235bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
236bbbd9b6eSWillian Rampazzo    def test_mips64el_malta_5KEc_cpio(self):
237bbbd9b6eSWillian Rampazzo        """
238bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
239bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
240bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
241bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:5KEc
242bbbd9b6eSWillian Rampazzo        """
243bbbd9b6eSWillian Rampazzo        kernel_url = ('https://github.com/philmd/qemu-testing-blob/'
244bbbd9b6eSWillian Rampazzo                      'raw/9ad2df38/mips/malta/mips64el/'
245bbbd9b6eSWillian Rampazzo                      'vmlinux-3.19.3.mtoman.20150408')
246bbbd9b6eSWillian Rampazzo        kernel_hash = '00d1d268fb9f7d8beda1de6bebcc46e884d71754'
247bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
248bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/'
249bbbd9b6eSWillian Rampazzo                      'raw/8584a59e/rootfs/'
250bbbd9b6eSWillian Rampazzo                      'mipsel64/rootfs.mipsel64r1.cpio.gz')
251bbbd9b6eSWillian Rampazzo        initrd_hash = '1dbb8a396e916847325284dbe2151167'
252bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, algorithm='md5',
253bbbd9b6eSWillian Rampazzo                                          asset_hash=initrd_hash)
254bbbd9b6eSWillian Rampazzo        initrd_path = self.workdir + "rootfs.cpio"
255bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
256bbbd9b6eSWillian Rampazzo
257bbbd9b6eSWillian Rampazzo        self.vm.set_console()
258bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
259bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0 console=tty '
260bbbd9b6eSWillian Rampazzo                               + 'rdinit=/sbin/init noreboot')
261bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
262bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
263bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
264bbbd9b6eSWillian Rampazzo                         '-no-reboot')
265bbbd9b6eSWillian Rampazzo        self.vm.launch()
266bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Boot successful.')
267bbbd9b6eSWillian Rampazzo
268bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
269bbbd9b6eSWillian Rampazzo                                                'MIPS 5KE')
270bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'uname -a',
271bbbd9b6eSWillian Rampazzo                                                '3.19.3.mtoman.20150408')
272bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
273bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
274bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
275bbbd9b6eSWillian Rampazzo        self.vm.wait()
276bbbd9b6eSWillian Rampazzo
277bbbd9b6eSWillian Rampazzo    def do_test_mips_malta32el_nanomips(self, kernel_url, kernel_hash):
278bbbd9b6eSWillian Rampazzo        kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
279bbbd9b6eSWillian Rampazzo        kernel_path = self.workdir + "kernel"
280bbbd9b6eSWillian Rampazzo        with lzma.open(kernel_path_xz, 'rb') as f_in:
281bbbd9b6eSWillian Rampazzo            with open(kernel_path, 'wb') as f_out:
282bbbd9b6eSWillian Rampazzo                shutil.copyfileobj(f_in, f_out)
283bbbd9b6eSWillian Rampazzo
284bbbd9b6eSWillian Rampazzo        self.vm.set_console()
285bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
286bbbd9b6eSWillian Rampazzo                               + 'mem=256m@@0x0 '
287bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0')
288bbbd9b6eSWillian Rampazzo        self.vm.add_args('-no-reboot',
289bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
290bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
291bbbd9b6eSWillian Rampazzo        self.vm.launch()
292bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
293bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
294bbbd9b6eSWillian Rampazzo
295bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_4k(self):
296bbbd9b6eSWillian Rampazzo        """
297bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
298bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
299bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
300bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
301bbbd9b6eSWillian Rampazzo        """
302bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
303bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
304bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page4k.xz')
305bbbd9b6eSWillian Rampazzo        kernel_hash = '477456aafd2a0f1ddc9482727f20fe9575565dd6'
306bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
307bbbd9b6eSWillian Rampazzo
308bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_16k_up(self):
309bbbd9b6eSWillian Rampazzo        """
310bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
311bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
312bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
313bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
314bbbd9b6eSWillian Rampazzo        """
315bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
316bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
317bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page16k_up.xz')
318bbbd9b6eSWillian Rampazzo        kernel_hash = 'e882868f944c71c816e832e2303b7874d044a7bc'
319bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
320bbbd9b6eSWillian Rampazzo
321bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_64k_dbg(self):
322bbbd9b6eSWillian Rampazzo        """
323bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
324bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
325bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
326bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
327bbbd9b6eSWillian Rampazzo        """
328bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
329bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
330bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page64k_dbg.xz')
331bbbd9b6eSWillian Rampazzo        kernel_hash = '18d1c68f2e23429e266ca39ba5349ccd0aeb7180'
332bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
333bbbd9b6eSWillian Rampazzo
334bbbd9b6eSWillian Rampazzo    def test_aarch64_xlnx_versal_virt(self):
335bbbd9b6eSWillian Rampazzo        """
336bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:aarch64
337bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:xlnx-versal-virt
338bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
339bbbd9b6eSWillian Rampazzo        :avocado: tags=device:arm_gicv3
340bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
341bbbd9b6eSWillian Rampazzo        """
342bbbd9b6eSWillian Rampazzo        images_url = ('http://ports.ubuntu.com/ubuntu-ports/dists/'
343bbbd9b6eSWillian Rampazzo                      'bionic-updates/main/installer-arm64/'
3447fcc3f75SThomas Huth                      '20101020ubuntu543.19/images/')
345bbbd9b6eSWillian Rampazzo        kernel_url = images_url + 'netboot/ubuntu-installer/arm64/linux'
3467fcc3f75SThomas Huth        kernel_hash = 'e167757620640eb26de0972f578741924abb3a82'
347bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
348bbbd9b6eSWillian Rampazzo
349bbbd9b6eSWillian Rampazzo        initrd_url = images_url + 'netboot/ubuntu-installer/arm64/initrd.gz'
3507fcc3f75SThomas Huth        initrd_hash = 'cab5cb3fcefca8408aa5aae57f24574bfce8bdb9'
351bbbd9b6eSWillian Rampazzo        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
352bbbd9b6eSWillian Rampazzo
353bbbd9b6eSWillian Rampazzo        self.vm.set_console()
354bbbd9b6eSWillian Rampazzo        self.vm.add_args('-m', '2G',
355bbbd9b6eSWillian Rampazzo                         '-accel', 'tcg',
356bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
357bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path)
358bbbd9b6eSWillian Rampazzo        self.vm.launch()
359bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Checked W+X mappings: passed')
360bbbd9b6eSWillian Rampazzo
361bbbd9b6eSWillian Rampazzo    def test_arm_virt(self):
362bbbd9b6eSWillian Rampazzo        """
363bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
364bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:virt
365bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
366bbbd9b6eSWillian Rampazzo        """
367bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
368bbbd9b6eSWillian Rampazzo                      '/linux/releases/29/Everything/armhfp/os/images/pxeboot'
369bbbd9b6eSWillian Rampazzo                      '/vmlinuz')
370bbbd9b6eSWillian Rampazzo        kernel_hash = 'e9826d741b4fb04cadba8d4824d1ed3b7fb8b4d4'
371bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
372bbbd9b6eSWillian Rampazzo
373bbbd9b6eSWillian Rampazzo        self.vm.set_console()
374bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
375bbbd9b6eSWillian Rampazzo                               'console=ttyAMA0')
376bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
377bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
378bbbd9b6eSWillian Rampazzo        self.vm.launch()
379bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
380bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
381bbbd9b6eSWillian Rampazzo
382bbbd9b6eSWillian Rampazzo    def test_arm_emcraft_sf2(self):
383bbbd9b6eSWillian Rampazzo        """
384bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
385bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:emcraft-sf2
386bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
387bbbd9b6eSWillian Rampazzo        :avocado: tags=u-boot
388bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
389bbbd9b6eSWillian Rampazzo        """
3900793fe01SPeter Maydell        self.require_netdev('user')
3910793fe01SPeter Maydell
392bbbd9b6eSWillian Rampazzo        uboot_url = ('https://raw.githubusercontent.com/'
393bbbd9b6eSWillian Rampazzo                     'Subbaraya-Sundeep/qemu-test-binaries/'
394bbbd9b6eSWillian Rampazzo                     'fe371d32e50ca682391e1e70ab98c2942aeffb01/u-boot')
395bbbd9b6eSWillian Rampazzo        uboot_hash = 'cbb8cbab970f594bf6523b9855be209c08374ae2'
396bbbd9b6eSWillian Rampazzo        uboot_path = self.fetch_asset(uboot_url, asset_hash=uboot_hash)
397bbbd9b6eSWillian Rampazzo        spi_url = ('https://raw.githubusercontent.com/'
398bbbd9b6eSWillian Rampazzo                   'Subbaraya-Sundeep/qemu-test-binaries/'
399bbbd9b6eSWillian Rampazzo                   'fe371d32e50ca682391e1e70ab98c2942aeffb01/spi.bin')
400bbbd9b6eSWillian Rampazzo        spi_hash = '65523a1835949b6f4553be96dec1b6a38fb05501'
401bbbd9b6eSWillian Rampazzo        spi_path = self.fetch_asset(spi_url, asset_hash=spi_hash)
402bbbd9b6eSWillian Rampazzo
403a7f16aedSPhilippe Mathieu-Daudé        file_truncate(spi_path, 16 << 20) # Spansion S25FL128SDPBHICO is 16 MiB
404a7f16aedSPhilippe Mathieu-Daudé
405bbbd9b6eSWillian Rampazzo        self.vm.set_console()
406bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
407bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', uboot_path,
408bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
409bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + spi_path + ',if=mtd,format=raw',
410bbbd9b6eSWillian Rampazzo                         '-no-reboot')
411bbbd9b6eSWillian Rampazzo        self.vm.launch()
412bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Enter \'help\' for a list')
413bbbd9b6eSWillian Rampazzo
414bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 10.0.2.15',
415bbbd9b6eSWillian Rampazzo                                                 'eth0: link becomes ready')
416bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
417bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
418bbbd9b6eSWillian Rampazzo
419bbbd9b6eSWillian Rampazzo    def do_test_arm_raspi2(self, uart_id):
420bbbd9b6eSWillian Rampazzo        """
421bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
422bbbd9b6eSWillian Rampazzo
423bbbd9b6eSWillian Rampazzo        The kernel can be rebuilt using the kernel source referenced
424bbbd9b6eSWillian Rampazzo        and following the instructions on the on:
425bbbd9b6eSWillian Rampazzo        https://www.raspberrypi.org/documentation/linux/kernel/building.md
426bbbd9b6eSWillian Rampazzo        """
427bbbd9b6eSWillian Rampazzo        serial_kernel_cmdline = {
428bbbd9b6eSWillian Rampazzo            0: 'earlycon=pl011,0x3f201000 console=ttyAMA0',
429bbbd9b6eSWillian Rampazzo        }
430bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
431bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
432bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
433bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
434bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
435bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
436bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
437bbbd9b6eSWillian Rampazzo
438bbbd9b6eSWillian Rampazzo        self.vm.set_console()
439bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
440bbbd9b6eSWillian Rampazzo                               serial_kernel_cmdline[uart_id] +
441bbbd9b6eSWillian Rampazzo                               ' root=/dev/mmcblk0p2 rootwait ' +
442bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
443bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
444bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
445bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
446bbbd9b6eSWillian Rampazzo                         '-device', 'usb-kbd')
447bbbd9b6eSWillian Rampazzo        self.vm.launch()
448bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
449bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
450bbbd9b6eSWillian Rampazzo        console_pattern = 'Product: QEMU USB Keyboard'
451bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
452bbbd9b6eSWillian Rampazzo
453bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_uart0(self):
454bbbd9b6eSWillian Rampazzo        """
455bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
456bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
457bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
458bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
459bbbd9b6eSWillian Rampazzo        """
460bbbd9b6eSWillian Rampazzo        self.do_test_arm_raspi2(0)
461bbbd9b6eSWillian Rampazzo
462bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_initrd(self):
463bbbd9b6eSWillian Rampazzo        """
464bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
465bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
466bbbd9b6eSWillian Rampazzo        """
467bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
468bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
469bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
470bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
471bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
472bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
473bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
474bbbd9b6eSWillian Rampazzo
475bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
476bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
477bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
478bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
479bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
480bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
481bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
482bbbd9b6eSWillian Rampazzo
483bbbd9b6eSWillian Rampazzo        self.vm.set_console()
484bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
485bbbd9b6eSWillian Rampazzo                               'earlycon=pl011,0x3f201000 console=ttyAMA0 '
486bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot ' +
487bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
488bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
489bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
490bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
491bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
492bbbd9b6eSWillian Rampazzo                         '-no-reboot')
493bbbd9b6eSWillian Rampazzo        self.vm.launch()
494bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
495bbbd9b6eSWillian Rampazzo
496bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
497bbbd9b6eSWillian Rampazzo                                                'BCM2835')
498bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
499bbbd9b6eSWillian Rampazzo                                                '/soc/cprman@7e101000')
500cc45d25cSPeter Maydell        exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted')
501bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
502bbbd9b6eSWillian Rampazzo        self.vm.wait()
503bbbd9b6eSWillian Rampazzo
5042f79d2edSPeter Maydell    def test_arm_raspi4(self):
5052f79d2edSPeter Maydell        """
5062f79d2edSPeter Maydell        :avocado: tags=arch:aarch64
5072f79d2edSPeter Maydell        :avocado: tags=machine:raspi4b
5082f79d2edSPeter Maydell        :avocado: tags=device:pl011
5092f79d2edSPeter Maydell        :avocado: tags=accel:tcg
5102f79d2edSPeter Maydell        :avocado: tags=rpi4b
5112f79d2edSPeter Maydell
5122f79d2edSPeter Maydell        The kernel can be rebuilt using the kernel source referenced
5132f79d2edSPeter Maydell        and following the instructions on the on:
5142f79d2edSPeter Maydell        https://www.raspberrypi.org/documentation/linux/kernel/building.md
5152f79d2edSPeter Maydell        """
5162f79d2edSPeter Maydell
5172f79d2edSPeter Maydell        deb_url = ('http://archive.raspberrypi.org/debian/'
5182f79d2edSPeter Maydell            'pool/main/r/raspberrypi-firmware/'
5192f79d2edSPeter Maydell            'raspberrypi-kernel_1.20230106-1_arm64.deb')
5202f79d2edSPeter Maydell        deb_hash = '08dc55696535b18a6d4fe6fa10d4c0d905cbb2ed'
5212f79d2edSPeter Maydell        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
5222f79d2edSPeter Maydell        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel8.img')
5232f79d2edSPeter Maydell        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2711-rpi-4-b.dtb')
5242f79d2edSPeter Maydell
5252f79d2edSPeter Maydell        self.vm.set_console()
5262f79d2edSPeter Maydell        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
5272f79d2edSPeter Maydell                               'earlycon=pl011,mmio32,0xfe201000 ' +
5282f79d2edSPeter Maydell                               'console=ttyAMA0,115200 ' +
5292f79d2edSPeter Maydell                               'root=/dev/mmcblk1p2 rootwait ' +
5302f79d2edSPeter Maydell                               'dwc_otg.fiq_fsm_enable=0')
5312f79d2edSPeter Maydell        self.vm.add_args('-kernel', kernel_path,
5322f79d2edSPeter Maydell                         '-dtb', dtb_path,
5332f79d2edSPeter Maydell                         '-append', kernel_command_line)
5342f79d2edSPeter Maydell        # When PCI is supported we can add a USB controller:
5352f79d2edSPeter Maydell        #                '-device', 'qemu-xhci,bus=pcie.1,id=xhci',
5362f79d2edSPeter Maydell        #                '-device', 'usb-kbd,bus=xhci.0',
5372f79d2edSPeter Maydell        self.vm.launch()
5382f79d2edSPeter Maydell        console_pattern = 'Kernel command line: %s' % kernel_command_line
5392f79d2edSPeter Maydell        self.wait_for_console_pattern(console_pattern)
5402f79d2edSPeter Maydell        # When USB is enabled we can look for this
5412f79d2edSPeter Maydell        # console_pattern = 'Product: QEMU USB Keyboard'
5422f79d2edSPeter Maydell        # self.wait_for_console_pattern(console_pattern)
5432f79d2edSPeter Maydell        console_pattern = 'Waiting for root device'
5442f79d2edSPeter Maydell        self.wait_for_console_pattern(console_pattern)
5452f79d2edSPeter Maydell
5462f79d2edSPeter Maydell
5472f79d2edSPeter Maydell    def test_arm_raspi4_initrd(self):
5482f79d2edSPeter Maydell        """
5492f79d2edSPeter Maydell        :avocado: tags=arch:aarch64
5502f79d2edSPeter Maydell        :avocado: tags=machine:raspi4b
5512f79d2edSPeter Maydell        :avocado: tags=device:pl011
5522f79d2edSPeter Maydell        :avocado: tags=accel:tcg
5532f79d2edSPeter Maydell        :avocado: tags=rpi4b
5542f79d2edSPeter Maydell
5552f79d2edSPeter Maydell        The kernel can be rebuilt using the kernel source referenced
5562f79d2edSPeter Maydell        and following the instructions on the on:
5572f79d2edSPeter Maydell        https://www.raspberrypi.org/documentation/linux/kernel/building.md
5582f79d2edSPeter Maydell        """
5592f79d2edSPeter Maydell        deb_url = ('http://archive.raspberrypi.org/debian/'
5602f79d2edSPeter Maydell            'pool/main/r/raspberrypi-firmware/'
5612f79d2edSPeter Maydell            'raspberrypi-kernel_1.20230106-1_arm64.deb')
5622f79d2edSPeter Maydell        deb_hash = '08dc55696535b18a6d4fe6fa10d4c0d905cbb2ed'
5632f79d2edSPeter Maydell        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
5642f79d2edSPeter Maydell        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel8.img')
5652f79d2edSPeter Maydell        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2711-rpi-4-b.dtb')
5662f79d2edSPeter Maydell
5672f79d2edSPeter Maydell        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
5682f79d2edSPeter Maydell                      '86b2be1384d41c8c388e63078a847f1e1c4cb1de/rootfs/'
5692f79d2edSPeter Maydell                      'arm64/rootfs.cpio.gz')
5702f79d2edSPeter Maydell        initrd_hash = 'f3d4f9fa92a49aa542f1b44d34be77bbf8ca5b9d'
5712f79d2edSPeter Maydell        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
5722f79d2edSPeter Maydell        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
5732f79d2edSPeter Maydell        archive.gzip_uncompress(initrd_path_gz, initrd_path)
5742f79d2edSPeter Maydell
5752f79d2edSPeter Maydell        self.vm.set_console()
5762f79d2edSPeter Maydell        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
5772f79d2edSPeter Maydell                               'earlycon=pl011,mmio32,0xfe201000 ' +
5782f79d2edSPeter Maydell                               'console=ttyAMA0,115200 ' +
5792f79d2edSPeter Maydell                               'panic=-1 noreboot ' +
5802f79d2edSPeter Maydell                               'dwc_otg.fiq_fsm_enable=0')
5812f79d2edSPeter Maydell        self.vm.add_args('-kernel', kernel_path,
5822f79d2edSPeter Maydell                         '-dtb', dtb_path,
5832f79d2edSPeter Maydell                         '-initrd', initrd_path,
5842f79d2edSPeter Maydell                         '-append', kernel_command_line,
5852f79d2edSPeter Maydell                         '-no-reboot')
5862f79d2edSPeter Maydell        # When PCI is supported we can add a USB controller:
5872f79d2edSPeter Maydell        #                '-device', 'qemu-xhci,bus=pcie.1,id=xhci',
5882f79d2edSPeter Maydell        #                '-device', 'usb-kbd,bus=xhci.0',
5892f79d2edSPeter Maydell        self.vm.launch()
5902f79d2edSPeter Maydell        self.wait_for_console_pattern('Boot successful.')
5912f79d2edSPeter Maydell
5922f79d2edSPeter Maydell        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
5932f79d2edSPeter Maydell                                                'BCM2835')
5942f79d2edSPeter Maydell        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
5952f79d2edSPeter Maydell                                                'cprman@7e101000')
5962f79d2edSPeter Maydell        exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted')
5972f79d2edSPeter Maydell        # TODO: Raspberry Pi4 doesn't shut down properly with recent kernels
5982f79d2edSPeter Maydell        # Wait for VM to shut down gracefully
5992f79d2edSPeter Maydell        #self.vm.wait()
6002f79d2edSPeter Maydell
601bbbd9b6eSWillian Rampazzo    def test_arm_exynos4210_initrd(self):
602bbbd9b6eSWillian Rampazzo        """
603bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
604bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:smdkc210
605bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
606bbbd9b6eSWillian Rampazzo        """
607bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian/'
608bbbd9b6eSWillian Rampazzo                   '20190928T224601Z/pool/main/l/linux/'
609bbbd9b6eSWillian Rampazzo                   'linux-image-4.19.0-6-armmp_4.19.67-2+deb10u1_armhf.deb')
610bbbd9b6eSWillian Rampazzo        deb_hash = 'fa9df4a0d38936cb50084838f2cb933f570d7d82'
611bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
612bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
613bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-4.19.0-6-armmp')
614bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-4.19.0-6-armmp/exynos4210-smdkv310.dtb'
615bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
616bbbd9b6eSWillian Rampazzo
617bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
618bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
619bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
620bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
621bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
622bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
623bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
624bbbd9b6eSWillian Rampazzo
625bbbd9b6eSWillian Rampazzo        self.vm.set_console()
626bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
627bbbd9b6eSWillian Rampazzo                               'earlycon=exynos4210,0x13800000 earlyprintk ' +
628bbbd9b6eSWillian Rampazzo                               'console=ttySAC0,115200n8 ' +
629bbbd9b6eSWillian Rampazzo                               'random.trust_cpu=off cryptomgr.notests ' +
630bbbd9b6eSWillian Rampazzo                               'cpuidle.off=1 panic=-1 noreboot')
631bbbd9b6eSWillian Rampazzo
632bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
633bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
634bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
635bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
636bbbd9b6eSWillian Rampazzo                         '-no-reboot')
637bbbd9b6eSWillian Rampazzo        self.vm.launch()
638bbbd9b6eSWillian Rampazzo
639bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
640bbbd9b6eSWillian Rampazzo        # TODO user command, for now the uart is stuck
641bbbd9b6eSWillian Rampazzo
642bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_initrd(self):
643bbbd9b6eSWillian Rampazzo        """
644bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
645bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
646bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
647bbbd9b6eSWillian Rampazzo        """
648bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
649dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
650dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
651bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
652bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
653dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
654dcc5c018SPeter Maydell        dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun4i-a10-cubieboard.dtb'
655bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
656bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
657bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
658bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
659bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
660bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
661bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
662bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
663bbbd9b6eSWillian Rampazzo
664bbbd9b6eSWillian Rampazzo        self.vm.set_console()
665bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
666bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
667bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
668bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
669bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
670bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
671bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
672bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
673bbbd9b6eSWillian Rampazzo                         '-no-reboot')
674bbbd9b6eSWillian Rampazzo        self.vm.launch()
675bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
676bbbd9b6eSWillian Rampazzo
677bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
678bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
679bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
680bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
681d784c5fbSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'reboot',
682d784c5fbSStrahinja Jankovic                                                'reboot: Restarting system')
683d784c5fbSStrahinja Jankovic        # Wait for VM to shut down gracefully
684d784c5fbSStrahinja Jankovic        self.vm.wait()
685bbbd9b6eSWillian Rampazzo
686bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_sata(self):
687bbbd9b6eSWillian Rampazzo        """
688bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
689bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
690bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
691bbbd9b6eSWillian Rampazzo        """
692bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
693dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
694dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
695bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
696bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
697dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
698dcc5c018SPeter Maydell        dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun4i-a10-cubieboard.dtb'
699bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
700bbbd9b6eSWillian Rampazzo        rootfs_url = ('https://github.com/groeck/linux-build-test/raw/'
701bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
702bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.ext2.gz')
703bbbd9b6eSWillian Rampazzo        rootfs_hash = '093e89d2b4d982234bf528bc9fb2f2f17a9d1f93'
704bbbd9b6eSWillian Rampazzo        rootfs_path_gz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
705bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
706bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(rootfs_path_gz, rootfs_path)
707bbbd9b6eSWillian Rampazzo
708bbbd9b6eSWillian Rampazzo        self.vm.set_console()
709bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
710bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
711bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
712bbbd9b6eSWillian Rampazzo                               'root=/dev/sda ro '
713bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
714bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
715bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
716bbbd9b6eSWillian Rampazzo                         '-drive', 'if=none,format=raw,id=disk0,file='
717bbbd9b6eSWillian Rampazzo                                   + rootfs_path,
718bbbd9b6eSWillian Rampazzo                         '-device', 'ide-hd,bus=ide.0,drive=disk0',
719bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
720bbbd9b6eSWillian Rampazzo                         '-no-reboot')
721bbbd9b6eSWillian Rampazzo        self.vm.launch()
722bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
723bbbd9b6eSWillian Rampazzo
724bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
725bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
726bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
727bbbd9b6eSWillian Rampazzo                                                'sda')
728d784c5fbSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'reboot',
729d784c5fbSStrahinja Jankovic                                                'reboot: Restarting system')
730d784c5fbSStrahinja Jankovic        # Wait for VM to shut down gracefully
731d784c5fbSStrahinja Jankovic        self.vm.wait()
732bbbd9b6eSWillian Rampazzo
73322bd244aSStrahinja Jankovic    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
73422bd244aSStrahinja Jankovic    def test_arm_cubieboard_openwrt_22_03_2(self):
73522bd244aSStrahinja Jankovic        """
73622bd244aSStrahinja Jankovic        :avocado: tags=arch:arm
73722bd244aSStrahinja Jankovic        :avocado: tags=machine:cubieboard
73822bd244aSStrahinja Jankovic        :avocado: tags=device:sd
73922bd244aSStrahinja Jankovic        """
74022bd244aSStrahinja Jankovic
74122bd244aSStrahinja Jankovic        # This test download a 7.5 MiB compressed image and expand it
74222bd244aSStrahinja Jankovic        # to 126 MiB.
74322bd244aSStrahinja Jankovic        image_url = ('https://downloads.openwrt.org/releases/22.03.2/targets/'
74422bd244aSStrahinja Jankovic                     'sunxi/cortexa8/openwrt-22.03.2-sunxi-cortexa8-'
74522bd244aSStrahinja Jankovic                     'cubietech_a10-cubieboard-ext4-sdcard.img.gz')
74622bd244aSStrahinja Jankovic        image_hash = ('94b5ecbfbc0b3b56276e5146b899eafa'
74722bd244aSStrahinja Jankovic                      '2ac5dc2d08733d6705af9f144f39f554')
74822bd244aSStrahinja Jankovic        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
74922bd244aSStrahinja Jankovic                                         algorithm='sha256')
75022bd244aSStrahinja Jankovic        image_path = archive.extract(image_path_gz, self.workdir)
75122bd244aSStrahinja Jankovic        image_pow2ceil_expand(image_path)
75222bd244aSStrahinja Jankovic
75322bd244aSStrahinja Jankovic        self.vm.set_console()
75422bd244aSStrahinja Jankovic        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
75522bd244aSStrahinja Jankovic                         '-nic', 'user',
75622bd244aSStrahinja Jankovic                         '-no-reboot')
75722bd244aSStrahinja Jankovic        self.vm.launch()
75822bd244aSStrahinja Jankovic
75922bd244aSStrahinja Jankovic        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
76022bd244aSStrahinja Jankovic                               'usbcore.nousb '
76122bd244aSStrahinja Jankovic                               'noreboot')
76222bd244aSStrahinja Jankovic
76322bd244aSStrahinja Jankovic        self.wait_for_console_pattern('U-Boot SPL')
76422bd244aSStrahinja Jankovic
76522bd244aSStrahinja Jankovic        interrupt_interactive_console_until_pattern(
76622bd244aSStrahinja Jankovic                self, 'Hit any key to stop autoboot:', '=>')
76722bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
76822bd244aSStrahinja Jankovic                                                kernel_command_line + "'", '=>')
76922bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
77022bd244aSStrahinja Jankovic
77122bd244aSStrahinja Jankovic        self.wait_for_console_pattern(
77222bd244aSStrahinja Jankovic            'Please press Enter to activate this console.')
77322bd244aSStrahinja Jankovic
77422bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, ' ', 'root@')
77522bd244aSStrahinja Jankovic
77622bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
77722bd244aSStrahinja Jankovic                                                'Allwinner sun4i/sun5i')
778d784c5fbSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'reboot',
779d784c5fbSStrahinja Jankovic                                                'reboot: Restarting system')
780d784c5fbSStrahinja Jankovic        # Wait for VM to shut down gracefully
781d784c5fbSStrahinja Jankovic        self.vm.wait()
78222bd244aSStrahinja Jankovic
783bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
784bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj(self):
785bbbd9b6eSWillian Rampazzo        """
786bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
787bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
788bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
789bbbd9b6eSWillian Rampazzo        """
790bbbd9b6eSWillian Rampazzo        # 25 MiB compressed, 32 MiB uncompressed.
791bbbd9b6eSWillian Rampazzo        image_url = (
792bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
793bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-image-gsj.static.mtd.gz')
794bbbd9b6eSWillian Rampazzo        image_hash = '14895e634923345cb5c8776037ff7876df96f6b1'
795bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
796bbbd9b6eSWillian Rampazzo        image_name = 'obmc.mtd'
797bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, image_name)
798bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
799bbbd9b6eSWillian Rampazzo
800bbbd9b6eSWillian Rampazzo        self.vm.set_console()
801bbbd9b6eSWillian Rampazzo        drive_args = 'file=' + image_path + ',if=mtd,bus=0,unit=0'
802bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', drive_args)
803bbbd9b6eSWillian Rampazzo        self.vm.launch()
804bbbd9b6eSWillian Rampazzo
805bbbd9b6eSWillian Rampazzo        # Disable drivers and services that stall for a long time during boot,
806bbbd9b6eSWillian Rampazzo        # to avoid running past the 90-second timeout. These may be removed
807bbbd9b6eSWillian Rampazzo        # as the corresponding device support is added.
808bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + (
809bbbd9b6eSWillian Rampazzo                'console=${console} '
810bbbd9b6eSWillian Rampazzo                'mem=${mem} '
811bbbd9b6eSWillian Rampazzo                'initcall_blacklist=npcm_i2c_bus_driver_init '
812bbbd9b6eSWillian Rampazzo                'systemd.mask=systemd-random-seed.service '
813bbbd9b6eSWillian Rampazzo                'systemd.mask=dropbearkey.service '
814bbbd9b6eSWillian Rampazzo        )
815bbbd9b6eSWillian Rampazzo
816bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('> BootBlock by Nuvoton')
817bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Device: Poleg BMC NPCM730')
818bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Skip DDR init.')
819bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot ')
820bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(
821bbbd9b6eSWillian Rampazzo                self, 'Hit any key to stop autoboot:', 'U-Boot>')
822bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
823bbbd9b6eSWillian Rampazzo                self, "setenv bootargs ${bootargs} " + kernel_command_line,
824bbbd9b6eSWillian Rampazzo                'U-Boot>')
825bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
826bbbd9b6eSWillian Rampazzo                self, 'run romboot', 'Booting Kernel from flash')
827bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
828bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
829bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('OpenBMC Project Reference Distro')
830bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('gsj login:')
831bbbd9b6eSWillian Rampazzo
832bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj_initrd(self):
833bbbd9b6eSWillian Rampazzo        """
834bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
835bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
836bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
837bbbd9b6eSWillian Rampazzo        """
838bbbd9b6eSWillian Rampazzo        initrd_url = (
839bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
840bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-initramfs-gsj.cpio.xz')
841bbbd9b6eSWillian Rampazzo        initrd_hash = '98fefe5d7e56727b1eb17d5c00311b1b5c945300'
842bbbd9b6eSWillian Rampazzo        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
843bbbd9b6eSWillian Rampazzo        kernel_url = (
844bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
845bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/uImage-gsj.bin')
846bbbd9b6eSWillian Rampazzo        kernel_hash = 'fa67b2f141d56d39b3c54305c0e8a899c99eb2c7'
847bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
848bbbd9b6eSWillian Rampazzo        dtb_url = (
849bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
850bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/nuvoton-npcm730-gsj.dtb')
851bbbd9b6eSWillian Rampazzo        dtb_hash = '18315f7006d7b688d8312d5c727eecd819aa36a4'
852bbbd9b6eSWillian Rampazzo        dtb_path = self.fetch_asset(dtb_url, asset_hash=dtb_hash)
853bbbd9b6eSWillian Rampazzo
854bbbd9b6eSWillian Rampazzo        self.vm.set_console()
855bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
856bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
857bbbd9b6eSWillian Rampazzo                               'earlycon=uart8250,mmio32,0xf0001000')
858bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
859bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
860bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
861bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
862bbbd9b6eSWillian Rampazzo        self.vm.launch()
863bbbd9b6eSWillian Rampazzo
864bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
865bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
866bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(
867bbbd9b6eSWillian Rampazzo                'Give root password for system maintenance')
868bbbd9b6eSWillian Rampazzo
8696c4f229aSqianfan Zhao    def test_arm_bpim2u(self):
8706c4f229aSqianfan Zhao        """
8716c4f229aSqianfan Zhao        :avocado: tags=arch:arm
8726c4f229aSqianfan Zhao        :avocado: tags=machine:bpim2u
8736c4f229aSqianfan Zhao        :avocado: tags=accel:tcg
8746c4f229aSqianfan Zhao        """
875dcc5c018SPeter Maydell        deb_url = ('https://apt.armbian.com/pool/main/l/'
876dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
877dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
8786c4f229aSqianfan Zhao        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
8796c4f229aSqianfan Zhao        kernel_path = self.extract_from_deb(deb_path,
880dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
881dcc5c018SPeter Maydell        dtb_path = ('/usr/lib/linux-image-6.6.16-current-sunxi/'
8826c4f229aSqianfan Zhao                    'sun8i-r40-bananapi-m2-ultra.dtb')
8836c4f229aSqianfan Zhao        dtb_path = self.extract_from_deb(deb_path, dtb_path)
8846c4f229aSqianfan Zhao
8856c4f229aSqianfan Zhao        self.vm.set_console()
8866c4f229aSqianfan Zhao        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
8876c4f229aSqianfan Zhao                               'console=ttyS0,115200n8 '
8886c4f229aSqianfan Zhao                               'earlycon=uart,mmio32,0x1c28000')
8896c4f229aSqianfan Zhao        self.vm.add_args('-kernel', kernel_path,
8906c4f229aSqianfan Zhao                         '-dtb', dtb_path,
8916c4f229aSqianfan Zhao                         '-append', kernel_command_line)
8926c4f229aSqianfan Zhao        self.vm.launch()
8936c4f229aSqianfan Zhao        console_pattern = 'Kernel command line: %s' % kernel_command_line
8946c4f229aSqianfan Zhao        self.wait_for_console_pattern(console_pattern)
8956c4f229aSqianfan Zhao
8966c4f229aSqianfan Zhao    def test_arm_bpim2u_initrd(self):
8976c4f229aSqianfan Zhao        """
8986c4f229aSqianfan Zhao        :avocado: tags=arch:arm
8996c4f229aSqianfan Zhao        :avocado: tags=accel:tcg
9006c4f229aSqianfan Zhao        :avocado: tags=machine:bpim2u
9016c4f229aSqianfan Zhao        """
902dcc5c018SPeter Maydell        deb_url = ('https://apt.armbian.com/pool/main/l/'
903dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
904dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
9056c4f229aSqianfan Zhao        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
9066c4f229aSqianfan Zhao        kernel_path = self.extract_from_deb(deb_path,
907dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
908dcc5c018SPeter Maydell        dtb_path = ('/usr/lib/linux-image-6.6.16-current-sunxi/'
9096c4f229aSqianfan Zhao                    'sun8i-r40-bananapi-m2-ultra.dtb')
9106c4f229aSqianfan Zhao        dtb_path = self.extract_from_deb(deb_path, dtb_path)
9116c4f229aSqianfan Zhao        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
9126c4f229aSqianfan Zhao                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
9136c4f229aSqianfan Zhao                      'arm/rootfs-armv7a.cpio.gz')
9146c4f229aSqianfan Zhao        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
9156c4f229aSqianfan Zhao        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
9166c4f229aSqianfan Zhao        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
9176c4f229aSqianfan Zhao        archive.gzip_uncompress(initrd_path_gz, initrd_path)
9186c4f229aSqianfan Zhao
9196c4f229aSqianfan Zhao        self.vm.set_console()
9206c4f229aSqianfan Zhao        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
9216c4f229aSqianfan Zhao                               'console=ttyS0,115200 '
9226c4f229aSqianfan Zhao                               'panic=-1 noreboot')
9236c4f229aSqianfan Zhao        self.vm.add_args('-kernel', kernel_path,
9246c4f229aSqianfan Zhao                         '-dtb', dtb_path,
9256c4f229aSqianfan Zhao                         '-initrd', initrd_path,
9266c4f229aSqianfan Zhao                         '-append', kernel_command_line,
9276c4f229aSqianfan Zhao                         '-no-reboot')
9286c4f229aSqianfan Zhao        self.vm.launch()
9296c4f229aSqianfan Zhao        self.wait_for_console_pattern('Boot successful.')
9306c4f229aSqianfan Zhao
9316c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
9326c4f229aSqianfan Zhao                                                'Allwinner sun8i Family')
9336c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
9346c4f229aSqianfan Zhao                                                'system-control@1c00000')
9356c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'reboot',
9366c4f229aSqianfan Zhao                                                'reboot: Restarting system')
9376c4f229aSqianfan Zhao        # Wait for VM to shut down gracefully
9386c4f229aSqianfan Zhao        self.vm.wait()
9396c4f229aSqianfan Zhao
9406c4f229aSqianfan Zhao    def test_arm_bpim2u_gmac(self):
9416c4f229aSqianfan Zhao        """
9426c4f229aSqianfan Zhao        :avocado: tags=arch:arm
9436c4f229aSqianfan Zhao        :avocado: tags=accel:tcg
9446c4f229aSqianfan Zhao        :avocado: tags=machine:bpim2u
9456c4f229aSqianfan Zhao        :avocado: tags=device:sd
9466c4f229aSqianfan Zhao        """
9476c4f229aSqianfan Zhao        self.require_netdev('user')
9486c4f229aSqianfan Zhao
949dcc5c018SPeter Maydell        deb_url = ('https://apt.armbian.com/pool/main/l/'
950dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
951dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
9526c4f229aSqianfan Zhao        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
9536c4f229aSqianfan Zhao        kernel_path = self.extract_from_deb(deb_path,
954dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
955dcc5c018SPeter Maydell        dtb_path = ('/usr/lib/linux-image-6.6.16-current-sunxi/'
9566c4f229aSqianfan Zhao                    'sun8i-r40-bananapi-m2-ultra.dtb')
9576c4f229aSqianfan Zhao        dtb_path = self.extract_from_deb(deb_path, dtb_path)
9586c4f229aSqianfan Zhao        rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/'
9596c4f229aSqianfan Zhao                      'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz')
9606c4f229aSqianfan Zhao        rootfs_hash = 'fae32f337c7b87547b10f42599acf109da8b6d9a'
9616c4f229aSqianfan Zhao        rootfs_path_xz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
9626c4f229aSqianfan Zhao        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
9636c4f229aSqianfan Zhao        archive.lzma_uncompress(rootfs_path_xz, rootfs_path)
9646c4f229aSqianfan Zhao        image_pow2ceil_expand(rootfs_path)
9656c4f229aSqianfan Zhao
9666c4f229aSqianfan Zhao        self.vm.set_console()
9676c4f229aSqianfan Zhao        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
9686c4f229aSqianfan Zhao                               'console=ttyS0,115200 '
9697ea47af3SThomas Huth                               'root=b300 rootwait rw '
9706c4f229aSqianfan Zhao                               'panic=-1 noreboot')
9716c4f229aSqianfan Zhao        self.vm.add_args('-kernel', kernel_path,
9726c4f229aSqianfan Zhao                         '-dtb', dtb_path,
9736c4f229aSqianfan Zhao                         '-drive', 'file=' + rootfs_path + ',if=sd,format=raw',
9746c4f229aSqianfan Zhao                         '-net', 'nic,model=gmac,netdev=host_gmac',
9756c4f229aSqianfan Zhao                         '-netdev', 'user,id=host_gmac',
9766c4f229aSqianfan Zhao                         '-append', kernel_command_line,
9776c4f229aSqianfan Zhao                         '-no-reboot')
9786c4f229aSqianfan Zhao        self.vm.launch()
9796c4f229aSqianfan Zhao        shell_ready = "/bin/sh: can't access tty; job control turned off"
9806c4f229aSqianfan Zhao        self.wait_for_console_pattern(shell_ready)
9816c4f229aSqianfan Zhao
9826c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
9836c4f229aSqianfan Zhao                                                'Allwinner sun8i Family')
9846c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
9857ea47af3SThomas Huth                                                'mmcblk')
9866c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 up',
9876c4f229aSqianfan Zhao                                                 'eth0: Link is Up')
9886c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'udhcpc eth0',
9896c4f229aSqianfan Zhao            'udhcpc: lease of 10.0.2.15 obtained')
9906c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
9916c4f229aSqianfan Zhao            '3 packets transmitted, 3 packets received, 0% packet loss')
9926c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'reboot',
9936c4f229aSqianfan Zhao                                                'reboot: Restarting system')
9946c4f229aSqianfan Zhao        # Wait for VM to shut down gracefully
9956c4f229aSqianfan Zhao        self.vm.wait()
9966c4f229aSqianfan Zhao
9976c4f229aSqianfan Zhao    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
9986c4f229aSqianfan Zhao    def test_arm_bpim2u_openwrt_22_03_3(self):
9996c4f229aSqianfan Zhao        """
10006c4f229aSqianfan Zhao        :avocado: tags=arch:arm
10016c4f229aSqianfan Zhao        :avocado: tags=machine:bpim2u
10026c4f229aSqianfan Zhao        :avocado: tags=device:sd
10036c4f229aSqianfan Zhao        """
10046c4f229aSqianfan Zhao
10056c4f229aSqianfan Zhao        # This test download a 8.9 MiB compressed image and expand it
10066c4f229aSqianfan Zhao        # to 127 MiB.
10076c4f229aSqianfan Zhao        image_url = ('https://downloads.openwrt.org/releases/22.03.3/targets/'
10086c4f229aSqianfan Zhao                     'sunxi/cortexa7/openwrt-22.03.3-sunxi-cortexa7-'
10096c4f229aSqianfan Zhao                     'sinovoip_bananapi-m2-ultra-ext4-sdcard.img.gz')
10106c4f229aSqianfan Zhao        image_hash = ('5b41b4e11423e562c6011640f9a7cd3b'
10116c4f229aSqianfan Zhao                      'dd0a3d42b83430f7caa70a432e6cd82c')
10126c4f229aSqianfan Zhao        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
10136c4f229aSqianfan Zhao                                         algorithm='sha256')
10146c4f229aSqianfan Zhao        image_path = archive.extract(image_path_gz, self.workdir)
10156c4f229aSqianfan Zhao        image_pow2ceil_expand(image_path)
10166c4f229aSqianfan Zhao
10176c4f229aSqianfan Zhao        self.vm.set_console()
10186c4f229aSqianfan Zhao        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
10196c4f229aSqianfan Zhao                         '-nic', 'user',
10206c4f229aSqianfan Zhao                         '-no-reboot')
10216c4f229aSqianfan Zhao        self.vm.launch()
10226c4f229aSqianfan Zhao
10236c4f229aSqianfan Zhao        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
10246c4f229aSqianfan Zhao                               'usbcore.nousb '
10256c4f229aSqianfan Zhao                               'noreboot')
10266c4f229aSqianfan Zhao
10276c4f229aSqianfan Zhao        self.wait_for_console_pattern('U-Boot SPL')
10286c4f229aSqianfan Zhao
10296c4f229aSqianfan Zhao        interrupt_interactive_console_until_pattern(
10306c4f229aSqianfan Zhao                self, 'Hit any key to stop autoboot:', '=>')
10316c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
10326c4f229aSqianfan Zhao                                                kernel_command_line + "'", '=>')
10336c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
10346c4f229aSqianfan Zhao
10356c4f229aSqianfan Zhao        self.wait_for_console_pattern(
10366c4f229aSqianfan Zhao            'Please press Enter to activate this console.')
10376c4f229aSqianfan Zhao
10386c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, ' ', 'root@')
10396c4f229aSqianfan Zhao
10406c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
10416c4f229aSqianfan Zhao                                                'Allwinner sun8i Family')
10426c4f229aSqianfan Zhao        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
10436c4f229aSqianfan Zhao                                                'system-control@1c00000')
10446c4f229aSqianfan Zhao
1045bbbd9b6eSWillian Rampazzo    def test_arm_orangepi(self):
1046bbbd9b6eSWillian Rampazzo        """
1047bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1048bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
1049bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
1050bbbd9b6eSWillian Rampazzo        """
1051bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
1052dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
1053dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
1054bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1055bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1056dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
1057dcc5c018SPeter Maydell        dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb'
1058bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
1059bbbd9b6eSWillian Rampazzo
1060bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1061bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1062bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
1063bbbd9b6eSWillian Rampazzo                               'earlycon=uart,mmio32,0x1c28000')
1064bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1065bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1066bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1067bbbd9b6eSWillian Rampazzo        self.vm.launch()
1068bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1069bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1070bbbd9b6eSWillian Rampazzo
1071bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_initrd(self):
1072bbbd9b6eSWillian Rampazzo        """
1073bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1074bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
1075bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
1076bbbd9b6eSWillian Rampazzo        """
1077bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
1078dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
1079dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
1080bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1081bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1082dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
1083dcc5c018SPeter Maydell        dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb'
1084bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
1085bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
1086bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
1087bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
1088bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
1089bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
1090bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
1091bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
1092bbbd9b6eSWillian Rampazzo
1093bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1094bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1095bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
1096bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
1097bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1098bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1099bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
1100bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
1101bbbd9b6eSWillian Rampazzo                         '-no-reboot')
1102bbbd9b6eSWillian Rampazzo        self.vm.launch()
1103bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
1104bbbd9b6eSWillian Rampazzo
1105bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
1106bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
1107bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
1108bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
1109bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
1110bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
1111bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
1112bbbd9b6eSWillian Rampazzo        self.vm.wait()
1113bbbd9b6eSWillian Rampazzo
1114bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_sd(self):
1115bbbd9b6eSWillian Rampazzo        """
1116bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1117bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
1118bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
1119bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
1120bbbd9b6eSWillian Rampazzo        """
11210793fe01SPeter Maydell        self.require_netdev('user')
11220793fe01SPeter Maydell
1123bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
1124dcc5c018SPeter Maydell                   'linux-6.6.16/linux-image-current-sunxi_24.2.1_armhf__6.6.16-Seb3e-D6b4a-P2359-Ce96bHfe66-HK01ba-V014b-B067e-R448a.deb')
1125dcc5c018SPeter Maydell        deb_hash = 'f7c3c8c5432f765445dc6e7eab02f3bbe668256b'
1126bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1127bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1128dcc5c018SPeter Maydell                                            '/boot/vmlinuz-6.6.16-current-sunxi')
1129dcc5c018SPeter Maydell        dtb_path = '/usr/lib/linux-image-6.6.16-current-sunxi/sun8i-h3-orangepi-pc.dtb'
1130bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
1131bbbd9b6eSWillian Rampazzo        rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/'
11324189af72SAlex Bennée                      'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz')
11334189af72SAlex Bennée        rootfs_hash = 'fae32f337c7b87547b10f42599acf109da8b6d9a'
1134bbbd9b6eSWillian Rampazzo        rootfs_path_xz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
1135bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
1136bbbd9b6eSWillian Rampazzo        archive.lzma_uncompress(rootfs_path_xz, rootfs_path)
1137bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(rootfs_path)
1138bbbd9b6eSWillian Rampazzo
1139bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1140bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1141bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
1142bbbd9b6eSWillian Rampazzo                               'root=/dev/mmcblk0 rootwait rw '
1143bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
1144bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1145bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1146bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + rootfs_path + ',if=sd,format=raw',
1147bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
1148bbbd9b6eSWillian Rampazzo                         '-no-reboot')
1149bbbd9b6eSWillian Rampazzo        self.vm.launch()
1150bbbd9b6eSWillian Rampazzo        shell_ready = "/bin/sh: can't access tty; job control turned off"
1151bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(shell_ready)
1152bbbd9b6eSWillian Rampazzo
1153bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
1154bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
1155bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
1156bbbd9b6eSWillian Rampazzo                                                'mmcblk0')
1157bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 up',
1158bbbd9b6eSWillian Rampazzo                                                 'eth0: Link is Up')
1159bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'udhcpc eth0',
1160bbbd9b6eSWillian Rampazzo            'udhcpc: lease of 10.0.2.15 obtained')
1161bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
1162bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
1163bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
1164bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
1165bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
1166bbbd9b6eSWillian Rampazzo        self.vm.wait()
1167bbbd9b6eSWillian Rampazzo
1168bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
1169bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_bionic_20_08(self):
1170bbbd9b6eSWillian Rampazzo        """
1171bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1172bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
1173bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
1174bbbd9b6eSWillian Rampazzo        """
1175bbbd9b6eSWillian Rampazzo
1176bbbd9b6eSWillian Rampazzo        # This test download a 275 MiB compressed image and expand it
1177bbbd9b6eSWillian Rampazzo        # to 1036 MiB, but the underlying filesystem is 1552 MiB...
1178bbbd9b6eSWillian Rampazzo        # As we expand it to 2 GiB we are safe.
1179bbbd9b6eSWillian Rampazzo
1180bbbd9b6eSWillian Rampazzo        image_url = ('https://archive.armbian.com/orangepipc/archive/'
1181bbbd9b6eSWillian Rampazzo                     'Armbian_20.08.1_Orangepipc_bionic_current_5.8.5.img.xz')
1182bbbd9b6eSWillian Rampazzo        image_hash = ('b4d6775f5673486329e45a0586bf06b6'
1183bbbd9b6eSWillian Rampazzo                      'dbe792199fd182ac6b9c7bb6c7d3e6dd')
1184bbbd9b6eSWillian Rampazzo        image_path_xz = self.fetch_asset(image_url, asset_hash=image_hash,
1185bbbd9b6eSWillian Rampazzo                                         algorithm='sha256')
1186bbbd9b6eSWillian Rampazzo        image_path = archive.extract(image_path_xz, self.workdir)
1187bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
1188bbbd9b6eSWillian Rampazzo
1189bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1190bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
1191bbbd9b6eSWillian Rampazzo                         '-nic', 'user',
1192bbbd9b6eSWillian Rampazzo                         '-no-reboot')
1193bbbd9b6eSWillian Rampazzo        self.vm.launch()
1194bbbd9b6eSWillian Rampazzo
1195bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1196bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
1197bbbd9b6eSWillian Rampazzo                               'loglevel=7 '
1198bbbd9b6eSWillian Rampazzo                               'nosmp '
1199bbbd9b6eSWillian Rampazzo                               'systemd.default_timeout_start_sec=9000 '
1200bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-zram-config.service '
1201bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-ramlog.service')
1202bbbd9b6eSWillian Rampazzo
1203bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot SPL')
1204bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Autoboot in ')
1205bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, ' ', '=>')
1206bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
1207bbbd9b6eSWillian Rampazzo                                                kernel_command_line + "'", '=>')
1208bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
1209bbbd9b6eSWillian Rampazzo
1210bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('systemd[1]: Set hostname ' +
1211bbbd9b6eSWillian Rampazzo                                      'to <orangepipc>')
1212bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Starting Load Kernel Modules...')
1213bbbd9b6eSWillian Rampazzo
1214bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
1215bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_uboot_netbsd9(self):
1216bbbd9b6eSWillian Rampazzo        """
1217bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1218bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
1219bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
1220bbbd9b6eSWillian Rampazzo        :avocado: tags=os:netbsd
1221bbbd9b6eSWillian Rampazzo        """
1222bbbd9b6eSWillian Rampazzo        # This test download a 304MB compressed image and expand it to 2GB
1223bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
1224bbbd9b6eSWillian Rampazzo                   '20200108T145233Z/pool/main/u/u-boot/'
1225bbbd9b6eSWillian Rampazzo                   'u-boot-sunxi_2020.01%2Bdfsg-1_armhf.deb')
1226bbbd9b6eSWillian Rampazzo        deb_hash = 'f67f404a80753ca3d1258f13e38f2b060e13db99'
1227bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1228bbbd9b6eSWillian Rampazzo        # We use the common OrangePi PC 'plus' build of U-Boot for our secondary
1229bbbd9b6eSWillian Rampazzo        # program loader (SPL). We will then set the path to the more specific
1230bbbd9b6eSWillian Rampazzo        # OrangePi "PC" device tree blob with 'setenv fdtfile' in U-Boot prompt,
1231bbbd9b6eSWillian Rampazzo        # before to boot NetBSD.
1232bbbd9b6eSWillian Rampazzo        uboot_path = '/usr/lib/u-boot/orangepi_plus/u-boot-sunxi-with-spl.bin'
1233bbbd9b6eSWillian Rampazzo        uboot_path = self.extract_from_deb(deb_path, uboot_path)
1234bbbd9b6eSWillian Rampazzo        image_url = ('https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/'
1235bbbd9b6eSWillian Rampazzo                     'evbarm-earmv7hf/binary/gzimg/armv7.img.gz')
1236bbbd9b6eSWillian Rampazzo        image_hash = '2babb29d36d8360adcb39c09e31060945259917a'
1237bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
1238bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, 'armv7.img')
1239bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
1240bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
1241bbbd9b6eSWillian Rampazzo        image_drive_args = 'if=sd,format=raw,snapshot=on,file=' + image_path
1242bbbd9b6eSWillian Rampazzo
1243bbbd9b6eSWillian Rampazzo        # dd if=u-boot-sunxi-with-spl.bin of=armv7.img bs=1K seek=8 conv=notrunc
1244bbbd9b6eSWillian Rampazzo        with open(uboot_path, 'rb') as f_in:
1245bbbd9b6eSWillian Rampazzo            with open(image_path, 'r+b') as f_out:
1246bbbd9b6eSWillian Rampazzo                f_out.seek(8 * 1024)
1247bbbd9b6eSWillian Rampazzo                shutil.copyfileobj(f_in, f_out)
1248bbbd9b6eSWillian Rampazzo
1249bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1250bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nic', 'user',
1251bbbd9b6eSWillian Rampazzo                         '-drive', image_drive_args,
1252bbbd9b6eSWillian Rampazzo                         '-global', 'allwinner-rtc.base-year=2000',
1253bbbd9b6eSWillian Rampazzo                         '-no-reboot')
1254bbbd9b6eSWillian Rampazzo        self.vm.launch()
1255bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'U-Boot 2020.01+dfsg-1')
1256bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(self,
1257bbbd9b6eSWillian Rampazzo                                       'Hit any key to stop autoboot:',
1258bbbd9b6eSWillian Rampazzo                                       'switch to partitions #0, OK')
1259bbbd9b6eSWillian Rampazzo
1260bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, '', '=>')
1261bbbd9b6eSWillian Rampazzo        cmd = 'setenv bootargs root=ld0a'
1262bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
1263bbbd9b6eSWillian Rampazzo        cmd = 'setenv kernel netbsd-GENERIC.ub'
1264bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
1265bbbd9b6eSWillian Rampazzo        cmd = 'setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb'
1266bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
1267bbbd9b6eSWillian Rampazzo        cmd = ("setenv bootcmd 'fatload mmc 0:1 ${kernel_addr_r} ${kernel}; "
1268bbbd9b6eSWillian Rampazzo               "fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}; "
1269bbbd9b6eSWillian Rampazzo               "fdt addr ${fdt_addr_r}; "
1270bbbd9b6eSWillian Rampazzo               "bootm ${kernel_addr_r} - ${fdt_addr_r}'")
1271bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
1272bbbd9b6eSWillian Rampazzo
1273bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot',
1274bbbd9b6eSWillian Rampazzo                                          'Booting kernel from Legacy Image')
1275bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting kernel ...')
1276bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'NetBSD 9.0 (GENERIC)')
1277bbbd9b6eSWillian Rampazzo        # Wait for user-space
1278bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting root file system check')
1279bbbd9b6eSWillian Rampazzo
1280bbbd9b6eSWillian Rampazzo    def test_aarch64_raspi3_atf(self):
1281bbbd9b6eSWillian Rampazzo        """
12829bb9a3f3SFabiano Rosas        :avocado: tags=accel:tcg
1283bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:aarch64
1284bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi3b
1285bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:cortex-a53
1286bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
1287bbbd9b6eSWillian Rampazzo        :avocado: tags=atf
1288bbbd9b6eSWillian Rampazzo        """
1289bbbd9b6eSWillian Rampazzo        zip_url = ('https://github.com/pbatard/RPi3/releases/download/'
1290bbbd9b6eSWillian Rampazzo                   'v1.15/RPi3_UEFI_Firmware_v1.15.zip')
1291bbbd9b6eSWillian Rampazzo        zip_hash = '74b3bd0de92683cadb14e008a7575e1d0c3cafb9'
1292bbbd9b6eSWillian Rampazzo        zip_path = self.fetch_asset(zip_url, asset_hash=zip_hash)
1293bbbd9b6eSWillian Rampazzo
1294bbbd9b6eSWillian Rampazzo        archive.extract(zip_path, self.workdir)
1295bbbd9b6eSWillian Rampazzo        efi_fd = os.path.join(self.workdir, 'RPI_EFI.fd')
1296bbbd9b6eSWillian Rampazzo
1297bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=1)
1298bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1299bbbd9b6eSWillian Rampazzo                         '-device', 'loader,file=%s,force-raw=true' % efi_fd)
1300bbbd9b6eSWillian Rampazzo        self.vm.launch()
1301bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('version UEFI Firmware v1.15')
1302bbbd9b6eSWillian Rampazzo
1303bbbd9b6eSWillian Rampazzo    def test_s390x_s390_ccw_virtio(self):
1304bbbd9b6eSWillian Rampazzo        """
1305bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:s390x
1306bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:s390-ccw-virtio
1307bbbd9b6eSWillian Rampazzo        """
1308bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive'
1309bbbd9b6eSWillian Rampazzo                      '/fedora-secondary/releases/29/Everything/s390x/os/images'
1310bbbd9b6eSWillian Rampazzo                      '/kernel.img')
1311bbbd9b6eSWillian Rampazzo        kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313'
1312bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1313bbbd9b6eSWillian Rampazzo
1314bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1315bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0'
1316bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1317bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
1318bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1319bbbd9b6eSWillian Rampazzo        self.vm.launch()
1320bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1321bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1322bbbd9b6eSWillian Rampazzo
1323bbbd9b6eSWillian Rampazzo    def test_alpha_clipper(self):
1324bbbd9b6eSWillian Rampazzo        """
1325bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:alpha
1326bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:clipper
1327bbbd9b6eSWillian Rampazzo        """
1328bbbd9b6eSWillian Rampazzo        kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/'
1329bbbd9b6eSWillian Rampazzo                      'installer-alpha/20090123lenny10/images/cdrom/vmlinuz')
1330bbbd9b6eSWillian Rampazzo        kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3'
1331bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1332bbbd9b6eSWillian Rampazzo
1333bbbd9b6eSWillian Rampazzo        uncompressed_kernel = archive.uncompress(kernel_path, self.workdir)
1334bbbd9b6eSWillian Rampazzo
1335bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1336bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
1337bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1338bbbd9b6eSWillian Rampazzo                         '-kernel', uncompressed_kernel,
1339bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1340bbbd9b6eSWillian Rampazzo        self.vm.launch()
1341bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1342bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1343bbbd9b6eSWillian Rampazzo
1344bbbd9b6eSWillian Rampazzo    def test_m68k_q800(self):
1345bbbd9b6eSWillian Rampazzo        """
1346bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1347bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:q800
1348bbbd9b6eSWillian Rampazzo        """
1349bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian-ports'
1350bbbd9b6eSWillian Rampazzo                   '/20191021T083923Z/pool-m68k/main'
1351bbbd9b6eSWillian Rampazzo                   '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb')
1352bbbd9b6eSWillian Rampazzo        deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1'
1353bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1354bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1355bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-5.3.0-1-m68k')
1356bbbd9b6eSWillian Rampazzo
1357bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1358bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1359bbbd9b6eSWillian Rampazzo                               'console=ttyS0 vga=off')
1360bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1361bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1362bbbd9b6eSWillian Rampazzo        self.vm.launch()
1363bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1364bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1365bbbd9b6eSWillian Rampazzo        console_pattern = 'No filesystem could mount root'
1366bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1367bbbd9b6eSWillian Rampazzo
1368bbbd9b6eSWillian Rampazzo    def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0):
136972cf57b0SThomas Huth        tar_url = ('https://qemu-advcal.gitlab.io'
137072cf57b0SThomas Huth                   '/qac-best-of-multiarch/download/day' + day + '.tar.xz')
1371bbbd9b6eSWillian Rampazzo        file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
1372bbbd9b6eSWillian Rampazzo        archive.extract(file_path, self.workdir)
1373bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=console)
1374bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel',
1375bbbd9b6eSWillian Rampazzo                         self.workdir + '/day' + day + '/' + kernel_name)
1376bbbd9b6eSWillian Rampazzo        self.vm.launch()
1377bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('QEMU advent calendar')
1378bbbd9b6eSWillian Rampazzo
1379bbbd9b6eSWillian Rampazzo    def test_arm_vexpressa9(self):
1380bbbd9b6eSWillian Rampazzo        """
1381bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1382bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:vexpress-a9
1383bbbd9b6eSWillian Rampazzo        """
1384bbbd9b6eSWillian Rampazzo        tar_hash = '32b7677ce8b6f1471fb0059865f451169934245b'
1385bbbd9b6eSWillian Rampazzo        self.vm.add_args('-dtb', self.workdir + '/day16/vexpress-v2p-ca9.dtb')
1386bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('16', tar_hash, 'winter.zImage')
1387bbbd9b6eSWillian Rampazzo
1388bbbd9b6eSWillian Rampazzo    def test_arm_ast2600_debian(self):
1389bbbd9b6eSWillian Rampazzo        """
1390bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
13919b983dc7SJoel Stanley        :avocado: tags=machine:rainier-bmc
1392bbbd9b6eSWillian Rampazzo        """
1393bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
13949b983dc7SJoel Stanley                   '20220606T211338Z/'
1395bbbd9b6eSWillian Rampazzo                   'pool/main/l/linux/'
13969b983dc7SJoel Stanley                   'linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb')
13979b983dc7SJoel Stanley        deb_hash = '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e'
1398bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
1399bbbd9b6eSWillian Rampazzo                                    algorithm='sha256')
14009b983dc7SJoel Stanley        kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
1401bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path,
14029b983dc7SJoel Stanley                '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
1403bbbd9b6eSWillian Rampazzo
1404bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1405bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1406bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1407bbbd9b6eSWillian Rampazzo                         '-net', 'nic')
1408bbbd9b6eSWillian Rampazzo        self.vm.launch()
1409bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
1410bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("SMP: Total of 2 processors activated")
1411bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("No filesystem could mount root")
1412bbbd9b6eSWillian Rampazzo
1413bbbd9b6eSWillian Rampazzo    def test_m68k_mcf5208evb(self):
1414bbbd9b6eSWillian Rampazzo        """
1415bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1416bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mcf5208evb
1417bbbd9b6eSWillian Rampazzo        """
1418bbbd9b6eSWillian Rampazzo        tar_hash = 'ac688fd00561a2b6ce1359f9ff6aa2b98c9a570c'
1419bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('07', tar_hash, 'sanity-clause.elf')
1420bbbd9b6eSWillian Rampazzo
1421bbbd9b6eSWillian Rampazzo    def test_or1k_sim(self):
1422bbbd9b6eSWillian Rampazzo        """
1423bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:or1k
1424bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:or1k-sim
1425bbbd9b6eSWillian Rampazzo        """
1426bbbd9b6eSWillian Rampazzo        tar_hash = '20334cdaf386108c530ff0badaecc955693027dd'
1427bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('20', tar_hash, 'vmlinux')
1428bbbd9b6eSWillian Rampazzo
1429bbbd9b6eSWillian Rampazzo    def test_ppc64_e500(self):
1430bbbd9b6eSWillian Rampazzo        """
1431bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1432bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:ppce500
1433bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:e5500
1434d78fb13dSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1435bbbd9b6eSWillian Rampazzo        """
1436d78fb13dSDaniel Henrique Barboza        self.require_accelerator("tcg")
1437bbbd9b6eSWillian Rampazzo        tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
1438bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('19', tar_hash, 'uImage')
1439bbbd9b6eSWillian Rampazzo
1440bbbd9b6eSWillian Rampazzo    def do_test_ppc64_powernv(self, proc):
14416b87d614SDaniel Henrique Barboza        self.require_accelerator("tcg")
1442bbbd9b6eSWillian Rampazzo        images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
1443bbbd9b6eSWillian Rampazzo
1444bbbd9b6eSWillian Rampazzo        kernel_url = images_url + 'zImage.epapr'
1445bbbd9b6eSWillian Rampazzo        kernel_hash = '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd'
1446bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash,
1447bbbd9b6eSWillian Rampazzo                                       algorithm='sha256')
1448bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1449bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1450bbbd9b6eSWillian Rampazzo                         '-append', 'console=tty0 console=hvc0',
1451bbbd9b6eSWillian Rampazzo                         '-device', 'pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0',
1452bbbd9b6eSWillian Rampazzo                         '-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234',
1453bbbd9b6eSWillian Rampazzo                         '-device', 'e1000e,bus=bridge1,addr=0x3',
1454bbbd9b6eSWillian Rampazzo                         '-device', 'nec-usb-xhci,bus=bridge1,addr=0x2')
1455bbbd9b6eSWillian Rampazzo        self.vm.launch()
1456bbbd9b6eSWillian Rampazzo
1457bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("CPU: " + proc + " generation processor")
1458bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("zImage starting: loaded")
1459bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Run /init as init process")
1460458a6aa3SNicholas Piggin        # Device detection output driven by udev probing is sometimes cut off
1461458a6aa3SNicholas Piggin        # from console output, suspect S14silence-console init script.
1462bbbd9b6eSWillian Rampazzo
1463bbbd9b6eSWillian Rampazzo    def test_ppc_powernv8(self):
1464bbbd9b6eSWillian Rampazzo        """
1465bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1466bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv8
14676b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1468bbbd9b6eSWillian Rampazzo        """
1469bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P8')
1470bbbd9b6eSWillian Rampazzo
1471bbbd9b6eSWillian Rampazzo    def test_ppc_powernv9(self):
1472bbbd9b6eSWillian Rampazzo        """
1473bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1474bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv9
14756b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1476bbbd9b6eSWillian Rampazzo        """
1477bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P9')
1478bbbd9b6eSWillian Rampazzo
1479234aa6d6SNicholas Piggin    def test_ppc_powernv10(self):
1480234aa6d6SNicholas Piggin        """
1481234aa6d6SNicholas Piggin        :avocado: tags=arch:ppc64
1482234aa6d6SNicholas Piggin        :avocado: tags=machine:powernv10
1483234aa6d6SNicholas Piggin        :avocado: tags=accel:tcg
1484234aa6d6SNicholas Piggin        """
1485234aa6d6SNicholas Piggin        self.do_test_ppc64_powernv('P10')
1486234aa6d6SNicholas Piggin
1487bbbd9b6eSWillian Rampazzo    def test_ppc_g3beige(self):
1488bbbd9b6eSWillian Rampazzo        """
1489bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1490bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:g3beige
1491daff68ccSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1492bbbd9b6eSWillian Rampazzo        """
1493daff68ccSDaniel Henrique Barboza        # TODO: g3beige works with kvm_pr but we don't have a
1494daff68ccSDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1495daff68ccSDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1496daff68ccSDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1497daff68ccSDaniel Henrique Barboza        self.require_accelerator("tcg")
1498bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1499bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1500bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1501bbbd9b6eSWillian Rampazzo
1502bbbd9b6eSWillian Rampazzo    def test_ppc_mac99(self):
1503bbbd9b6eSWillian Rampazzo        """
1504bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1505bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mac99
1506ff110c18SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1507bbbd9b6eSWillian Rampazzo        """
1508ff110c18SDaniel Henrique Barboza        # TODO: mac99 works with kvm_pr but we don't have a
1509ff110c18SDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1510ff110c18SDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1511ff110c18SDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1512ff110c18SDaniel Henrique Barboza        self.require_accelerator("tcg")
1513bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1514bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1515bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1516bbbd9b6eSWillian Rampazzo
1517500f73b1SAlex Bennée    # This test has a 6-10% failure rate on various hosts that look
1518500f73b1SAlex Bennée    # like issues with a buggy kernel. As a result we don't want it
1519500f73b1SAlex Bennée    # gating releases on Gitlab.
15209b45cc99SAlex Bennée    @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
15219b45cc99SAlex Bennée
1522bbbd9b6eSWillian Rampazzo    def test_sh4_r2d(self):
1523bbbd9b6eSWillian Rampazzo        """
1524bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sh4
1525bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:r2d
15265d25fcb7SAlex Bennée        :avocado: tags=flaky
1527bbbd9b6eSWillian Rampazzo        """
1528bbbd9b6eSWillian Rampazzo        tar_hash = 'fe06a4fd8ccbf2e27928d64472939d47829d4c7e'
1529bbbd9b6eSWillian Rampazzo        self.vm.add_args('-append', 'console=ttySC1')
1530bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('09', tar_hash, 'zImage', console=1)
1531bbbd9b6eSWillian Rampazzo
1532bbbd9b6eSWillian Rampazzo    def test_sparc_ss20(self):
1533bbbd9b6eSWillian Rampazzo        """
1534bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sparc
1535bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:SS-20
1536bbbd9b6eSWillian Rampazzo        """
1537bbbd9b6eSWillian Rampazzo        tar_hash = 'b18550d5d61c7615d989a06edace051017726a9f'
1538bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('11', tar_hash, 'zImage.elf')
1539bbbd9b6eSWillian Rampazzo
1540bbbd9b6eSWillian Rampazzo    def test_xtensa_lx60(self):
1541bbbd9b6eSWillian Rampazzo        """
1542bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:xtensa
1543bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:lx60
1544bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:dc233c
1545bbbd9b6eSWillian Rampazzo        """
1546bbbd9b6eSWillian Rampazzo        tar_hash = '49e88d9933742f0164b60839886c9739cb7a0d34'
1547bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('02', tar_hash, 'santas-sleigh-ride.elf')
1548