WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

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

To: xen-ia64-devel <xen-ia64-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-ia64-devel] [PATCH 5/5] Implement guest_os_type for ia64
From: Alex Williamson <alex.williamson@xxxxxx>
Date: Tue, 27 Nov 2007 21:20:55 -0700
Delivery-date: Tue, 27 Nov 2007 20:21:35 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Organization: OSLO R&D
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
   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

<Prev in Thread] Current Thread [Next in Thread>