diff -rup xen-unstable-16606.orig/tools/python/xen/xend/image.py xen-unstable-16606.new/tools/python/xen/xend/image.py --- xen-unstable-16606.orig/tools/python/xen/xend/image.py 2007-12-17 17:52:29.000000000 -0500 +++ xen-unstable-16606.new/tools/python/xen/xend/image.py 2007-12-17 18:17:31.000000000 -0500 @@ -127,7 +127,7 @@ class ImageHandler: """ # Set params and call buildDomain(). - if not os.path.isfile(self.kernel): + if self.kernel and not os.path.isfile(self.kernel): raise VmError('Kernel image does not exist: %s' % self.kernel) if self.ramdisk and not os.path.isfile(self.ramdisk): raise VmError('Kernel ramdisk does not exist: %s' % self.ramdisk) @@ -187,6 +187,10 @@ class ImageHandler: def parseDeviceModelArgs(self, vmConfig): ret = ["-domain-name", str(self.vm.info['name_label'])] + # Tell QEMU how large the guest's memory allocation is + # to help it when loading the initrd (if neccessary) + ret += ["-m", str(self.getRequiredInitialReservation() / 1024)] + # Find RFB console device, and if it exists, make QEMU enable # the VNC console. if int(vmConfig['platform'].get('nographic', 0)) != 0: @@ -410,8 +414,7 @@ class HVMImageHandler(ImageHandler): def configure(self, vmConfig): ImageHandler.configure(self, vmConfig) - if not self.kernel: - self.kernel = '/usr/lib/xen/boot/hvmloader' + self.loader = vmConfig['platform'].get('loader') info = xc.xeninfo() if 'hvm' not in info['xen_caps']: @@ -434,6 +437,17 @@ class HVMImageHandler(ImageHandler): ret = ImageHandler.parseDeviceModelArgs(self, vmConfig) ret = ret + ['-vcpus', str(self.vm.getVCpuCount())] + if self.kernel and self.kernel != "/usr/lib/xen/boot/hvmloader": + log.debug("kernel = %s", self.kernel) + ret = ret + ['-kernel', self.kernel] + if self.ramdisk: + log.debug("ramdisk = %s", self.ramdisk) + ret = ret + ['-initrd', self.ramdisk] + if self.cmdline: + log.debug("cmdline = %s", self.cmdline) + ret = ret + ['-append', self.cmdline] + + dmargs = [ 'boot', 'fda', 'fdb', 'soundhw', 'localtime', 'serial', 'stdvga', 'isa', 'acpi', 'usb', 'usbdevice', 'pci' ] @@ -509,7 +523,7 @@ class HVMImageHandler(ImageHandler): mem_mb = self.getRequiredInitialReservation() / 1024 log.debug("domid = %d", self.vm.getDomid()) - log.debug("image = %s", self.kernel) + log.debug("image = %s", self.loader) log.debug("store_evtchn = %d", store_evtchn) log.debug("memsize = %d", mem_mb) log.debug("vcpus = %d", self.vm.getVCpuCount()) @@ -517,7 +531,7 @@ class HVMImageHandler(ImageHandler): log.debug("apic = %d", self.apic) rc = xc.hvm_build(domid = self.vm.getDomid(), - image = self.kernel, + image = self.loader, memsize = mem_mb, vcpus = self.vm.getVCpuCount(), acpi = self.acpi, diff -rup xen-unstable-16606.orig/tools/python/xen/xend/XendConfig.py xen-unstable-16606.new/tools/python/xen/xend/XendConfig.py --- xen-unstable-16606.orig/tools/python/xen/xend/XendConfig.py 2007-12-17 17:52:29.000000000 -0500 +++ xen-unstable-16606.new/tools/python/xen/xend/XendConfig.py 2007-12-17 18:26:30.000000000 -0500 @@ -124,7 +124,7 @@ XENAPI_CFG_TO_LEGACY_CFG = { LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(XENAPI_CFG_TO_LEGACY_CFG) # Platform configuration keys. -XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display', +XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'loader', 'display', 'fda', 'fdb', 'keymap', 'isa', 'localtime', 'monitor', 'nographic', 'pae', 'rtc_timeoffset', 'serial', 'sdl', 'soundhw','stdvga', 'usb', 'usbdevice', 'vnc', @@ -402,6 +402,17 @@ class XendConfig(dict): self['platform']['device_model'] = xen.util.auxbin.pathTo("qemu-dm") if self.is_hvm(): + if 'loader' not in self['platform']: + log.debug("No loader present") + # Old configs may have hvmloder set as PV_kernel param, + # so lets migrate them.... + if self['PV_kernel'] == "/usr/lib/xen/boot/hvmloader": + self['platform']['loader'] = self['PV_kernel'] + log.debug("Loader copied from kernel %s" % str(self['platform']['loader'])) + else: + self['platform']['loader'] = "/usr/lib/xen/boot/hvmloader" + log.debug("Loader %s" % str(self['platform']['loader'])) + # Compatibility hack, can go away soon. if 'soundhw' not in self['platform'] and \ self['platform'].get('enable_audio'): diff -rup xen-unstable-16606.orig/tools/python/xen/xm/create.py xen-unstable-16606.new/tools/python/xen/xm/create.py --- xen-unstable-16606.orig/tools/python/xen/xm/create.py 2007-12-17 17:52:29.000000000 -0500 +++ xen-unstable-16606.new/tools/python/xen/xm/create.py 2007-12-17 18:28:06.000000000 -0500 @@ -158,6 +158,10 @@ gopts.var('ramdisk', val='FILE', fn=set_value, default='', use="Path to ramdisk.") +gopts.var('loader', val='FILE', + fn=set_value, default='', + use="Path to HVM firmware.") + gopts.var('features', val='FEATURES', fn=set_value, default='', use="Features to enable in guest kernel") @@ -552,6 +556,8 @@ def configure_image(vals): config_image.append([ 'kernel', os.path.abspath(vals.kernel) ]) if vals.ramdisk: config_image.append([ 'ramdisk', os.path.abspath(vals.ramdisk) ]) + if vals.loader: + config_image.append([ 'loader', os.path.abspath(vals.loader) ]) if vals.cmdline_ip: cmdline_ip = strip('ip=', vals.cmdline_ip) config_image.append(['ip', cmdline_ip])