[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] [PATCH 5/5] Implement guest_os_type for ia64



   This implements guest_os_type to set optimization features for
Windows and Linux guests.  This is also highly leveraged from Wing's
original code.  Note that the original patch set pgprot _PAGE_MA_UC for
Linux region 7.  I think this was a typo/copy-n-paste error and it
should be WB, but please correct me if I'm missing something.

Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
---

diff -r 98defc4f3bf9 tools/examples/xmexample.vti
--- a/tools/examples/xmexample.vti      Mon Nov 26 10:07:30 2007 -0700
+++ b/tools/examples/xmexample.vti      Tue Nov 27 12:25:09 2007 -0700
@@ -147,3 +147,16 @@ serial='pty'
 #-----------------------------------------------------------------------------
 #   Set keyboard layout, default is en-us keyboard.
 #keymap='ja'
+
+#-----------------------------------------------------------------------------
+#   Enable optimization features for the specified OS type. (Specific to the
+#           OS running in the guest domain.  Other OSes may not run correctly
+#           if the wrong OS type is specified.)
+#
+#   Default is "default", which should work for all supported guest OSes.
+#
+#   Known values:
+#    'linux' - All Linux variants
+#    'windows' - All Windows variants (Windows Server 2003/2008)
+#
+#guest_os_type='default'
diff -r 98defc4f3bf9 tools/libxc/ia64/xc_ia64_hvm_build.c
--- a/tools/libxc/ia64/xc_ia64_hvm_build.c      Mon Nov 26 10:07:30 2007 -0700
+++ b/tools/libxc/ia64/xc_ia64_hvm_build.c      Tue Nov 27 19:56:07 2007 -0700
@@ -11,6 +11,21 @@
 #include "xen/arch-ia64.h"
 #include <xen/hvm/ioreq.h>
 #include <xen/hvm/params.h>
+
+/*
+ * From asm/pgtable.h
+ */
+#define _PAGE_P_BIT     0
+#define _PAGE_A_BIT     5
+#define _PAGE_D_BIT     6
+
+#define _PAGE_P         (1 << _PAGE_P_BIT)      /* page present bit */
+#define _PAGE_A         (1 << _PAGE_A_BIT)      /* page accessed bit */
+#define _PAGE_D         (1 << _PAGE_D_BIT)      /* page dirty bit */
+
+#define _PAGE_MA_WB     (0x0 <<  2)     /* write back memory attribute */
+#define _PAGE_MA_UC     (0x4 <<  2)     /* uncacheable memory attribute */
+#define _PAGE_AR_RW     (2 <<  9)       /* read & write */
 
 static int
 xc_ia64_copy_to_domain_pages(int xc_handle, uint32_t domid, void* src_page,
@@ -880,6 +895,59 @@ xc_ia64_setup_shared_info(int xc_handle,
     return 0;
 }
 
+static void
+set_opt_features(int xc_handle, uint32_t dom)
+{
+    DECLARE_DOMCTL;
+    uint64_t os_type;
+
+    if (xc_get_hvm_param(xc_handle, dom, HVM_PARAM_GOS_TYPE, &os_type)) {
+        PERROR("Failed to get guest OS type, assuming default.\n");
+        return;
+    }
+
+    domctl.cmd = XEN_DOMCTL_set_opt_feature;
+    domctl.domain = (domid_t)dom;
+
+    if (!strncmp("windows", (char *)&os_type, sizeof(os_type))) {
+        DPRINTF("Enabling Windows guest OS optimizations\n");
+
+        /* Windows identity maps regions 4 & 5 */
+        domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG4;
+        domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON;
+        domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D |
+                                                _PAGE_MA_WB | _PAGE_AR_RW);
+        domctl.u.set_opt_feature.optf.key = 0;
+        if (xc_domctl(xc_handle, &domctl))
+            PERROR("Failed to set region 4 identity mapping for Windows "
+                   "guest OS type.\n");
+
+        domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG5;
+        domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON;
+        domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D |
+                                                _PAGE_MA_UC | _PAGE_AR_RW);
+        domctl.u.set_opt_feature.optf.key = 0;
+        if (xc_domctl(xc_handle, &domctl))
+            PERROR("Failed to set region 5 identity mapping for Windows "
+                   "guest OS type.\n");
+
+    } else if (!strncmp("linux", (char *)&os_type, sizeof(os_type))) {
+        DPRINTF("Enabling Linux guest OS optimizations\n");
+
+        /* Linux identity maps regions 7 */
+        domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7;
+        domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON;
+        domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D |
+                                                _PAGE_MA_WB | _PAGE_AR_RW);
+        domctl.u.set_opt_feature.optf.key = 0;
+        if (xc_domctl(xc_handle, &domctl))
+            PERROR("Failed to set region 7 identity mapping for Linux "
+                   "guest OS type.\n");
+    }
+
+    return;
+}
+
 /*
  * In this function, we will allocate memory and build P2M/M2P table for VTI
  * guest.  Frist, a pfn list will be initialized discontiguous, normal memory
@@ -990,6 +1058,8 @@ setup_guest(int xc_handle, uint32_t dom,
     if (xc_domctl(xc_handle, &domctl))
         goto error_out;
 
+    set_opt_features(xc_handle, dom);
+
     // Load guest firmware 
     if (xc_ia64_copy_to_domain_pages(xc_handle, dom, image,
                             (GFW_START + GFW_SIZE - image_size) >> PAGE_SHIFT,
diff -r 98defc4f3bf9 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Mon Nov 26 10:07:30 2007 -0700
+++ b/xen/arch/ia64/vmx/mmio.c  Tue Nov 27 09:21:20 2007 -0700
@@ -234,35 +234,6 @@ static int vmx_ide_pio_intercept(ioreq_t
 
 #define TO_LEGACY_IO(pa)  (((pa)>>12<<2)|((pa)&0x3))
 
-static const char * const guest_os_name[] = {
-    "Unknown",
-    "Windows 2003 server",
-    "Linux",
-};
-
-static inline void set_os_type(VCPU *v, u64 type)
-{
-    if (type > OS_BASE && type < OS_END) {
-        v->domain->arch.vmx_platform.gos_type = type;
-        gdprintk(XENLOG_INFO, "Guest OS : %s\n", guest_os_name[type - 
OS_BASE]);
-
-        if (GOS_WINDOWS(v)) {
-            struct xen_ia64_opt_feature optf;
-
-            /* Windows identity maps regions 4 & 5 */
-            optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG4;
-            optf.on = XEN_IA64_OPTF_ON;
-            optf.pgprot = (_PAGE_P|_PAGE_A|_PAGE_D|_PAGE_MA_WB|_PAGE_AR_RW);
-            optf.key = 0;
-            domain_opt_feature(v->domain, &optf);
-
-            optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG5;
-            optf.pgprot = (_PAGE_P|_PAGE_A|_PAGE_D|_PAGE_MA_UC|_PAGE_AR_RW);
-            domain_opt_feature(v->domain, &optf);
-        }
-    }
-}
-
 static void __vmx_identity_mapping_save(int on,
         const struct identity_mapping* im,
         struct hvm_hw_ia64_identity_mapping *im_save)
@@ -359,11 +330,6 @@ static void legacy_io_access(VCPU *vcpu,
 
     p->io_count++;
     
-    if (dir == IOREQ_WRITE && p->addr == OS_TYPE_PORT) {
-        set_os_type(v, *val);
-        return;
-    }
-
     if (vmx_ide_pio_intercept(p, val))
         return;
 
diff -r 98defc4f3bf9 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Mon Nov 26 10:07:30 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_init.c      Tue Nov 27 11:24:02 2007 -0700
@@ -396,7 +396,6 @@ vmx_final_setup_guest(struct vcpu *v)
        v->arch.privregs = (mapped_regs_t *)vpd;
        vpd->vpd_low.virt_env_vaddr = vm_buffer;
     
-       v->domain->arch.vmx_platform.gos_type = OS_UNKNOWN;
        /* Per-domain vTLB and vhpt implementation. Now vmx domain will stick
         * to this solution. Maybe it can be deferred until we know created
         * one as vmx domain */
diff -r 98defc4f3bf9 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Mon Nov 26 10:07:30 2007 -0700
+++ b/xen/include/asm-ia64/domain.h     Tue Nov 27 20:02:22 2007 -0700
@@ -75,11 +75,11 @@ struct xen_sal_data {
 };
 
 /*
- * Optimization features
- * are used by the hypervisor to do some optimizations for guests.
- * By default the optimizations are switched off and the guest has to activate
- * the feature. On PV the guest must do this via the hypercall
- * __HYPERVISOR_opt_feature, on HVM it's done within xen in set_os_type().
+ * Optimization features are used by the hypervisor to do some optimizations
+ * for guests.  By default the optimizations are switched off and the guest
+ * may activate the feature. The guest may do this via the hypercall
+ * __HYPERVISOR_opt_feature.  Domain builder code can also enable these
+ * via XEN_DOMCTL_set_opt_feature.
  */
 
 /*
@@ -100,20 +100,6 @@ struct opt_feature {
     struct identity_mapping im_reg5;   /* Region 5 identity mapping */
     struct identity_mapping im_reg7;   /* Region 7 identity mapping */
 };
-
-/*
- * The base XEN_IA64_OPTF_IDENT_MAP_REG7 is defined in public/arch-ia64.h.
- * Identity mapping of region 4 addresses in HVM.
- */
-#define XEN_IA64_OPTF_IDENT_MAP_REG4_BIT        \
-    (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 1)
-#define XEN_IA64_OPTF_IDENT_MAP_REG4            \
-    (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_BIT)
-/* Identity mapping of region 5 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG5_BIT        \
-    (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 2)
-#define XEN_IA64_OPTF_IDENT_MAP_REG5            \
-    (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_BIT)
 
 /* Set an optimization feature in the struct arch_domain. */
 extern int domain_opt_feature(struct domain *, struct xen_ia64_opt_feature*);
diff -r 98defc4f3bf9 xen/include/asm-ia64/vmx_platform.h
--- a/xen/include/asm-ia64/vmx_platform.h       Mon Nov 26 10:07:30 2007 -0700
+++ b/xen/include/asm-ia64/vmx_platform.h       Tue Nov 27 09:21:20 2007 -0700
@@ -24,25 +24,6 @@
 #include <asm/viosapic.h>
 #include <asm/hvm/vacpi.h>
 
-
-/* Value of guest os type */
-#define OS_BASE     0xB0
-#define OS_UNKNOWN  0xB0
-#define OS_WINDOWS  0xB1
-#define OS_LINUX    0xB2
-#define OS_END      0xB3
-
-#define GOS_WINDOWS(_v) \
-    ((_v)->domain->arch.vmx_platform.gos_type == OS_WINDOWS)
-
-#define GOS_LINUX(_v) \
-    ((_v)->domain->arch.vmx_platform.gos_type == OS_LINUX)
-
-/* port guest Firmware use to indicate os type 
- * this port is used to trigger SMI on x86,
- * it is not used on ia64 */
-#define OS_TYPE_PORT    0xB2
-
 struct vmx_ioreq_page {
     spinlock_t          lock;
     struct page_info   *page;
@@ -52,7 +33,6 @@ int vmx_set_ioreq_page(struct domain *d,
                        struct vmx_ioreq_page *iorp, unsigned long gmfn);
 
 typedef struct virtual_platform_def {
-    unsigned long               gos_type;
     struct vmx_ioreq_page       ioreq;
     struct vmx_ioreq_page       buf_ioreq;
     struct vmx_ioreq_page       buf_pioreq;
diff -r 98defc4f3bf9 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Mon Nov 26 10:07:30 2007 -0700
+++ b/xen/include/public/arch-ia64.h    Tue Nov 27 10:57:20 2007 -0700
@@ -605,6 +605,20 @@ struct xen_ia64_boot_param {
 #define XEN_IA64_OPTF_IDENT_MAP_REG7           \
        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_BIT)
 
+/* Identity mapping of region 4 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_BIT        \
+        (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4            \
+        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_BIT)
+
+/* Identity mapping of region 5 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_BIT        \
+        (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 2)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5            \
+        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_BIT)
+
+#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET  (0)
+
 struct xen_ia64_opt_feature {
        unsigned long cmd;              /* Which feature */
        unsigned char on;               /* Switch feature on/off */



_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.