blob: ec093fa84683ddccd2b5039fe09f93800cd9367c [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
mbligh8baa2ea2006-12-17 23:01:24 +00006
7
8class xen(kernel.kernel):
9
10 def log(self, msg):
11 print msg
mblighf25cde12006-12-17 23:13:48 +000012 self.logfile.write('%s\n' % msg)
mbligh8baa2ea2006-12-17 23:01:24 +000013
14
15 def __init__(self, job, base_tree, results_dir, tmp_dir, build_dir, \
16 leave = False, kjob = None):
17 # call base-class
mblighf25cde12006-12-17 23:13:48 +000018 kernel.kernel.__init__(self, job, base_tree, results_dir, \
19 tmp_dir, build_dir, leave)
mbligh8baa2ea2006-12-17 23:01:24 +000020 self.kjob = kjob
21
22
23 def config(self, config_file, config_list = None):
mbligh642b03e2008-01-14 16:53:15 +000024 raise NotImplementedError('config() not implemented for xen')
mbligh8baa2ea2006-12-17 23:01:24 +000025
26
27 def build(self, make_opts = '', logfile = '', extraversion='autotest'):
28 """build xen
29
30 make_opts
31 additional options to make, if any
32 """
33 self.log('running build')
34 os_dep.commands('gcc', 'make')
mblighf25cde12006-12-17 23:13:48 +000035 # build xen with extraversion flag
mbligh8baa2ea2006-12-17 23:01:24 +000036 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
37 if logfile == '':
38 logfile = os.path.join(self.log_dir, 'xen_build')
39 os.chdir(self.build_dir)
mblighf25cde12006-12-17 23:13:48 +000040 self.log('log_dir: %s ' % os.path.join(self.log_dir, 'stdout'))
mbligh44da9372007-11-05 23:30:07 +000041 self.job.stdout.tee_redirect(logfile + '.stdout')
42 self.job.stderr.tee_redirect(logfile + '.stderr')
mbligh8baa2ea2006-12-17 23:01:24 +000043
44 # build xen hypervisor and user-space tools
mblighf25cde12006-12-17 23:13:48 +000045 targets = ['xen', 'tools']
mbligh8baa2ea2006-12-17 23:01:24 +000046 threads = 2 * count_cpus()
47 for t in targets:
48 build_string = 'make -j %d %s %s' % (threads, make_opts, t)
mblighf25cde12006-12-17 23:13:48 +000049 self.log('build_string: %s' % build_string)
mbligh8baa2ea2006-12-17 23:01:24 +000050 system(build_string)
51
52 # make a kernel job out of the kernel from the xen src if one isn't provided
53 if self.kjob == None:
54 # get xen kernel tree ready
mblighf25cde12006-12-17 23:13:48 +000055 self.log("prep-ing xen'ified kernel source tree")
mbligh8baa2ea2006-12-17 23:01:24 +000056 system('make prep-kernels')
57
58 v = self.get_xen_kernel_build_ver()
mblighf25cde12006-12-17 23:13:48 +000059 self.log('building xen kernel version: %s' % v)
mbligh8baa2ea2006-12-17 23:01:24 +000060
61 # build xen-ified kernel in xen tree
mblighf25cde12006-12-17 23:13:48 +000062 kernel_base_tree = os.path.join(self.build_dir, \
63 'linux-%s' % self.get_xen_kernel_build_ver())
mbligh8baa2ea2006-12-17 23:01:24 +000064
65 self.log('kernel_base_tree = %s' % kernel_base_tree)
mblighf25cde12006-12-17 23:13:48 +000066 # fix up XENGUEST value in EXTRAVERSION; we can't have
67 # files with '$(XENGEUST)' in the name, =(
mbligh8baa2ea2006-12-17 23:01:24 +000068 self.fix_up_xen_kernel_makefile(kernel_base_tree)
69
70 # make the kernel job
71 self.kjob = self.job.kernel(kernel_base_tree)
72
73 # hardcoding dom0 config (no modules for testing, yay!)
74 # FIXME: probe host to determine which config to pick
75 c = self.build_dir + '/buildconfigs/linux-defconfig_xen0_x86_32'
mblighf25cde12006-12-17 23:13:48 +000076 self.log('using kernel config: %s ' % c)
mbligh8baa2ea2006-12-17 23:01:24 +000077 self.kjob.config(c)
78
79 # Xen's kernel tree sucks; doesn't use bzImage, but vmlinux
80 self.kjob.set_build_target('vmlinuz')
81
82 # also, the vmlinuz is not out in arch/*/boot, ARGH! more hackery
mblighf25cde12006-12-17 23:13:48 +000083 self.kjob.set_build_image(self.job.tmpdir + '/build/linux/vmlinuz')
mbligh8baa2ea2006-12-17 23:01:24 +000084
85 self.kjob.build()
86
87 self.job.stdout.restore()
88 self.job.stderr.restore()
89
90 xen_version = self.get_xen_build_ver()
mblighf25cde12006-12-17 23:13:48 +000091 self.log('BUILD VERSION: Xen: %s Kernel:%s' % \
92 (xen_version, self.kjob.get_kernel_build_ver()))
mbligh8baa2ea2006-12-17 23:01:24 +000093
94
95 def build_timed(self, *args, **kwds):
mbligh642b03e2008-01-14 16:53:15 +000096 raise NotImplementedError('build_timed() not implemented')
mbligh8baa2ea2006-12-17 23:01:24 +000097
98
99 def install(self, tag='', prefix = '/', extraversion='autotest'):
100 """make install in the kernel tree"""
101 self.log('Installing ...')
102
103 os.chdir(self.build_dir)
104
105 if not os.path.isdir(prefix):
106 os.mkdir(prefix)
107 self.boot_dir = os.path.join(prefix, 'boot')
108 if not os.path.isdir(self.boot_dir):
109 os.mkdir(self.boot_dir)
110
111 # remember what we are going to install
mblighf25cde12006-12-17 23:13:48 +0000112 xen_version = '%s-%s' % (self.get_xen_build_ver(), extraversion)
mbligh8baa2ea2006-12-17 23:01:24 +0000113 self.xen_image = self.boot_dir + '/xen-' + xen_version + '.gz'
114 self.xen_syms = self.boot_dir + '/xen-syms-' + xen_version
115
116 self.log('Installing Xen ...')
117 os.environ['XEN_EXTRAVERSION'] = '-unstable-%s'% extraversion
118
119 # install xen
120 system('make DESTDIR=%s -C xen install' % prefix)
121
122 # install tools
123 system('make DESTDIR=%s -C tools install' % prefix)
124
125 # install kernel
126 ktag = self.kjob.get_kernel_build_ver()
127 kprefix = prefix
128 self.kjob.install(tag=ktag, prefix=kprefix)
129
130
131 def add_to_bootloader(self, tag='autotest', args=''):
132 """ add this kernel to bootloader, taking an
133 optional parameter of space separated parameters
134 e.g.: kernel.add_to_bootloader('mykernel', 'ro acpi=off')
135 """
136
137 # turn on xen mode
138 self.job.bootloader.enable_xen_mode()
139
140 # remove existing entry if present
141 self.job.bootloader.remove_kernel(tag)
142
143 # add xen and xen kernel
144 self.job.bootloader.add_kernel(self.kjob.image, tag, \
mblighf25cde12006-12-17 23:13:48 +0000145 self.kjob.initrd, self.xen_image)
mbligh8baa2ea2006-12-17 23:01:24 +0000146
147 # if no args passed, populate from /proc/cmdline
148 if not args:
149 args = open('/proc/cmdline', 'r').readline().strip()
150
151 # add args to entry one at a time
152 for a in args.split(' '):
153 self.job.bootloader.add_args(tag, a)
154
155 # turn off xen mode
156 self.job.bootloader.disable_xen_mode()
157
158
159 def get_xen_kernel_build_ver(self):
160 """Check xen buildconfig for current kernel version"""
mblighf25cde12006-12-17 23:13:48 +0000161 version = patchlevel = sublevel = ''
162 extraversion = localversion = ''
163
mbligh8baa2ea2006-12-17 23:01:24 +0000164 version_file = self.build_dir + '/buildconfigs/mk.linux-2.6-xen'
165
166 for line in open(version_file, 'r').readlines():
167 if line.startswith('LINUX_VER'):
mblighf25cde12006-12-17 23:13:48 +0000168 start = line.index('=') + 1
169 version = line[start:].strip() + "-xen"
mbligh8baa2ea2006-12-17 23:01:24 +0000170 break
171
172 return version
173
174
175 def fix_up_xen_kernel_makefile(self, kernel_dir):
176 """Fix up broken EXTRAVERSION in xen-ified Linux kernel Makefile"""
177 xenguest = ''
178 makefile = kernel_dir + '/Makefile'
179
180 for line in open(makefile, 'r').readlines():
181 if line.startswith('XENGUEST'):
mblighf25cde12006-12-17 23:13:48 +0000182 start = line.index('=') + 1
183 xenguest = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000184 break;
185
186 # change out $XENGUEST in EXTRAVERSION line
mblighf25cde12006-12-17 23:13:48 +0000187 system('sed -i.old "s,\$(XENGUEST),%s," %s' % \
188 (xenguest, makefile))
mbligh8baa2ea2006-12-17 23:01:24 +0000189
190
191 def get_xen_build_ver(self):
192 """Check Makefile and .config to return kernel version"""
mblighf25cde12006-12-17 23:13:48 +0000193 version = patchlevel = sublevel = ''
194 extraversion = localversion = ''
mbligh8baa2ea2006-12-17 23:01:24 +0000195
196 for line in open(self.build_dir + '/xen/Makefile', 'r').readlines():
197 if line.startswith('export XEN_VERSION'):
mblighf25cde12006-12-17 23:13:48 +0000198 start = line.index('=') + 1
199 version = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000200 if line.startswith('export XEN_SUBVERSION'):
mblighf25cde12006-12-17 23:13:48 +0000201 start = line.index('=') + 1
202 sublevel = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000203 if line.startswith('export XEN_EXTRAVERSION'):
mblighf25cde12006-12-17 23:13:48 +0000204 start = line.index('=') + 1
205 extraversion = line[start:].strip()
mbligh8baa2ea2006-12-17 23:01:24 +0000206
mblighf25cde12006-12-17 23:13:48 +0000207 return "%s.%s%s" % (version, sublevel, extraversion)