Skip to contentSkip to conversation

Add guest_os_type domain config option

PATCH New Alex Williamson 1 participant 1 message Nov 28, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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

---

tools/python/xen/xend/XendConfig.py +2 -1
diff -r c555a5f97982 tools/python/xen/xend/XendConfig.py
@@ -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',
tools/python/xen/xend/XendConstants.py +1 -0
diff -r c555a5f97982 tools/python/xen/xend/XendConstants.py
@@ -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",
tools/python/xen/xend/image.py +7 -0
diff -r c555a5f97982 tools/python/xen/xend/image.py
@@ -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
tools/python/xen/xm/create.py +7 -1
diff -r c555a5f97982 tools/python/xen/xm/create.py
@@ -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]])
xen/include/public/hvm/params.h +3 -1
diff -r c555a5f97982 xen/include/public/hvm/params.h
@@ -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__ */