-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqemu.py
executable file
·135 lines (102 loc) · 4.1 KB
/
qemu.py
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/python3
import os
import datetime
import pfw.console
import pfw.shell
import pfw.linux.dt
EMULATOR: str = ""
def init( qemu_path: str ):
global EMULATOR
EMULATOR = qemu_path
# def init
def qemu( emulator: str, **kwargs ):
kw_qemu_path = kwargs.get( "qemu_path", None )
if None == kw_qemu_path:
kw_qemu_path = EMULATOR
return os.path.join( kw_qemu_path, emulator )
# def qemu
def run( parameters, **kwargs ):
kw_emulator = kwargs.get( "emulator", None )
kw_bios = kwargs.get( "bios", None )
kw_kernel = kwargs.get( "kernel", None )
kw_initrd = kwargs.get( "initrd", None )
kw_append = kwargs.get( "append", None )
kw_dtb = kwargs.get( "dtb", None )
kw_cwd = kwargs.get( "cwd", None )
kw_arch = kwargs.get( "arch", None )
kw_gdb = kwargs.get( "gdb", False )
kw_dump_dtb = kwargs.get( "dump_dtb", False )
kw_dump_dtb_path = kwargs.get( "dump_dtb_path", f"/tmp/dtb/{str(datetime.datetime.now( ))}.dtb" )
kw_output = kwargs.get( "output", pfw.shell.eOutput.PTY )
if kw_dump_dtb:
pfw.shell.execute( f"mkdir -p {os.path.dirname( kw_dump_dtb_path )}", output = kw_output )
if "x86" == kw_arch:
kw_emulator = qemu( f"qemu-system-x86_64", qemu_path = kw_emulator )
elif "x86_64" == kw_arch:
kw_emulator = qemu( f"qemu-system-x86_64", qemu_path = kw_emulator )
elif "arm" == kw_arch or "arm32" == kw_arch:
kw_emulator = qemu( f"qemu-system-arm", qemu_path = kw_emulator )
elif "arm64" == kw_arch or "aarch64" == kw_arch:
kw_emulator = qemu( f"qemu-system-aarch64", qemu_path = kw_emulator )
command: str = f"{kw_emulator} {parameters}"
command += f" -bios {kw_bios}" if kw_bios else ""
command += f" -kernel {kw_kernel}" if kw_kernel else ""
command += f" -initrd {kw_initrd}" if kw_initrd else ""
command += f" -append \"{kw_append}\"" if kw_append else ""
command += f" -dtb {kw_dtb}" if kw_dtb else ""
command += f" -machine dumpdtb={kw_dump_dtb_path}" if kw_dump_dtb else ""
command += f" -s -S" if kw_gdb else ""
result = pfw.shell.execute( command, cwd = kw_cwd, sudo = False, output = kw_output )
if True == kw_dump_dtb:
pfw.linux.dt.decompile( kw_dump_dtb_path, kw_dump_dtb_path + ".dts" )
return result["code"]
# def run
def build_parameters( **kwargs ):
kw_arch = kwargs.get( "arch", "arm64" )
kw_nographic = kwargs.get( "nographic", False )
kw_nodefaults = kwargs.get( "nodefaults", False )
parameters = f""
parameters += f" -serial mon:stdio"
parameters += f" -no-reboot"
parameters += f" -d guest_errors"
# parameters += f" -chardev socket,id=qemu-monitor,host=localhost,port=7777,server=on,wait=off,telnet=on"
# parameters += f" -mon qemu-monitor,mode=readline"
if True == kw_nodefaults:
parameters += f" -nodefaults"
if True == kw_nographic:
parameters += f" -nographic"
if kw_arch in [ "x86", "x86_64" ]:
parameters += f" -enable-kvm"
parameters += f" -smp cores=2"
parameters += f" -m 8192"
elif kw_arch in [ "arm", "arm32", "arm64", "aarch64" ]:
parameters += f" -machine virt"
parameters += f" -machine virtualization=true"
parameters += f" -cpu cortex-a53"
parameters += f" -smp cores=4"
parameters += f" -m 8192"
return parameters
# def build_parameters
def build_kernel_parameters( **kwargs ):
kw_arch = kwargs.get( "arch", "arm64" )
kw_max_loop = kwargs.get( "max_loop", 100 )
kw_bootconfig = kwargs.get( "bootconfig", True )
kw_debug = kwargs.get( "debug", True )
cmdline = f"loop.max_loop={kw_max_loop}"
if True == kw_debug:
cmdline += f" loglevel=7"
cmdline += f" printk.devkmsg=on"
# cmdline += f" earlyprintk"
# cmdline += f" debug"
# cmdline += f" drm.debug=0x1FF"
else:
cmdline += f" loglevel=1"
if True == kw_bootconfig:
cmdline += f" bootconfig"
if kw_arch in [ "x86", "x86_64" ]:
cmdline += f" console=ttyS0,38400"
elif kw_arch in [ "arm", "arm32", "arm64", "aarch64" ]:
cmdline += f" console=ttyAMA0"
pfw.console.debug.trace( "cmdline = '%s'" % (cmdline) )
return cmdline
# def build_kernel_parameters