hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python3
 
# This script expect to run from the Buildroot top directory.
 
import os
import pexpect
import sys
import time
 
 
def main():
    if not (len(sys.argv) == 2):
        print("Error: incorrect number of arguments")
        print("""Usage: boot-qemu-image.py <qemu_arch_defconfig>""")
        sys.exit(1)
 
    # Ignore non Qemu defconfig
    if not sys.argv[1].startswith('qemu_'):
        sys.exit(0)
 
    if not os.path.exists('output/images/start-qemu.sh'):
        print('qemu-start.sh is missing, cannot test.')
        sys.exit(0)
 
    qemu_start = os.path.join(os.getcwd(), 'output/images/start-qemu.sh')
 
    child = pexpect.spawn(qemu_start, ['serial-only'],
                          timeout=5, encoding='utf-8',
                          env={"QEMU_AUDIO_DRV": "none"})
 
    # We want only stdout into the log to avoid double echo
    child.logfile = sys.stdout
 
    # Let the spawn actually try to fork+exec to the wrapper, and then
    # let the wrapper exec the qemu process.
    time.sleep(1)
 
    try:
        child.expect(["buildroot login:"], timeout=60)
    except pexpect.EOF as e:
        # Some emulations require a fork of qemu-system, which may be
        # missing on the system, and is not provided by Buildroot.
        # In this case, spawn above will succeed at starting the wrapper
        # start-qemu.sh, but that one will fail (exit with 127) in such
        # a situation.
        exit = [int(line.split(' ')[1])
                for line in e.value.splitlines()
                if line.startswith('exitstatus: ')]
        if len(exit) and exit[0] == 127:
            print('qemu-start.sh could not find the qemu binary')
            sys.exit(0)
        print("Connection problem, exiting.")
        sys.exit(1)
    except pexpect.TIMEOUT:
        print("System did not boot in time, exiting.")
        sys.exit(1)
 
    child.sendline("root\r")
 
    try:
        child.expect(["# "], timeout=60)
    except pexpect.EOF:
        print("Cannot connect to shell")
        sys.exit(1)
    except pexpect.TIMEOUT:
        print("Timeout while waiting for shell")
        sys.exit(1)
 
    child.sendline("poweroff\r")
 
    try:
        child.expect(["System halted"], timeout=60)
        child.expect(pexpect.EOF)
    except pexpect.EOF:
        pass
    except pexpect.TIMEOUT:
        # Qemu may not exit properly after "System halted", ignore.
        print("Cannot halt machine")
 
    sys.exit(0)
 
 
if __name__ == "__main__":
    main()