xref: /openbmc/qemu/tests/avocado/boot_linux_console.py (revision ffd0cac708733ec0e039e3aa8a49f371ac066f36)
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
18500f73b1SAlex Bennéefrom avocado import skipIf
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
33*ffd0cac7SPhilippe Mathieu-Daudédef file_truncate(path, size):
34*ffd0cac7SPhilippe Mathieu-Daudé    if size != os.path.getsize(path):
35*ffd0cac7SPhilippe Mathieu-Daudé        with open(path, 'ab+') as fd:
36*ffd0cac7SPhilippe Mathieu-Daudé            fd.truncate(size)
37*ffd0cac7SPhilippe 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
403bbbd9b6eSWillian Rampazzo        self.vm.set_console()
404bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
405bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', uboot_path,
406bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
407bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + spi_path + ',if=mtd,format=raw',
408bbbd9b6eSWillian Rampazzo                         '-no-reboot')
409bbbd9b6eSWillian Rampazzo        self.vm.launch()
410bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Enter \'help\' for a list')
411bbbd9b6eSWillian Rampazzo
412bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 10.0.2.15',
413bbbd9b6eSWillian Rampazzo                                                 'eth0: link becomes ready')
414bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
415bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
416bbbd9b6eSWillian Rampazzo
417bbbd9b6eSWillian Rampazzo    def do_test_arm_raspi2(self, uart_id):
418bbbd9b6eSWillian Rampazzo        """
419bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
420bbbd9b6eSWillian Rampazzo
421bbbd9b6eSWillian Rampazzo        The kernel can be rebuilt using the kernel source referenced
422bbbd9b6eSWillian Rampazzo        and following the instructions on the on:
423bbbd9b6eSWillian Rampazzo        https://www.raspberrypi.org/documentation/linux/kernel/building.md
424bbbd9b6eSWillian Rampazzo        """
425bbbd9b6eSWillian Rampazzo        serial_kernel_cmdline = {
426bbbd9b6eSWillian Rampazzo            0: 'earlycon=pl011,0x3f201000 console=ttyAMA0',
427bbbd9b6eSWillian Rampazzo        }
428bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
429bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
430bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
431bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
432bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
433bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
434bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
435bbbd9b6eSWillian Rampazzo
436bbbd9b6eSWillian Rampazzo        self.vm.set_console()
437bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
438bbbd9b6eSWillian Rampazzo                               serial_kernel_cmdline[uart_id] +
439bbbd9b6eSWillian Rampazzo                               ' root=/dev/mmcblk0p2 rootwait ' +
440bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
441bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
442bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
443bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
444bbbd9b6eSWillian Rampazzo                         '-device', 'usb-kbd')
445bbbd9b6eSWillian Rampazzo        self.vm.launch()
446bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
447bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
448bbbd9b6eSWillian Rampazzo        console_pattern = 'Product: QEMU USB Keyboard'
449bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
450bbbd9b6eSWillian Rampazzo
451bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_uart0(self):
452bbbd9b6eSWillian Rampazzo        """
453bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
454bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
455bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
456bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
457bbbd9b6eSWillian Rampazzo        """
458bbbd9b6eSWillian Rampazzo        self.do_test_arm_raspi2(0)
459bbbd9b6eSWillian Rampazzo
460bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_initrd(self):
461bbbd9b6eSWillian Rampazzo        """
462bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
463bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
464bbbd9b6eSWillian Rampazzo        """
465bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
466bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
467bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
468bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
469bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
470bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
471bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
472bbbd9b6eSWillian Rampazzo
473bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
474bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
475bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
476bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
477bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
478bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
479bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
480bbbd9b6eSWillian Rampazzo
481bbbd9b6eSWillian Rampazzo        self.vm.set_console()
482bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
483bbbd9b6eSWillian Rampazzo                               'earlycon=pl011,0x3f201000 console=ttyAMA0 '
484bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot ' +
485bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
486bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
487bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
488bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
489bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
490bbbd9b6eSWillian Rampazzo                         '-no-reboot')
491bbbd9b6eSWillian Rampazzo        self.vm.launch()
492bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
493bbbd9b6eSWillian Rampazzo
494bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
495bbbd9b6eSWillian Rampazzo                                                'BCM2835')
496bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
497bbbd9b6eSWillian Rampazzo                                                '/soc/cprman@7e101000')
498cc45d25cSPeter Maydell        exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted')
499bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
500bbbd9b6eSWillian Rampazzo        self.vm.wait()
501bbbd9b6eSWillian Rampazzo
502bbbd9b6eSWillian Rampazzo    def test_arm_exynos4210_initrd(self):
503bbbd9b6eSWillian Rampazzo        """
504bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
505bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:smdkc210
506bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
507bbbd9b6eSWillian Rampazzo        """
508bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian/'
509bbbd9b6eSWillian Rampazzo                   '20190928T224601Z/pool/main/l/linux/'
510bbbd9b6eSWillian Rampazzo                   'linux-image-4.19.0-6-armmp_4.19.67-2+deb10u1_armhf.deb')
511bbbd9b6eSWillian Rampazzo        deb_hash = 'fa9df4a0d38936cb50084838f2cb933f570d7d82'
512bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
513bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
514bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-4.19.0-6-armmp')
515bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-4.19.0-6-armmp/exynos4210-smdkv310.dtb'
516bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
517bbbd9b6eSWillian Rampazzo
518bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
519bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
520bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
521bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
522bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
523bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
524bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
525bbbd9b6eSWillian Rampazzo
526bbbd9b6eSWillian Rampazzo        self.vm.set_console()
527bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
528bbbd9b6eSWillian Rampazzo                               'earlycon=exynos4210,0x13800000 earlyprintk ' +
529bbbd9b6eSWillian Rampazzo                               'console=ttySAC0,115200n8 ' +
530bbbd9b6eSWillian Rampazzo                               'random.trust_cpu=off cryptomgr.notests ' +
531bbbd9b6eSWillian Rampazzo                               'cpuidle.off=1 panic=-1 noreboot')
532bbbd9b6eSWillian Rampazzo
533bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
534bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
535bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
536bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
537bbbd9b6eSWillian Rampazzo                         '-no-reboot')
538bbbd9b6eSWillian Rampazzo        self.vm.launch()
539bbbd9b6eSWillian Rampazzo
540bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
541bbbd9b6eSWillian Rampazzo        # TODO user command, for now the uart is stuck
542bbbd9b6eSWillian Rampazzo
543bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_initrd(self):
544bbbd9b6eSWillian Rampazzo        """
545bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
546bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
547bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
548bbbd9b6eSWillian Rampazzo        """
549bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
550bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
551bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
552bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
553bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
554bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
555bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb'
556bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
557bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
558bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
559bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
560bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
561bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
562bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
563bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
564bbbd9b6eSWillian Rampazzo
565bbbd9b6eSWillian Rampazzo        self.vm.set_console()
566bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
567bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
568bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
569bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
570bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
571bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
572bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
573bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
574bbbd9b6eSWillian Rampazzo                         '-no-reboot')
575bbbd9b6eSWillian Rampazzo        self.vm.launch()
576bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
577bbbd9b6eSWillian Rampazzo
578bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
579bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
580bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
581bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
582bbbd9b6eSWillian Rampazzo        # cubieboard's reboot is not functioning; omit reboot test.
583bbbd9b6eSWillian Rampazzo
584bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_sata(self):
585bbbd9b6eSWillian Rampazzo        """
586bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
587bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
588bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
589bbbd9b6eSWillian Rampazzo        """
590bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
591bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
592bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
593bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
594bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
595bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
596bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb'
597bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
598bbbd9b6eSWillian Rampazzo        rootfs_url = ('https://github.com/groeck/linux-build-test/raw/'
599bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
600bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.ext2.gz')
601bbbd9b6eSWillian Rampazzo        rootfs_hash = '093e89d2b4d982234bf528bc9fb2f2f17a9d1f93'
602bbbd9b6eSWillian Rampazzo        rootfs_path_gz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
603bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
604bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(rootfs_path_gz, rootfs_path)
605bbbd9b6eSWillian Rampazzo
606bbbd9b6eSWillian Rampazzo        self.vm.set_console()
607bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
608bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
609bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
610bbbd9b6eSWillian Rampazzo                               'root=/dev/sda ro '
611bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
612bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
613bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
614bbbd9b6eSWillian Rampazzo                         '-drive', 'if=none,format=raw,id=disk0,file='
615bbbd9b6eSWillian Rampazzo                                   + rootfs_path,
616bbbd9b6eSWillian Rampazzo                         '-device', 'ide-hd,bus=ide.0,drive=disk0',
617bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
618bbbd9b6eSWillian Rampazzo                         '-no-reboot')
619bbbd9b6eSWillian Rampazzo        self.vm.launch()
620bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
621bbbd9b6eSWillian Rampazzo
622bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
623bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
624bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
625bbbd9b6eSWillian Rampazzo                                                'sda')
626bbbd9b6eSWillian Rampazzo        # cubieboard's reboot is not functioning; omit reboot test.
627bbbd9b6eSWillian Rampazzo
62822bd244aSStrahinja Jankovic    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
62922bd244aSStrahinja Jankovic    def test_arm_cubieboard_openwrt_22_03_2(self):
63022bd244aSStrahinja Jankovic        """
63122bd244aSStrahinja Jankovic        :avocado: tags=arch:arm
63222bd244aSStrahinja Jankovic        :avocado: tags=machine:cubieboard
63322bd244aSStrahinja Jankovic        :avocado: tags=device:sd
63422bd244aSStrahinja Jankovic        """
63522bd244aSStrahinja Jankovic
63622bd244aSStrahinja Jankovic        # This test download a 7.5 MiB compressed image and expand it
63722bd244aSStrahinja Jankovic        # to 126 MiB.
63822bd244aSStrahinja Jankovic        image_url = ('https://downloads.openwrt.org/releases/22.03.2/targets/'
63922bd244aSStrahinja Jankovic                     'sunxi/cortexa8/openwrt-22.03.2-sunxi-cortexa8-'
64022bd244aSStrahinja Jankovic                     'cubietech_a10-cubieboard-ext4-sdcard.img.gz')
64122bd244aSStrahinja Jankovic        image_hash = ('94b5ecbfbc0b3b56276e5146b899eafa'
64222bd244aSStrahinja Jankovic                      '2ac5dc2d08733d6705af9f144f39f554')
64322bd244aSStrahinja Jankovic        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
64422bd244aSStrahinja Jankovic                                         algorithm='sha256')
64522bd244aSStrahinja Jankovic        image_path = archive.extract(image_path_gz, self.workdir)
64622bd244aSStrahinja Jankovic        image_pow2ceil_expand(image_path)
64722bd244aSStrahinja Jankovic
64822bd244aSStrahinja Jankovic        self.vm.set_console()
64922bd244aSStrahinja Jankovic        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
65022bd244aSStrahinja Jankovic                         '-nic', 'user',
65122bd244aSStrahinja Jankovic                         '-no-reboot')
65222bd244aSStrahinja Jankovic        self.vm.launch()
65322bd244aSStrahinja Jankovic
65422bd244aSStrahinja Jankovic        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
65522bd244aSStrahinja Jankovic                               'usbcore.nousb '
65622bd244aSStrahinja Jankovic                               'noreboot')
65722bd244aSStrahinja Jankovic
65822bd244aSStrahinja Jankovic        self.wait_for_console_pattern('U-Boot SPL')
65922bd244aSStrahinja Jankovic
66022bd244aSStrahinja Jankovic        interrupt_interactive_console_until_pattern(
66122bd244aSStrahinja Jankovic                self, 'Hit any key to stop autoboot:', '=>')
66222bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
66322bd244aSStrahinja Jankovic                                                kernel_command_line + "'", '=>')
66422bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
66522bd244aSStrahinja Jankovic
66622bd244aSStrahinja Jankovic        self.wait_for_console_pattern(
66722bd244aSStrahinja Jankovic            'Please press Enter to activate this console.')
66822bd244aSStrahinja Jankovic
66922bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, ' ', 'root@')
67022bd244aSStrahinja Jankovic
67122bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
67222bd244aSStrahinja Jankovic                                                'Allwinner sun4i/sun5i')
67322bd244aSStrahinja Jankovic        # cubieboard's reboot is not functioning; omit reboot test.
67422bd244aSStrahinja Jankovic
675bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
676bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj(self):
677bbbd9b6eSWillian Rampazzo        """
678bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
679bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
680bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
681bbbd9b6eSWillian Rampazzo        """
682bbbd9b6eSWillian Rampazzo        # 25 MiB compressed, 32 MiB uncompressed.
683bbbd9b6eSWillian Rampazzo        image_url = (
684bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
685bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-image-gsj.static.mtd.gz')
686bbbd9b6eSWillian Rampazzo        image_hash = '14895e634923345cb5c8776037ff7876df96f6b1'
687bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
688bbbd9b6eSWillian Rampazzo        image_name = 'obmc.mtd'
689bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, image_name)
690bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
691bbbd9b6eSWillian Rampazzo
692bbbd9b6eSWillian Rampazzo        self.vm.set_console()
693bbbd9b6eSWillian Rampazzo        drive_args = 'file=' + image_path + ',if=mtd,bus=0,unit=0'
694bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', drive_args)
695bbbd9b6eSWillian Rampazzo        self.vm.launch()
696bbbd9b6eSWillian Rampazzo
697bbbd9b6eSWillian Rampazzo        # Disable drivers and services that stall for a long time during boot,
698bbbd9b6eSWillian Rampazzo        # to avoid running past the 90-second timeout. These may be removed
699bbbd9b6eSWillian Rampazzo        # as the corresponding device support is added.
700bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + (
701bbbd9b6eSWillian Rampazzo                'console=${console} '
702bbbd9b6eSWillian Rampazzo                'mem=${mem} '
703bbbd9b6eSWillian Rampazzo                'initcall_blacklist=npcm_i2c_bus_driver_init '
704bbbd9b6eSWillian Rampazzo                'systemd.mask=systemd-random-seed.service '
705bbbd9b6eSWillian Rampazzo                'systemd.mask=dropbearkey.service '
706bbbd9b6eSWillian Rampazzo        )
707bbbd9b6eSWillian Rampazzo
708bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('> BootBlock by Nuvoton')
709bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Device: Poleg BMC NPCM730')
710bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Skip DDR init.')
711bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot ')
712bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(
713bbbd9b6eSWillian Rampazzo                self, 'Hit any key to stop autoboot:', 'U-Boot>')
714bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
715bbbd9b6eSWillian Rampazzo                self, "setenv bootargs ${bootargs} " + kernel_command_line,
716bbbd9b6eSWillian Rampazzo                'U-Boot>')
717bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
718bbbd9b6eSWillian Rampazzo                self, 'run romboot', 'Booting Kernel from flash')
719bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
720bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
721bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('OpenBMC Project Reference Distro')
722bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('gsj login:')
723bbbd9b6eSWillian Rampazzo
724bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj_initrd(self):
725bbbd9b6eSWillian Rampazzo        """
726bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
727bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
728bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
729bbbd9b6eSWillian Rampazzo        """
730bbbd9b6eSWillian Rampazzo        initrd_url = (
731bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
732bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-initramfs-gsj.cpio.xz')
733bbbd9b6eSWillian Rampazzo        initrd_hash = '98fefe5d7e56727b1eb17d5c00311b1b5c945300'
734bbbd9b6eSWillian Rampazzo        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
735bbbd9b6eSWillian Rampazzo        kernel_url = (
736bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
737bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/uImage-gsj.bin')
738bbbd9b6eSWillian Rampazzo        kernel_hash = 'fa67b2f141d56d39b3c54305c0e8a899c99eb2c7'
739bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
740bbbd9b6eSWillian Rampazzo        dtb_url = (
741bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
742bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/nuvoton-npcm730-gsj.dtb')
743bbbd9b6eSWillian Rampazzo        dtb_hash = '18315f7006d7b688d8312d5c727eecd819aa36a4'
744bbbd9b6eSWillian Rampazzo        dtb_path = self.fetch_asset(dtb_url, asset_hash=dtb_hash)
745bbbd9b6eSWillian Rampazzo
746bbbd9b6eSWillian Rampazzo        self.vm.set_console()
747bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
748bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
749bbbd9b6eSWillian Rampazzo                               'earlycon=uart8250,mmio32,0xf0001000')
750bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
751bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
752bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
753bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
754bbbd9b6eSWillian Rampazzo        self.vm.launch()
755bbbd9b6eSWillian Rampazzo
756bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
757bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
758bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(
759bbbd9b6eSWillian Rampazzo                'Give root password for system maintenance')
760bbbd9b6eSWillian Rampazzo
761bbbd9b6eSWillian Rampazzo    def test_arm_orangepi(self):
762bbbd9b6eSWillian Rampazzo        """
763bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
764bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
765bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
766bbbd9b6eSWillian Rampazzo        """
767bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
768bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
769bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
770bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
771bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
772bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
773bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
774bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
775bbbd9b6eSWillian Rampazzo
776bbbd9b6eSWillian Rampazzo        self.vm.set_console()
777bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
778bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
779bbbd9b6eSWillian Rampazzo                               'earlycon=uart,mmio32,0x1c28000')
780bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
781bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
782bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
783bbbd9b6eSWillian Rampazzo        self.vm.launch()
784bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
785bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
786bbbd9b6eSWillian Rampazzo
787bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_initrd(self):
788bbbd9b6eSWillian Rampazzo        """
789bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
790bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
791bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
792bbbd9b6eSWillian Rampazzo        """
793bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
794bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
795bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
796bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
797bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
798bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
799bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
800bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
801bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
802bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
803bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
804bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
805bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
806bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
807bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
808bbbd9b6eSWillian Rampazzo
809bbbd9b6eSWillian Rampazzo        self.vm.set_console()
810bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
811bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
812bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
813bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
814bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
815bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
816bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
817bbbd9b6eSWillian Rampazzo                         '-no-reboot')
818bbbd9b6eSWillian Rampazzo        self.vm.launch()
819bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
820bbbd9b6eSWillian Rampazzo
821bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
822bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
823bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
824bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
825bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
826bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
827bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
828bbbd9b6eSWillian Rampazzo        self.vm.wait()
829bbbd9b6eSWillian Rampazzo
830bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_sd(self):
831bbbd9b6eSWillian Rampazzo        """
832bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
833bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
834bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
835bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
836bbbd9b6eSWillian Rampazzo        """
8370793fe01SPeter Maydell        self.require_netdev('user')
8380793fe01SPeter Maydell
839bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
840bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
841bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
842bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
843bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
844bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
845bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
846bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
847bbbd9b6eSWillian Rampazzo        rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/'
8484189af72SAlex Bennée                      'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz')
8494189af72SAlex Bennée        rootfs_hash = 'fae32f337c7b87547b10f42599acf109da8b6d9a'
850bbbd9b6eSWillian Rampazzo        rootfs_path_xz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
851bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
852bbbd9b6eSWillian Rampazzo        archive.lzma_uncompress(rootfs_path_xz, rootfs_path)
853bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(rootfs_path)
854bbbd9b6eSWillian Rampazzo
855bbbd9b6eSWillian Rampazzo        self.vm.set_console()
856bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
857bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
858bbbd9b6eSWillian Rampazzo                               'root=/dev/mmcblk0 rootwait rw '
859bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
860bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
861bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
862bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + rootfs_path + ',if=sd,format=raw',
863bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
864bbbd9b6eSWillian Rampazzo                         '-no-reboot')
865bbbd9b6eSWillian Rampazzo        self.vm.launch()
866bbbd9b6eSWillian Rampazzo        shell_ready = "/bin/sh: can't access tty; job control turned off"
867bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(shell_ready)
868bbbd9b6eSWillian Rampazzo
869bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
870bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
871bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
872bbbd9b6eSWillian Rampazzo                                                'mmcblk0')
873bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 up',
874bbbd9b6eSWillian Rampazzo                                                 'eth0: Link is Up')
875bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'udhcpc eth0',
876bbbd9b6eSWillian Rampazzo            'udhcpc: lease of 10.0.2.15 obtained')
877bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
878bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
879bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
880bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
881bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
882bbbd9b6eSWillian Rampazzo        self.vm.wait()
883bbbd9b6eSWillian Rampazzo
884bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
885bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_bionic_20_08(self):
886bbbd9b6eSWillian Rampazzo        """
887bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
888bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
889bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
890bbbd9b6eSWillian Rampazzo        """
891bbbd9b6eSWillian Rampazzo
892bbbd9b6eSWillian Rampazzo        # This test download a 275 MiB compressed image and expand it
893bbbd9b6eSWillian Rampazzo        # to 1036 MiB, but the underlying filesystem is 1552 MiB...
894bbbd9b6eSWillian Rampazzo        # As we expand it to 2 GiB we are safe.
895bbbd9b6eSWillian Rampazzo
896bbbd9b6eSWillian Rampazzo        image_url = ('https://archive.armbian.com/orangepipc/archive/'
897bbbd9b6eSWillian Rampazzo                     'Armbian_20.08.1_Orangepipc_bionic_current_5.8.5.img.xz')
898bbbd9b6eSWillian Rampazzo        image_hash = ('b4d6775f5673486329e45a0586bf06b6'
899bbbd9b6eSWillian Rampazzo                      'dbe792199fd182ac6b9c7bb6c7d3e6dd')
900bbbd9b6eSWillian Rampazzo        image_path_xz = self.fetch_asset(image_url, asset_hash=image_hash,
901bbbd9b6eSWillian Rampazzo                                         algorithm='sha256')
902bbbd9b6eSWillian Rampazzo        image_path = archive.extract(image_path_xz, self.workdir)
903bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
904bbbd9b6eSWillian Rampazzo
905bbbd9b6eSWillian Rampazzo        self.vm.set_console()
906bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
907bbbd9b6eSWillian Rampazzo                         '-nic', 'user',
908bbbd9b6eSWillian Rampazzo                         '-no-reboot')
909bbbd9b6eSWillian Rampazzo        self.vm.launch()
910bbbd9b6eSWillian Rampazzo
911bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
912bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
913bbbd9b6eSWillian Rampazzo                               'loglevel=7 '
914bbbd9b6eSWillian Rampazzo                               'nosmp '
915bbbd9b6eSWillian Rampazzo                               'systemd.default_timeout_start_sec=9000 '
916bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-zram-config.service '
917bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-ramlog.service')
918bbbd9b6eSWillian Rampazzo
919bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot SPL')
920bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Autoboot in ')
921bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, ' ', '=>')
922bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
923bbbd9b6eSWillian Rampazzo                                                kernel_command_line + "'", '=>')
924bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
925bbbd9b6eSWillian Rampazzo
926bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('systemd[1]: Set hostname ' +
927bbbd9b6eSWillian Rampazzo                                      'to <orangepipc>')
928bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Starting Load Kernel Modules...')
929bbbd9b6eSWillian Rampazzo
930bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
931bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_uboot_netbsd9(self):
932bbbd9b6eSWillian Rampazzo        """
933bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
934bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
935bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
936bbbd9b6eSWillian Rampazzo        :avocado: tags=os:netbsd
937bbbd9b6eSWillian Rampazzo        """
938bbbd9b6eSWillian Rampazzo        # This test download a 304MB compressed image and expand it to 2GB
939bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
940bbbd9b6eSWillian Rampazzo                   '20200108T145233Z/pool/main/u/u-boot/'
941bbbd9b6eSWillian Rampazzo                   'u-boot-sunxi_2020.01%2Bdfsg-1_armhf.deb')
942bbbd9b6eSWillian Rampazzo        deb_hash = 'f67f404a80753ca3d1258f13e38f2b060e13db99'
943bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
944bbbd9b6eSWillian Rampazzo        # We use the common OrangePi PC 'plus' build of U-Boot for our secondary
945bbbd9b6eSWillian Rampazzo        # program loader (SPL). We will then set the path to the more specific
946bbbd9b6eSWillian Rampazzo        # OrangePi "PC" device tree blob with 'setenv fdtfile' in U-Boot prompt,
947bbbd9b6eSWillian Rampazzo        # before to boot NetBSD.
948bbbd9b6eSWillian Rampazzo        uboot_path = '/usr/lib/u-boot/orangepi_plus/u-boot-sunxi-with-spl.bin'
949bbbd9b6eSWillian Rampazzo        uboot_path = self.extract_from_deb(deb_path, uboot_path)
950bbbd9b6eSWillian Rampazzo        image_url = ('https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/'
951bbbd9b6eSWillian Rampazzo                     'evbarm-earmv7hf/binary/gzimg/armv7.img.gz')
952bbbd9b6eSWillian Rampazzo        image_hash = '2babb29d36d8360adcb39c09e31060945259917a'
953bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
954bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, 'armv7.img')
955bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
956bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
957bbbd9b6eSWillian Rampazzo        image_drive_args = 'if=sd,format=raw,snapshot=on,file=' + image_path
958bbbd9b6eSWillian Rampazzo
959bbbd9b6eSWillian Rampazzo        # dd if=u-boot-sunxi-with-spl.bin of=armv7.img bs=1K seek=8 conv=notrunc
960bbbd9b6eSWillian Rampazzo        with open(uboot_path, 'rb') as f_in:
961bbbd9b6eSWillian Rampazzo            with open(image_path, 'r+b') as f_out:
962bbbd9b6eSWillian Rampazzo                f_out.seek(8 * 1024)
963bbbd9b6eSWillian Rampazzo                shutil.copyfileobj(f_in, f_out)
964bbbd9b6eSWillian Rampazzo
965bbbd9b6eSWillian Rampazzo        self.vm.set_console()
966bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nic', 'user',
967bbbd9b6eSWillian Rampazzo                         '-drive', image_drive_args,
968bbbd9b6eSWillian Rampazzo                         '-global', 'allwinner-rtc.base-year=2000',
969bbbd9b6eSWillian Rampazzo                         '-no-reboot')
970bbbd9b6eSWillian Rampazzo        self.vm.launch()
971bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'U-Boot 2020.01+dfsg-1')
972bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(self,
973bbbd9b6eSWillian Rampazzo                                       'Hit any key to stop autoboot:',
974bbbd9b6eSWillian Rampazzo                                       'switch to partitions #0, OK')
975bbbd9b6eSWillian Rampazzo
976bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, '', '=>')
977bbbd9b6eSWillian Rampazzo        cmd = 'setenv bootargs root=ld0a'
978bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
979bbbd9b6eSWillian Rampazzo        cmd = 'setenv kernel netbsd-GENERIC.ub'
980bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
981bbbd9b6eSWillian Rampazzo        cmd = 'setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb'
982bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
983bbbd9b6eSWillian Rampazzo        cmd = ("setenv bootcmd 'fatload mmc 0:1 ${kernel_addr_r} ${kernel}; "
984bbbd9b6eSWillian Rampazzo               "fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}; "
985bbbd9b6eSWillian Rampazzo               "fdt addr ${fdt_addr_r}; "
986bbbd9b6eSWillian Rampazzo               "bootm ${kernel_addr_r} - ${fdt_addr_r}'")
987bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
988bbbd9b6eSWillian Rampazzo
989bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot',
990bbbd9b6eSWillian Rampazzo                                          'Booting kernel from Legacy Image')
991bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting kernel ...')
992bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'NetBSD 9.0 (GENERIC)')
993bbbd9b6eSWillian Rampazzo        # Wait for user-space
994bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting root file system check')
995bbbd9b6eSWillian Rampazzo
996bbbd9b6eSWillian Rampazzo    def test_aarch64_raspi3_atf(self):
997bbbd9b6eSWillian Rampazzo        """
998bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:aarch64
999bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi3b
1000bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:cortex-a53
1001bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
1002bbbd9b6eSWillian Rampazzo        :avocado: tags=atf
1003bbbd9b6eSWillian Rampazzo        """
1004bbbd9b6eSWillian Rampazzo        zip_url = ('https://github.com/pbatard/RPi3/releases/download/'
1005bbbd9b6eSWillian Rampazzo                   'v1.15/RPi3_UEFI_Firmware_v1.15.zip')
1006bbbd9b6eSWillian Rampazzo        zip_hash = '74b3bd0de92683cadb14e008a7575e1d0c3cafb9'
1007bbbd9b6eSWillian Rampazzo        zip_path = self.fetch_asset(zip_url, asset_hash=zip_hash)
1008bbbd9b6eSWillian Rampazzo
1009bbbd9b6eSWillian Rampazzo        archive.extract(zip_path, self.workdir)
1010bbbd9b6eSWillian Rampazzo        efi_fd = os.path.join(self.workdir, 'RPI_EFI.fd')
1011bbbd9b6eSWillian Rampazzo
1012bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=1)
1013bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1014bbbd9b6eSWillian Rampazzo                         '-device', 'loader,file=%s,force-raw=true' % efi_fd)
1015bbbd9b6eSWillian Rampazzo        self.vm.launch()
1016bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('version UEFI Firmware v1.15')
1017bbbd9b6eSWillian Rampazzo
1018bbbd9b6eSWillian Rampazzo    def test_s390x_s390_ccw_virtio(self):
1019bbbd9b6eSWillian Rampazzo        """
1020bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:s390x
1021bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:s390-ccw-virtio
1022bbbd9b6eSWillian Rampazzo        """
1023bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive'
1024bbbd9b6eSWillian Rampazzo                      '/fedora-secondary/releases/29/Everything/s390x/os/images'
1025bbbd9b6eSWillian Rampazzo                      '/kernel.img')
1026bbbd9b6eSWillian Rampazzo        kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313'
1027bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1028bbbd9b6eSWillian Rampazzo
1029bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1030bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0'
1031bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1032bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
1033bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1034bbbd9b6eSWillian Rampazzo        self.vm.launch()
1035bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1036bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1037bbbd9b6eSWillian Rampazzo
1038bbbd9b6eSWillian Rampazzo    def test_alpha_clipper(self):
1039bbbd9b6eSWillian Rampazzo        """
1040bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:alpha
1041bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:clipper
1042bbbd9b6eSWillian Rampazzo        """
1043bbbd9b6eSWillian Rampazzo        kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/'
1044bbbd9b6eSWillian Rampazzo                      'installer-alpha/20090123lenny10/images/cdrom/vmlinuz')
1045bbbd9b6eSWillian Rampazzo        kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3'
1046bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1047bbbd9b6eSWillian Rampazzo
1048bbbd9b6eSWillian Rampazzo        uncompressed_kernel = archive.uncompress(kernel_path, self.workdir)
1049bbbd9b6eSWillian Rampazzo
1050bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1051bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
1052bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1053bbbd9b6eSWillian Rampazzo                         '-kernel', uncompressed_kernel,
1054bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1055bbbd9b6eSWillian Rampazzo        self.vm.launch()
1056bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1057bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1058bbbd9b6eSWillian Rampazzo
1059bbbd9b6eSWillian Rampazzo    def test_m68k_q800(self):
1060bbbd9b6eSWillian Rampazzo        """
1061bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1062bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:q800
1063bbbd9b6eSWillian Rampazzo        """
1064bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian-ports'
1065bbbd9b6eSWillian Rampazzo                   '/20191021T083923Z/pool-m68k/main'
1066bbbd9b6eSWillian Rampazzo                   '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb')
1067bbbd9b6eSWillian Rampazzo        deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1'
1068bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1069bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1070bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-5.3.0-1-m68k')
1071bbbd9b6eSWillian Rampazzo
1072bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1073bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1074bbbd9b6eSWillian Rampazzo                               'console=ttyS0 vga=off')
1075bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1076bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1077bbbd9b6eSWillian Rampazzo        self.vm.launch()
1078bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1079bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1080bbbd9b6eSWillian Rampazzo        console_pattern = 'No filesystem could mount root'
1081bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1082bbbd9b6eSWillian Rampazzo
1083bbbd9b6eSWillian Rampazzo    def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0):
108472cf57b0SThomas Huth        tar_url = ('https://qemu-advcal.gitlab.io'
108572cf57b0SThomas Huth                   '/qac-best-of-multiarch/download/day' + day + '.tar.xz')
1086bbbd9b6eSWillian Rampazzo        file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
1087bbbd9b6eSWillian Rampazzo        archive.extract(file_path, self.workdir)
1088bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=console)
1089bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel',
1090bbbd9b6eSWillian Rampazzo                         self.workdir + '/day' + day + '/' + kernel_name)
1091bbbd9b6eSWillian Rampazzo        self.vm.launch()
1092bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('QEMU advent calendar')
1093bbbd9b6eSWillian Rampazzo
1094bbbd9b6eSWillian Rampazzo    def test_arm_vexpressa9(self):
1095bbbd9b6eSWillian Rampazzo        """
1096bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1097bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:vexpress-a9
1098bbbd9b6eSWillian Rampazzo        """
1099bbbd9b6eSWillian Rampazzo        tar_hash = '32b7677ce8b6f1471fb0059865f451169934245b'
1100bbbd9b6eSWillian Rampazzo        self.vm.add_args('-dtb', self.workdir + '/day16/vexpress-v2p-ca9.dtb')
1101bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('16', tar_hash, 'winter.zImage')
1102bbbd9b6eSWillian Rampazzo
1103bbbd9b6eSWillian Rampazzo    def test_arm_ast2600_debian(self):
1104bbbd9b6eSWillian Rampazzo        """
1105bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1106bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:tacoma-bmc
1107bbbd9b6eSWillian Rampazzo        """
1108bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
1109bbbd9b6eSWillian Rampazzo                   '20210302T203551Z/'
1110bbbd9b6eSWillian Rampazzo                   'pool/main/l/linux/'
1111bbbd9b6eSWillian Rampazzo                   'linux-image-5.10.0-3-armmp_5.10.13-1_armhf.deb')
1112bbbd9b6eSWillian Rampazzo        deb_hash = 'db40d32fe39255d05482bea48d72467b67d6225bb2a2a4d6f618cb8976f1e09e'
1113bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
1114bbbd9b6eSWillian Rampazzo                                    algorithm='sha256')
1115bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.10.0-3-armmp')
1116bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path,
1117bbbd9b6eSWillian Rampazzo                '/usr/lib/linux-image-5.10.0-3-armmp/aspeed-bmc-opp-tacoma.dtb')
1118bbbd9b6eSWillian Rampazzo
1119bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1120bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1121bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1122bbbd9b6eSWillian Rampazzo                         '-net', 'nic')
1123bbbd9b6eSWillian Rampazzo        self.vm.launch()
1124bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
1125bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("SMP: Total of 2 processors activated")
1126bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("No filesystem could mount root")
1127bbbd9b6eSWillian Rampazzo
1128bbbd9b6eSWillian Rampazzo    def test_m68k_mcf5208evb(self):
1129bbbd9b6eSWillian Rampazzo        """
1130bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1131bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mcf5208evb
1132bbbd9b6eSWillian Rampazzo        """
1133bbbd9b6eSWillian Rampazzo        tar_hash = 'ac688fd00561a2b6ce1359f9ff6aa2b98c9a570c'
1134bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('07', tar_hash, 'sanity-clause.elf')
1135bbbd9b6eSWillian Rampazzo
1136bbbd9b6eSWillian Rampazzo    def test_or1k_sim(self):
1137bbbd9b6eSWillian Rampazzo        """
1138bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:or1k
1139bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:or1k-sim
1140bbbd9b6eSWillian Rampazzo        """
1141bbbd9b6eSWillian Rampazzo        tar_hash = '20334cdaf386108c530ff0badaecc955693027dd'
1142bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('20', tar_hash, 'vmlinux')
1143bbbd9b6eSWillian Rampazzo
1144bbbd9b6eSWillian Rampazzo    def test_nios2_10m50(self):
1145bbbd9b6eSWillian Rampazzo        """
1146bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:nios2
1147bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:10m50-ghrd
1148bbbd9b6eSWillian Rampazzo        """
1149bbbd9b6eSWillian Rampazzo        tar_hash = 'e4251141726c412ac0407c5a6bceefbbff018918'
1150bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('14', tar_hash, 'vmlinux.elf')
1151bbbd9b6eSWillian Rampazzo
1152bbbd9b6eSWillian Rampazzo    def test_ppc64_e500(self):
1153bbbd9b6eSWillian Rampazzo        """
1154bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1155bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:ppce500
1156bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:e5500
1157d78fb13dSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1158bbbd9b6eSWillian Rampazzo        """
1159d78fb13dSDaniel Henrique Barboza        self.require_accelerator("tcg")
1160bbbd9b6eSWillian Rampazzo        tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
1161bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('19', tar_hash, 'uImage')
1162bbbd9b6eSWillian Rampazzo
1163bbbd9b6eSWillian Rampazzo    def do_test_ppc64_powernv(self, proc):
11646b87d614SDaniel Henrique Barboza        self.require_accelerator("tcg")
1165bbbd9b6eSWillian Rampazzo        images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
1166bbbd9b6eSWillian Rampazzo
1167bbbd9b6eSWillian Rampazzo        kernel_url = images_url + 'zImage.epapr'
1168bbbd9b6eSWillian Rampazzo        kernel_hash = '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd'
1169bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash,
1170bbbd9b6eSWillian Rampazzo                                       algorithm='sha256')
1171bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1172bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1173bbbd9b6eSWillian Rampazzo                         '-append', 'console=tty0 console=hvc0',
1174bbbd9b6eSWillian Rampazzo                         '-device', 'pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0',
1175bbbd9b6eSWillian Rampazzo                         '-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234',
1176bbbd9b6eSWillian Rampazzo                         '-device', 'e1000e,bus=bridge1,addr=0x3',
1177bbbd9b6eSWillian Rampazzo                         '-device', 'nec-usb-xhci,bus=bridge1,addr=0x2')
1178bbbd9b6eSWillian Rampazzo        self.vm.launch()
1179bbbd9b6eSWillian Rampazzo
1180bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("CPU: " + proc + " generation processor")
1181bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("zImage starting: loaded")
1182bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Run /init as init process")
1183bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Creating 1 MTD partitions")
1184bbbd9b6eSWillian Rampazzo
1185bbbd9b6eSWillian Rampazzo    def test_ppc_powernv8(self):
1186bbbd9b6eSWillian Rampazzo        """
1187bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1188bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv8
11896b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1190bbbd9b6eSWillian Rampazzo        """
1191bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P8')
1192bbbd9b6eSWillian Rampazzo
1193bbbd9b6eSWillian Rampazzo    def test_ppc_powernv9(self):
1194bbbd9b6eSWillian Rampazzo        """
1195bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1196bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv9
11976b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1198bbbd9b6eSWillian Rampazzo        """
1199bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P9')
1200bbbd9b6eSWillian Rampazzo
1201bbbd9b6eSWillian Rampazzo    def test_ppc_g3beige(self):
1202bbbd9b6eSWillian Rampazzo        """
1203bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1204bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:g3beige
1205daff68ccSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1206bbbd9b6eSWillian Rampazzo        """
1207daff68ccSDaniel Henrique Barboza        # TODO: g3beige works with kvm_pr but we don't have a
1208daff68ccSDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1209daff68ccSDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1210daff68ccSDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1211daff68ccSDaniel Henrique Barboza        self.require_accelerator("tcg")
1212bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1213bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1214bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1215bbbd9b6eSWillian Rampazzo
1216bbbd9b6eSWillian Rampazzo    def test_ppc_mac99(self):
1217bbbd9b6eSWillian Rampazzo        """
1218bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1219bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mac99
1220ff110c18SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1221bbbd9b6eSWillian Rampazzo        """
1222ff110c18SDaniel Henrique Barboza        # TODO: mac99 works with kvm_pr but we don't have a
1223ff110c18SDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1224ff110c18SDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1225ff110c18SDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1226ff110c18SDaniel Henrique Barboza        self.require_accelerator("tcg")
1227bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1228bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1229bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1230bbbd9b6eSWillian Rampazzo
1231500f73b1SAlex Bennée    # This test has a 6-10% failure rate on various hosts that look
1232500f73b1SAlex Bennée    # like issues with a buggy kernel. As a result we don't want it
1233500f73b1SAlex Bennée    # gating releases on Gitlab.
1234500f73b1SAlex Bennée    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
1235bbbd9b6eSWillian Rampazzo    def test_sh4_r2d(self):
1236bbbd9b6eSWillian Rampazzo        """
1237bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sh4
1238bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:r2d
1239bbbd9b6eSWillian Rampazzo        """
1240bbbd9b6eSWillian Rampazzo        tar_hash = 'fe06a4fd8ccbf2e27928d64472939d47829d4c7e'
1241bbbd9b6eSWillian Rampazzo        self.vm.add_args('-append', 'console=ttySC1')
1242bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('09', tar_hash, 'zImage', console=1)
1243bbbd9b6eSWillian Rampazzo
1244bbbd9b6eSWillian Rampazzo    def test_sparc_ss20(self):
1245bbbd9b6eSWillian Rampazzo        """
1246bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sparc
1247bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:SS-20
1248bbbd9b6eSWillian Rampazzo        """
1249bbbd9b6eSWillian Rampazzo        tar_hash = 'b18550d5d61c7615d989a06edace051017726a9f'
1250bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('11', tar_hash, 'zImage.elf')
1251bbbd9b6eSWillian Rampazzo
1252bbbd9b6eSWillian Rampazzo    def test_xtensa_lx60(self):
1253bbbd9b6eSWillian Rampazzo        """
1254bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:xtensa
1255bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:lx60
1256bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:dc233c
1257bbbd9b6eSWillian Rampazzo        """
1258bbbd9b6eSWillian Rampazzo        tar_hash = '49e88d9933742f0164b60839886c9739cb7a0d34'
1259bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('02', tar_hash, 'santas-sleigh-ride.elf')
1260