I really directly use copy/parse , thx for collecting me.
My purpose to use arch_setup for two reasons:
1. Do little change in common code.
2. I think building tools should not know much about how
to set identify mapping. It only needs tell XEN which region
should be identify mapping.
Of course, your implantation is more flexible, both method are ok for me.
Good good study,day day up ! ^_^
-Wing(zhang xin)
OTC,Intel Corporation
>-----Original Message-----
>From: Alex Williamson [mailto:alex.williamson@xxxxxx]
>Sent: 2007?11?28? 12:21
>To: xen-ia64-devel
>Cc: Zhang, Xing Z; Duan, Ronghui
>Subject: [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
|