blob: 90686fcb4296cad57e1333c24f67af88abe26e73 [file] [log] [blame]
mbligh8baa2ea2006-12-17 23:01:24 +00001__author__ = """Copyright Martin J. Bligh, 2006,
2 Copyright IBM Corp. 2006, Ryan Harper <ryanh@us.ibm.com>"""
3
mbligh02ff2d52008-06-03 15:00:21 +00004import os, shutil, copy, pickle, re, glob
mblighc61fb362008-06-05 16:22:15 +00005from autotest_lib.client.bin import kernel, kernel_config, os_dep, test
mbligh34d01172008-06-05 16:26:31 +00006from autotest_lib.client.bin import autotest_utils
mbligh23955fc2008-06-12 17:41:18 +00007from autotest_lib.client.common_lib import utils
mbligh8baa2ea2006-12-17 23:01:24 +00008
9
10class xen(kernel.kernel):
11
jadmanski0afbb632008-06-06 21:10:57 +000012 def log(self, msg):
13 print msg
14 self.logfile.write('%s\n' % msg)
mbligh8baa2ea2006-12-17 23:01:24 +000015
16
mbligh8b352852008-06-07 01:07:08 +000017 def __init__(self, job, base_tree, results_dir, tmp_dir, build_dir,
18 leave = False, kjob = None):
jadmanski0afbb632008-06-06 21:10:57 +000019 # call base-class
mbligh8b352852008-06-07 01:07:08 +000020 kernel.kernel.__init__(self, job, base_tree, results_dir,
jadmanski0afbb632008-06-06 21:10:57 +000021 tmp_dir, build_dir, leave)
22 self.kjob = kjob
mbligh8baa2ea2006-12-17 23:01:24 +000023
24
jadmanski0afbb632008-06-06 21:10:57 +000025 def config(self, config_file, config_list = None):
26 raise NotImplementedError('config() not implemented for xen')
mbligh8baa2ea2006-12-17 23:01:24 +000027
28
jadmanski0afbb632008-06-06 21:10:57 +000029 def build(self, make_opts = '', logfile = '', extraversion='autotest'):
30 """build xen
mbligh8baa2ea2006-12-17 23:01:24 +000031
jadmanski0afbb632008-06-06 21:10:57 +000032 make_opts
33 additional options to make, if any
34 """
35 self.log('running build')
36 os_dep.commands('gcc', 'make')
37 # build xen with extraversion flag
38 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
39 if logfile == '':
40 logfile = os.path.join(self.log_dir, 'xen_build')
41 os.chdir(self.build_dir)
42 self.log('log_dir: %s ' % os.path.join(self.log_dir, 'stdout'))
43 self.job.stdout.tee_redirect(logfile + '.stdout')
44 self.job.stderr.tee_redirect(logfile + '.stderr')
mbligh8baa2ea2006-12-17 23:01:24 +000045
jadmanski0afbb632008-06-06 21:10:57 +000046 # build xen hypervisor and user-space tools
47 targets = ['xen', 'tools']
48 threads = 2 * autotest_utils.count_cpus()
49 for t in targets:
50 build_string = 'make -j %d %s %s' % (threads, make_opts, t)
51 self.log('build_string: %s' % build_string)
mbligh23955fc2008-06-12 17:41:18 +000052 utils.system(build_string)
mbligh8baa2ea2006-12-17 23:01:24 +000053
jadmanski0afbb632008-06-06 21:10:57 +000054 # make a kernel job out of the kernel from the xen src if one isn't provided
55 if self.kjob == None:
56 # get xen kernel tree ready
57 self.log("prep-ing xen'ified kernel source tree")
mbligh23955fc2008-06-12 17:41:18 +000058 utils.system('make prep-kernels')
mbligh8baa2ea2006-12-17 23:01:24 +000059
jadmanski0afbb632008-06-06 21:10:57 +000060 v = self.get_xen_kernel_build_ver()
61 self.log('building xen kernel version: %s' % v)
mbligh8baa2ea2006-12-17 23:01:24 +000062
jadmanski0afbb632008-06-06 21:10:57 +000063 # build xen-ified kernel in xen tree
64 kernel_base_tree = os.path.join(self.build_dir, \
65 'linux-%s' % self.get_xen_kernel_build_ver())
mbligh8baa2ea2006-12-17 23:01:24 +000066
jadmanski0afbb632008-06-06 21:10:57 +000067 self.log('kernel_base_tree = %s' % kernel_base_tree)
68 # fix up XENGUEST value in EXTRAVERSION; we can't have
69 # files with '$(XENGEUST)' in the name, =(
70 self.fix_up_xen_kernel_makefile(kernel_base_tree)
mbligh8baa2ea2006-12-17 23:01:24 +000071
jadmanski0afbb632008-06-06 21:10:57 +000072 # make the kernel job
73 self.kjob = self.job.kernel(kernel_base_tree)
mbligh8baa2ea2006-12-17 23:01:24 +000074
jadmanski0afbb632008-06-06 21:10:57 +000075 # hardcoding dom0 config (no modules for testing, yay!)
76 # FIXME: probe host to determine which config to pick
77 c = self.build_dir + '/buildconfigs/linux-defconfig_xen0_x86_32'
78 self.log('using kernel config: %s ' % c)
79 self.kjob.config(c)
mbligh8baa2ea2006-12-17 23:01:24 +000080
jadmanski0afbb632008-06-06 21:10:57 +000081 # Xen's kernel tree sucks; doesn't use bzImage, but vmlinux
82 self.kjob.set_build_target('vmlinuz')
mbligh8baa2ea2006-12-17 23:01:24 +000083
jadmanski0afbb632008-06-06 21:10:57 +000084 # also, the vmlinuz is not out in arch/*/boot, ARGH! more hackery
85 self.kjob.set_build_image(self.job.tmpdir + '/build/linux/vmlinuz')
mbligh8baa2ea2006-12-17 23:01:24 +000086
jadmanski0afbb632008-06-06 21:10:57 +000087 self.kjob.build()
mbligh8baa2ea2006-12-17 23:01:24 +000088
jadmanski0afbb632008-06-06 21:10:57 +000089 self.job.stdout.restore()
90 self.job.stderr.restore()
mbligh8baa2ea2006-12-17 23:01:24 +000091
jadmanski0afbb632008-06-06 21:10:57 +000092 xen_version = self.get_xen_build_ver()
93 self.log('BUILD VERSION: Xen: %s Kernel:%s' % \
94 (xen_version, self.kjob.get_kernel_build_ver()))
mbligh8baa2ea2006-12-17 23:01:24 +000095
96
jadmanski0afbb632008-06-06 21:10:57 +000097 def build_timed(self, *args, **kwds):
98 raise NotImplementedError('build_timed() not implemented')
mbligh8baa2ea2006-12-17 23:01:24 +000099
100
jadmanski0afbb632008-06-06 21:10:57 +0000101 def install(self, tag='', prefix = '/', extraversion='autotest'):
102 """make install in the kernel tree"""
103 self.log('Installing ...')
mbligh8baa2ea2006-12-17 23:01:24 +0000104
jadmanski0afbb632008-06-06 21:10:57 +0000105 os.chdir(self.build_dir)
mbligh8baa2ea2006-12-17 23:01:24 +0000106
jadmanski0afbb632008-06-06 21:10:57 +0000107 if not os.path.isdir(prefix):
108 os.mkdir(prefix)
109 self.boot_dir = os.path.join(prefix, 'boot')
110 if not os.path.isdir(self.boot_dir):
111 os.mkdir(self.boot_dir)
mbligh8baa2ea2006-12-17 23:01:24 +0000112
jadmanski0afbb632008-06-06 21:10:57 +0000113 # remember what we are going to install
114 xen_version = '%s-%s' % (self.get_xen_build_ver(), extraversion)
115 self.xen_image = self.boot_dir + '/xen-' + xen_version + '.gz'
116 self.xen_syms = self.boot_dir + '/xen-syms-' + xen_version
mbligh8baa2ea2006-12-17 23:01:24 +0000117
jadmanski0afbb632008-06-06 21:10:57 +0000118 self.log('Installing Xen ...')
119 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
mbligh8baa2ea2006-12-17 23:01:24 +0000120
jadmanski0afbb632008-06-06 21:10:57 +0000121 # install xen
mbligh23955fc2008-06-12 17:41:18 +0000122 utils.system('make DESTDIR=%s -C xen install' % prefix)
mbligh8baa2ea2006-12-17 23:01:24 +0000123
jadmanski0afbb632008-06-06 21:10:57 +0000124 # install tools
mbligh23955fc2008-06-12 17:41:18 +0000125 utils.system('make DESTDIR=%s -C tools install' % prefix)
mbligh8baa2ea2006-12-17 23:01:24 +0000126
jadmanski0afbb632008-06-06 21:10:57 +0000127 # install kernel
128 ktag = self.kjob.get_kernel_build_ver()
129 kprefix = prefix
130 self.kjob.install(tag=ktag, prefix=kprefix)
mbligh8baa2ea2006-12-17 23:01:24 +0000131
132
jadmanski0afbb632008-06-06 21:10:57 +0000133 def add_to_bootloader(self, tag='autotest', args=''):
134 """ add this kernel to bootloader, taking an
135 optional parameter of space separated parameters
136 e.g.: kernel.add_to_bootloader('mykernel', 'ro acpi=off')
137 """
mbligh8baa2ea2006-12-17 23:01:24 +0000138
jadmanski0afbb632008-06-06 21:10:57 +0000139 # turn on xen mode
140 self.job.bootloader.enable_xen_mode()
mbligh8baa2ea2006-12-17 23:01:24 +0000141
jadmanski0afbb632008-06-06 21:10:57 +0000142 # remove existing entry if present
143 self.job.bootloader.remove_kernel(tag)
mbligh8baa2ea2006-12-17 23:01:24 +0000144
jadmanski0afbb632008-06-06 21:10:57 +0000145 # add xen and xen kernel
mbligh8b352852008-06-07 01:07:08 +0000146 self.job.bootloader.add_kernel(self.kjob.image, tag,
147 self.kjob.initrd, self.xen_image)
mbligh8baa2ea2006-12-17 23:01:24 +0000148
jadmanski0afbb632008-06-06 21:10:57 +0000149 # if no args passed, populate from /proc/cmdline
150 if not args:
151 args = open('/proc/cmdline', 'r').readline().strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000152
jadmanski0afbb632008-06-06 21:10:57 +0000153 # add args to entry one at a time
154 for a in args.split(' '):
155 self.job.bootloader.add_args(tag, a)
mbligh8baa2ea2006-12-17 23:01:24 +0000156
jadmanski0afbb632008-06-06 21:10:57 +0000157 # turn off xen mode
158 self.job.bootloader.disable_xen_mode()
mbligh8baa2ea2006-12-17 23:01:24 +0000159
160
jadmanski0afbb632008-06-06 21:10:57 +0000161 def get_xen_kernel_build_ver(self):
162 """Check xen buildconfig for current kernel version"""
163 version = patchlevel = sublevel = ''
164 extraversion = localversion = ''
mblighf25cde12006-12-17 23:13:48 +0000165
jadmanski0afbb632008-06-06 21:10:57 +0000166 version_file = self.build_dir + '/buildconfigs/mk.linux-2.6-xen'
mbligh8baa2ea2006-12-17 23:01:24 +0000167
jadmanski0afbb632008-06-06 21:10:57 +0000168 for line in open(version_file, 'r').readlines():
169 if line.startswith('LINUX_VER'):
170 start = line.index('=') + 1
171 version = line[start:].strip() + "-xen"
172 break
mbligh8baa2ea2006-12-17 23:01:24 +0000173
jadmanski0afbb632008-06-06 21:10:57 +0000174 return version
mbligh8baa2ea2006-12-17 23:01:24 +0000175
176
jadmanski0afbb632008-06-06 21:10:57 +0000177 def fix_up_xen_kernel_makefile(self, kernel_dir):
178 """Fix up broken EXTRAVERSION in xen-ified Linux kernel Makefile"""
179 xenguest = ''
180 makefile = kernel_dir + '/Makefile'
mbligh8baa2ea2006-12-17 23:01:24 +0000181
jadmanski0afbb632008-06-06 21:10:57 +0000182 for line in open(makefile, 'r').readlines():
183 if line.startswith('XENGUEST'):
184 start = line.index('=') + 1
185 xenguest = line[start:].strip()
186 break;
mbligh8baa2ea2006-12-17 23:01:24 +0000187
jadmanski0afbb632008-06-06 21:10:57 +0000188 # change out $XENGUEST in EXTRAVERSION line
mbligh23955fc2008-06-12 17:41:18 +0000189 utils.system('sed -i.old "s,\$(XENGUEST),%s," %s' % (xenguest,
190 makefile))
mbligh8baa2ea2006-12-17 23:01:24 +0000191
192
jadmanski0afbb632008-06-06 21:10:57 +0000193 def get_xen_build_ver(self):
194 """Check Makefile and .config to return kernel version"""
195 version = patchlevel = sublevel = ''
196 extraversion = localversion = ''
mbligh8baa2ea2006-12-17 23:01:24 +0000197
jadmanski0afbb632008-06-06 21:10:57 +0000198 for line in open(self.build_dir + '/xen/Makefile', 'r').readlines():
199 if line.startswith('export XEN_VERSION'):
200 start = line.index('=') + 1
201 version = line[start:].strip()
202 if line.startswith('export XEN_SUBVERSION'):
203 start = line.index('=') + 1
204 sublevel = line[start:].strip()
205 if line.startswith('export XEN_EXTRAVERSION'):
206 start = line.index('=') + 1
207 extraversion = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000208
jadmanski0afbb632008-06-06 21:10:57 +0000209 return "%s.%s%s" % (version, sublevel, extraversion)