blob: d69b2c504ca631d6d11daa02979020beded5f15b [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
mbligh8baa2ea2006-12-17 23:01:24 +00007
8
9class xen(kernel.kernel):
10
11 def log(self, msg):
12 print msg
mblighf25cde12006-12-17 23:13:48 +000013 self.logfile.write('%s\n' % msg)
mbligh8baa2ea2006-12-17 23:01:24 +000014
15
16 def __init__(self, job, base_tree, results_dir, tmp_dir, build_dir, \
17 leave = False, kjob = None):
18 # call base-class
mblighf25cde12006-12-17 23:13:48 +000019 kernel.kernel.__init__(self, job, base_tree, results_dir, \
20 tmp_dir, build_dir, leave)
mbligh8baa2ea2006-12-17 23:01:24 +000021 self.kjob = kjob
22
23
24 def config(self, config_file, config_list = None):
mbligh642b03e2008-01-14 16:53:15 +000025 raise NotImplementedError('config() not implemented for xen')
mbligh8baa2ea2006-12-17 23:01:24 +000026
27
28 def build(self, make_opts = '', logfile = '', extraversion='autotest'):
29 """build xen
30
31 make_opts
32 additional options to make, if any
33 """
34 self.log('running build')
35 os_dep.commands('gcc', 'make')
mblighf25cde12006-12-17 23:13:48 +000036 # build xen with extraversion flag
mbligh8baa2ea2006-12-17 23:01:24 +000037 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
38 if logfile == '':
39 logfile = os.path.join(self.log_dir, 'xen_build')
40 os.chdir(self.build_dir)
mblighf25cde12006-12-17 23:13:48 +000041 self.log('log_dir: %s ' % os.path.join(self.log_dir, 'stdout'))
mbligh44da9372007-11-05 23:30:07 +000042 self.job.stdout.tee_redirect(logfile + '.stdout')
43 self.job.stderr.tee_redirect(logfile + '.stderr')
mbligh8baa2ea2006-12-17 23:01:24 +000044
45 # build xen hypervisor and user-space tools
mblighf25cde12006-12-17 23:13:48 +000046 targets = ['xen', 'tools']
mbligh34d01172008-06-05 16:26:31 +000047 threads = 2 * autotest_utils.count_cpus()
mbligh8baa2ea2006-12-17 23:01:24 +000048 for t in targets:
49 build_string = 'make -j %d %s %s' % (threads, make_opts, t)
mblighf25cde12006-12-17 23:13:48 +000050 self.log('build_string: %s' % build_string)
mbligh8baa2ea2006-12-17 23:01:24 +000051 system(build_string)
52
53 # make a kernel job out of the kernel from the xen src if one isn't provided
54 if self.kjob == None:
55 # get xen kernel tree ready
mblighf25cde12006-12-17 23:13:48 +000056 self.log("prep-ing xen'ified kernel source tree")
mbligh8baa2ea2006-12-17 23:01:24 +000057 system('make prep-kernels')
58
59 v = self.get_xen_kernel_build_ver()
mblighf25cde12006-12-17 23:13:48 +000060 self.log('building xen kernel version: %s' % v)
mbligh8baa2ea2006-12-17 23:01:24 +000061
62 # build xen-ified kernel in xen tree
mblighf25cde12006-12-17 23:13:48 +000063 kernel_base_tree = os.path.join(self.build_dir, \
64 'linux-%s' % self.get_xen_kernel_build_ver())
mbligh8baa2ea2006-12-17 23:01:24 +000065
66 self.log('kernel_base_tree = %s' % kernel_base_tree)
mblighf25cde12006-12-17 23:13:48 +000067 # fix up XENGUEST value in EXTRAVERSION; we can't have
68 # files with '$(XENGEUST)' in the name, =(
mbligh8baa2ea2006-12-17 23:01:24 +000069 self.fix_up_xen_kernel_makefile(kernel_base_tree)
70
71 # make the kernel job
72 self.kjob = self.job.kernel(kernel_base_tree)
73
74 # hardcoding dom0 config (no modules for testing, yay!)
75 # FIXME: probe host to determine which config to pick
76 c = self.build_dir + '/buildconfigs/linux-defconfig_xen0_x86_32'
mblighf25cde12006-12-17 23:13:48 +000077 self.log('using kernel config: %s ' % c)
mbligh8baa2ea2006-12-17 23:01:24 +000078 self.kjob.config(c)
79
80 # Xen's kernel tree sucks; doesn't use bzImage, but vmlinux
81 self.kjob.set_build_target('vmlinuz')
82
83 # also, the vmlinuz is not out in arch/*/boot, ARGH! more hackery
mblighf25cde12006-12-17 23:13:48 +000084 self.kjob.set_build_image(self.job.tmpdir + '/build/linux/vmlinuz')
mbligh8baa2ea2006-12-17 23:01:24 +000085
86 self.kjob.build()
87
88 self.job.stdout.restore()
89 self.job.stderr.restore()
90
91 xen_version = self.get_xen_build_ver()
mblighf25cde12006-12-17 23:13:48 +000092 self.log('BUILD VERSION: Xen: %s Kernel:%s' % \
93 (xen_version, self.kjob.get_kernel_build_ver()))
mbligh8baa2ea2006-12-17 23:01:24 +000094
95
96 def build_timed(self, *args, **kwds):
mbligh642b03e2008-01-14 16:53:15 +000097 raise NotImplementedError('build_timed() not implemented')
mbligh8baa2ea2006-12-17 23:01:24 +000098
99
100 def install(self, tag='', prefix = '/', extraversion='autotest'):
101 """make install in the kernel tree"""
102 self.log('Installing ...')
103
104 os.chdir(self.build_dir)
105
106 if not os.path.isdir(prefix):
107 os.mkdir(prefix)
108 self.boot_dir = os.path.join(prefix, 'boot')
109 if not os.path.isdir(self.boot_dir):
110 os.mkdir(self.boot_dir)
111
112 # remember what we are going to install
mblighf25cde12006-12-17 23:13:48 +0000113 xen_version = '%s-%s' % (self.get_xen_build_ver(), extraversion)
mbligh8baa2ea2006-12-17 23:01:24 +0000114 self.xen_image = self.boot_dir + '/xen-' + xen_version + '.gz'
115 self.xen_syms = self.boot_dir + '/xen-syms-' + xen_version
116
117 self.log('Installing Xen ...')
118 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
119
120 # install xen
121 system('make DESTDIR=%s -C xen install' % prefix)
122
123 # install tools
124 system('make DESTDIR=%s -C tools install' % prefix)
125
126 # install kernel
127 ktag = self.kjob.get_kernel_build_ver()
128 kprefix = prefix
129 self.kjob.install(tag=ktag, prefix=kprefix)
130
131
132 def add_to_bootloader(self, tag='autotest', args=''):
133 """ add this kernel to bootloader, taking an
134 optional parameter of space separated parameters
135 e.g.: kernel.add_to_bootloader('mykernel', 'ro acpi=off')
136 """
137
138 # turn on xen mode
139 self.job.bootloader.enable_xen_mode()
140
141 # remove existing entry if present
142 self.job.bootloader.remove_kernel(tag)
143
144 # add xen and xen kernel
145 self.job.bootloader.add_kernel(self.kjob.image, tag, \
mblighf25cde12006-12-17 23:13:48 +0000146 self.kjob.initrd, self.xen_image)
mbligh8baa2ea2006-12-17 23:01:24 +0000147
148 # if no args passed, populate from /proc/cmdline
149 if not args:
150 args = open('/proc/cmdline', 'r').readline().strip()
151
152 # add args to entry one at a time
153 for a in args.split(' '):
154 self.job.bootloader.add_args(tag, a)
155
156 # turn off xen mode
157 self.job.bootloader.disable_xen_mode()
158
159
160 def get_xen_kernel_build_ver(self):
161 """Check xen buildconfig for current kernel version"""
mblighf25cde12006-12-17 23:13:48 +0000162 version = patchlevel = sublevel = ''
163 extraversion = localversion = ''
164
mbligh8baa2ea2006-12-17 23:01:24 +0000165 version_file = self.build_dir + '/buildconfigs/mk.linux-2.6-xen'
166
167 for line in open(version_file, 'r').readlines():
168 if line.startswith('LINUX_VER'):
mblighf25cde12006-12-17 23:13:48 +0000169 start = line.index('=') + 1
170 version = line[start:].strip() + "-xen"
mbligh8baa2ea2006-12-17 23:01:24 +0000171 break
172
173 return version
174
175
176 def fix_up_xen_kernel_makefile(self, kernel_dir):
177 """Fix up broken EXTRAVERSION in xen-ified Linux kernel Makefile"""
178 xenguest = ''
179 makefile = kernel_dir + '/Makefile'
180
181 for line in open(makefile, 'r').readlines():
182 if line.startswith('XENGUEST'):
mblighf25cde12006-12-17 23:13:48 +0000183 start = line.index('=') + 1
184 xenguest = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000185 break;
186
187 # change out $XENGUEST in EXTRAVERSION line
mblighf25cde12006-12-17 23:13:48 +0000188 system('sed -i.old "s,\$(XENGUEST),%s," %s' % \
189 (xenguest, makefile))
mbligh8baa2ea2006-12-17 23:01:24 +0000190
191
192 def get_xen_build_ver(self):
193 """Check Makefile and .config to return kernel version"""
mblighf25cde12006-12-17 23:13:48 +0000194 version = patchlevel = sublevel = ''
195 extraversion = localversion = ''
mbligh8baa2ea2006-12-17 23:01:24 +0000196
197 for line in open(self.build_dir + '/xen/Makefile', 'r').readlines():
198 if line.startswith('export XEN_VERSION'):
mblighf25cde12006-12-17 23:13:48 +0000199 start = line.index('=') + 1
200 version = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000201 if line.startswith('export XEN_SUBVERSION'):
mblighf25cde12006-12-17 23:13:48 +0000202 start = line.index('=') + 1
203 sublevel = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000204 if line.startswith('export XEN_EXTRAVERSION'):
mblighf25cde12006-12-17 23:13:48 +0000205 start = line.index('=') + 1
206 extraversion = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000207
mblighf25cde12006-12-17 23:13:48 +0000208 return "%s.%s%s" % (version, sublevel, extraversion)