Add a per-domain parameter in the control panel to specify shadow or hap. - Add a per-domain parameter "hap" in the control panel to specify shadow or hap. If hap=1 is set in the configuration file, hap is enabled; otherwise if hap=0, then hap is disabled. The hap default value is 1. Signed-off-by: Xu Dongxiao diff -r afa521cf82e6 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Sun Jan 27 17:25:56 2008 +0000 +++ b/tools/python/xen/lowlevel/xc/xc.c Tue Jan 29 11:22:35 2008 +0800 @@ -97,18 +97,17 @@ static PyObject *pyxc_domain_create(XcOb 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)) - return NULL; - + &dom, &ssidref, &pyhandle, &flags, &target)) + return NULL; if ( pyhandle != NULL ) { if ( !PyList_Check(pyhandle) || @@ -123,9 +122,6 @@ static PyObject *pyxc_domain_create(XcOb handle[i] = (uint8_t)PyInt_AsLong(p); } } - - if ( hvm ) - flags |= XEN_DOMCTL_CDF_hvm_guest; if ( (ret = xc_domain_create(self->xc_handle, ssidref, handle, flags, &dom)) < 0 ) diff -r afa521cf82e6 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Sun Jan 27 17:25:56 2008 +0000 +++ b/tools/python/xen/xend/XendConfig.py Tue Jan 29 11:05:33 2008 +0800 @@ -130,7 +130,7 @@ XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', '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 -r afa521cf82e6 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Sun Jan 27 17:25:56 2008 +0000 +++ b/tools/python/xen/xend/XendDomainInfo.py Tue Jan 29 13:57:24 2008 +0800 @@ -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 -r afa521cf82e6 tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Sun Jan 27 17:25:56 2008 +0000 +++ b/tools/python/xen/xm/create.py Tue Jan 29 11:10:35 2008 +0800 @@ -524,6 +524,11 @@ gopts.var('target', val='TARGET', 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 -r afa521cf82e6 tools/python/xen/xm/xenapi_create.py --- a/tools/python/xen/xm/xenapi_create.py Sun Jan 27 17:25:56 2008 +0000 +++ b/tools/python/xen/xm/xenapi_create.py Tue Jan 29 11:13:23 2008 +0800 @@ -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 -r afa521cf82e6 xen/arch/x86/mm/paging.c --- a/xen/arch/x86/mm/paging.c Sun Jan 27 17:25:56 2008 +0000 +++ b/xen/arch/x86/mm/paging.c Tue Jan 29 13:55:44 2008 +0800 @@ -28,7 +28,8 @@ #include #include -#define hap_enabled(d) (hvm_funcs.hap_supported && is_hvm_domain(d)) +#define hap_enabled(d) \ + (hvm_funcs.hap_supported && is_hvm_domain(d) && is_hap_on(d)) /* Printouts */ #define PAGING_PRINTK(_f, _a...) \ diff -r afa521cf82e6 xen/common/domain.c --- a/xen/common/domain.c Sun Jan 27 17:25:56 2008 +0000 +++ b/xen/common/domain.c Tue Jan 29 13:28:48 2008 +0800 @@ -196,7 +196,11 @@ struct domain *domain_create( return NULL; if ( domcr_flags & DOMCRF_hvm ) + { d->is_hvm = 1; + if ( domcr_flags & DOMCRF_hvm_hap ) + d->is_hap = 1; + } rangeset_domain_initialise(d); diff -r afa521cf82e6 xen/common/domctl.c --- a/xen/common/domctl.c Sun Jan 27 17:25:56 2008 +0000 +++ b/xen/common/domctl.c Tue Jan 29 13:54:07 2008 +0800 @@ -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_hvm_hap)) ) break; dom = op->domain; @@ -366,8 +367,13 @@ 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_hvm_hap ) + domcr_flags |= DOMCRF_hvm_hap; + } ret = -ENOMEM; d = domain_create(dom, domcr_flags, op->u.createdomain.ssidref); diff -r afa521cf82e6 xen/include/public/domctl.h --- a/xen/include/public/domctl.h Sun Jan 27 17:25:56 2008 +0000 +++ b/xen/include/public/domctl.h Tue Jan 29 11:26:10 2008 +0800 @@ -53,6 +53,8 @@ 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) +#define _XEN_DOMCTL_CDF_hvm_hap 1 +#define XEN_DOMCTL_CDF_hvm_hap (1U<<_XEN_DOMCTL_CDF_hvm_hap) uint32_t flags; }; typedef struct xen_domctl_createdomain xen_domctl_createdomain_t; diff -r afa521cf82e6 xen/include/xen/sched.h --- a/xen/include/xen/sched.h Sun Jan 27 17:25:56 2008 +0000 +++ b/xen/include/xen/sched.h Tue Jan 29 11:28:00 2008 +0800 @@ -187,6 +187,8 @@ struct domain /* Is this an HVM guest? */ bool_t is_hvm; + /* Is hap on? */ + bool_t is_hap; /* Is this guest fully privileged (aka dom0)? */ bool_t is_privileged; /* Which guest this guest has privileges on */ @@ -311,6 +313,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_hvm_hap 1 +#define DOMCRF_hvm_hap (1U<<_DOMCRF_hvm_hap) int construct_dom0( struct domain *d, @@ -508,6 +512,7 @@ static inline void vcpu_unblock(struct v #define VM_ASSIST(_d,_t) (test_bit((_t), &(_d)->vm_assist)) #define is_hvm_domain(d) ((d)->is_hvm) +#define is_hap_on(d) ((d)->is_hap) #define is_hvm_vcpu(v) (is_hvm_domain(v->domain)) extern enum cpufreq_controller {