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