133 lines
4.5 KiB
Python
133 lines
4.5 KiB
Python
##########################################################################
|
|
# Copyright (c) 2009, 2010, 2011, 2016, ETH Zurich.
|
|
# All rights reserved.
|
|
#
|
|
# This file is distributed under the terms in the attached LICENSE file.
|
|
# If you do not find this file, copies can be found by writing to:
|
|
# ETH Zurich D-INFK, Universitaetstr 6, CH-8092 Zurich. Attn: Systems Group.
|
|
##########################################################################
|
|
|
|
import os.path
|
|
|
|
class Module(object):
|
|
def __init__(self, module, args):
|
|
self.module = module
|
|
self.args = args
|
|
|
|
class BootModules(object):
|
|
"""Modules to boot (ie. the menu.lst file)"""
|
|
|
|
def __init__(self, machine, prefix, kernel=None):
|
|
self.hypervisor = None
|
|
self.prefix = prefix
|
|
|
|
self.kernel = None
|
|
if not kernel is None:
|
|
self.kernel = os.path.join(prefix, kernel)
|
|
self.kernelArgs = []
|
|
self.cpu_driver = None
|
|
self.boot_driver = None
|
|
self.boot_driver_args = []
|
|
self.modules = []
|
|
self.machine = machine
|
|
|
|
def set_kernel(self, kernel, args=[]):
|
|
if kernel == None:
|
|
self.kernel = None
|
|
else:
|
|
self.kernel = os.path.join(self.prefix, kernel)
|
|
if args is None:
|
|
args = []
|
|
self.kernelArgs = args
|
|
|
|
def add_kernel_args(self, args):
|
|
if args:
|
|
self.kernelArgs.extend(args)
|
|
|
|
def set_cpu_driver(self, cpu_driver, args=[]):
|
|
if cpu_driver == None :
|
|
self.cpu_driver = None
|
|
self.kernelArgs = []
|
|
else :
|
|
self.cpu_driver = os.path.join(self.prefix, cpu_driver)
|
|
if args is None:
|
|
args = []
|
|
self.kernelArgs = args
|
|
|
|
def set_boot_driver(self, boot_driver, args=[]):
|
|
if boot_driver == None :
|
|
self.boot_driver = None
|
|
self.boot_driver_args = []
|
|
else :
|
|
self.boot_driver = os.path.join(self.prefix, boot_driver);
|
|
if args is None:
|
|
args = []
|
|
self.boot_driver_args = args
|
|
|
|
def set_boot_driver_args(self, args):
|
|
self.boot_driver_args.extend(args)
|
|
|
|
def set_hypervisor(self, h):
|
|
self.hypervisor = h
|
|
|
|
# does modulespec describe modulename?
|
|
def _module_matches(self, modulename, modulespec):
|
|
if '/' in modulespec: # if the spec contains a path, they must be the same
|
|
return modulespec == modulename
|
|
else: # otherwise, we look at the last part of the name only
|
|
return modulespec == modulename.rsplit('/',1)[-1]
|
|
|
|
def add_module(self, module, args=[]):
|
|
if module.startswith('/'):
|
|
# absolute path are converted to relative and left as-is
|
|
module = module[1:]
|
|
else:
|
|
# relative paths are prepended with the prefix
|
|
module = os.path.join(self.prefix, module)
|
|
mod = Module(module, args)
|
|
self.modules.append(mod)
|
|
return mod
|
|
|
|
def add_module_arg(self, modulename, arg):
|
|
for mod in self.modules:
|
|
if self._module_matches(mod.module, modulename):
|
|
mod.args.append(arg)
|
|
|
|
def get_menu_data(self, path, root="(nd)"):
|
|
assert(self.kernel != None
|
|
or (self.boot_driver != None and self.cpu_driver != None))
|
|
r = "timeout 0\n"
|
|
r += "title Harness image\n"
|
|
r += "root %s\n" % root
|
|
if self.boot_driver :
|
|
r += "bootdriver %s %s\n" % (
|
|
os.path.join(path, self.boot_driver), " ".join(self.boot_driver_args))
|
|
if self.cpu_driver :
|
|
r += "cpudriver %s %s\n" % (
|
|
os.path.join(path, self.cpu_driver), " ".join(self.kernelArgs))
|
|
if self.hypervisor:
|
|
r += "hypervisor %s\n" % os.path.join(path, self.prefix, self.hypervisor)
|
|
|
|
if self.kernel :
|
|
r += "kernel %s %s\n" % (
|
|
os.path.join(path, self.kernel), " ".join(self.kernelArgs))
|
|
for module in self.modules:
|
|
r += "modulenounzip %s %s\n" % (os.path.join(path, module.module), " ".join(map(str, module.args)))
|
|
|
|
return r
|
|
|
|
# what targets do we need to build/install to run this test?
|
|
def get_build_targets(self):
|
|
ret = list(set([ module.module for module in self.modules] ))
|
|
|
|
if self.kernel :
|
|
ret.append(self.kernel)
|
|
if self.cpu_driver :
|
|
ret.append(self.cpu_driver)
|
|
if self.boot_driver :
|
|
ret.append(self.boot_driver)
|
|
if self.hypervisor:
|
|
ret.append(self.hypervisor)
|
|
|
|
return ret
|