source: mainline/tools/ew.py@ 8bfb163

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8bfb163 was f9d0a86, checked in by Aearsis <Hlavaty.Ondrej@…>, 8 years ago

Merge tag '0.7.1'

The merge wasn't clean, because of changes in build system. The most
significant change was partial revert of usbhc callback refactoring,
which now does not take usb transfer batch, but few named fields again.

  • Property mode set to 100755
File size: 10.2 KB
Line 
1#!/usr/bin/env python
2#
3# Copyright (c) 2013 Jakub Jermar
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
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.
17#
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.
28#
29
30
31"""
32Emulator wrapper for running HelenOS
33"""
34
35import os
36import sys
37import subprocess
38import autotool
39import platform
40import thread
41import time
42
43overrides = {}
44
45def is_override(str):
46 if str in overrides.keys():
47 return overrides[str]
48 return False
49
50def cfg_get(platform, machine, processor):
51 if machine == "" or emulators[platform].has_key("run"):
52 return emulators[platform]
53 elif processor == "" or emulators[platform][machine].has_key("run"):
54 return emulators[platform][machine]
55 else:
56 return emulators[platform][machine][processor]
57
58def termemu_detect():
59 for termemu in ['xfce4-terminal', 'xterm']:
60 try:
61 subprocess.check_output('which ' + termemu, shell = True)
62 return termemu
63 except:
64 pass
65
66def run_in_console(cmd, title):
67 ecmd = cmd.replace('"', '\\"')
68 cmdline = termemu_detect() + ' -T ' + '"' + title + '"' + ' -e "' + ecmd + '"'
69 print(cmdline)
70 if not is_override('dryrun'):
71 subprocess.call(cmdline, shell = True)
72
73def get_host_native_width():
74 return int(platform.architecture()[0].strip('bit'))
75
76def pc_options(guest_width):
77 opts = ''
78
79 # Do not enable KVM if running 64 bits HelenOS
80 # on 32 bits host
81 host_width = get_host_native_width()
82 if guest_width <= host_width and not is_override('nokvm'):
83 opts = opts + ' -enable-kvm'
84
85 # Remove the leading space
86 return opts[1:]
87
88def malta_options():
89 return '-cpu 4Kc'
90
91def platform_to_qemu_options(platform, machine, processor):
92 if platform == 'amd64':
93 return 'system-x86_64', pc_options(64)
94 elif platform == 'arm32':
95 return 'system-arm', '-M integratorcp'
96 elif platform == 'ia32':
97 return 'system-i386', pc_options(32)
98 elif platform == 'mips32':
99 if machine == 'lmalta':
100 return 'system-mipsel', malta_options()
101 elif machine == 'bmalta':
102 return 'system-mips', malta_options()
103 elif platform == 'ppc32':
104 return 'system-ppc', '-m 256'
105 elif platform == 'sparc64':
106 if machine != 'generic':
107 raise Exception
108 if processor == 'us':
109 return 'system-sparc64', '-M sun4u --prom-env boot-args="console=devices/\\hw\\pci0\\00:03.0\\com1\\a"'
110 elif processor == 'sun4v':
111 default_path = '/usr/local/opensparc/image/'
112 try:
113 if os.path.exists(default_path):
114 opensparc_bins = default_path
115 elif os.path.exists(os.environ['OPENSPARC_BINARIES']):
116 opensparc_bins = os.environ['OPENSPARC_BINARIES']
117 else:
118 raise Exception
119 except:
120 print("Cannot find OpenSPARC binary images!")
121 print("Either set OPENSPARC_BINARIES environment variable accordingly or place the images in %s." % (default_path))
122 raise Exception
123
124 return 'system-sparc64', '-M niagara -m 256 -L %s' % (opensparc_bins)
125
126
127def hdisk_mk():
128 if not os.path.exists('hdisk.img'):
129 subprocess.call('tools/mkfat.py 1048576 uspace/dist/data hdisk.img', shell = True)
130
131def qemu_bd_options():
132 if is_override('nohdd'):
133 return ''
134
135 hdisk_mk()
136
137 return ' -drive file=hdisk.img,index=0,media=disk,format=raw'
138
139def qemu_nic_ne2k_options():
140 return ' -device ne2k_isa,irq=5,vlan=0'
141
142def qemu_nic_e1k_options():
143 return ' -device e1000,vlan=0'
144
145def qemu_nic_rtl8139_options():
146 return ' -device rtl8139,vlan=0'
147
148def qemu_net_options():
149 if is_override('nonet'):
150 return ''
151
152 nic_options = ''
153 if 'net' in overrides.keys():
154 if 'e1k' in overrides['net'].keys():
155 nic_options += qemu_nic_e1k_options()
156 if 'rtl8139' in overrides['net'].keys():
157 nic_options += qemu_nic_rtl8139_options()
158 if 'ne2k' in overrides['net'].keys():
159 nic_options += qemu_nic_ne2k_options()
160 else:
161 # Use the default NIC
162 nic_options += qemu_nic_e1k_options()
163
164 return nic_options + ' -net user,hostfwd=udp::8080-:8080,hostfwd=udp::8081-:8081,hostfwd=tcp::8080-:8080,hostfwd=tcp::8081-:8081,hostfwd=tcp::2223-:2223'
165
166def qemu_usb_options():
167 if is_override('nousb'):
168 return ''
169 return ' -usb'
170
171def qemu_xhci_options():
172 if is_override('noxhci'):
173 return ''
174 return ' -device nec-usb-xhci,id=xhci'
175
176def qemu_audio_options():
177 if is_override('nosnd'):
178 return ''
179 return ' -device intel-hda -device hda-duplex'
180
181def qemu_run(platform, machine, processor):
182 cfg = cfg_get(platform, machine, processor)
183 suffix, options = platform_to_qemu_options(platform, machine, processor)
184 cmd = 'qemu-' + suffix
185
186 cmdline = cmd
187 if options != '':
188 cmdline += ' ' + options
189
190 cmdline += qemu_bd_options()
191
192 if (not 'net' in cfg.keys()) or cfg['net']:
193 cmdline += qemu_net_options()
194 if (not 'usb' in cfg.keys()) or cfg['usb']:
195 cmdline += qemu_usb_options()
196 if (not 'xhci' in cfg.keys()) or cfg['xhci']:
197 cmdline += qemu_xhci_options()
198 if (not 'audio' in cfg.keys()) or cfg['audio']:
199 cmdline += qemu_audio_options()
200
201 if cfg['image'] == 'image.iso':
202 cmdline += ' -boot d -cdrom image.iso'
203 elif cfg['image'] == 'image.boot':
204 cmdline += ' -kernel image.boot'
205 else:
206 cmdline += ' ' + cfg['image']
207
208 if ('console' in cfg.keys()) and not cfg['console']:
209 cmdline += ' -nographic'
210
211 title = 'HelenOS/' + platform
212 if machine != '':
213 title += ' on ' + machine
214 if 'expect' in cfg.keys():
215 cmdline = 'expect -c \'spawn %s; expect "%s" { send "%s" } timeout exp_continue; interact\'' % (cmdline, cfg['expect']['src'], cfg['expect']['dst'])
216 run_in_console(cmdline, title)
217 else:
218 print(cmdline)
219 if not is_override('dryrun'):
220 subprocess.call(cmdline, shell = True)
221
222def ski_run(platform, machine, processor):
223 run_in_console('ski -i contrib/conf/ski.conf', 'HelenOS/ia64 on ski')
224
225def msim_run(platform, machine, processor):
226 hdisk_mk()
227 run_in_console('msim -c contrib/conf/msim.conf', 'HelenOS/mips32 on msim')
228
229def spike_run(platform, machine, processor):
230 run_in_console('spike -m1073741824:1073741824 image.boot', 'HelenOS/risvc64 on Spike')
231
232emulators = {
233 'amd64' : {
234 'run' : qemu_run,
235 'image' : 'image.iso'
236 },
237 'arm32' : {
238 'integratorcp' : {
239 'run' : qemu_run,
240 'image' : 'image.boot',
241 'net' : False,
242 'audio' : False
243 }
244 },
245 'ia32' : {
246 'run' : qemu_run,
247 'image' : 'image.iso'
248 },
249 'ia64' : {
250 'ski' : {
251 'run' : ski_run
252 }
253 },
254 'mips32' : {
255 'msim' : {
256 'run' : msim_run
257 },
258 'lmalta' : {
259 'run' : qemu_run,
260 'image' : 'image.boot',
261 'console' : False
262 },
263 'bmalta' : {
264 'run' : qemu_run,
265 'image' : 'image.boot',
266 'console' : False
267 },
268 },
269 'ppc32' : {
270 'run' : qemu_run,
271 'image' : 'image.iso',
272 'audio' : False
273 },
274 'riscv64' : {
275 'run' : spike_run,
276 'image' : 'image.boot'
277 },
278 'sparc64' : {
279 'generic' : {
280 'us' : {
281 'run' : qemu_run,
282 'image' : 'image.iso',
283 'audio' : False,
284 'console' : False,
285 },
286 'sun4v' : {
287 'run' : qemu_run,
288 'image' : '-drive if=pflash,readonly=on,file=image.iso',
289 'audio' : False,
290 'console' : False,
291 'net' : False,
292 'usb' : False,
293 'expect' : {
294 'src' : 'ok ',
295 'dst' : 'boot\n'
296 },
297 }
298 }
299 },
300}
301
302def usage():
303 print("%s - emulator wrapper for running HelenOS\n" % os.path.basename(sys.argv[0]))
304 print("%s [-d] [-h] [-net e1k|rtl8139|ne2k] [-nohdd] [-nokvm] [-nonet] [-nosnd] [-nousb] [-noxhci]\n" %
305 os.path.basename(sys.argv[0]))
306 print("-d\tDry run: do not run the emulation, just print the command line.")
307 print("-h\tPrint the usage information and exit.")
308 print("-nohdd\tDisable hard disk, if applicable.")
309 print("-nokvm\tDisable KVM, if applicable.")
310 print("-nonet\tDisable networking support, if applicable.")
311 print("-nosnd\tDisable sound, if applicable.")
312 print("-nousb\tDisable USB support, if applicable.")
313 print("-noxhci\tDisable XHCI support, if applicable.")
314
315def fail(platform, machine):
316 print("Cannot start emulation for the chosen configuration. (%s/%s)" % (platform, machine))
317
318
319def run():
320 expect_nic = False
321
322 for i in range(1, len(sys.argv)):
323
324 if expect_nic:
325 expect_nic = False
326 if not 'net' in overrides.keys():
327 overrides['net'] = {}
328 if sys.argv[i] == 'e1k':
329 overrides['net']['e1k'] = True
330 elif sys.argv[i] == 'rtl8139':
331 overrides['net']['rtl8139'] = True
332 elif sys.argv[i] == 'ne2k':
333 overrides['net']['ne2k'] = True
334 else:
335 usage()
336 exit()
337
338 elif sys.argv[i] == '-h':
339 usage()
340 exit()
341 elif sys.argv[i] == '-d':
342 overrides['dryrun'] = True
343 elif sys.argv[i] == '-net' and i < len(sys.argv) - 1:
344 expect_nic = True
345 elif sys.argv[i] == '-nohdd':
346 overrides['nohdd'] = True
347 elif sys.argv[i] == '-nokvm':
348 overrides['nokvm'] = True
349 elif sys.argv[i] == '-nonet':
350 overrides['nonet'] = True
351 elif sys.argv[i] == '-nosnd':
352 overrides['nosnd'] = True
353 elif sys.argv[i] == '-nousb':
354 overrides['nousb'] = True
355 elif sys.argv[i] == '-noxhci':
356 overrides['noxhci'] = True
357 else:
358 usage()
359 exit()
360
361 config = {}
362 autotool.read_config(autotool.CONFIG, config)
363
364 if 'PLATFORM' in config.keys():
365 platform = config['PLATFORM']
366 else:
367 platform = ''
368
369 if 'MACHINE' in config.keys():
370 mach = config['MACHINE']
371 else:
372 mach = ''
373
374 if 'PROCESSOR' in config.keys():
375 processor = config['PROCESSOR']
376 else:
377 processor = ''
378
379 try:
380 emu_run = cfg_get(platform, mach, processor)['run']
381 emu_run(platform, mach, processor)
382 except:
383 fail(platform, mach)
384 return
385
386run()
Note: See TracBrowser for help on using the repository browser.