merge libext4 fixes
[helenos.git] / tools / ew.py
blob959b736c35d95dacaf74affdd31fee8d0538f0db
1 #!/usr/bin/env python
3 # Copyright (c) 2013 Jakub Jermar
4 # All rights reserved.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
10 # - Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # - Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # - The name of the author may not be used to endorse or promote products
16 # derived from this software without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 """
32 Emulator wrapper for running HelenOS
33 """
35 import os
36 import sys
37 import subprocess
38 import autotool
39 import platform
41 overrides = {}
43 def is_override(str):
44 if str in overrides.keys():
45 return overrides[str]
46 return False
48 def cfg_get(platform, machine):
49 if machine == "":
50 return emulators[platform]
51 else:
52 return emulators[platform][machine]
54 def run_in_console(cmd, title):
55 cmdline = 'xterm -T ' + '"' + title + '"' + ' -e ' + cmd
56 print(cmdline)
57 if not is_override('dryrun'):
58 subprocess.call(cmdline, shell = True);
60 def get_host_native_width():
61 return int(platform.architecture()[0].strip('bit'))
63 def pc_options(guest_width):
64 opts = ''
66 # Do not enable KVM if running 64 bits HelenOS
67 # on 32 bits host
68 host_width = get_host_native_width()
69 if guest_width <= host_width and not is_override('nokvm'):
70 opts = opts + ' -enable-kvm'
72 # Remove the leading space
73 return opts[1:]
75 def malta_options():
76 return '-cpu 4Kc'
78 def platform_to_qemu_options(platform, machine):
79 if platform == 'amd64':
80 return 'system-x86_64', pc_options(64)
81 elif platform == 'arm32':
82 return 'system-arm', ''
83 elif platform == 'ia32':
84 return 'system-i386', pc_options(32)
85 elif platform == 'mips32':
86 if machine == 'lmalta':
87 return 'system-mipsel', malta_options()
88 elif machine == 'bmalta':
89 return 'system-mips', malta_options()
90 elif platform == 'ppc32':
91 return 'system-ppc', ''
92 elif platform == 'sparc64':
93 return 'system-sparc64', ''
95 def qemu_bd_options():
96 if is_override('nohdd'):
97 return ''
99 if not os.path.exists('hdisk.img'):
100 subprocess.call('tools/mkfat.py 1048576 uspace/dist/data hdisk.img', shell = True)
102 return ' -hda hdisk.img'
104 def qemu_nic_ne2k_options():
105 return ' -device ne2k_isa,irq=5,vlan=0'
107 def qemu_nic_e1k_options():
108 return ' -device e1000,vlan=0'
110 def qemu_nic_rtl8139_options():
111 return ' -device rtl8139,vlan=0'
113 def qemu_net_options():
114 if is_override('nonet'):
115 return ''
117 nic_options = ''
118 if 'net' in overrides.keys():
119 if 'e1k' in overrides['net'].keys():
120 nic_options += qemu_nic_e1k_options()
121 if 'rtl8139' in overrides['net'].keys():
122 nic_options += qemu_nic_rtl8139_options()
123 if 'ne2k' in overrides['net'].keys():
124 nic_options += qemu_nic_ne2k_options()
125 else:
126 # Use the default NIC
127 nic_options += qemu_nic_e1k_options()
129 return nic_options + ' -net user -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -redir tcp:2223::2223'
131 def qemu_usb_options():
132 if is_override('nousb'):
133 return ''
134 return ' -usb'
136 def qemu_audio_options():
137 if is_override('nosnd'):
138 return ''
139 return ' -soundhw sb16'
141 def qemu_run(platform, machine):
142 cfg = cfg_get(platform, machine)
143 suffix, options = platform_to_qemu_options(platform, machine)
144 cmd = 'qemu-' + suffix
146 cmdline = cmd
147 if options != '':
148 cmdline += ' ' + options
150 cmdline += qemu_bd_options()
152 if (not 'net' in cfg.keys()) or cfg['net']:
153 cmdline += qemu_net_options()
154 if (not 'usb' in cfg.keys()) or cfg['usb']:
155 cmdline += qemu_usb_options()
156 if (not 'audio' in cfg.keys()) or cfg['audio']:
157 cmdline += qemu_audio_options()
159 if cfg['image'] == 'image.iso':
160 cmdline += ' -boot d -cdrom image.iso'
161 elif cfg['image'] == 'image.boot':
162 cmdline += ' -kernel image.boot'
164 if ('console' in cfg.keys()) and not cfg['console']:
165 cmdline += ' -nographic'
167 title = 'HelenOS/' + platform
168 if machine != '':
169 title += ' on ' + machine
170 run_in_console(cmdline, title)
171 else:
172 print(cmdline)
173 if not is_override('dryrun'):
174 subprocess.call(cmdline, shell = True)
176 def ski_run(platform, machine):
177 run_in_console('ski -i contrib/conf/ski.conf', 'HelenOS/ia64 on ski')
179 def msim_run(platform, machine):
180 run_in_console('msim -c contrib/conf/msim.conf', 'HelenOS/mips32 on msim')
183 emulators = {
184 'amd64' : {
185 'run' : qemu_run,
186 'image' : 'image.iso'
188 'arm32' : {
189 'integratorcp' : {
190 'run' : qemu_run,
191 'image' : 'image.boot',
192 'net' : False,
193 'audio' : False
196 'ia32' : {
197 'run' : qemu_run,
198 'image' : 'image.iso'
200 'ia64' : {
201 'ski' : {
202 'run' : ski_run
205 'mips32' : {
206 'msim' : {
207 'run' : msim_run
209 'lmalta' : {
210 'run' : qemu_run,
211 'image' : 'image.boot',
212 'console' : False
214 'bmalta' : {
215 'run' : qemu_run,
216 'image' : 'image.boot',
217 'console' : False
220 'ppc32' : {
221 'run' : qemu_run,
222 'image' : 'image.iso',
223 'audio' : False
225 'sparc64' : {
226 'generic' : {
227 'run' : qemu_run,
228 'image' : 'image.iso',
229 'audio' : False
234 def usage():
235 print("%s - emulator wrapper for running HelenOS\n" % os.path.basename(sys.argv[0]))
236 print("%s [-d] [-h] [-net e1k|rtl8139|ne2k] [-nohdd] [-nokvm] [-nonet] [-nosnd] [-nousb]\n" %
237 os.path.basename(sys.argv[0]))
238 print("-d\tDry run: do not run the emulation, just print the command line.")
239 print("-h\tPrint the usage information and exit.")
240 print("-nohdd\tDisable hard disk, if applicable.")
241 print("-nokvm\tDisable KVM, if applicable.")
242 print("-nonet\tDisable networking support, if applicable.")
243 print("-nosnd\tDisable sound, if applicable.")
244 print("-nousb\tDisable USB support, if applicable.")
246 def run():
247 expect_nic = False
249 for i in range(1, len(sys.argv)):
251 if expect_nic:
252 expect_nic = False
253 if not 'net' in overrides.keys():
254 overrides['net'] = {}
255 if sys.argv[i] == 'e1k':
256 overrides['net']['e1k'] = True
257 elif sys.argv[i] == 'rtl8139':
258 overrides['net']['rtl8139'] = True
259 elif sys.argv[i] == 'ne2k':
260 overrides['net']['ne2k'] = True
261 else:
262 usage()
263 exit()
265 elif sys.argv[i] == '-h':
266 usage()
267 exit()
268 elif sys.argv[i] == '-d':
269 overrides['dryrun'] = True
270 elif sys.argv[i] == '-net' and i < len(sys.argv) - 1:
271 expect_nic = True
272 elif sys.argv[i] == '-nohdd':
273 overrides['nohdd'] = True
274 elif sys.argv[i] == '-nokvm':
275 overrides['nokvm'] = True
276 elif sys.argv[i] == '-nonet':
277 overrides['nonet'] = True
278 elif sys.argv[i] == '-nosnd':
279 overrides['nosnd'] = True
280 elif sys.argv[i] == '-nousb':
281 overrides['nousb'] = True
282 else:
283 usage()
284 exit()
286 config = {}
287 autotool.read_config(autotool.CONFIG, config)
289 if 'PLATFORM' in config.keys():
290 platform = config['PLATFORM']
291 else:
292 platform = ''
294 if 'MACHINE' in config.keys():
295 mach = config['MACHINE']
296 else:
297 mach = ''
299 try:
300 emu_run = cfg_get(platform, mach)['run']
301 except:
302 print("Cannot start emulation for the chosen configuration. (%s/%s)" % (platform, mach))
303 return
305 emu_run(platform, mach)
307 run()