Merge branch 'arrakis'
[barrelfish] / tools / harness / barrelfish.py
1 ##########################################################################
2 # Copyright (c) 2009, 2010, 2011, ETH Zurich.
3 # All rights reserved.
4 #
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9
10 import os.path
11 import builds
12 import re
13
14 class BootModules(object):
15     """Modules to boot (ie. the menu.lst file)"""
16
17     def __init__(self, machine):
18         self.hypervisor = None
19         self.kernel = (None, [])
20         self.modules = []
21         self.machine = machine
22
23     def set_kernel(self, kernel, args=None):
24         self.kernel = (kernel, args if args else [])
25
26     def add_kernel_arg(self, arg):
27         self.kernel[1].append(arg)
28
29     def set_hypervisor(self, h):
30         self.hypervisor = h
31
32     # does modulespec describe modulename?
33     def _module_matches(self, modulename, modulespec):
34         if '/' in modulespec: # if the spec contains a path, they must be the same
35             return modulespec == modulename
36         else: # otherwise, we look at the last part of the name only
37             return modulespec == modulename.rsplit('/',1)[-1]
38
39     def add_module(self, module, args=None):
40
41         # Support for build targets with / in their name (e.g. examples/xmpl-spawn)
42         module = module.replace('$BUILD', os.path.dirname(self.kernel[0]))
43
44         # XXX: workaround for backwards compatibility: prepend default path
45         if not '/' in module:
46             assert self.kernel
47             module = os.path.join(os.path.dirname(self.kernel[0]), module)
48         elif module.startswith('/'):
49             # XXX: workaround to allow working around the previous workaround
50             module = module[1:]
51         self.modules.append((module, args if args else []))
52
53     def add_module_arg(self, modulename, arg):
54         for (mod, args) in self.modules:
55             if self._module_matches(mod, modulename):
56                 args.append(arg)
57
58     def del_module(self, name):
59         self.modules = [(mod, arg) for (mod, arg) in self.modules
60                                    if not self._module_matches(mod, name)]
61
62     def reset_module(self, name, args=[]):
63         self.del_module(name)
64         self.add_module(name, args)
65
66     def get_menu_data(self, path):
67         assert(self.kernel[0])
68         r = "timeout 0\n"
69         r += "title Harness image\n"
70         r += "root (nd)\n"
71         if self.hypervisor:
72             r += "hypervisor %s\n" % os.path.join(path, self.hypervisor)
73         r += "kernel %s %s\n" % (
74                 os.path.join(path, self.kernel[0]), " ".join(map(str, self.kernel[1])))
75         for (module, args) in self.modules:
76             r += "modulenounzip %s %s\n" % (os.path.join(path, module), " ".join(map(str, args)))
77         return r
78
79     # what targets do we need to build/install to run this test?
80     def get_build_targets(self):
81         def mktarget(modname):
82             # workaround beehive's multi-core hack: discard everything after the |
83             return modname.split('|',1)[0]
84
85         ret = list(set([self.kernel[0]] + [mktarget(m) for (m, _) in self.modules]))
86
87         if self.hypervisor:
88             ret.append(self.hypervisor)
89
90         if self.machine.get_bootarch() == "arm_gem5":
91                 ret.append('arm_gem5_harness_kernel')
92         elif self.machine.get_bootarch() == "armv7_gem5_2":
93             ret.append('arm_gem5_image')
94
95         return ret
96
97 def default_bootmodules(build, machine):
98     """Returns the default boot module configuration for the given machine."""
99     # FIXME: clean up / separate platform-specific logic
100
101     a = machine.get_bootarch()
102     m = BootModules(machine)
103
104     # set the kernel: elver on x86_64
105     if a == "x86_64":
106         m.set_kernel("%s/sbin/elver" % a, machine.get_kernel_args())
107     elif a == "armv5":
108         m.set_kernel("%s/sbin/cpu.bin" % a, machine.get_kernel_args())
109     elif a == "armv7":
110         m.set_kernel("%s/sbin/cpu_arm_gem5" % a, machine.get_kernel_args())
111     else:
112         m.set_kernel("%s/sbin/cpu" % a, machine.get_kernel_args())
113     # default for all barrelfish archs
114     # hack: cpu driver is not called "cpu" for ARMv7 builds
115     if a == "armv7":
116         m.add_module("%s/sbin/cpu_arm_gem5" % a, machine.get_kernel_args())
117         m.add_module("/arm_gem5_image")
118     else:
119         m.add_module("%s/sbin/cpu" % a, machine.get_kernel_args())
120
121     m.add_module("%s/sbin/init" % a)
122     m.add_module("%s/sbin/mem_serv" % a)
123     m.add_module("%s/sbin/monitor" % a)
124     m.add_module("%s/sbin/ramfsd" % a, ["boot"])
125     m.add_module("%s/sbin/skb" % a, ["boot"])
126     m.add_module("%s/sbin/spawnd" % a, ["boot"])
127     m.add_module("%s/sbin/startd" % a, ["boot"])
128
129     # SKB and PCI are x86-only for the moment
130     if a == "x86_64" or a == "x86_32":
131         m.add_module("%s/sbin/acpi" % a, ["boot"])
132         m.add_module("/skb_ramfs.cpio.gz", ["nospawn"])
133         m.add_module("%s/sbin/routing_setup" %a, ["boot"])
134         m.add_module("%s/sbin/corectrl" % a, ["auto"])
135
136         is_babybel = 0
137         if re.search("babybel[1-4]|xeon_phi_[1-4]", machine.name) :
138             is_babybel = 1
139
140         if machine.name == "sbrinz1" or machine.name == "sbrinz2" \
141         or machine.name == "tomme1" or machine.name == "tomme2" \
142         or is_babybel == 1 :
143             # PCI allocation broken, use BIOS plan
144             m.add_module("%s/sbin/pci" % a, ["auto",
145                                              "skb_bridge_program=bridge_bios"] + machine.get_pci_args())
146         else:
147             m.add_module("%s/sbin/pci" % a, ["auto"] + machine.get_pci_args())
148
149         if is_babybel :
150             m.add_module("%s/sbin/kaluga" % a, ["boot", "eth0=4:0:0"])
151         else :
152             m.add_module("%s/sbin/kaluga" % a, ["boot"])
153
154     if a == "armv7":
155         if machine.get_ncores() == 2:
156                 m.add_module("corectrl", ["boot", "1"])
157         elif machine.get_ncores() == 4:
158             m.add_module("corectrl", ["boot", "1"])
159             m.add_module("corectrl", ["boot", "2"])
160             m.add_module("corectrl", ["boot", "3"])
161     return m