xref: /openbmc/qemu/tests/avocado/boot_linux_console.py (revision 22bd244a1cf6fd95117f03004e8a1fc74a39311b)
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
33bbbd9b6eSWillian Rampazzo"""
34bbbd9b6eSWillian RampazzoExpand file size to next power of 2
35bbbd9b6eSWillian Rampazzo"""
36bbbd9b6eSWillian Rampazzodef image_pow2ceil_expand(path):
37bbbd9b6eSWillian Rampazzo        size = os.path.getsize(path)
38bbbd9b6eSWillian Rampazzo        size_aligned = pow2ceil(size)
39bbbd9b6eSWillian Rampazzo        if size != size_aligned:
40bbbd9b6eSWillian Rampazzo            with open(path, 'ab+') as fd:
41bbbd9b6eSWillian Rampazzo                fd.truncate(size_aligned)
42bbbd9b6eSWillian Rampazzo
432283b627SPhilippe Mathieu-Daudéclass LinuxKernelTest(QemuSystemTest):
44bbbd9b6eSWillian Rampazzo    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
45bbbd9b6eSWillian Rampazzo
46bbbd9b6eSWillian Rampazzo    def wait_for_console_pattern(self, success_message, vm=None):
47bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, success_message,
48bbbd9b6eSWillian Rampazzo                                 failure_message='Kernel panic - not syncing',
49bbbd9b6eSWillian Rampazzo                                 vm=vm)
50bbbd9b6eSWillian Rampazzo
51bbbd9b6eSWillian Rampazzo    def extract_from_deb(self, deb, path):
52bbbd9b6eSWillian Rampazzo        """
53bbbd9b6eSWillian Rampazzo        Extracts a file from a deb package into the test workdir
54bbbd9b6eSWillian Rampazzo
55bbbd9b6eSWillian Rampazzo        :param deb: path to the deb archive
56bbbd9b6eSWillian Rampazzo        :param path: path within the deb archive of the file to be extracted
57bbbd9b6eSWillian Rampazzo        :returns: path of the extracted file
58bbbd9b6eSWillian Rampazzo        """
59bbbd9b6eSWillian Rampazzo        cwd = os.getcwd()
60bbbd9b6eSWillian Rampazzo        os.chdir(self.workdir)
61bbbd9b6eSWillian Rampazzo        file_path = process.run("ar t %s" % deb).stdout_text.split()[2]
62bbbd9b6eSWillian Rampazzo        process.run("ar x %s %s" % (deb, file_path))
63bbbd9b6eSWillian Rampazzo        archive.extract(file_path, self.workdir)
64bbbd9b6eSWillian Rampazzo        os.chdir(cwd)
65bbbd9b6eSWillian Rampazzo        # Return complete path to extracted file.  Because callers to
66bbbd9b6eSWillian Rampazzo        # extract_from_deb() specify 'path' with a leading slash, it is
67bbbd9b6eSWillian Rampazzo        # necessary to use os.path.relpath() as otherwise os.path.join()
68bbbd9b6eSWillian Rampazzo        # interprets it as an absolute path and drops the self.workdir part.
69bbbd9b6eSWillian Rampazzo        return os.path.normpath(os.path.join(self.workdir,
70bbbd9b6eSWillian Rampazzo                                             os.path.relpath(path, '/')))
71bbbd9b6eSWillian Rampazzo
72bbbd9b6eSWillian Rampazzo    def extract_from_rpm(self, rpm, path):
73bbbd9b6eSWillian Rampazzo        """
74bbbd9b6eSWillian Rampazzo        Extracts a file from an RPM package into the test workdir.
75bbbd9b6eSWillian Rampazzo
76bbbd9b6eSWillian Rampazzo        :param rpm: path to the rpm archive
77bbbd9b6eSWillian Rampazzo        :param path: path within the rpm archive of the file to be extracted
78bbbd9b6eSWillian Rampazzo                     needs to be a relative path (starting with './') because
79bbbd9b6eSWillian Rampazzo                     cpio(1), which is used to extract the file, expects that.
80bbbd9b6eSWillian Rampazzo        :returns: path of the extracted file
81bbbd9b6eSWillian Rampazzo        """
82bbbd9b6eSWillian Rampazzo        cwd = os.getcwd()
83bbbd9b6eSWillian Rampazzo        os.chdir(self.workdir)
84bbbd9b6eSWillian Rampazzo        process.run("rpm2cpio %s | cpio -id %s" % (rpm, path), shell=True)
85bbbd9b6eSWillian Rampazzo        os.chdir(cwd)
86bbbd9b6eSWillian Rampazzo        return os.path.normpath(os.path.join(self.workdir, path))
87bbbd9b6eSWillian Rampazzo
88bbbd9b6eSWillian Rampazzoclass BootLinuxConsole(LinuxKernelTest):
89bbbd9b6eSWillian Rampazzo    """
90bbbd9b6eSWillian Rampazzo    Boots a Linux kernel and checks that the console is operational and the
91bbbd9b6eSWillian Rampazzo    kernel command line is properly passed from QEMU to the kernel
92bbbd9b6eSWillian Rampazzo    """
93bbbd9b6eSWillian Rampazzo    timeout = 90
94bbbd9b6eSWillian Rampazzo
95bbbd9b6eSWillian Rampazzo    def test_x86_64_pc(self):
96bbbd9b6eSWillian Rampazzo        """
97bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:x86_64
98bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:pc
99bbbd9b6eSWillian Rampazzo        """
100bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
101bbbd9b6eSWillian Rampazzo                      '/linux/releases/29/Everything/x86_64/os/images/pxeboot'
102bbbd9b6eSWillian Rampazzo                      '/vmlinuz')
103bbbd9b6eSWillian Rampazzo        kernel_hash = '23bebd2680757891cf7adedb033532163a792495'
104bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
105bbbd9b6eSWillian Rampazzo
106bbbd9b6eSWillian Rampazzo        self.vm.set_console()
107bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
108bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
109bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
110bbbd9b6eSWillian Rampazzo        self.vm.launch()
111bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
112bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
113bbbd9b6eSWillian Rampazzo
114bbbd9b6eSWillian Rampazzo    def test_mips_malta(self):
115bbbd9b6eSWillian Rampazzo        """
116bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips
117bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
118bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:big
119bbbd9b6eSWillian Rampazzo        """
120bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
121bbbd9b6eSWillian Rampazzo                   '20130217T032700Z/pool/main/l/linux-2.6/'
122bbbd9b6eSWillian Rampazzo                   'linux-image-2.6.32-5-4kc-malta_2.6.32-48_mips.deb')
123bbbd9b6eSWillian Rampazzo        deb_hash = 'a8cfc28ad8f45f54811fc6cf74fc43ffcfe0ba04'
124bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
125bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
126bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-2.6.32-5-4kc-malta')
127bbbd9b6eSWillian Rampazzo
128bbbd9b6eSWillian Rampazzo        self.vm.set_console()
129bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
130bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
131bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
132bbbd9b6eSWillian Rampazzo        self.vm.launch()
133bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
134bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
135bbbd9b6eSWillian Rampazzo
136bbbd9b6eSWillian Rampazzo    def test_mips64el_malta(self):
137bbbd9b6eSWillian Rampazzo        """
138bbbd9b6eSWillian Rampazzo        This test requires the ar tool to extract "data.tar.gz" from
139bbbd9b6eSWillian Rampazzo        the Debian package.
140bbbd9b6eSWillian Rampazzo
141bbbd9b6eSWillian Rampazzo        The kernel can be rebuilt using this Debian kernel source [1] and
142bbbd9b6eSWillian Rampazzo        following the instructions on [2].
143bbbd9b6eSWillian Rampazzo
144bbbd9b6eSWillian Rampazzo        [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/
145bbbd9b6eSWillian Rampazzo            #linux-source-2.6.32_2.6.32-48
146bbbd9b6eSWillian Rampazzo        [2] https://kernel-team.pages.debian.net/kernel-handbook/
147bbbd9b6eSWillian Rampazzo            ch-common-tasks.html#s-common-official
148bbbd9b6eSWillian Rampazzo
149bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
150bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
151bbbd9b6eSWillian Rampazzo        """
152bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
153bbbd9b6eSWillian Rampazzo                   '20130217T032700Z/pool/main/l/linux-2.6/'
154bbbd9b6eSWillian Rampazzo                   'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb')
155bbbd9b6eSWillian Rampazzo        deb_hash = '1aaec92083bf22fda31e0d27fa8d9a388e5fc3d5'
156bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
157bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
158bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-2.6.32-5-5kc-malta')
159bbbd9b6eSWillian Rampazzo
160bbbd9b6eSWillian Rampazzo        self.vm.set_console()
161bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
162bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
163bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
164bbbd9b6eSWillian Rampazzo        self.vm.launch()
165bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
166bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
167bbbd9b6eSWillian Rampazzo
168bbbd9b6eSWillian Rampazzo    def test_mips64el_fuloong2e(self):
169bbbd9b6eSWillian Rampazzo        """
170bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
171bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:fuloong2e
172bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
173bbbd9b6eSWillian Rampazzo        """
174bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.debian.org/debian/pool/main/l/linux/'
175bbbd9b6eSWillian Rampazzo                   'linux-image-3.16.0-6-loongson-2e_3.16.56-1+deb8u1_mipsel.deb')
176bbbd9b6eSWillian Rampazzo        deb_hash = 'd04d446045deecf7b755ef576551de0c4184dd44'
177bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
178bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
179bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-3.16.0-6-loongson-2e')
180bbbd9b6eSWillian Rampazzo
181bbbd9b6eSWillian Rampazzo        self.vm.set_console()
182bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
183bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
184bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
185bbbd9b6eSWillian Rampazzo        self.vm.launch()
186bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
187bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
188bbbd9b6eSWillian Rampazzo
189bbbd9b6eSWillian Rampazzo    def test_mips_malta_cpio(self):
190bbbd9b6eSWillian Rampazzo        """
191bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips
192bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
193bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:big
194bbbd9b6eSWillian Rampazzo        """
195bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
196bbbd9b6eSWillian Rampazzo                   '20160601T041800Z/pool/main/l/linux/'
197bbbd9b6eSWillian Rampazzo                   'linux-image-4.5.0-2-4kc-malta_4.5.5-1_mips.deb')
198bbbd9b6eSWillian Rampazzo        deb_hash = 'a3c84f3e88b54e06107d65a410d1d1e8e0f340f8'
199bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
200bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
201bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-4.5.0-2-4kc-malta')
202bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
203bbbd9b6eSWillian Rampazzo                      '8584a59ed9e5eb5ee7ca91f6d74bbb06619205b8/rootfs/'
204bbbd9b6eSWillian Rampazzo                      'mips/rootfs.cpio.gz')
205bbbd9b6eSWillian Rampazzo        initrd_hash = 'bf806e17009360a866bf537f6de66590de349a99'
206bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
207bbbd9b6eSWillian Rampazzo        initrd_path = self.workdir + "rootfs.cpio"
208bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
209bbbd9b6eSWillian Rampazzo
210bbbd9b6eSWillian Rampazzo        self.vm.set_console()
211bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
212bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0 console=tty '
213bbbd9b6eSWillian Rampazzo                               + 'rdinit=/sbin/init noreboot')
214bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
215bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
216bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
217bbbd9b6eSWillian Rampazzo                         '-no-reboot')
218bbbd9b6eSWillian Rampazzo        self.vm.launch()
219bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
220bbbd9b6eSWillian Rampazzo
221bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
222bbbd9b6eSWillian Rampazzo                                                'BogoMIPS')
223bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'uname -a',
224bbbd9b6eSWillian Rampazzo                                                'Debian')
225bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
226bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
227bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
228bbbd9b6eSWillian Rampazzo        self.vm.wait()
229bbbd9b6eSWillian Rampazzo
230bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
231bbbd9b6eSWillian Rampazzo    def test_mips64el_malta_5KEc_cpio(self):
232bbbd9b6eSWillian Rampazzo        """
233bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mips64el
234bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
235bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
236bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:5KEc
237bbbd9b6eSWillian Rampazzo        """
238bbbd9b6eSWillian Rampazzo        kernel_url = ('https://github.com/philmd/qemu-testing-blob/'
239bbbd9b6eSWillian Rampazzo                      'raw/9ad2df38/mips/malta/mips64el/'
240bbbd9b6eSWillian Rampazzo                      'vmlinux-3.19.3.mtoman.20150408')
241bbbd9b6eSWillian Rampazzo        kernel_hash = '00d1d268fb9f7d8beda1de6bebcc46e884d71754'
242bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
243bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/'
244bbbd9b6eSWillian Rampazzo                      'raw/8584a59e/rootfs/'
245bbbd9b6eSWillian Rampazzo                      'mipsel64/rootfs.mipsel64r1.cpio.gz')
246bbbd9b6eSWillian Rampazzo        initrd_hash = '1dbb8a396e916847325284dbe2151167'
247bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, algorithm='md5',
248bbbd9b6eSWillian Rampazzo                                          asset_hash=initrd_hash)
249bbbd9b6eSWillian Rampazzo        initrd_path = self.workdir + "rootfs.cpio"
250bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
251bbbd9b6eSWillian Rampazzo
252bbbd9b6eSWillian Rampazzo        self.vm.set_console()
253bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
254bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0 console=tty '
255bbbd9b6eSWillian Rampazzo                               + 'rdinit=/sbin/init noreboot')
256bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
257bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
258bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
259bbbd9b6eSWillian Rampazzo                         '-no-reboot')
260bbbd9b6eSWillian Rampazzo        self.vm.launch()
261bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Boot successful.')
262bbbd9b6eSWillian Rampazzo
263bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
264bbbd9b6eSWillian Rampazzo                                                'MIPS 5KE')
265bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'uname -a',
266bbbd9b6eSWillian Rampazzo                                                '3.19.3.mtoman.20150408')
267bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
268bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
269bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
270bbbd9b6eSWillian Rampazzo        self.vm.wait()
271bbbd9b6eSWillian Rampazzo
272bbbd9b6eSWillian Rampazzo    def do_test_mips_malta32el_nanomips(self, kernel_url, kernel_hash):
273bbbd9b6eSWillian Rampazzo        kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
274bbbd9b6eSWillian Rampazzo        kernel_path = self.workdir + "kernel"
275bbbd9b6eSWillian Rampazzo        with lzma.open(kernel_path_xz, 'rb') as f_in:
276bbbd9b6eSWillian Rampazzo            with open(kernel_path, 'wb') as f_out:
277bbbd9b6eSWillian Rampazzo                shutil.copyfileobj(f_in, f_out)
278bbbd9b6eSWillian Rampazzo
279bbbd9b6eSWillian Rampazzo        self.vm.set_console()
280bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE
281bbbd9b6eSWillian Rampazzo                               + 'mem=256m@@0x0 '
282bbbd9b6eSWillian Rampazzo                               + 'console=ttyS0')
283bbbd9b6eSWillian Rampazzo        self.vm.add_args('-no-reboot',
284bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
285bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
286bbbd9b6eSWillian Rampazzo        self.vm.launch()
287bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
288bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
289bbbd9b6eSWillian Rampazzo
290bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_4k(self):
291bbbd9b6eSWillian Rampazzo        """
292bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
293bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
294bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
295bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
296bbbd9b6eSWillian Rampazzo        """
297bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
298bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
299bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page4k.xz')
300bbbd9b6eSWillian Rampazzo        kernel_hash = '477456aafd2a0f1ddc9482727f20fe9575565dd6'
301bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
302bbbd9b6eSWillian Rampazzo
303bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_16k_up(self):
304bbbd9b6eSWillian Rampazzo        """
305bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
306bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
307bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
308bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
309bbbd9b6eSWillian Rampazzo        """
310bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
311bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
312bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page16k_up.xz')
313bbbd9b6eSWillian Rampazzo        kernel_hash = 'e882868f944c71c816e832e2303b7874d044a7bc'
314bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
315bbbd9b6eSWillian Rampazzo
316bbbd9b6eSWillian Rampazzo    def test_mips_malta32el_nanomips_64k_dbg(self):
317bbbd9b6eSWillian Rampazzo        """
318bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:mipsel
319bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:malta
320bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
321bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:I7200
322bbbd9b6eSWillian Rampazzo        """
323bbbd9b6eSWillian Rampazzo        kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/'
324bbbd9b6eSWillian Rampazzo                      'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/'
325bbbd9b6eSWillian Rampazzo                      'generic_nano32r6el_page64k_dbg.xz')
326bbbd9b6eSWillian Rampazzo        kernel_hash = '18d1c68f2e23429e266ca39ba5349ccd0aeb7180'
327bbbd9b6eSWillian Rampazzo        self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash)
328bbbd9b6eSWillian Rampazzo
329bbbd9b6eSWillian Rampazzo    def test_aarch64_xlnx_versal_virt(self):
330bbbd9b6eSWillian Rampazzo        """
331bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:aarch64
332bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:xlnx-versal-virt
333bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
334bbbd9b6eSWillian Rampazzo        :avocado: tags=device:arm_gicv3
335bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
336bbbd9b6eSWillian Rampazzo        """
337bbbd9b6eSWillian Rampazzo        images_url = ('http://ports.ubuntu.com/ubuntu-ports/dists/'
338bbbd9b6eSWillian Rampazzo                      'bionic-updates/main/installer-arm64/'
3397fcc3f75SThomas Huth                      '20101020ubuntu543.19/images/')
340bbbd9b6eSWillian Rampazzo        kernel_url = images_url + 'netboot/ubuntu-installer/arm64/linux'
3417fcc3f75SThomas Huth        kernel_hash = 'e167757620640eb26de0972f578741924abb3a82'
342bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
343bbbd9b6eSWillian Rampazzo
344bbbd9b6eSWillian Rampazzo        initrd_url = images_url + 'netboot/ubuntu-installer/arm64/initrd.gz'
3457fcc3f75SThomas Huth        initrd_hash = 'cab5cb3fcefca8408aa5aae57f24574bfce8bdb9'
346bbbd9b6eSWillian Rampazzo        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
347bbbd9b6eSWillian Rampazzo
348bbbd9b6eSWillian Rampazzo        self.vm.set_console()
349bbbd9b6eSWillian Rampazzo        self.vm.add_args('-m', '2G',
350bbbd9b6eSWillian Rampazzo                         '-accel', 'tcg',
351bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
352bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path)
353bbbd9b6eSWillian Rampazzo        self.vm.launch()
354bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Checked W+X mappings: passed')
355bbbd9b6eSWillian Rampazzo
356bbbd9b6eSWillian Rampazzo    def test_arm_virt(self):
357bbbd9b6eSWillian Rampazzo        """
358bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
359bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:virt
360bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
361bbbd9b6eSWillian Rampazzo        """
362bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
363bbbd9b6eSWillian Rampazzo                      '/linux/releases/29/Everything/armhfp/os/images/pxeboot'
364bbbd9b6eSWillian Rampazzo                      '/vmlinuz')
365bbbd9b6eSWillian Rampazzo        kernel_hash = 'e9826d741b4fb04cadba8d4824d1ed3b7fb8b4d4'
366bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
367bbbd9b6eSWillian Rampazzo
368bbbd9b6eSWillian Rampazzo        self.vm.set_console()
369bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
370bbbd9b6eSWillian Rampazzo                               'console=ttyAMA0')
371bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
372bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
373bbbd9b6eSWillian Rampazzo        self.vm.launch()
374bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
375bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
376bbbd9b6eSWillian Rampazzo
377bbbd9b6eSWillian Rampazzo    def test_arm_emcraft_sf2(self):
378bbbd9b6eSWillian Rampazzo        """
379bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
380bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:emcraft-sf2
381bbbd9b6eSWillian Rampazzo        :avocado: tags=endian:little
382bbbd9b6eSWillian Rampazzo        :avocado: tags=u-boot
383bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
384bbbd9b6eSWillian Rampazzo        """
3850793fe01SPeter Maydell        self.require_netdev('user')
3860793fe01SPeter Maydell
387bbbd9b6eSWillian Rampazzo        uboot_url = ('https://raw.githubusercontent.com/'
388bbbd9b6eSWillian Rampazzo                     'Subbaraya-Sundeep/qemu-test-binaries/'
389bbbd9b6eSWillian Rampazzo                     'fe371d32e50ca682391e1e70ab98c2942aeffb01/u-boot')
390bbbd9b6eSWillian Rampazzo        uboot_hash = 'cbb8cbab970f594bf6523b9855be209c08374ae2'
391bbbd9b6eSWillian Rampazzo        uboot_path = self.fetch_asset(uboot_url, asset_hash=uboot_hash)
392bbbd9b6eSWillian Rampazzo        spi_url = ('https://raw.githubusercontent.com/'
393bbbd9b6eSWillian Rampazzo                   'Subbaraya-Sundeep/qemu-test-binaries/'
394bbbd9b6eSWillian Rampazzo                   'fe371d32e50ca682391e1e70ab98c2942aeffb01/spi.bin')
395bbbd9b6eSWillian Rampazzo        spi_hash = '65523a1835949b6f4553be96dec1b6a38fb05501'
396bbbd9b6eSWillian Rampazzo        spi_path = self.fetch_asset(spi_url, asset_hash=spi_hash)
397bbbd9b6eSWillian Rampazzo
398bbbd9b6eSWillian Rampazzo        self.vm.set_console()
399bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
400bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', uboot_path,
401bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
402bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + spi_path + ',if=mtd,format=raw',
403bbbd9b6eSWillian Rampazzo                         '-no-reboot')
404bbbd9b6eSWillian Rampazzo        self.vm.launch()
405bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Enter \'help\' for a list')
406bbbd9b6eSWillian Rampazzo
407bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 10.0.2.15',
408bbbd9b6eSWillian Rampazzo                                                 'eth0: link becomes ready')
409bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
410bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
411bbbd9b6eSWillian Rampazzo
412bbbd9b6eSWillian Rampazzo    def do_test_arm_raspi2(self, uart_id):
413bbbd9b6eSWillian Rampazzo        """
414bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
415bbbd9b6eSWillian Rampazzo
416bbbd9b6eSWillian Rampazzo        The kernel can be rebuilt using the kernel source referenced
417bbbd9b6eSWillian Rampazzo        and following the instructions on the on:
418bbbd9b6eSWillian Rampazzo        https://www.raspberrypi.org/documentation/linux/kernel/building.md
419bbbd9b6eSWillian Rampazzo        """
420bbbd9b6eSWillian Rampazzo        serial_kernel_cmdline = {
421bbbd9b6eSWillian Rampazzo            0: 'earlycon=pl011,0x3f201000 console=ttyAMA0',
422bbbd9b6eSWillian Rampazzo        }
423bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
424bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
425bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
426bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
427bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
428bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
429bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
430bbbd9b6eSWillian Rampazzo
431bbbd9b6eSWillian Rampazzo        self.vm.set_console()
432bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
433bbbd9b6eSWillian Rampazzo                               serial_kernel_cmdline[uart_id] +
434bbbd9b6eSWillian Rampazzo                               ' root=/dev/mmcblk0p2 rootwait ' +
435bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
436bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
437bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
438bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
439bbbd9b6eSWillian Rampazzo                         '-device', 'usb-kbd')
440bbbd9b6eSWillian Rampazzo        self.vm.launch()
441bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
442bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
443bbbd9b6eSWillian Rampazzo        console_pattern = 'Product: QEMU USB Keyboard'
444bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
445bbbd9b6eSWillian Rampazzo
446bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_uart0(self):
447bbbd9b6eSWillian Rampazzo        """
448bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
449bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
450bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
451bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
452bbbd9b6eSWillian Rampazzo        """
453bbbd9b6eSWillian Rampazzo        self.do_test_arm_raspi2(0)
454bbbd9b6eSWillian Rampazzo
455bbbd9b6eSWillian Rampazzo    def test_arm_raspi2_initrd(self):
456bbbd9b6eSWillian Rampazzo        """
457bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
458bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi2b
459bbbd9b6eSWillian Rampazzo        """
460bbbd9b6eSWillian Rampazzo        deb_url = ('http://archive.raspberrypi.org/debian/'
461bbbd9b6eSWillian Rampazzo                   'pool/main/r/raspberrypi-firmware/'
462bbbd9b6eSWillian Rampazzo                   'raspberrypi-kernel_1.20190215-1_armhf.deb')
463bbbd9b6eSWillian Rampazzo        deb_hash = 'cd284220b32128c5084037553db3c482426f3972'
464bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
465bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img')
466bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb')
467bbbd9b6eSWillian Rampazzo
468bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
469bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
470bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
471bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
472bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
473bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
474bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
475bbbd9b6eSWillian Rampazzo
476bbbd9b6eSWillian Rampazzo        self.vm.set_console()
477bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
478bbbd9b6eSWillian Rampazzo                               'earlycon=pl011,0x3f201000 console=ttyAMA0 '
479bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot ' +
480bbbd9b6eSWillian Rampazzo                               'dwc_otg.fiq_fsm_enable=0')
481bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
482bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
483bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
484bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
485bbbd9b6eSWillian Rampazzo                         '-no-reboot')
486bbbd9b6eSWillian Rampazzo        self.vm.launch()
487bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
488bbbd9b6eSWillian Rampazzo
489bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
490bbbd9b6eSWillian Rampazzo                                                'BCM2835')
491bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
492bbbd9b6eSWillian Rampazzo                                                '/soc/cprman@7e101000')
493cc45d25cSPeter Maydell        exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted')
494bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
495bbbd9b6eSWillian Rampazzo        self.vm.wait()
496bbbd9b6eSWillian Rampazzo
497bbbd9b6eSWillian Rampazzo    def test_arm_exynos4210_initrd(self):
498bbbd9b6eSWillian Rampazzo        """
499bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
500bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:smdkc210
501bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
502bbbd9b6eSWillian Rampazzo        """
503bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian/'
504bbbd9b6eSWillian Rampazzo                   '20190928T224601Z/pool/main/l/linux/'
505bbbd9b6eSWillian Rampazzo                   'linux-image-4.19.0-6-armmp_4.19.67-2+deb10u1_armhf.deb')
506bbbd9b6eSWillian Rampazzo        deb_hash = 'fa9df4a0d38936cb50084838f2cb933f570d7d82'
507bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
508bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
509bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-4.19.0-6-armmp')
510bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-4.19.0-6-armmp/exynos4210-smdkv310.dtb'
511bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
512bbbd9b6eSWillian Rampazzo
513bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
514bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
515bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
516bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
517bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
518bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
519bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
520bbbd9b6eSWillian Rampazzo
521bbbd9b6eSWillian Rampazzo        self.vm.set_console()
522bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
523bbbd9b6eSWillian Rampazzo                               'earlycon=exynos4210,0x13800000 earlyprintk ' +
524bbbd9b6eSWillian Rampazzo                               'console=ttySAC0,115200n8 ' +
525bbbd9b6eSWillian Rampazzo                               'random.trust_cpu=off cryptomgr.notests ' +
526bbbd9b6eSWillian Rampazzo                               'cpuidle.off=1 panic=-1 noreboot')
527bbbd9b6eSWillian Rampazzo
528bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
529bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
530bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
531bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
532bbbd9b6eSWillian Rampazzo                         '-no-reboot')
533bbbd9b6eSWillian Rampazzo        self.vm.launch()
534bbbd9b6eSWillian Rampazzo
535bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
536bbbd9b6eSWillian Rampazzo        # TODO user command, for now the uart is stuck
537bbbd9b6eSWillian Rampazzo
538bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_initrd(self):
539bbbd9b6eSWillian Rampazzo        """
540bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
541bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
542bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
543bbbd9b6eSWillian Rampazzo        """
544bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
545bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
546bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
547bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
548bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
549bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
550bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb'
551bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
552bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
553bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
554bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.cpio.gz')
555bbbd9b6eSWillian Rampazzo        initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b'
556bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
557bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
558bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
559bbbd9b6eSWillian Rampazzo
560bbbd9b6eSWillian Rampazzo        self.vm.set_console()
561bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
562bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
563bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
564bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
565bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
566bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
567bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
568bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
569bbbd9b6eSWillian Rampazzo                         '-no-reboot')
570bbbd9b6eSWillian Rampazzo        self.vm.launch()
571bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
572bbbd9b6eSWillian Rampazzo
573bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
574bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
575bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
576bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
577bbbd9b6eSWillian Rampazzo        # cubieboard's reboot is not functioning; omit reboot test.
578bbbd9b6eSWillian Rampazzo
579bbbd9b6eSWillian Rampazzo    def test_arm_cubieboard_sata(self):
580bbbd9b6eSWillian Rampazzo        """
581bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
582bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:cubieboard
583bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
584bbbd9b6eSWillian Rampazzo        """
585bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
586bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
587bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
588bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
589bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
590bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
591bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb'
592bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
593bbbd9b6eSWillian Rampazzo        rootfs_url = ('https://github.com/groeck/linux-build-test/raw/'
594bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
595bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv5.ext2.gz')
596bbbd9b6eSWillian Rampazzo        rootfs_hash = '093e89d2b4d982234bf528bc9fb2f2f17a9d1f93'
597bbbd9b6eSWillian Rampazzo        rootfs_path_gz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
598bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
599bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(rootfs_path_gz, rootfs_path)
600bbbd9b6eSWillian Rampazzo
601bbbd9b6eSWillian Rampazzo        self.vm.set_console()
602bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
603bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
604bbbd9b6eSWillian Rampazzo                               'usbcore.nousb '
605bbbd9b6eSWillian Rampazzo                               'root=/dev/sda ro '
606bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
607bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
608bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
609bbbd9b6eSWillian Rampazzo                         '-drive', 'if=none,format=raw,id=disk0,file='
610bbbd9b6eSWillian Rampazzo                                   + rootfs_path,
611bbbd9b6eSWillian Rampazzo                         '-device', 'ide-hd,bus=ide.0,drive=disk0',
612bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
613bbbd9b6eSWillian Rampazzo                         '-no-reboot')
614bbbd9b6eSWillian Rampazzo        self.vm.launch()
615bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
616bbbd9b6eSWillian Rampazzo
617bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
618bbbd9b6eSWillian Rampazzo                                                'Allwinner sun4i/sun5i')
619bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
620bbbd9b6eSWillian Rampazzo                                                'sda')
621bbbd9b6eSWillian Rampazzo        # cubieboard's reboot is not functioning; omit reboot test.
622bbbd9b6eSWillian Rampazzo
623*22bd244aSStrahinja Jankovic    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
624*22bd244aSStrahinja Jankovic    def test_arm_cubieboard_openwrt_22_03_2(self):
625*22bd244aSStrahinja Jankovic        """
626*22bd244aSStrahinja Jankovic        :avocado: tags=arch:arm
627*22bd244aSStrahinja Jankovic        :avocado: tags=machine:cubieboard
628*22bd244aSStrahinja Jankovic        :avocado: tags=device:sd
629*22bd244aSStrahinja Jankovic        """
630*22bd244aSStrahinja Jankovic
631*22bd244aSStrahinja Jankovic        # This test download a 7.5 MiB compressed image and expand it
632*22bd244aSStrahinja Jankovic        # to 126 MiB.
633*22bd244aSStrahinja Jankovic        image_url = ('https://downloads.openwrt.org/releases/22.03.2/targets/'
634*22bd244aSStrahinja Jankovic                     'sunxi/cortexa8/openwrt-22.03.2-sunxi-cortexa8-'
635*22bd244aSStrahinja Jankovic                     'cubietech_a10-cubieboard-ext4-sdcard.img.gz')
636*22bd244aSStrahinja Jankovic        image_hash = ('94b5ecbfbc0b3b56276e5146b899eafa'
637*22bd244aSStrahinja Jankovic                      '2ac5dc2d08733d6705af9f144f39f554')
638*22bd244aSStrahinja Jankovic        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash,
639*22bd244aSStrahinja Jankovic                                         algorithm='sha256')
640*22bd244aSStrahinja Jankovic        image_path = archive.extract(image_path_gz, self.workdir)
641*22bd244aSStrahinja Jankovic        image_pow2ceil_expand(image_path)
642*22bd244aSStrahinja Jankovic
643*22bd244aSStrahinja Jankovic        self.vm.set_console()
644*22bd244aSStrahinja Jankovic        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
645*22bd244aSStrahinja Jankovic                         '-nic', 'user',
646*22bd244aSStrahinja Jankovic                         '-no-reboot')
647*22bd244aSStrahinja Jankovic        self.vm.launch()
648*22bd244aSStrahinja Jankovic
649*22bd244aSStrahinja Jankovic        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
650*22bd244aSStrahinja Jankovic                               'usbcore.nousb '
651*22bd244aSStrahinja Jankovic                               'noreboot')
652*22bd244aSStrahinja Jankovic
653*22bd244aSStrahinja Jankovic        self.wait_for_console_pattern('U-Boot SPL')
654*22bd244aSStrahinja Jankovic
655*22bd244aSStrahinja Jankovic        interrupt_interactive_console_until_pattern(
656*22bd244aSStrahinja Jankovic                self, 'Hit any key to stop autoboot:', '=>')
657*22bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
658*22bd244aSStrahinja Jankovic                                                kernel_command_line + "'", '=>')
659*22bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
660*22bd244aSStrahinja Jankovic
661*22bd244aSStrahinja Jankovic        self.wait_for_console_pattern(
662*22bd244aSStrahinja Jankovic            'Please press Enter to activate this console.')
663*22bd244aSStrahinja Jankovic
664*22bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, ' ', 'root@')
665*22bd244aSStrahinja Jankovic
666*22bd244aSStrahinja Jankovic        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
667*22bd244aSStrahinja Jankovic                                                'Allwinner sun4i/sun5i')
668*22bd244aSStrahinja Jankovic        # cubieboard's reboot is not functioning; omit reboot test.
669*22bd244aSStrahinja Jankovic
670bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
671bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj(self):
672bbbd9b6eSWillian Rampazzo        """
673bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
674bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
675bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
676bbbd9b6eSWillian Rampazzo        """
677bbbd9b6eSWillian Rampazzo        # 25 MiB compressed, 32 MiB uncompressed.
678bbbd9b6eSWillian Rampazzo        image_url = (
679bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
680bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-image-gsj.static.mtd.gz')
681bbbd9b6eSWillian Rampazzo        image_hash = '14895e634923345cb5c8776037ff7876df96f6b1'
682bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
683bbbd9b6eSWillian Rampazzo        image_name = 'obmc.mtd'
684bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, image_name)
685bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
686bbbd9b6eSWillian Rampazzo
687bbbd9b6eSWillian Rampazzo        self.vm.set_console()
688bbbd9b6eSWillian Rampazzo        drive_args = 'file=' + image_path + ',if=mtd,bus=0,unit=0'
689bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', drive_args)
690bbbd9b6eSWillian Rampazzo        self.vm.launch()
691bbbd9b6eSWillian Rampazzo
692bbbd9b6eSWillian Rampazzo        # Disable drivers and services that stall for a long time during boot,
693bbbd9b6eSWillian Rampazzo        # to avoid running past the 90-second timeout. These may be removed
694bbbd9b6eSWillian Rampazzo        # as the corresponding device support is added.
695bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + (
696bbbd9b6eSWillian Rampazzo                'console=${console} '
697bbbd9b6eSWillian Rampazzo                'mem=${mem} '
698bbbd9b6eSWillian Rampazzo                'initcall_blacklist=npcm_i2c_bus_driver_init '
699bbbd9b6eSWillian Rampazzo                'systemd.mask=systemd-random-seed.service '
700bbbd9b6eSWillian Rampazzo                'systemd.mask=dropbearkey.service '
701bbbd9b6eSWillian Rampazzo        )
702bbbd9b6eSWillian Rampazzo
703bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('> BootBlock by Nuvoton')
704bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Device: Poleg BMC NPCM730')
705bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('>Skip DDR init.')
706bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot ')
707bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(
708bbbd9b6eSWillian Rampazzo                self, 'Hit any key to stop autoboot:', 'U-Boot>')
709bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
710bbbd9b6eSWillian Rampazzo                self, "setenv bootargs ${bootargs} " + kernel_command_line,
711bbbd9b6eSWillian Rampazzo                'U-Boot>')
712bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(
713bbbd9b6eSWillian Rampazzo                self, 'run romboot', 'Booting Kernel from flash')
714bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
715bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
716bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('OpenBMC Project Reference Distro')
717bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('gsj login:')
718bbbd9b6eSWillian Rampazzo
719bbbd9b6eSWillian Rampazzo    def test_arm_quanta_gsj_initrd(self):
720bbbd9b6eSWillian Rampazzo        """
721bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
722bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:quanta-gsj
723bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
724bbbd9b6eSWillian Rampazzo        """
725bbbd9b6eSWillian Rampazzo        initrd_url = (
726bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
727bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/obmc-phosphor-initramfs-gsj.cpio.xz')
728bbbd9b6eSWillian Rampazzo        initrd_hash = '98fefe5d7e56727b1eb17d5c00311b1b5c945300'
729bbbd9b6eSWillian Rampazzo        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
730bbbd9b6eSWillian Rampazzo        kernel_url = (
731bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
732bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/uImage-gsj.bin')
733bbbd9b6eSWillian Rampazzo        kernel_hash = 'fa67b2f141d56d39b3c54305c0e8a899c99eb2c7'
734bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
735bbbd9b6eSWillian Rampazzo        dtb_url = (
736bbbd9b6eSWillian Rampazzo                'https://github.com/hskinnemoen/openbmc/releases/download/'
737bbbd9b6eSWillian Rampazzo                '20200711-gsj-qemu-0/nuvoton-npcm730-gsj.dtb')
738bbbd9b6eSWillian Rampazzo        dtb_hash = '18315f7006d7b688d8312d5c727eecd819aa36a4'
739bbbd9b6eSWillian Rampazzo        dtb_path = self.fetch_asset(dtb_url, asset_hash=dtb_hash)
740bbbd9b6eSWillian Rampazzo
741bbbd9b6eSWillian Rampazzo        self.vm.set_console()
742bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
743bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
744bbbd9b6eSWillian Rampazzo                               'earlycon=uart8250,mmio32,0xf0001000')
745bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
746bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
747bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
748bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
749bbbd9b6eSWillian Rampazzo        self.vm.launch()
750bbbd9b6eSWillian Rampazzo
751bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Booting Linux on physical CPU 0x0')
752bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
753bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(
754bbbd9b6eSWillian Rampazzo                'Give root password for system maintenance')
755bbbd9b6eSWillian Rampazzo
756bbbd9b6eSWillian Rampazzo    def test_arm_orangepi(self):
757bbbd9b6eSWillian Rampazzo        """
758bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
759bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
760bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
761bbbd9b6eSWillian Rampazzo        """
762bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
763bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
764bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
765bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
766bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
767bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
768bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
769bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
770bbbd9b6eSWillian Rampazzo
771bbbd9b6eSWillian Rampazzo        self.vm.set_console()
772bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
773bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200n8 '
774bbbd9b6eSWillian Rampazzo                               'earlycon=uart,mmio32,0x1c28000')
775bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
776bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
777bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
778bbbd9b6eSWillian Rampazzo        self.vm.launch()
779bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
780bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
781bbbd9b6eSWillian Rampazzo
782bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_initrd(self):
783bbbd9b6eSWillian Rampazzo        """
784bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
785bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
786bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
787bbbd9b6eSWillian Rampazzo        """
788bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
789bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
790bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
791bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
792bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
793bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
794bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
795bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
796bbbd9b6eSWillian Rampazzo        initrd_url = ('https://github.com/groeck/linux-build-test/raw/'
797bbbd9b6eSWillian Rampazzo                      '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/'
798bbbd9b6eSWillian Rampazzo                      'arm/rootfs-armv7a.cpio.gz')
799bbbd9b6eSWillian Rampazzo        initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c'
800bbbd9b6eSWillian Rampazzo        initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
801bbbd9b6eSWillian Rampazzo        initrd_path = os.path.join(self.workdir, 'rootfs.cpio')
802bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(initrd_path_gz, initrd_path)
803bbbd9b6eSWillian Rampazzo
804bbbd9b6eSWillian Rampazzo        self.vm.set_console()
805bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
806bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
807bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
808bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
809bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
810bbbd9b6eSWillian Rampazzo                         '-initrd', initrd_path,
811bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
812bbbd9b6eSWillian Rampazzo                         '-no-reboot')
813bbbd9b6eSWillian Rampazzo        self.vm.launch()
814bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Boot successful.')
815bbbd9b6eSWillian Rampazzo
816bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
817bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
818bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
819bbbd9b6eSWillian Rampazzo                                                'system-control@1c00000')
820bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
821bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
822bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
823bbbd9b6eSWillian Rampazzo        self.vm.wait()
824bbbd9b6eSWillian Rampazzo
825bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_sd(self):
826bbbd9b6eSWillian Rampazzo        """
827bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
828bbbd9b6eSWillian Rampazzo        :avocado: tags=accel:tcg
829bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
830bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
831bbbd9b6eSWillian Rampazzo        """
8320793fe01SPeter Maydell        self.require_netdev('user')
8330793fe01SPeter Maydell
834bbbd9b6eSWillian Rampazzo        deb_url = ('https://apt.armbian.com/pool/main/l/'
835bbbd9b6eSWillian Rampazzo                   'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
836bbbd9b6eSWillian Rampazzo        deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
837bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
838bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
839bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinuz-5.10.16-sunxi')
840bbbd9b6eSWillian Rampazzo        dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb'
841bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path, dtb_path)
842bbbd9b6eSWillian Rampazzo        rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/'
8434189af72SAlex Bennée                      'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz')
8444189af72SAlex Bennée        rootfs_hash = 'fae32f337c7b87547b10f42599acf109da8b6d9a'
845bbbd9b6eSWillian Rampazzo        rootfs_path_xz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash)
846bbbd9b6eSWillian Rampazzo        rootfs_path = os.path.join(self.workdir, 'rootfs.cpio')
847bbbd9b6eSWillian Rampazzo        archive.lzma_uncompress(rootfs_path_xz, rootfs_path)
848bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(rootfs_path)
849bbbd9b6eSWillian Rampazzo
850bbbd9b6eSWillian Rampazzo        self.vm.set_console()
851bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
852bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
853bbbd9b6eSWillian Rampazzo                               'root=/dev/mmcblk0 rootwait rw '
854bbbd9b6eSWillian Rampazzo                               'panic=-1 noreboot')
855bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
856bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
857bbbd9b6eSWillian Rampazzo                         '-drive', 'file=' + rootfs_path + ',if=sd,format=raw',
858bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line,
859bbbd9b6eSWillian Rampazzo                         '-no-reboot')
860bbbd9b6eSWillian Rampazzo        self.vm.launch()
861bbbd9b6eSWillian Rampazzo        shell_ready = "/bin/sh: can't access tty; job control turned off"
862bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(shell_ready)
863bbbd9b6eSWillian Rampazzo
864bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
865bbbd9b6eSWillian Rampazzo                                                'Allwinner sun8i Family')
866bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
867bbbd9b6eSWillian Rampazzo                                                'mmcblk0')
868bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ifconfig eth0 up',
869bbbd9b6eSWillian Rampazzo                                                 'eth0: Link is Up')
870bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'udhcpc eth0',
871bbbd9b6eSWillian Rampazzo            'udhcpc: lease of 10.0.2.15 obtained')
872bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2',
873bbbd9b6eSWillian Rampazzo            '3 packets transmitted, 3 packets received, 0% packet loss')
874bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'reboot',
875bbbd9b6eSWillian Rampazzo                                                'reboot: Restarting system')
876bbbd9b6eSWillian Rampazzo        # Wait for VM to shut down gracefully
877bbbd9b6eSWillian Rampazzo        self.vm.wait()
878bbbd9b6eSWillian Rampazzo
879bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
880bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_bionic_20_08(self):
881bbbd9b6eSWillian Rampazzo        """
882bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
883bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
884bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
885bbbd9b6eSWillian Rampazzo        """
886bbbd9b6eSWillian Rampazzo
887bbbd9b6eSWillian Rampazzo        # This test download a 275 MiB compressed image and expand it
888bbbd9b6eSWillian Rampazzo        # to 1036 MiB, but the underlying filesystem is 1552 MiB...
889bbbd9b6eSWillian Rampazzo        # As we expand it to 2 GiB we are safe.
890bbbd9b6eSWillian Rampazzo
891bbbd9b6eSWillian Rampazzo        image_url = ('https://archive.armbian.com/orangepipc/archive/'
892bbbd9b6eSWillian Rampazzo                     'Armbian_20.08.1_Orangepipc_bionic_current_5.8.5.img.xz')
893bbbd9b6eSWillian Rampazzo        image_hash = ('b4d6775f5673486329e45a0586bf06b6'
894bbbd9b6eSWillian Rampazzo                      'dbe792199fd182ac6b9c7bb6c7d3e6dd')
895bbbd9b6eSWillian Rampazzo        image_path_xz = self.fetch_asset(image_url, asset_hash=image_hash,
896bbbd9b6eSWillian Rampazzo                                         algorithm='sha256')
897bbbd9b6eSWillian Rampazzo        image_path = archive.extract(image_path_xz, self.workdir)
898bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
899bbbd9b6eSWillian Rampazzo
900bbbd9b6eSWillian Rampazzo        self.vm.set_console()
901bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw',
902bbbd9b6eSWillian Rampazzo                         '-nic', 'user',
903bbbd9b6eSWillian Rampazzo                         '-no-reboot')
904bbbd9b6eSWillian Rampazzo        self.vm.launch()
905bbbd9b6eSWillian Rampazzo
906bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
907bbbd9b6eSWillian Rampazzo                               'console=ttyS0,115200 '
908bbbd9b6eSWillian Rampazzo                               'loglevel=7 '
909bbbd9b6eSWillian Rampazzo                               'nosmp '
910bbbd9b6eSWillian Rampazzo                               'systemd.default_timeout_start_sec=9000 '
911bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-zram-config.service '
912bbbd9b6eSWillian Rampazzo                               'systemd.mask=armbian-ramlog.service')
913bbbd9b6eSWillian Rampazzo
914bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('U-Boot SPL')
915bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Autoboot in ')
916bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, ' ', '=>')
917bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, "setenv extraargs '" +
918bbbd9b6eSWillian Rampazzo                                                kernel_command_line + "'", '=>')
919bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...');
920bbbd9b6eSWillian Rampazzo
921bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('systemd[1]: Set hostname ' +
922bbbd9b6eSWillian Rampazzo                                      'to <orangepipc>')
923bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('Starting Load Kernel Modules...')
924bbbd9b6eSWillian Rampazzo
925bbbd9b6eSWillian Rampazzo    @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
926bbbd9b6eSWillian Rampazzo    def test_arm_orangepi_uboot_netbsd9(self):
927bbbd9b6eSWillian Rampazzo        """
928bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
929bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:orangepi-pc
930bbbd9b6eSWillian Rampazzo        :avocado: tags=device:sd
931bbbd9b6eSWillian Rampazzo        :avocado: tags=os:netbsd
932bbbd9b6eSWillian Rampazzo        """
933bbbd9b6eSWillian Rampazzo        # This test download a 304MB compressed image and expand it to 2GB
934bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
935bbbd9b6eSWillian Rampazzo                   '20200108T145233Z/pool/main/u/u-boot/'
936bbbd9b6eSWillian Rampazzo                   'u-boot-sunxi_2020.01%2Bdfsg-1_armhf.deb')
937bbbd9b6eSWillian Rampazzo        deb_hash = 'f67f404a80753ca3d1258f13e38f2b060e13db99'
938bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
939bbbd9b6eSWillian Rampazzo        # We use the common OrangePi PC 'plus' build of U-Boot for our secondary
940bbbd9b6eSWillian Rampazzo        # program loader (SPL). We will then set the path to the more specific
941bbbd9b6eSWillian Rampazzo        # OrangePi "PC" device tree blob with 'setenv fdtfile' in U-Boot prompt,
942bbbd9b6eSWillian Rampazzo        # before to boot NetBSD.
943bbbd9b6eSWillian Rampazzo        uboot_path = '/usr/lib/u-boot/orangepi_plus/u-boot-sunxi-with-spl.bin'
944bbbd9b6eSWillian Rampazzo        uboot_path = self.extract_from_deb(deb_path, uboot_path)
945bbbd9b6eSWillian Rampazzo        image_url = ('https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/'
946bbbd9b6eSWillian Rampazzo                     'evbarm-earmv7hf/binary/gzimg/armv7.img.gz')
947bbbd9b6eSWillian Rampazzo        image_hash = '2babb29d36d8360adcb39c09e31060945259917a'
948bbbd9b6eSWillian Rampazzo        image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash)
949bbbd9b6eSWillian Rampazzo        image_path = os.path.join(self.workdir, 'armv7.img')
950bbbd9b6eSWillian Rampazzo        archive.gzip_uncompress(image_path_gz, image_path)
951bbbd9b6eSWillian Rampazzo        image_pow2ceil_expand(image_path)
952bbbd9b6eSWillian Rampazzo        image_drive_args = 'if=sd,format=raw,snapshot=on,file=' + image_path
953bbbd9b6eSWillian Rampazzo
954bbbd9b6eSWillian Rampazzo        # dd if=u-boot-sunxi-with-spl.bin of=armv7.img bs=1K seek=8 conv=notrunc
955bbbd9b6eSWillian Rampazzo        with open(uboot_path, 'rb') as f_in:
956bbbd9b6eSWillian Rampazzo            with open(image_path, 'r+b') as f_out:
957bbbd9b6eSWillian Rampazzo                f_out.seek(8 * 1024)
958bbbd9b6eSWillian Rampazzo                shutil.copyfileobj(f_in, f_out)
959bbbd9b6eSWillian Rampazzo
960bbbd9b6eSWillian Rampazzo        self.vm.set_console()
961bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nic', 'user',
962bbbd9b6eSWillian Rampazzo                         '-drive', image_drive_args,
963bbbd9b6eSWillian Rampazzo                         '-global', 'allwinner-rtc.base-year=2000',
964bbbd9b6eSWillian Rampazzo                         '-no-reboot')
965bbbd9b6eSWillian Rampazzo        self.vm.launch()
966bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'U-Boot 2020.01+dfsg-1')
967bbbd9b6eSWillian Rampazzo        interrupt_interactive_console_until_pattern(self,
968bbbd9b6eSWillian Rampazzo                                       'Hit any key to stop autoboot:',
969bbbd9b6eSWillian Rampazzo                                       'switch to partitions #0, OK')
970bbbd9b6eSWillian Rampazzo
971bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, '', '=>')
972bbbd9b6eSWillian Rampazzo        cmd = 'setenv bootargs root=ld0a'
973bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
974bbbd9b6eSWillian Rampazzo        cmd = 'setenv kernel netbsd-GENERIC.ub'
975bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
976bbbd9b6eSWillian Rampazzo        cmd = 'setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb'
977bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
978bbbd9b6eSWillian Rampazzo        cmd = ("setenv bootcmd 'fatload mmc 0:1 ${kernel_addr_r} ${kernel}; "
979bbbd9b6eSWillian Rampazzo               "fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}; "
980bbbd9b6eSWillian Rampazzo               "fdt addr ${fdt_addr_r}; "
981bbbd9b6eSWillian Rampazzo               "bootm ${kernel_addr_r} - ${fdt_addr_r}'")
982bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, cmd, '=>')
983bbbd9b6eSWillian Rampazzo
984bbbd9b6eSWillian Rampazzo        exec_command_and_wait_for_pattern(self, 'boot',
985bbbd9b6eSWillian Rampazzo                                          'Booting kernel from Legacy Image')
986bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting kernel ...')
987bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'NetBSD 9.0 (GENERIC)')
988bbbd9b6eSWillian Rampazzo        # Wait for user-space
989bbbd9b6eSWillian Rampazzo        wait_for_console_pattern(self, 'Starting root file system check')
990bbbd9b6eSWillian Rampazzo
991bbbd9b6eSWillian Rampazzo    def test_aarch64_raspi3_atf(self):
992bbbd9b6eSWillian Rampazzo        """
993bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:aarch64
994bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:raspi3b
995bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:cortex-a53
996bbbd9b6eSWillian Rampazzo        :avocado: tags=device:pl011
997bbbd9b6eSWillian Rampazzo        :avocado: tags=atf
998bbbd9b6eSWillian Rampazzo        """
999bbbd9b6eSWillian Rampazzo        zip_url = ('https://github.com/pbatard/RPi3/releases/download/'
1000bbbd9b6eSWillian Rampazzo                   'v1.15/RPi3_UEFI_Firmware_v1.15.zip')
1001bbbd9b6eSWillian Rampazzo        zip_hash = '74b3bd0de92683cadb14e008a7575e1d0c3cafb9'
1002bbbd9b6eSWillian Rampazzo        zip_path = self.fetch_asset(zip_url, asset_hash=zip_hash)
1003bbbd9b6eSWillian Rampazzo
1004bbbd9b6eSWillian Rampazzo        archive.extract(zip_path, self.workdir)
1005bbbd9b6eSWillian Rampazzo        efi_fd = os.path.join(self.workdir, 'RPI_EFI.fd')
1006bbbd9b6eSWillian Rampazzo
1007bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=1)
1008bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1009bbbd9b6eSWillian Rampazzo                         '-device', 'loader,file=%s,force-raw=true' % efi_fd)
1010bbbd9b6eSWillian Rampazzo        self.vm.launch()
1011bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('version UEFI Firmware v1.15')
1012bbbd9b6eSWillian Rampazzo
1013bbbd9b6eSWillian Rampazzo    def test_s390x_s390_ccw_virtio(self):
1014bbbd9b6eSWillian Rampazzo        """
1015bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:s390x
1016bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:s390-ccw-virtio
1017bbbd9b6eSWillian Rampazzo        """
1018bbbd9b6eSWillian Rampazzo        kernel_url = ('https://archives.fedoraproject.org/pub/archive'
1019bbbd9b6eSWillian Rampazzo                      '/fedora-secondary/releases/29/Everything/s390x/os/images'
1020bbbd9b6eSWillian Rampazzo                      '/kernel.img')
1021bbbd9b6eSWillian Rampazzo        kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313'
1022bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1023bbbd9b6eSWillian Rampazzo
1024bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1025bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0'
1026bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1027bbbd9b6eSWillian Rampazzo                         '-kernel', kernel_path,
1028bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1029bbbd9b6eSWillian Rampazzo        self.vm.launch()
1030bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1031bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1032bbbd9b6eSWillian Rampazzo
1033bbbd9b6eSWillian Rampazzo    def test_alpha_clipper(self):
1034bbbd9b6eSWillian Rampazzo        """
1035bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:alpha
1036bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:clipper
1037bbbd9b6eSWillian Rampazzo        """
1038bbbd9b6eSWillian Rampazzo        kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/'
1039bbbd9b6eSWillian Rampazzo                      'installer-alpha/20090123lenny10/images/cdrom/vmlinuz')
1040bbbd9b6eSWillian Rampazzo        kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3'
1041bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
1042bbbd9b6eSWillian Rampazzo
1043bbbd9b6eSWillian Rampazzo        uncompressed_kernel = archive.uncompress(kernel_path, self.workdir)
1044bbbd9b6eSWillian Rampazzo
1045bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1046bbbd9b6eSWillian Rampazzo        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
1047bbbd9b6eSWillian Rampazzo        self.vm.add_args('-nodefaults',
1048bbbd9b6eSWillian Rampazzo                         '-kernel', uncompressed_kernel,
1049bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1050bbbd9b6eSWillian Rampazzo        self.vm.launch()
1051bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1052bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1053bbbd9b6eSWillian Rampazzo
1054bbbd9b6eSWillian Rampazzo    def test_m68k_q800(self):
1055bbbd9b6eSWillian Rampazzo        """
1056bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1057bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:q800
1058bbbd9b6eSWillian Rampazzo        """
1059bbbd9b6eSWillian Rampazzo        deb_url = ('https://snapshot.debian.org/archive/debian-ports'
1060bbbd9b6eSWillian Rampazzo                   '/20191021T083923Z/pool-m68k/main'
1061bbbd9b6eSWillian Rampazzo                   '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb')
1062bbbd9b6eSWillian Rampazzo        deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1'
1063bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
1064bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path,
1065bbbd9b6eSWillian Rampazzo                                            '/boot/vmlinux-5.3.0-1-m68k')
1066bbbd9b6eSWillian Rampazzo
1067bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1068bbbd9b6eSWillian Rampazzo        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
1069bbbd9b6eSWillian Rampazzo                               'console=ttyS0 vga=off')
1070bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1071bbbd9b6eSWillian Rampazzo                         '-append', kernel_command_line)
1072bbbd9b6eSWillian Rampazzo        self.vm.launch()
1073bbbd9b6eSWillian Rampazzo        console_pattern = 'Kernel command line: %s' % kernel_command_line
1074bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1075bbbd9b6eSWillian Rampazzo        console_pattern = 'No filesystem could mount root'
1076bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern(console_pattern)
1077bbbd9b6eSWillian Rampazzo
1078bbbd9b6eSWillian Rampazzo    def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0):
107972cf57b0SThomas Huth        tar_url = ('https://qemu-advcal.gitlab.io'
108072cf57b0SThomas Huth                   '/qac-best-of-multiarch/download/day' + day + '.tar.xz')
1081bbbd9b6eSWillian Rampazzo        file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
1082bbbd9b6eSWillian Rampazzo        archive.extract(file_path, self.workdir)
1083bbbd9b6eSWillian Rampazzo        self.vm.set_console(console_index=console)
1084bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel',
1085bbbd9b6eSWillian Rampazzo                         self.workdir + '/day' + day + '/' + kernel_name)
1086bbbd9b6eSWillian Rampazzo        self.vm.launch()
1087bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern('QEMU advent calendar')
1088bbbd9b6eSWillian Rampazzo
1089bbbd9b6eSWillian Rampazzo    def test_arm_vexpressa9(self):
1090bbbd9b6eSWillian Rampazzo        """
1091bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1092bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:vexpress-a9
1093bbbd9b6eSWillian Rampazzo        """
1094bbbd9b6eSWillian Rampazzo        tar_hash = '32b7677ce8b6f1471fb0059865f451169934245b'
1095bbbd9b6eSWillian Rampazzo        self.vm.add_args('-dtb', self.workdir + '/day16/vexpress-v2p-ca9.dtb')
1096bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('16', tar_hash, 'winter.zImage')
1097bbbd9b6eSWillian Rampazzo
1098bbbd9b6eSWillian Rampazzo    def test_arm_ast2600_debian(self):
1099bbbd9b6eSWillian Rampazzo        """
1100bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:arm
1101bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:tacoma-bmc
1102bbbd9b6eSWillian Rampazzo        """
1103bbbd9b6eSWillian Rampazzo        deb_url = ('http://snapshot.debian.org/archive/debian/'
1104bbbd9b6eSWillian Rampazzo                   '20210302T203551Z/'
1105bbbd9b6eSWillian Rampazzo                   'pool/main/l/linux/'
1106bbbd9b6eSWillian Rampazzo                   'linux-image-5.10.0-3-armmp_5.10.13-1_armhf.deb')
1107bbbd9b6eSWillian Rampazzo        deb_hash = 'db40d32fe39255d05482bea48d72467b67d6225bb2a2a4d6f618cb8976f1e09e'
1108bbbd9b6eSWillian Rampazzo        deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
1109bbbd9b6eSWillian Rampazzo                                    algorithm='sha256')
1110bbbd9b6eSWillian Rampazzo        kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.10.0-3-armmp')
1111bbbd9b6eSWillian Rampazzo        dtb_path = self.extract_from_deb(deb_path,
1112bbbd9b6eSWillian Rampazzo                '/usr/lib/linux-image-5.10.0-3-armmp/aspeed-bmc-opp-tacoma.dtb')
1113bbbd9b6eSWillian Rampazzo
1114bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1115bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1116bbbd9b6eSWillian Rampazzo                         '-dtb', dtb_path,
1117bbbd9b6eSWillian Rampazzo                         '-net', 'nic')
1118bbbd9b6eSWillian Rampazzo        self.vm.launch()
1119bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
1120bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("SMP: Total of 2 processors activated")
1121bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("No filesystem could mount root")
1122bbbd9b6eSWillian Rampazzo
1123bbbd9b6eSWillian Rampazzo    def test_m68k_mcf5208evb(self):
1124bbbd9b6eSWillian Rampazzo        """
1125bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:m68k
1126bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mcf5208evb
1127bbbd9b6eSWillian Rampazzo        """
1128bbbd9b6eSWillian Rampazzo        tar_hash = 'ac688fd00561a2b6ce1359f9ff6aa2b98c9a570c'
1129bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('07', tar_hash, 'sanity-clause.elf')
1130bbbd9b6eSWillian Rampazzo
1131bbbd9b6eSWillian Rampazzo    def test_or1k_sim(self):
1132bbbd9b6eSWillian Rampazzo        """
1133bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:or1k
1134bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:or1k-sim
1135bbbd9b6eSWillian Rampazzo        """
1136bbbd9b6eSWillian Rampazzo        tar_hash = '20334cdaf386108c530ff0badaecc955693027dd'
1137bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('20', tar_hash, 'vmlinux')
1138bbbd9b6eSWillian Rampazzo
1139bbbd9b6eSWillian Rampazzo    def test_nios2_10m50(self):
1140bbbd9b6eSWillian Rampazzo        """
1141bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:nios2
1142bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:10m50-ghrd
1143bbbd9b6eSWillian Rampazzo        """
1144bbbd9b6eSWillian Rampazzo        tar_hash = 'e4251141726c412ac0407c5a6bceefbbff018918'
1145bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('14', tar_hash, 'vmlinux.elf')
1146bbbd9b6eSWillian Rampazzo
1147bbbd9b6eSWillian Rampazzo    def test_ppc64_e500(self):
1148bbbd9b6eSWillian Rampazzo        """
1149bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1150bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:ppce500
1151bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:e5500
1152d78fb13dSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1153bbbd9b6eSWillian Rampazzo        """
1154d78fb13dSDaniel Henrique Barboza        self.require_accelerator("tcg")
1155bbbd9b6eSWillian Rampazzo        tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
1156bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('19', tar_hash, 'uImage')
1157bbbd9b6eSWillian Rampazzo
1158bbbd9b6eSWillian Rampazzo    def do_test_ppc64_powernv(self, proc):
11596b87d614SDaniel Henrique Barboza        self.require_accelerator("tcg")
1160bbbd9b6eSWillian Rampazzo        images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
1161bbbd9b6eSWillian Rampazzo
1162bbbd9b6eSWillian Rampazzo        kernel_url = images_url + 'zImage.epapr'
1163bbbd9b6eSWillian Rampazzo        kernel_hash = '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd'
1164bbbd9b6eSWillian Rampazzo        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash,
1165bbbd9b6eSWillian Rampazzo                                       algorithm='sha256')
1166bbbd9b6eSWillian Rampazzo        self.vm.set_console()
1167bbbd9b6eSWillian Rampazzo        self.vm.add_args('-kernel', kernel_path,
1168bbbd9b6eSWillian Rampazzo                         '-append', 'console=tty0 console=hvc0',
1169bbbd9b6eSWillian Rampazzo                         '-device', 'pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0',
1170bbbd9b6eSWillian Rampazzo                         '-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234',
1171bbbd9b6eSWillian Rampazzo                         '-device', 'e1000e,bus=bridge1,addr=0x3',
1172bbbd9b6eSWillian Rampazzo                         '-device', 'nec-usb-xhci,bus=bridge1,addr=0x2')
1173bbbd9b6eSWillian Rampazzo        self.vm.launch()
1174bbbd9b6eSWillian Rampazzo
1175bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("CPU: " + proc + " generation processor")
1176bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("zImage starting: loaded")
1177bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Run /init as init process")
1178bbbd9b6eSWillian Rampazzo        self.wait_for_console_pattern("Creating 1 MTD partitions")
1179bbbd9b6eSWillian Rampazzo
1180bbbd9b6eSWillian Rampazzo    def test_ppc_powernv8(self):
1181bbbd9b6eSWillian Rampazzo        """
1182bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1183bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv8
11846b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1185bbbd9b6eSWillian Rampazzo        """
1186bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P8')
1187bbbd9b6eSWillian Rampazzo
1188bbbd9b6eSWillian Rampazzo    def test_ppc_powernv9(self):
1189bbbd9b6eSWillian Rampazzo        """
1190bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc64
1191bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:powernv9
11926b87d614SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1193bbbd9b6eSWillian Rampazzo        """
1194bbbd9b6eSWillian Rampazzo        self.do_test_ppc64_powernv('P9')
1195bbbd9b6eSWillian Rampazzo
1196bbbd9b6eSWillian Rampazzo    def test_ppc_g3beige(self):
1197bbbd9b6eSWillian Rampazzo        """
1198bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1199bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:g3beige
1200daff68ccSDaniel Henrique Barboza        :avocado: tags=accel:tcg
1201bbbd9b6eSWillian Rampazzo        """
1202daff68ccSDaniel Henrique Barboza        # TODO: g3beige works with kvm_pr but we don't have a
1203daff68ccSDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1204daff68ccSDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1205daff68ccSDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1206daff68ccSDaniel Henrique Barboza        self.require_accelerator("tcg")
1207bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1208bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1209bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1210bbbd9b6eSWillian Rampazzo
1211bbbd9b6eSWillian Rampazzo    def test_ppc_mac99(self):
1212bbbd9b6eSWillian Rampazzo        """
1213bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:ppc
1214bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:mac99
1215ff110c18SDaniel Henrique Barboza        :avocado: tags=accel:tcg
1216bbbd9b6eSWillian Rampazzo        """
1217ff110c18SDaniel Henrique Barboza        # TODO: mac99 works with kvm_pr but we don't have a
1218ff110c18SDaniel Henrique Barboza        # reliable way ATM (e.g. looking at /proc/modules) to detect
1219ff110c18SDaniel Henrique Barboza        # whether we're running kvm_hv or kvm_pr. For now let's
1220ff110c18SDaniel Henrique Barboza        # disable this test if we don't have TCG support.
1221ff110c18SDaniel Henrique Barboza        self.require_accelerator("tcg")
1222bbbd9b6eSWillian Rampazzo        tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc'
1223bbbd9b6eSWillian Rampazzo        self.vm.add_args('-M', 'graphics=off')
1224bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
1225bbbd9b6eSWillian Rampazzo
1226500f73b1SAlex Bennée    # This test has a 6-10% failure rate on various hosts that look
1227500f73b1SAlex Bennée    # like issues with a buggy kernel. As a result we don't want it
1228500f73b1SAlex Bennée    # gating releases on Gitlab.
1229500f73b1SAlex Bennée    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
1230bbbd9b6eSWillian Rampazzo    def test_sh4_r2d(self):
1231bbbd9b6eSWillian Rampazzo        """
1232bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sh4
1233bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:r2d
1234bbbd9b6eSWillian Rampazzo        """
1235bbbd9b6eSWillian Rampazzo        tar_hash = 'fe06a4fd8ccbf2e27928d64472939d47829d4c7e'
1236bbbd9b6eSWillian Rampazzo        self.vm.add_args('-append', 'console=ttySC1')
1237bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('09', tar_hash, 'zImage', console=1)
1238bbbd9b6eSWillian Rampazzo
1239bbbd9b6eSWillian Rampazzo    def test_sparc_ss20(self):
1240bbbd9b6eSWillian Rampazzo        """
1241bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:sparc
1242bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:SS-20
1243bbbd9b6eSWillian Rampazzo        """
1244bbbd9b6eSWillian Rampazzo        tar_hash = 'b18550d5d61c7615d989a06edace051017726a9f'
1245bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('11', tar_hash, 'zImage.elf')
1246bbbd9b6eSWillian Rampazzo
1247bbbd9b6eSWillian Rampazzo    def test_xtensa_lx60(self):
1248bbbd9b6eSWillian Rampazzo        """
1249bbbd9b6eSWillian Rampazzo        :avocado: tags=arch:xtensa
1250bbbd9b6eSWillian Rampazzo        :avocado: tags=machine:lx60
1251bbbd9b6eSWillian Rampazzo        :avocado: tags=cpu:dc233c
1252bbbd9b6eSWillian Rampazzo        """
1253bbbd9b6eSWillian Rampazzo        tar_hash = '49e88d9933742f0164b60839886c9739cb7a0d34'
1254bbbd9b6eSWillian Rampazzo        self.do_test_advcal_2018('02', tar_hash, 'santas-sleigh-ride.elf')
1255