[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |