From: Keir Fraser Date: Tue, 29 Jan 2008 13:46:16 +0000 (+0000) Subject: x86, hvm: Add a per-domain parameter to specify shadow or hap. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14358 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e0979793eac412156349d38207d913e4ef9424a2;p=xen.git x86, hvm: Add a per-domain parameter to specify shadow or hap. Signed-off-by: Xu Dongxiao --- diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 29a1bc0fd2..f766d28e77 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -97,18 +97,17 @@ static PyObject *pyxc_domain_create(XcObject *self, PyObject *kwds) { uint32_t dom = 0, ssidref = 0, flags = 0, target = 0; - int ret, i, hvm = 0; + int ret, i; PyObject *pyhandle = NULL; xen_domain_handle_t handle = { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef }; - static char *kwd_list[] = { "domid", "ssidref", "handle", "hvm", "target", NULL }; + static char *kwd_list[] = { "domid", "ssidref", "handle", "flags", "target", NULL }; if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|iiOii", kwd_list, - &dom, &ssidref, &pyhandle, &hvm, &target)) + &dom, &ssidref, &pyhandle, &flags, &target)) return NULL; - if ( pyhandle != NULL ) { if ( !PyList_Check(pyhandle) || @@ -124,9 +123,6 @@ static PyObject *pyxc_domain_create(XcObject *self, } } - if ( hvm ) - flags |= XEN_DOMCTL_CDF_hvm_guest; - if ( (ret = xc_domain_create(self->xc_handle, ssidref, handle, flags, &dom)) < 0 ) return pyxc_error_to_exception(); diff --git a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py index 67803517eb..f543e93f26 100644 --- a/tools/python/xen/xend/XendConfig.py +++ b/tools/python/xen/xend/XendConfig.py @@ -130,7 +130,7 @@ XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display', 'soundhw','stdvga', 'usb', 'usbdevice', 'vnc', 'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode', 'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt', - 'guest_os_type' ] + 'guest_os_type', 'hap'] # Xen API console 'other_config' keys. XENAPI_CONSOLE_OTHER_CFG = ['vncunused', 'vncdisplay', 'vnclisten', @@ -1593,3 +1593,6 @@ class XendConfig(dict): def image_type(self): stored_type = self['platform'].get('image_type') return stored_type or (self.is_hvm() and 'hvm' or 'linux') + + def is_hap(self): + return self['platform']['hap'] diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 7d0c43fc48..0f866f02a6 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -1626,11 +1626,18 @@ class XendDomainInfo: @raise: VmError on error """ + hvm_bit_offset = 0 + + hap_bit_offset = 1 + log.debug('XendDomainInfo.constructDomain') self.shutdownStartTime = None hvm = self.info.is_hvm() + + hap = self.info.is_hap() + if hvm: info = xc.xeninfo() if 'hvm' not in info['xen_caps']: @@ -1656,7 +1663,7 @@ class XendDomainInfo: domid = 0, ssidref = ssidref, handle = uuid.fromString(self.info['uuid']), - hvm = int(hvm), + flags = int((hvm << hvm_bit_offset) | (hap << hap_bit_offset)), target = self.info.target()) except Exception, e: # may get here if due to ACM the operation is not permitted diff --git a/tools/python/xen/xm/create.py b/tools/python/xen/xm/create.py index b201c548db..417589b07c 100644 --- a/tools/python/xen/xm/create.py +++ b/tools/python/xen/xm/create.py @@ -525,6 +525,11 @@ gopts.var('target', val='TARGET', fn=set_int, default=0, use="Set domain target.") +gopts.var('hap', val='HAP', + fn=set_int, default=1, + use="""Hap status (0=hap is disabled; + 1=hap is enabled.""") + def err(msg): """Print an error to stderr and exit. """ @@ -728,7 +733,7 @@ def configure_hvm(config_image, vals): 'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten', 'sdl', 'display', 'xauthority', 'rtc_timeoffset', 'monitor', 'acpi', 'apic', 'usb', 'usbdevice', 'keymap', 'pci', - 'guest_os_type'] + 'guest_os_type', 'hap'] for a in args: if a in vals.__dict__ and vals.__dict__[a] is not None: diff --git a/tools/python/xen/xm/xenapi_create.py b/tools/python/xen/xm/xenapi_create.py index 29ef6efb70..04abcc4e4e 100644 --- a/tools/python/xen/xm/xenapi_create.py +++ b/tools/python/xen/xm/xenapi_create.py @@ -818,7 +818,7 @@ class sxp2xml: def extract_platform(self, image, document): - platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode'] + platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode', 'hap'] def extract_platform_key(key): platform = document.createElement("platform") diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index 3ba5b996cc..0e54987a34 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -559,7 +559,7 @@ static int opt_pervcpu_vhpt = 1; integer_param("pervcpu_vhpt", opt_pervcpu_vhpt); #endif -int arch_domain_create(struct domain *d) +int arch_domain_create(struct domain *d, unsigned int domcr_flags) { int i; struct page_info *page = NULL; diff --git a/xen/arch/powerpc/domain.c b/xen/arch/powerpc/domain.c index 214a257385..3be2fdbe84 100644 --- a/xen/arch/powerpc/domain.c +++ b/xen/arch/powerpc/domain.c @@ -76,7 +76,7 @@ unsigned long hypercall_create_continuation(unsigned int op, return XEN_MARK(op); } -int arch_domain_create(struct domain *d) +int arch_domain_create(struct domain *d, unsigned int domcr_flags) { if (d->domain_id == IDLE_DOMAIN_ID) { d->shared_info = (void *)alloc_xenheap_page(); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 618542f20f..9d0537a9f9 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -435,7 +435,7 @@ void vcpu_destroy(struct vcpu *v) hvm_vcpu_destroy(v); } -int arch_domain_create(struct domain *d) +int arch_domain_create(struct domain *d, unsigned int domcr_flags) { #ifdef __x86_64__ struct page_info *pg; @@ -445,6 +445,11 @@ int arch_domain_create(struct domain *d) int vcpuid, pdpt_order, paging_initialised = 0; int rc = -ENOMEM; + d->arch.hvm_domain.hap_enabled = + is_hvm_domain(d) && + hvm_funcs.hap_supported && + (domcr_flags & DOMCRF_hap); + d->arch.relmem = RELMEM_not_started; INIT_LIST_HEAD(&d->arch.relmem_list); diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index cb3e6a066d..ee98ae8c6a 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -710,7 +710,8 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn, { if ( !test_and_set_bool(d->arch.hvm_domain.amd_npt_4gb_warning) ) dprintk(XENLOG_WARNING, "Dom%d failed to populate memory beyond" - " 4GB: remove 'hap' Xen boot parameter.\n", + " 4GB: specify 'nohap' Xen boot parameter, or 'hap=0' " + "domain config option.\n", d->domain_id); return -EINVAL; } diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index cf5d54e210..c22818e755 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -28,7 +28,7 @@ #include #include -#define hap_enabled(d) (hvm_funcs.hap_supported && is_hvm_domain(d)) +#define hap_enabled(d) (is_hvm_domain(d) && (d)->arch.hvm_domain.hap_enabled) /* Printouts */ #define PAGING_PRINTK(_f, _a...) \ diff --git a/xen/common/domain.c b/xen/common/domain.c index a888d88d79..112978f82c 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -217,7 +217,7 @@ struct domain *domain_create( init_status |= INIT_gnttab; } - if ( arch_domain_create(d) != 0 ) + if ( arch_domain_create(d, domcr_flags) != 0 ) goto fail; init_status |= INIT_arch; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 83d191d93a..2660af36d8 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -338,7 +338,8 @@ resumedomain_out: ret = -EINVAL; if ( supervisor_mode_kernel || - (op->u.createdomain.flags & ~XEN_DOMCTL_CDF_hvm_guest) ) + (op->u.createdomain.flags & + ~(XEN_DOMCTL_CDF_hvm_guest | XEN_DOMCTL_CDF_hap)) ) break; dom = op->domain; @@ -368,6 +369,8 @@ resumedomain_out: domcr_flags = 0; if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hvm_guest ) domcr_flags |= DOMCRF_hvm; + if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hap ) + domcr_flags |= DOMCRF_hap; ret = -ENOMEM; d = domain_create(dom, domcr_flags, op->u.createdomain.ssidref); diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index 5a17c25076..0e6ee2ace4 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -77,7 +77,7 @@ struct hvm_domain { #if CONFIG_PAGING_LEVELS == 3 bool_t amd_npt_4gb_warning; #endif - + bool_t hap_enabled; bool_t qemu_mapcache_invalidate; }; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 99822e3d46..e40d34af1a 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -53,6 +53,9 @@ struct xen_domctl_createdomain { /* Is this an HVM guest (as opposed to a PV guest)? */ #define _XEN_DOMCTL_CDF_hvm_guest 0 #define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest) + /* Use hardware-assisted paging if available? */ +#define _XEN_DOMCTL_CDF_hap 1 +#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap) uint32_t flags; }; typedef struct xen_domctl_createdomain xen_domctl_createdomain_t; diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index 2b3a24cb2d..ff471ab930 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -40,7 +40,7 @@ void free_vcpu_struct(struct vcpu *v); int vcpu_initialise(struct vcpu *v); void vcpu_destroy(struct vcpu *v); -int arch_domain_create(struct domain *d); +int arch_domain_create(struct domain *d, unsigned int domcr_flags); void arch_domain_destroy(struct domain *d); diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 83ea5a99c5..dc79463ba7 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -311,6 +311,8 @@ struct domain *domain_create( /* DOMCRF_hvm: Create an HVM domain, as opposed to a PV domain. */ #define _DOMCRF_hvm 0 #define DOMCRF_hvm (1U<<_DOMCRF_hvm) +#define _DOMCRF_hap 1 +#define DOMCRF_hap (1U<<_DOMCRF_hap) int construct_dom0( struct domain *d,