Alex Williamson
2007-Nov-28 17:19 UTC
[Xen-ia64-devel] [PATCH] Add guest_os_type domain config option
On ia64 we have a desire to know the guest OS the user plans to run in an HVM domain. With this information we can make certain optimizations, for instance knowing if a guest identity maps a memory region can change how we handle page faults. In the past we''ve tried to do this via the guest firmware detecting the guest type, but this is error prone and doesn''t allow the user to override the guess should the guest firmware detect incorrectly. The right way to do this seems to be a config option in the domain spec file. The default should obviously work for all supported guest OS types, but specifying a specific value may provide optimization. The patch below implements the common code pieces of this. The guest OS type is truncated to 8 characters and stored as an HVM parameter. It''s left to the architecture specific builder code whether to make use of these. The default is simply "default". For ia64 we plan to make use of "windows" and "linux", but may add more in the future. Patch based on code originally from Zhang Xin. Thanks, Alex Signed-off-by: Alex Williamson <alex.williamson@hp.com> --- diff -r c555a5f97982 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Wed Nov 28 13:36:56 2007 +0000 +++ b/tools/python/xen/xend/XendConfig.py Wed Nov 28 09:48:59 2007 -0700 @@ -129,7 +129,8 @@ XENAPI_PLATFORM_CFG = [ ''acpi'', ''apic'', ''nographic'', ''pae'', ''rtc_timeoffset'', ''serial'', ''sdl'', ''soundhw'',''stdvga'', ''usb'', ''usbdevice'', ''vnc'', ''vncconsole'', ''vncdisplay'', ''vnclisten'', ''timer_mode'', - ''vncpasswd'', ''vncunused'', ''xauthority'', ''pci'', ''vhpt''] + ''vncpasswd'', ''vncunused'', ''xauthority'', ''pci'', ''vhpt'', + ''guest_os_type'' ] # Xen API console ''other_config'' keys. XENAPI_CONSOLE_OTHER_CFG = [''vncunused'', ''vncdisplay'', ''vnclisten'', diff -r c555a5f97982 tools/python/xen/xend/XendConstants.py --- a/tools/python/xen/xend/XendConstants.py Wed Nov 28 13:36:56 2007 +0000 +++ b/tools/python/xen/xend/XendConstants.py Wed Nov 28 09:48:59 2007 -0700 @@ -47,6 +47,7 @@ HVM_PARAM_VHPT_SIZE = 8 HVM_PARAM_VHPT_SIZE = 8 HVM_PARAM_BUFPIOREQ_PFN = 9 HVM_PARAM_TIMER_MODE = 10 +HVM_PARAM_GOS_TYPE = 11 restart_modes = [ "restart", diff -r c555a5f97982 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Wed Nov 28 13:36:56 2007 +0000 +++ b/tools/python/xen/xend/image.py Wed Nov 28 09:48:59 2007 -0700 @@ -22,6 +22,7 @@ import math import math import time import signal +import struct import xen.lowlevel.xc from xen.xend.XendConstants import * @@ -426,6 +427,7 @@ class HVMImageHandler(ImageHandler): self.apic = int(vmConfig[''platform''].get(''apic'', 0)) self.acpi = int(vmConfig[''platform''].get(''acpi'', 0)) + self.guest_os_type = vmConfig[''platform''].get(''guest_os_type'') # Return a list of cmd line args to the device models based on the # xm config file @@ -503,6 +505,11 @@ class HVMImageHandler(ImageHandler): return args def buildDomain(self): + # Encode OS type string into an integer w/ null padding + val = struct.unpack("Q", + self.guest_os_type[:8].lower().ljust(8, chr(0)))[0] + xc.hvm_set_param(self.vm.getDomid(), HVM_PARAM_GOS_TYPE, val) + store_evtchn = self.vm.getStorePort() mem_mb = self.getRequiredInitialReservation() / 1024 diff -r c555a5f97982 tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Wed Nov 28 13:36:56 2007 +0000 +++ b/tools/python/xen/xm/create.py Wed Nov 28 09:48:59 2007 -0700 @@ -453,6 +453,10 @@ gopts.var(''usbdevice'', val=''NAME'', gopts.var(''usbdevice'', val=''NAME'', fn=set_value, default='''', use="Name of USB device to add?") + +gopts.var(''guest_os_type'', val=''NAME'', + fn=set_value, default=''default'', + use="Guest OS type running in HVM") gopts.var(''stdvga'', val=''no|yes'', fn=set_bool, default=0, @@ -733,7 +737,9 @@ def configure_hvm(config_image, vals): ''localtime'', ''serial'', ''stdvga'', ''isa'', ''nographic'', ''soundhw'', ''vnc'', ''vncdisplay'', ''vncunused'', ''vncconsole'', ''vnclisten'', ''sdl'', ''display'', ''xauthority'', ''rtc_timeoffset'', ''monitor'', - ''acpi'', ''apic'', ''usb'', ''usbdevice'', ''keymap'', ''pci'' ] + ''acpi'', ''apic'', ''usb'', ''usbdevice'', ''keymap'', ''pci'', + ''guest_os_type''] + for a in args: if a in vals.__dict__ and vals.__dict__[a] is not None: config_image.append([a, vals.__dict__[a]]) diff -r c555a5f97982 xen/include/public/hvm/params.h --- a/xen/include/public/hvm/params.h Wed Nov 28 13:36:56 2007 +0000 +++ b/xen/include/public/hvm/params.h Wed Nov 28 09:48:59 2007 -0700 @@ -75,6 +75,8 @@ #define HVMPTM_no_delay_for_missed_ticks 1 #define HVMPTM_no_missed_tick_accounting 2 -#define HVM_NR_PARAMS 11 +#define HVM_PARAM_GOS_TYPE 11 + +#define HVM_NR_PARAMS 12 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@lists.xensource.com http://lists.xensource.com/xen-ia64-devel