From bd8636b0e815114e778d15ad87ae70c28a9acacb Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Tue, 2 Apr 2013 15:38:09 +0200 Subject: [PATCH] bochs-experiment-runner: small wrapper for running fail-clients The wrapper builds a temporary bochsrc and sets an FAIL_STATEDIR environment variable to a temporary directory. FAIL_ELF_PATH is also set in regard to the command line interface. Change-Id: I647c6eb3a91ae22847958ca30ede6e09519fba04 --- .../bochs-experiment-runner.py | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tools/bochs-experiment-runner/bochs-experiment-runner.py diff --git a/tools/bochs-experiment-runner/bochs-experiment-runner.py b/tools/bochs-experiment-runner/bochs-experiment-runner.py new file mode 100644 index 00000000..48f0e4ca --- /dev/null +++ b/tools/bochs-experiment-runner/bochs-experiment-runner.py @@ -0,0 +1,114 @@ +#!/usr/bin/python + +import os, sys +from optparse import OptionParser +from subprocess import * +from tempfile import mkstemp, mkdtemp +import shutil + + +def parseArgs(): + parser = OptionParser() + parser.add_option("-e", "--elf-file", dest="elf_file", + help="elf file to be executed", metavar="ELF") + parser.add_option("-i", "--iso-file", dest="iso_file", + help="iso file to be executed", metavar="ISO") + parser.add_option("-f", "--fail-client", dest="fail_client", + help="fail-client to be executed", metavar="ISO") + parser.add_option("-m", "--memory", dest="memory", default="16", + help="memory for the bochs VM", metavar="SIZE") + + parser.add_option("-b", "--bios", dest="bios", default="/proj/i4ciao/tools/fail/BIOS-bochs-latest", + help="bios image for bochs", metavar="BIOS") + + parser.add_option("-V", "--vgabios", dest="vgabios", default="/proj/i4ciao/tools/fail/vgabios.bin", + help="vgabios image for bochs", metavar="VGABIOS") + + parser.add_option("-1", "--once", + action="store_false", dest="forever", default=True, + help="fail-client to be executed") + + + (options, args) = parser.parse_args() + + if not (options.elf_file and options.iso_file and options.fail_client): + parser.error("elf, iso and fail-client are required") + + return options, args + +def execute(options, args, bochsrc, statedir): + command = "env FAIL_ELF_PATH=%s FAIL_STATEDIR=%s %s -q -f %s" %\ + (options.elf_file, statedir, options.fail_client, bochsrc) + print "executing: " + command + p = Popen(command, shell=True) + p.wait() + + return p.returncode + +def main(options, args): + bochsrc_args = { + "memory": options.memory, + "bios": options.bios, + "vgabios": options.vgabios, + "iso": options.iso_file + } + + bochsrc_text = """ +config_interface: textconfig +display_library: nogui +romimage: file="{bios}" +cpu: count=1, ips=5000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def" +cpuid: mmx=1, sep=1, sse=sse4_2, xapic=1, aes=1, movbe=1, xsave=1, cpuid_limit_winnt=0 +memory: guest={memory}, host={memory} +vgaromimage: file="{vgabios}" +vga: extension=vbe +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15 +ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11 +ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9 +ata0-slave: type=cdrom, path="{iso}", status=inserted +boot: cdrom +clock: sync=none, time0=946681200 +floppy_bootsig_check: disabled=0 +panic: action=fatal +error: action=fatal +info: action=ignore +debug: action=ignore +pass: action=ignore +debugger_log: - +com1: enabled=1, mode=file, dev=serial.out +parport1: enabled=0 +vga_update_interval: 300000 +keyboard_serial_delay: 250 +keyboard_paste_delay: 100000 +private_colormap: enabled=0 +i440fxsupport: enabled=0, slot1=pcivga +""".format(**bochsrc_args) + + bochsrc = mkstemp() + fd = os.fdopen(bochsrc[0], "w") + fd.write(bochsrc_text) + fd.close() + bochsrc = bochsrc[1] + + statedir = mkdtemp() + + if options.forever: + while True: + res = execute(options, args, bochsrc, statedir) + if res != 0: + break + + ret = 0 + else: + ret = execute(options, args, bochsrc, statedir) + + os.unlink(bochsrc) + shutil.rmtree(statedir) + sys.exit(ret) + +if __name__ == "__main__": + (options, args) = parseArgs() + main(options, args) + +