From: George Dunlap <george.dunlap@citrix.com>
To: Roger Pau Monne <roger.pau@citrix.com>, xen-devel@lists.xenproject.org
Cc: Elena Ufimtseva <elena.ufimtseva@oracle.com>,
Kevin Tian <kevin.tian@intel.com>,
Tamas K Lengyel <tamas@tklengyel.com>,
Wei Liu <wei.liu2@citrix.com>,
Jun Nakajima <jun.nakajima@intel.com>,
Razvan Cojocaru <rcojocaru@bitdefender.com>,
George Dunlap <george.dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
Paul Durrant <paul.durrant@citrix.com>,
Jan Beulich <jbeulich@suse.com>
Subject: Re: [PATCH v2 1/3] x86: remove PVHv1 code
Date: Wed, 1 Mar 2017 12:35:34 +0000 [thread overview]
Message-ID: <d29f64c0-15e9-f153-f9fc-e76207ae566f@citrix.com> (raw)
In-Reply-To: <20170228173941.69473-2-roger.pau@citrix.com>
On 28/02/17 17:39, Roger Pau Monne wrote:
> This removal applies to both the hypervisor and the toolstack side of PVHv1.
>
> Note that on the toolstack side there's one hiccup: on xl the "pvh"
> configuration option is translated to builder="hvm",
> device_model_version="none". This is done because otherwise xl would start
> parsing PV like options, and filling the PV struct at libxl_domain_build_info
> (which in turn pollutes the HVM one because it's a union).
>
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
MM bits:
Acked-by: George Dunlap <george.dunlap@citrix.com>
> ---
> Changes since v1:
> - Remove dom0pvh option from the command line docs.
> - Bump domctl interface version due to the removed CDF flag.
>
> ---
> Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> Cc: Wei Liu <wei.liu2@citrix.com>
> Cc: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> Cc: Paul Durrant <paul.durrant@citrix.com>
> Cc: Jun Nakajima <jun.nakajima@intel.com>
> Cc: Kevin Tian <kevin.tian@intel.com>
> Cc: George Dunlap <george.dunlap@eu.citrix.com>
> Cc: Razvan Cojocaru <rcojocaru@bitdefender.com>
> Cc: Tamas K Lengyel <tamas@tklengyel.com>
> ---
> docs/man/xl.cfg.pod.5.in | 10 +-
> docs/misc/pvh-readme.txt | 63 --------
> docs/misc/xen-command-line.markdown | 7 -
> tools/debugger/gdbsx/xg/xg_main.c | 4 +-
> tools/libxc/include/xc_dom.h | 1 -
> tools/libxc/include/xenctrl.h | 2 +-
> tools/libxc/xc_cpuid_x86.c | 13 +-
> tools/libxc/xc_dom_core.c | 9 --
> tools/libxc/xc_dom_x86.c | 49 +++---
> tools/libxc/xc_domain.c | 1 -
> tools/libxl/libxl_create.c | 31 ++--
> tools/libxl/libxl_dom.c | 1 -
> tools/libxl/libxl_internal.h | 1 -
> tools/libxl/libxl_x86.c | 7 +-
> tools/xl/xl_parse.c | 10 +-
> xen/arch/x86/cpu/vpmu.c | 3 +-
> xen/arch/x86/domain.c | 42 +-----
> xen/arch/x86/domain_build.c | 287 +-----------------------------------
> xen/arch/x86/domctl.c | 7 +-
> xen/arch/x86/hvm/hvm.c | 81 +---------
> xen/arch/x86/hvm/hypercall.c | 4 +-
> xen/arch/x86/hvm/io.c | 2 -
> xen/arch/x86/hvm/ioreq.c | 3 +-
> xen/arch/x86/hvm/irq.c | 3 -
> xen/arch/x86/hvm/vmx/vmcs.c | 35 +----
> xen/arch/x86/hvm/vmx/vmx.c | 12 +-
> xen/arch/x86/mm.c | 2 +-
> xen/arch/x86/mm/p2m-pt.c | 2 +-
> xen/arch/x86/mm/p2m.c | 6 +-
> xen/arch/x86/physdev.c | 8 -
> xen/arch/x86/setup.c | 7 -
> xen/arch/x86/time.c | 27 ----
> xen/common/domain.c | 2 -
> xen/common/domctl.c | 10 --
> xen/common/kernel.c | 5 -
> xen/common/vm_event.c | 8 +-
> xen/include/asm-x86/domain.h | 1 -
> xen/include/asm-x86/hvm/hvm.h | 3 -
> xen/include/public/domctl.h | 14 +-
> xen/include/xen/sched.h | 9 +-
> 40 files changed, 96 insertions(+), 696 deletions(-)
> delete mode 100644 docs/misc/pvh-readme.txt
>
> diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in
> index 505c111..da1fdd7 100644
> --- a/docs/man/xl.cfg.pod.5.in
> +++ b/docs/man/xl.cfg.pod.5.in
> @@ -1064,6 +1064,12 @@ FIFO-based event channel ABI support up to 131,071 event channels.
> Other guests are limited to 4095 (64-bit x86 and ARM) or 1023 (32-bit
> x86).
>
> +=item B<pvh=BOOLEAN>
> +
> +Selects whether to run this PV guest in an HVM container. Default is 0.
> +Note that this option is equivalent to setting builder="hvm" and
> +device_model_version="none"
> +
> =back
>
> =head2 Paravirtualised (PV) Guest Specific Options
> @@ -1108,10 +1114,6 @@ if your particular guest kernel does not require this behaviour then
> it is safe to allow this to be enabled but you may wish to disable it
> anyway.
>
> -=item B<pvh=BOOLEAN>
> -
> -Selects whether to run this PV guest in an HVM container. Default is 0.
> -
> =back
>
> =head2 Fully-virtualised (HVM) Guest Specific Options
> diff --git a/docs/misc/pvh-readme.txt b/docs/misc/pvh-readme.txt
> deleted file mode 100644
> index c5b3de4..0000000
> --- a/docs/misc/pvh-readme.txt
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -
> -PVH : an x86 PV guest running in an HVM container.
> -
> -See: http://blog.xen.org/index.php/2012/10/23/the-paravirtualization-spectrum-part-1-the-ends-of-the-spectrum/
> -
> -At the moment HAP is required for PVH.
> -
> -At present the only PVH guest is an x86 64bit PV linux. Patches are at:
> - git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git
> -
> -A PVH guest kernel must support following features, as defined for linux
> -in arch/x86/xen/xen-head.S:
> -
> - #define FEATURES_PVH "|writable_descriptor_tables" \
> - "|auto_translated_physmap" \
> - "|supervisor_mode_kernel" \
> - "|hvm_callback_vector"
> -
> -In a nutshell:
> -* the guest uses auto translate:
> - - p2m is managed by xen
> - - pagetables are owned by the guest
> - - mmu_update hypercall not available
> -* it uses event callback and not vlapic emulation,
> -* IDT is native, so set_trap_table hcall is also N/A for a PVH guest.
> -
> -For a full list of hcalls supported for PVH, see pvh_hypercall64_table
> -in arch/x86/hvm/hvm.c in xen. From the ABI prespective, it's mostly a
> -PV guest with auto translate, although it does use hvm_op for setting
> -callback vector, and has a special version of arch_set_guest_info for bringing
> -up secondary cpus.
> -
> -The initial phase targets the booting of a 64bit UP/SMP linux guest in PVH
> -mode. This is done by adding: pvh=1 in the config file. xl, and not xm, is
> -supported. Phase I patches are broken into three parts:
> - - xen changes for booting of 64bit PVH guest
> - - tools changes for creating a PVH guest
> - - boot of 64bit dom0 in PVH mode.
> -
> -To boot 64bit dom0 in PVH mode, add dom0pvh to grub xen command line.
> -
> -Following fixme's exist in the code:
> - - arch/x86/time.c: support more tsc modes.
> -
> -Following remain to be done for PVH:
> - - Get rid of PVH mode, make it just HVM with some flags set
> - - implement arch_get_info_guest() for pvh.
> - - Investigate what else needs to be done for VMI support.
> - - AMD port.
> - - 32bit PVH guest support in both linux and xen. Xen changes are tagged
> - "32bitfixme".
> - - Add support for monitoring guest behavior. See hvm_memory_event* functions
> - in hvm.c
> - - vcpu hotplug support
> - - Live migration of PVH guests.
> - - Avail PVH dom0 of posted interrupts. (This will be a big win).
> -
> -
> -Note, any emails to me must be cc'd to xen devel mailing list. OTOH, please
> -cc me on PVH emails to the xen devel mailing list.
> -
> -Mukesh Rathor
> -mukesh.rathor [at] oracle [dot] com
> diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown
> index 3acbb33..e069594 100644
> --- a/docs/misc/xen-command-line.markdown
> +++ b/docs/misc/xen-command-line.markdown
> @@ -675,13 +675,6 @@ Flag that makes a dom0 boot in PVHv2 mode.
>
> Flag that makes a dom0 use shadow paging.
>
> -### dom0pvh
> -> `= <boolean>`
> -
> -> Default: `false`
> -
> -Flag that makes a 64bit dom0 boot in PVH mode. No 32bit support at present.
> -
> ### dtuart (ARM)
> > `= path [:options]`
>
> diff --git a/tools/debugger/gdbsx/xg/xg_main.c b/tools/debugger/gdbsx/xg/xg_main.c
> index 8c8a402..7ebf914 100644
> --- a/tools/debugger/gdbsx/xg/xg_main.c
> +++ b/tools/debugger/gdbsx/xg/xg_main.c
> @@ -79,7 +79,6 @@ int xgtrc_on = 0;
> struct xen_domctl domctl; /* just use a global domctl */
>
> static int _hvm_guest; /* hvm guest? 32bit HVMs have 64bit context */
> -static int _pvh_guest; /* PV guest in HVM container */
> static domid_t _dom_id; /* guest domid */
> static int _max_vcpu_id; /* thus max_vcpu_id+1 VCPUs */
> static int _dom0_fd; /* fd of /dev/privcmd */
> @@ -308,7 +307,6 @@ xg_attach(int domid, int guest_bitness)
>
> _max_vcpu_id = domctl.u.getdomaininfo.max_vcpu_id;
> _hvm_guest = (domctl.u.getdomaininfo.flags & XEN_DOMINF_hvm_guest);
> - _pvh_guest = (domctl.u.getdomaininfo.flags & XEN_DOMINF_pvh_guest);
> return _max_vcpu_id;
> }
>
> @@ -369,7 +367,7 @@ _change_TF(vcpuid_t which_vcpu, int guest_bitness, int setit)
> int sz = sizeof(anyc);
>
> /* first try the MTF for hvm guest. otherwise do manually */
> - if (_hvm_guest || _pvh_guest) {
> + if (_hvm_guest) {
> domctl.u.debug_op.vcpu = which_vcpu;
> domctl.u.debug_op.op = setit ? XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON :
> XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF;
> diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
> index 608cbc2..b416eb5 100644
> --- a/tools/libxc/include/xc_dom.h
> +++ b/tools/libxc/include/xc_dom.h
> @@ -164,7 +164,6 @@ struct xc_dom_image {
> domid_t console_domid;
> domid_t xenstore_domid;
> xen_pfn_t shared_info_mfn;
> - int pvh_enabled;
>
> xc_interface *xch;
> domid_t guest_domid;
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index a48981a..a7083f8 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -443,7 +443,7 @@ typedef struct xc_dominfo {
> uint32_t ssidref;
> unsigned int dying:1, crashed:1, shutdown:1,
> paused:1, blocked:1, running:1,
> - hvm:1, debugged:1, pvh:1, xenstore:1, hap:1;
> + hvm:1, debugged:1, xenstore:1, hap:1;
> unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
> unsigned long nr_pages; /* current number, not maximum */
> unsigned long nr_outstanding_pages;
> diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c
> index 35ecca1..1bedf05 100644
> --- a/tools/libxc/xc_cpuid_x86.c
> +++ b/tools/libxc/xc_cpuid_x86.c
> @@ -167,7 +167,6 @@ struct cpuid_domain_info
> } vendor;
>
> bool hvm;
> - bool pvh;
> uint64_t xfeature_mask;
>
> uint32_t *featureset;
> @@ -231,7 +230,6 @@ static int get_cpuid_domain_info(xc_interface *xch, domid_t domid,
> return -ESRCH;
>
> info->hvm = di.hvm;
> - info->pvh = di.pvh;
>
> info->featureset = calloc(host_nr_features, sizeof(*info->featureset));
> if ( !info->featureset )
> @@ -682,13 +680,10 @@ static void sanitise_featureset(struct cpuid_domain_info *info)
> clear_bit(X86_FEATURE_SYSCALL, info->featureset);
> }
>
> - if ( !info->pvh )
> - {
> - clear_bit(X86_FEATURE_PSE, info->featureset);
> - clear_bit(X86_FEATURE_PSE36, info->featureset);
> - clear_bit(X86_FEATURE_PGE, info->featureset);
> - clear_bit(X86_FEATURE_PAGE1GB, info->featureset);
> - }
> + clear_bit(X86_FEATURE_PSE, info->featureset);
> + clear_bit(X86_FEATURE_PSE36, info->featureset);
> + clear_bit(X86_FEATURE_PGE, info->featureset);
> + clear_bit(X86_FEATURE_PAGE1GB, info->featureset);
> }
>
> if ( info->xfeature_mask == 0 )
> diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c
> index 36cd3c8..cf40343 100644
> --- a/tools/libxc/xc_dom_core.c
> +++ b/tools/libxc/xc_dom_core.c
> @@ -896,15 +896,6 @@ int xc_dom_parse_image(struct xc_dom_image *dom)
> goto err;
> }
>
> - if ( dom->pvh_enabled )
> - {
> - const char *pvh_features = "writable_descriptor_tables|"
> - "auto_translated_physmap|"
> - "supervisor_mode_kernel|"
> - "hvm_callback_vector";
> - elf_xen_parse_features(pvh_features, dom->f_requested, NULL);
> - }
> -
> /* check features */
> for ( i = 0; i < XENFEAT_NR_SUBMAPS; i++ )
> {
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index 6495e7f..c176c00 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -373,7 +373,7 @@ static x86_pgentry_t get_pg_prot_x86(struct xc_dom_image *dom, int l,
> unsigned m;
>
> prot = domx86->params->lvl_prot[l];
> - if ( l > 0 || dom->pvh_enabled )
> + if ( l > 0 )
> return prot;
>
> for ( m = 0; m < domx86->n_mappings; m++ )
> @@ -870,18 +870,15 @@ static int vcpu_x86_32(struct xc_dom_image *dom)
> DOMPRINTF("%s: cr3: pfn 0x%" PRIpfn " mfn 0x%" PRIpfn "",
> __FUNCTION__, dom->pgtables_seg.pfn, cr3_pfn);
>
> - if ( !dom->pvh_enabled )
> - {
> - ctxt->user_regs.ds = FLAT_KERNEL_DS_X86_32;
> - ctxt->user_regs.es = FLAT_KERNEL_DS_X86_32;
> - ctxt->user_regs.fs = FLAT_KERNEL_DS_X86_32;
> - ctxt->user_regs.gs = FLAT_KERNEL_DS_X86_32;
> - ctxt->user_regs.ss = FLAT_KERNEL_SS_X86_32;
> - ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_32;
> -
> - ctxt->kernel_ss = ctxt->user_regs.ss;
> - ctxt->kernel_sp = ctxt->user_regs.esp;
> - }
> + ctxt->user_regs.ds = FLAT_KERNEL_DS_X86_32;
> + ctxt->user_regs.es = FLAT_KERNEL_DS_X86_32;
> + ctxt->user_regs.fs = FLAT_KERNEL_DS_X86_32;
> + ctxt->user_regs.gs = FLAT_KERNEL_DS_X86_32;
> + ctxt->user_regs.ss = FLAT_KERNEL_SS_X86_32;
> + ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_32;
> +
> + ctxt->kernel_ss = ctxt->user_regs.ss;
> + ctxt->kernel_sp = ctxt->user_regs.esp;
>
> rc = xc_vcpu_setcontext(dom->xch, dom->guest_domid, 0, &any_ctx);
> if ( rc != 0 )
> @@ -916,18 +913,15 @@ static int vcpu_x86_64(struct xc_dom_image *dom)
> DOMPRINTF("%s: cr3: pfn 0x%" PRIpfn " mfn 0x%" PRIpfn "",
> __FUNCTION__, dom->pgtables_seg.pfn, cr3_pfn);
>
> - if ( !dom->pvh_enabled )
> - {
> - ctxt->user_regs.ds = FLAT_KERNEL_DS_X86_64;
> - ctxt->user_regs.es = FLAT_KERNEL_DS_X86_64;
> - ctxt->user_regs.fs = FLAT_KERNEL_DS_X86_64;
> - ctxt->user_regs.gs = FLAT_KERNEL_DS_X86_64;
> - ctxt->user_regs.ss = FLAT_KERNEL_SS_X86_64;
> - ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_64;
> -
> - ctxt->kernel_ss = ctxt->user_regs.ss;
> - ctxt->kernel_sp = ctxt->user_regs.esp;
> - }
> + ctxt->user_regs.ds = FLAT_KERNEL_DS_X86_64;
> + ctxt->user_regs.es = FLAT_KERNEL_DS_X86_64;
> + ctxt->user_regs.fs = FLAT_KERNEL_DS_X86_64;
> + ctxt->user_regs.gs = FLAT_KERNEL_DS_X86_64;
> + ctxt->user_regs.ss = FLAT_KERNEL_SS_X86_64;
> + ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_64;
> +
> + ctxt->kernel_ss = ctxt->user_regs.ss;
> + ctxt->kernel_sp = ctxt->user_regs.esp;
>
> rc = xc_vcpu_setcontext(dom->xch, dom->guest_domid, 0, &any_ctx);
> if ( rc != 0 )
> @@ -1106,7 +1100,7 @@ static int meminit_pv(struct xc_dom_image *dom)
> rc = x86_compat(dom->xch, dom->guest_domid, dom->guest_type);
> if ( rc )
> return rc;
> - if ( xc_dom_feature_translated(dom) && !dom->pvh_enabled )
> + if ( xc_dom_feature_translated(dom) )
> {
> dom->shadow_enabled = 1;
> rc = x86_shadow(dom->xch, dom->guest_domid);
> @@ -1594,9 +1588,6 @@ static int map_grant_table_frames(struct xc_dom_image *dom)
> {
> int i, rc;
>
> - if ( dom->pvh_enabled )
> - return 0;
> -
> for ( i = 0; ; i++ )
> {
> rc = xc_domain_add_to_physmap(dom->xch, dom->guest_domid,
> diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
> index d862e53..ea3f193 100644
> --- a/tools/libxc/xc_domain.c
> +++ b/tools/libxc/xc_domain.c
> @@ -370,7 +370,6 @@ int xc_domain_getinfo(xc_interface *xch,
> info->running = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_running);
> info->hvm = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_hvm_guest);
> info->debugged = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_debugged);
> - info->pvh = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_pvh_guest);
> info->xenstore = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_xs_domain);
> info->hap = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_hap);
>
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index e741b9a..c23ba2f 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -38,9 +38,6 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc,
> if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) {
> libxl_defbool_setdefault(&c_info->hap, true);
> libxl_defbool_setdefault(&c_info->oos, true);
> - } else {
> - libxl_defbool_setdefault(&c_info->pvh, false);
> - libxl_defbool_setdefault(&c_info->hap, libxl_defbool_val(c_info->pvh));
> }
>
> libxl_defbool_setdefault(&c_info->run_hotplug_scripts, true);
> @@ -475,8 +472,6 @@ int libxl__domain_build(libxl__gc *gc,
>
> break;
> case LIBXL_DOMAIN_TYPE_PV:
> - state->pvh_enabled = libxl_defbool_val(d_config->c_info.pvh);
> -
> ret = libxl__build_pv(gc, domid, info, state);
> if (ret)
> goto out;
> @@ -536,14 +531,6 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
> flags |= XEN_DOMCTL_CDF_hvm_guest;
> flags |= libxl_defbool_val(info->hap) ? XEN_DOMCTL_CDF_hap : 0;
> flags |= libxl_defbool_val(info->oos) ? 0 : XEN_DOMCTL_CDF_oos_off;
> - } else if (libxl_defbool_val(info->pvh)) {
> - flags |= XEN_DOMCTL_CDF_pvh_guest;
> - if (!libxl_defbool_val(info->hap)) {
> - LOGD(ERROR, *domid, "HAP must be on for PVH");
> - rc = ERROR_INVAL;
> - goto out;
> - }
> - flags |= XEN_DOMCTL_CDF_hap;
> }
>
> /* Ultimately, handle is an array of 16 uint8_t, same as uuid */
> @@ -859,6 +846,24 @@ static void initiate_domain_create(libxl__egc *egc,
> goto error_out;
> }
>
> + libxl_defbool_setdefault(&d_config->c_info.pvh, false);
> + if (libxl_defbool_val(d_config->c_info.pvh)) {
> + if (d_config->c_info.type != LIBXL_DOMAIN_TYPE_HVM) {
> + LOGD(ERROR, domid, "Invalid domain type for PVH: %s",
> + libxl_domain_type_to_string(d_config->c_info.type));
> + ret = ERROR_INVAL;
> + goto error_out;
> + }
> + if (d_config->b_info.device_model_version !=
> + LIBXL_DEVICE_MODEL_VERSION_NONE) {
> + LOGD(ERROR, domid, "Invalid device model version for PVH: %s",
> + libxl_device_model_version_to_string(
> + d_config->b_info.device_model_version));
> + ret = ERROR_INVAL;
> + goto error_out;
> + }
> + }
> +
> /* If target_memkb is smaller than max_memkb, the subsequent call
> * to libxc when building HVM domain will enable PoD mode.
> */
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index d519c8d..e133962 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -690,7 +690,6 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
> return ERROR_FAIL;
> }
>
> - dom->pvh_enabled = state->pvh_enabled;
> dom->container_type = XC_DOM_PV_CONTAINER;
>
> LOG(DEBUG, "pv kernel mapped %d path %s", state->pv_kernel.mapped, state->pv_kernel.path);
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 5bbede5..7722665 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -1129,7 +1129,6 @@ typedef struct {
> libxl__file_reference pv_kernel;
> libxl__file_reference pv_ramdisk;
> const char * pv_cmdline;
> - bool pvh_enabled;
>
> xen_vmemrange_t *vmemranges;
> uint32_t num_vmemranges;
> diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c
> index 5da7504..eb6bf66 100644
> --- a/tools/libxl/libxl_x86.c
> +++ b/tools/libxl/libxl_x86.c
> @@ -338,11 +338,8 @@ int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
> if (rtc_timeoffset)
> xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset);
>
> - if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM ||
> - libxl_defbool_val(d_config->c_info.pvh)) {
> -
> - unsigned long shadow;
> - shadow = (d_config->b_info.shadow_memkb + 1023) / 1024;
> + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM) {
> + unsigned long shadow = (d_config->b_info.shadow_memkb + 1023) / 1024;
> xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL);
> }
>
> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index 1ef0c27..bac40b7 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -760,7 +760,15 @@ void parse_config_data(const char *config_source,
> !strncmp(buf, "hvm", strlen(buf)))
> c_info->type = LIBXL_DOMAIN_TYPE_HVM;
>
> - xlu_cfg_get_defbool(config, "pvh", &c_info->pvh, 0);
> + if (!xlu_cfg_get_defbool(config, "pvh", &c_info->pvh, 0)) {
> + /* NB: we need to set the type here, or else we will fall into
> + * the PV path, and the set of options will be completely wrong
> + * (even more because the PV and HVM options are inside an union).
> + */
> + c_info->type = LIBXL_DOMAIN_TYPE_HVM;
> + b_info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_NONE;
> + }
> +
> xlu_cfg_get_defbool(config, "hap", &c_info->hap, 0);
>
> if (xlu_cfg_replace_string (config, "name", &c_info->name, 0)) {
> diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c
> index c8615e8..d319dea 100644
> --- a/xen/arch/x86/cpu/vpmu.c
> +++ b/xen/arch/x86/cpu/vpmu.c
> @@ -225,8 +225,7 @@ void vpmu_do_interrupt(struct cpu_user_regs *regs)
> if ( !vpmu->xenpmu_data )
> return;
>
> - if ( is_pvh_vcpu(sampling) &&
> - !(vpmu_mode & XENPMU_MODE_ALL) &&
> + if ( !(vpmu_mode & XENPMU_MODE_ALL) &&
> !vpmu->arch_vpmu_ops->do_interrupt(regs) )
> return;
>
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index 7d3071e..75ded25 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -328,7 +328,7 @@ int switch_compat(struct domain *d)
>
> if ( is_hvm_domain(d) || d->tot_pages != 0 )
> return -EACCES;
> - if ( is_pv_32bit_domain(d) || is_pvh_32bit_domain(d) )
> + if ( is_pv_32bit_domain(d) )
> return 0;
>
> d->arch.has_32bit_shinfo = 1;
> @@ -339,12 +339,7 @@ int switch_compat(struct domain *d)
> {
> rc = setup_compat_arg_xlat(v);
> if ( !rc )
> - {
> - if ( !is_pvh_domain(d) )
> - rc = setup_compat_l4(v);
> - else
> - rc = hvm_set_mode(v, 4);
> - }
> + rc = setup_compat_l4(v);
>
> if ( rc )
> goto undo_and_fail;
> @@ -363,7 +358,7 @@ int switch_compat(struct domain *d)
> {
> free_compat_arg_xlat(v);
>
> - if ( !is_pvh_domain(d) && !pagetable_is_null(v->arch.guest_table) )
> + if ( !pagetable_is_null(v->arch.guest_table) )
> release_compat_l4(v);
> }
>
> @@ -873,7 +868,7 @@ int arch_set_info_guest(
>
> /* The context is a compat-mode one if the target domain is compat-mode;
> * we expect the tools to DTRT even in compat-mode callers. */
> - compat = is_pv_32bit_domain(d) || is_pvh_32bit_domain(d);
> + compat = is_pv_32bit_domain(d);
>
> #define c(fld) (compat ? (c.cmp->fld) : (c.nat->fld))
> flags = c(flags);
> @@ -925,18 +920,6 @@ int arch_set_info_guest(
> (c(ldt_ents) > 8192) )
> return -EINVAL;
> }
> - else if ( is_pvh_domain(d) )
> - {
> - if ( c(ctrlreg[0]) || c(ctrlreg[1]) || c(ctrlreg[2]) ||
> - c(ctrlreg[4]) || c(ctrlreg[5]) || c(ctrlreg[6]) ||
> - c(ctrlreg[7]) || c(ldt_base) || c(ldt_ents) ||
> - c(user_regs.cs) || c(user_regs.ss) || c(user_regs.es) ||
> - c(user_regs.ds) || c(user_regs.fs) || c(user_regs.gs) ||
> - c(kernel_ss) || c(kernel_sp) || c(gdt_ents) ||
> - (!compat && (c.nat->gs_base_kernel ||
> - c.nat->fs_base || c.nat->gs_base_user)) )
> - return -EINVAL;
> - }
>
> v->fpu_initialised = !!(flags & VGCF_I387_VALID);
>
> @@ -992,21 +975,7 @@ int arch_set_info_guest(
> v->arch.debugreg[i] = c(debugreg[i]);
>
> hvm_set_info_guest(v);
> -
> - if ( is_hvm_domain(d) || v->is_initialised )
> - goto out;
> -
> - /* NB: No need to use PV cr3 un-pickling macros */
> - cr3_gfn = c(ctrlreg[3]) >> PAGE_SHIFT;
> - cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
> -
> - v->arch.cr3 = page_to_maddr(cr3_page);
> - v->arch.hvm_vcpu.guest_cr[3] = c(ctrlreg[3]);
> - v->arch.guest_table = pagetable_from_page(cr3_page);
> -
> - ASSERT(paging_mode_enabled(d));
> -
> - goto pvh_skip_pv_stuff;
> + goto out;
> }
>
> init_int80_direct_trap(v);
> @@ -1259,7 +1228,6 @@ int arch_set_info_guest(
>
> clear_bit(_VPF_in_reset, &v->pause_flags);
>
> - pvh_skip_pv_stuff:
> if ( v->vcpu_id == 0 )
> update_domain_wallclock_time(d);
>
> diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
> index 506780f..88f65cb 100644
> --- a/xen/arch/x86/domain_build.c
> +++ b/xen/arch/x86/domain_build.c
> @@ -471,141 +471,6 @@ static void __init process_dom0_ioports_disable(struct domain *dom0)
> }
> }
>
> -static __init void pvh_add_mem_mapping(struct domain *d, unsigned long gfn,
> - unsigned long mfn, unsigned long nr_mfns)
> -{
> - unsigned long i;
> - p2m_access_t a;
> - mfn_t omfn;
> - p2m_type_t t;
> - int rc;
> -
> - for ( i = 0; i < nr_mfns; i++ )
> - {
> - if ( !iomem_access_permitted(d, mfn + i, mfn + i) )
> - {
> - omfn = get_gfn_query_unlocked(d, gfn + i, &t);
> - guest_physmap_remove_page(d, _gfn(gfn + i), omfn, PAGE_ORDER_4K);
> - continue;
> - }
> -
> - if ( rangeset_contains_singleton(mmio_ro_ranges, mfn + i) )
> - a = p2m_access_r;
> - else
> - a = p2m_access_rw;
> -
> - if ( (rc = set_mmio_p2m_entry(d, gfn + i, _mfn(mfn + i),
> - PAGE_ORDER_4K, a)) )
> - panic("pvh_add_mem_mapping: gfn:%lx mfn:%lx i:%ld rc:%d\n",
> - gfn, mfn, i, rc);
> - if ( !(i & 0xfffff) )
> - process_pending_softirqs();
> - }
> -}
> -
> -/*
> - * Set the 1:1 map for all non-RAM regions for dom 0. Thus, dom0 will have
> - * the entire io region mapped in the EPT/NPT.
> - *
> - * pvh fixme: The following doesn't map MMIO ranges when they sit above the
> - * highest E820 covered address.
> - */
> -static __init void pvh_map_all_iomem(struct domain *d, unsigned long nr_pages)
> -{
> - unsigned long start_pfn, end_pfn, end = 0, start = 0;
> - const struct e820entry *entry;
> - unsigned long nump, nmap, navail, mfn, nr_holes = 0;
> - unsigned int i;
> - struct page_info *page;
> - int rc;
> -
> - for ( i = 0, entry = e820.map; i < e820.nr_map; i++, entry++ )
> - {
> - end = entry->addr + entry->size;
> -
> - if ( entry->type == E820_RAM || entry->type == E820_UNUSABLE ||
> - i == e820.nr_map - 1 )
> - {
> - start_pfn = PFN_DOWN(start);
> -
> - /* Unused RAM areas are marked UNUSABLE, so skip them too */
> - if ( entry->type == E820_RAM || entry->type == E820_UNUSABLE )
> - end_pfn = PFN_UP(entry->addr);
> - else
> - end_pfn = PFN_UP(end);
> -
> - if ( start_pfn < end_pfn )
> - {
> - nump = end_pfn - start_pfn;
> - /* Add pages to the mapping */
> - pvh_add_mem_mapping(d, start_pfn, start_pfn, nump);
> - if ( start_pfn < nr_pages )
> - nr_holes += (end_pfn < nr_pages) ?
> - nump : (nr_pages - start_pfn);
> - }
> - start = end;
> - }
> - }
> -
> - /*
> - * Some BIOSes may not report io space above ram that is less than 4GB. So
> - * we map any non-ram upto 4GB.
> - */
> - if ( end < GB(4) )
> - {
> - start_pfn = PFN_UP(end);
> - end_pfn = (GB(4)) >> PAGE_SHIFT;
> - nump = end_pfn - start_pfn;
> - pvh_add_mem_mapping(d, start_pfn, start_pfn, nump);
> - }
> -
> - /*
> - * Add the memory removed by the holes at the end of the
> - * memory map.
> - */
> - page = page_list_first(&d->page_list);
> - for ( i = 0, entry = e820.map; i < e820.nr_map && nr_holes > 0;
> - i++, entry++ )
> - {
> - if ( entry->type != E820_RAM )
> - continue;
> -
> - end_pfn = PFN_UP(entry->addr + entry->size);
> - if ( end_pfn <= nr_pages )
> - continue;
> -
> - navail = end_pfn - nr_pages;
> - nmap = min(navail, nr_holes);
> - nr_holes -= nmap;
> - start_pfn = max_t(unsigned long, nr_pages, PFN_DOWN(entry->addr));
> - /*
> - * Populate this memory region using the pages
> - * previously removed by the MMIO holes.
> - */
> - do
> - {
> - mfn = page_to_mfn(page);
> - if ( get_gpfn_from_mfn(mfn) != INVALID_M2P_ENTRY )
> - continue;
> -
> - rc = guest_physmap_add_page(d, _gfn(start_pfn), _mfn(mfn), 0);
> - if ( rc != 0 )
> - panic("Unable to add gpfn %#lx mfn %#lx to Dom0 physmap: %d",
> - start_pfn, mfn, rc);
> - start_pfn++;
> - nmap--;
> - if ( !(nmap & 0xfffff) )
> - process_pending_softirqs();
> - } while ( ((page = page_list_next(page, &d->page_list)) != NULL)
> - && nmap );
> - ASSERT(nmap == 0);
> - if ( page == NULL )
> - break;
> - }
> -
> - ASSERT(nr_holes == 0);
> -}
> -
> static __init void pvh_setup_e820(struct domain *d, unsigned long nr_pages)
> {
> struct e820entry *entry, *entry_guest;
> @@ -676,12 +541,6 @@ static __init void pvh_setup_e820(struct domain *d, unsigned long nr_pages)
> static __init void dom0_update_physmap(struct domain *d, unsigned long pfn,
> unsigned long mfn, unsigned long vphysmap_s)
> {
> - if ( is_pvh_domain(d) )
> - {
> - int rc = guest_physmap_add_page(d, _gfn(pfn), _mfn(mfn), 0);
> - BUG_ON(rc);
> - return;
> - }
> if ( !is_pv_32bit_domain(d) )
> ((unsigned long *)vphysmap_s)[pfn] = mfn;
> else
> @@ -690,78 +549,6 @@ static __init void dom0_update_physmap(struct domain *d, unsigned long pfn,
> set_gpfn_from_mfn(mfn, pfn);
> }
>
> -/* Replace mfns with pfns in dom0 page tables */
> -static __init void pvh_fixup_page_tables_for_hap(struct vcpu *v,
> - unsigned long v_start,
> - unsigned long v_end)
> -{
> - int i, j, k;
> - l4_pgentry_t *pl4e, *l4start;
> - l3_pgentry_t *pl3e;
> - l2_pgentry_t *pl2e;
> - l1_pgentry_t *pl1e;
> - unsigned long cr3_pfn;
> -
> - ASSERT(paging_mode_enabled(v->domain));
> -
> - l4start = map_domain_page(_mfn(pagetable_get_pfn(v->arch.guest_table)));
> -
> - /* Clear entries prior to guest L4 start */
> - pl4e = l4start + l4_table_offset(v_start);
> - memset(l4start, 0, (unsigned long)pl4e - (unsigned long)l4start);
> -
> - for ( ; pl4e <= l4start + l4_table_offset(v_end - 1); pl4e++ )
> - {
> - pl3e = map_l3t_from_l4e(*pl4e);
> - for ( i = 0; i < PAGE_SIZE / sizeof(*pl3e); i++, pl3e++ )
> - {
> - if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) )
> - continue;
> -
> - pl2e = map_l2t_from_l3e(*pl3e);
> - for ( j = 0; j < PAGE_SIZE / sizeof(*pl2e); j++, pl2e++ )
> - {
> - if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
> - continue;
> -
> - pl1e = map_l1t_from_l2e(*pl2e);
> - for ( k = 0; k < PAGE_SIZE / sizeof(*pl1e); k++, pl1e++ )
> - {
> - if ( !(l1e_get_flags(*pl1e) & _PAGE_PRESENT) )
> - continue;
> -
> - *pl1e = l1e_from_pfn(get_gpfn_from_mfn(l1e_get_pfn(*pl1e)),
> - l1e_get_flags(*pl1e));
> - }
> - unmap_domain_page(pl1e);
> - *pl2e = l2e_from_pfn(get_gpfn_from_mfn(l2e_get_pfn(*pl2e)),
> - l2e_get_flags(*pl2e));
> - }
> - unmap_domain_page(pl2e);
> - *pl3e = l3e_from_pfn(get_gpfn_from_mfn(l3e_get_pfn(*pl3e)),
> - l3e_get_flags(*pl3e));
> - }
> - unmap_domain_page(pl3e);
> - *pl4e = l4e_from_pfn(get_gpfn_from_mfn(l4e_get_pfn(*pl4e)),
> - l4e_get_flags(*pl4e));
> - }
> -
> - /* Clear entries post guest L4. */
> - if ( (unsigned long)pl4e & (PAGE_SIZE - 1) )
> - memset(pl4e, 0, PAGE_SIZE - ((unsigned long)pl4e & (PAGE_SIZE - 1)));
> -
> - unmap_domain_page(l4start);
> -
> - cr3_pfn = get_gpfn_from_mfn(paddr_to_pfn(v->arch.cr3));
> - v->arch.hvm_vcpu.guest_cr[3] = pfn_to_paddr(cr3_pfn);
> -
> - /*
> - * Finally, we update the paging modes (hap_update_paging_modes). This will
> - * create monitor_table for us, update v->arch.cr3, and update vmcs.cr3.
> - */
> - paging_update_paging_modes(v);
> -}
> -
> static __init void mark_pv_pt_pages_rdonly(struct domain *d,
> l4_pgentry_t *l4start,
> unsigned long vpt_start,
> @@ -1053,8 +840,6 @@ static int __init construct_dom0_pv(
> l3_pgentry_t *l3tab = NULL, *l3start = NULL;
> l2_pgentry_t *l2tab = NULL, *l2start = NULL;
> l1_pgentry_t *l1tab = NULL, *l1start = NULL;
> - paddr_t shared_info_paddr = 0;
> - u32 save_pvh_pg_mode = 0;
>
> /*
> * This fully describes the memory layout of the initial domain. All
> @@ -1135,13 +920,6 @@ static int __init construct_dom0_pv(
> rc = -EINVAL;
> goto out;
> }
> - if ( is_pvh_domain(d) &&
> - !test_bit(XENFEAT_hvm_callback_vector, parms.f_supported) )
> - {
> - printk("Kernel does not support PVH mode\n");
> - rc = -EINVAL;
> - goto out;
> - }
> }
>
> if ( compat32 )
> @@ -1207,12 +985,6 @@ static int __init construct_dom0_pv(
> sizeof(struct start_info) +
> sizeof(struct dom0_vga_console_info));
>
> - if ( is_pvh_domain(d) )
> - {
> - shared_info_paddr = round_pgup(vstartinfo_end) - v_start;
> - vstartinfo_end += PAGE_SIZE;
> - }
> -
> vpt_start = round_pgup(vstartinfo_end);
> for ( nr_pt_pages = 2; ; nr_pt_pages++ )
> {
> @@ -1458,11 +1230,6 @@ static int __init construct_dom0_pv(
> setup_dom0_vcpu(d, i, cpu);
> }
>
> - /*
> - * pvh: we temporarily disable d->arch.paging.mode so that we can build cr3
> - * needed to run on dom0's page tables.
> - */
> - save_pvh_pg_mode = d->arch.paging.mode;
> d->arch.paging.mode = 0;
>
> /* Set up CR3 value for write_ptbase */
> @@ -1532,25 +1299,6 @@ static int __init construct_dom0_pv(
> nr_pages);
> }
>
> - /*
> - * We enable paging mode again so guest_physmap_add_page and
> - * paging_set_allocation will do the right thing for us.
> - */
> - d->arch.paging.mode = save_pvh_pg_mode;
> -
> - if ( is_pvh_domain(d) )
> - {
> - bool preempted;
> -
> - do {
> - preempted = false;
> - paging_set_allocation(d, dom0_paging_pages(d, nr_pages),
> - &preempted);
> - process_pending_softirqs();
> - } while ( preempted );
> - }
> -
> -
> /* Write the phys->machine and machine->phys table entries. */
> for ( pfn = 0; pfn < count; pfn++ )
> {
> @@ -1628,15 +1376,6 @@ static int __init construct_dom0_pv(
> si->console.dom0.info_size = sizeof(struct dom0_vga_console_info);
> }
>
> - /*
> - * PVH: We need to update si->shared_info while we are on dom0 page tables,
> - * but need to defer the p2m update until after we have fixed up the
> - * page tables for PVH so that the m2p for the si pte entry returns
> - * correct pfn.
> - */
> - if ( is_pvh_domain(d) )
> - si->shared_info = shared_info_paddr;
> -
> if ( is_pv_32bit_domain(d) )
> xlat_start_info(si, XLAT_start_info_console_dom0);
>
> @@ -1670,16 +1409,8 @@ static int __init construct_dom0_pv(
> regs->_eflags = X86_EFLAGS_IF;
>
> #ifdef CONFIG_SHADOW_PAGING
> - if ( opt_dom0_shadow )
> - {
> - if ( is_pvh_domain(d) )
> - {
> - printk("Unsupported option dom0_shadow for PVH\n");
> - return -EINVAL;
> - }
> - if ( paging_enable(d, PG_SH_enable) == 0 )
> - paging_update_paging_modes(v);
> - }
> + if ( opt_dom0_shadow && paging_enable(d, PG_SH_enable) == 0 )
> + paging_update_paging_modes(v);
> #endif
>
> /*
> @@ -1696,20 +1427,6 @@ static int __init construct_dom0_pv(
> printk(" Xen warning: dom0 kernel broken ELF: %s\n",
> elf_check_broken(&elf));
>
> - if ( is_pvh_domain(d) )
> - {
> - /* finally, fixup the page table, replacing mfns with pfns */
> - pvh_fixup_page_tables_for_hap(v, v_start, v_end);
> -
> - /* the pt has correct pfn for si, now update the mfn in the p2m */
> - mfn = virt_to_mfn(d->shared_info);
> - pfn = shared_info_paddr >> PAGE_SHIFT;
> - dom0_update_physmap(d, pfn, mfn, 0);
> -
> - pvh_map_all_iomem(d, nr_pages);
> - pvh_setup_e820(d, nr_pages);
> - }
> -
> if ( d->domain_id == hardware_domid )
> iommu_hwdom_init(d);
>
> diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> index a3dd276..2c1893d 100644
> --- a/xen/arch/x86/domctl.c
> +++ b/xen/arch/x86/domctl.c
> @@ -618,9 +618,8 @@ long arch_do_domctl(
> break;
>
> case XEN_DOMCTL_get_address_size:
> - domctl->u.address_size.size =
> - (is_pv_32bit_domain(d) || is_pvh_32bit_domain(d)) ?
> - 32 : BITS_PER_LONG;
> + domctl->u.address_size.size = is_pv_32bit_domain(d) ? 32 :
> + BITS_PER_LONG;
> copyback = 1;
> break;
>
> @@ -1493,7 +1492,7 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c)
> {
> unsigned int i;
> const struct domain *d = v->domain;
> - bool_t compat = is_pv_32bit_domain(d) || is_pvh_32bit_domain(d);
> + bool_t compat = is_pv_32bit_domain(d);
> #define c(fld) (!compat ? (c.nat->fld) : (c.cmp->fld))
>
> if ( !is_pv_domain(d) )
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 9eeb0a2..b95b500 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -180,9 +180,6 @@ static int __init hvm_enable(void)
> printk("\n");
> }
>
> - if ( !fns->pvh_supported )
> - printk(XENLOG_INFO "HVM: PVH mode not supported on this platform\n");
> -
> if ( !opt_altp2m_enabled )
> hvm_funcs.altp2m_supported = 0;
>
> @@ -431,10 +428,6 @@ u64 hvm_get_guest_tsc_fixed(struct vcpu *v, uint64_t at_tsc)
>
> void hvm_migrate_timers(struct vcpu *v)
> {
> - /* PVH doesn't use rtc and emulated timers, it uses pvclock mechanism. */
> - if ( is_pvh_vcpu(v) )
> - return;
> -
> rtc_migrate_timers(v);
> pt_migrate(v);
> }
> @@ -594,19 +587,6 @@ static int hvm_print_line(
> return X86EMUL_OKAY;
> }
>
> -static int handle_pvh_io(
> - int dir, unsigned int port, unsigned int bytes, uint32_t *val)
> -{
> - struct domain *currd = current->domain;
> -
> - if ( dir == IOREQ_WRITE )
> - guest_io_write(port, bytes, *val, currd);
> - else
> - *val = guest_io_read(port, bytes, currd);
> -
> - return X86EMUL_OKAY;
> -}
> -
> int hvm_domain_initialise(struct domain *d)
> {
> int rc;
> @@ -618,22 +598,6 @@ int hvm_domain_initialise(struct domain *d)
> return -EINVAL;
> }
>
> - if ( is_pvh_domain(d) )
> - {
> - if ( !hvm_funcs.pvh_supported )
> - {
> - printk(XENLOG_G_WARNING "Attempt to create a PVH guest "
> - "on a system without necessary hardware support\n");
> - return -EINVAL;
> - }
> - if ( !hap_enabled(d) )
> - {
> - printk(XENLOG_G_INFO "PVH guest must have HAP on\n");
> - return -EINVAL;
> - }
> -
> - }
> -
> spin_lock_init(&d->arch.hvm_domain.irq_lock);
> spin_lock_init(&d->arch.hvm_domain.uc_lock);
> spin_lock_init(&d->arch.hvm_domain.write_map.lock);
> @@ -675,12 +639,6 @@ int hvm_domain_initialise(struct domain *d)
>
> hvm_ioreq_init(d);
>
> - if ( is_pvh_domain(d) )
> - {
> - register_portio_handler(d, 0, 0x10003, handle_pvh_io);
> - return 0;
> - }
> -
> hvm_init_guest_time(d);
>
> d->arch.hvm_domain.params[HVM_PARAM_TRIPLE_FAULT_REASON] = SHUTDOWN_reboot;
> @@ -723,9 +681,6 @@ int hvm_domain_initialise(struct domain *d)
>
> void hvm_domain_relinquish_resources(struct domain *d)
> {
> - if ( is_pvh_domain(d) )
> - return;
> -
> if ( hvm_funcs.nhvm_domain_relinquish_resources )
> hvm_funcs.nhvm_domain_relinquish_resources(d);
>
> @@ -754,9 +709,6 @@ void hvm_domain_destroy(struct domain *d)
>
> hvm_destroy_cacheattr_region_list(d);
>
> - if ( is_pvh_domain(d) )
> - return;
> -
> hvm_funcs.domain_destroy(d);
> rtc_deinit(d);
> stdvga_deinit(d);
> @@ -1525,13 +1477,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
>
> v->arch.hvm_vcpu.inject_event.vector = HVM_EVENT_VECTOR_UNSET;
>
> - if ( is_pvh_domain(d) )
> - {
> - /* This is for hvm_long_mode_enabled(v). */
> - v->arch.hvm_vcpu.guest_efer = EFER_LMA | EFER_LME;
> - return 0;
> - }
> -
> rc = setup_compat_arg_xlat(v); /* teardown: free_compat_arg_xlat() */
> if ( rc != 0 )
> goto fail4;
> @@ -1869,9 +1814,6 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
> __put_gfn(hostp2m, gfn);
>
> rc = 0;
> - if ( unlikely(is_pvh_domain(currd)) )
> - goto out;
> -
> if ( !handle_mmio_with_translation(gla, gpa >> PAGE_SHIFT, npfec) )
> hvm_inject_hw_exception(TRAP_gp_fault, 0);
> rc = 1;
> @@ -2211,15 +2153,6 @@ int hvm_set_cr0(unsigned long value, bool_t may_defer)
> (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
> goto gpf;
>
> - /* A pvh is not expected to change to real mode. */
> - if ( is_pvh_domain(d) &&
> - (value & (X86_CR0_PE | X86_CR0_PG)) != (X86_CR0_PG | X86_CR0_PE) )
> - {
> - printk(XENLOG_G_WARNING
> - "PVH attempting to turn off PE/PG. CR0:%lx\n", value);
> - goto gpf;
> - }
> -
> if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled &
> monitor_ctrlreg_bitmask(VM_EVENT_X86_CR0)) )
> {
> @@ -2384,11 +2317,6 @@ int hvm_set_cr4(unsigned long value, bool_t may_defer)
> "EFER.LMA is set");
> goto gpf;
> }
> - if ( is_pvh_vcpu(v) )
> - {
> - HVM_DBG_LOG(DBG_LEVEL_1, "32-bit PVH guest cleared CR4.PAE");
> - goto gpf;
> - }
> }
>
> old_cr = v->arch.hvm_vcpu.guest_cr[4];
> @@ -3542,8 +3470,7 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content,
> break;
>
> case MSR_IA32_APICBASE:
> - if ( unlikely(is_pvh_vcpu(v)) ||
> - !vlapic_msr_set(vcpu_vlapic(v), msr_content) )
> + if ( !vlapic_msr_set(vcpu_vlapic(v), msr_content) )
> goto gp_fault;
> break;
>
> @@ -4066,8 +3993,7 @@ static int hvmop_set_param(
> return -ESRCH;
>
> rc = -EINVAL;
> - if ( !has_hvm_container_domain(d) ||
> - (is_pvh_domain(d) && (a.index != HVM_PARAM_CALLBACK_IRQ)) )
> + if ( !has_hvm_container_domain(d) )
> goto out;
>
> rc = hvm_allow_set_param(d, &a);
> @@ -4322,8 +4248,7 @@ static int hvmop_get_param(
> return -ESRCH;
>
> rc = -EINVAL;
> - if ( !has_hvm_container_domain(d) ||
> - (is_pvh_domain(d) && (a.index != HVM_PARAM_CALLBACK_IRQ)) )
> + if ( !has_hvm_container_domain(d) )
> goto out;
>
> rc = hvm_allow_get_param(d, &a);
> diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> index 6499caa..8cc7cc6 100644
> --- a/xen/arch/x86/hvm/hypercall.c
> +++ b/xen/arch/x86/hvm/hypercall.c
> @@ -78,7 +78,7 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> switch ( cmd )
> {
> default:
> - if ( !is_pvh_vcpu(curr) || !is_hardware_domain(curr->domain) )
> + if ( !is_hardware_domain(curr->domain) )
> return -ENOSYS;
> /* fall through */
> case PHYSDEVOP_map_pirq:
> @@ -86,7 +86,7 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> case PHYSDEVOP_eoi:
> case PHYSDEVOP_irq_status_query:
> case PHYSDEVOP_get_free_pirq:
> - if ( !has_pirq(curr->domain) && !is_pvh_vcpu(curr) )
> + if ( !has_pirq(curr->domain) )
> return -ENOSYS;
> break;
> }
> diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
> index 205fb68..5016300 100644
> --- a/xen/arch/x86/hvm/io.c
> +++ b/xen/arch/x86/hvm/io.c
> @@ -84,8 +84,6 @@ bool hvm_emulate_one_insn(hvm_emulate_validate_t *validate)
> struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
> int rc;
>
> - ASSERT(!is_pvh_vcpu(curr));
> -
> hvm_emulate_init_once(&ctxt, validate, guest_cpu_user_regs());
>
> rc = hvm_emulate_one(&ctxt);
> diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c
> index ebb3eca..ad2edad 100644
> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -1387,8 +1387,7 @@ void hvm_ioreq_init(struct domain *d)
> spin_lock_init(&d->arch.hvm_domain.ioreq_server.lock);
> INIT_LIST_HEAD(&d->arch.hvm_domain.ioreq_server.list);
>
> - if ( !is_pvh_domain(d) )
> - register_portio_handler(d, 0xcf8, 4, hvm_access_cf8);
> + register_portio_handler(d, 0xcf8, 4, hvm_access_cf8);
> }
>
> /*
> diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
> index ff7d288..760544b 100644
> --- a/xen/arch/x86/hvm/irq.c
> +++ b/xen/arch/x86/hvm/irq.c
> @@ -423,9 +423,6 @@ struct hvm_intack hvm_vcpu_has_pending_irq(struct vcpu *v)
> && vcpu_info(v, evtchn_upcall_pending) )
> return hvm_intack_vector(plat->irq.callback_via.vector);
>
> - if ( is_pvh_vcpu(v) )
> - return hvm_intack_none;
> -
> if ( vlapic_accept_pic_intr(v) && plat->vpic[0].int_output )
> return hvm_intack_pic(0);
>
> diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
> index 03e68ad..f98a8b7 100644
> --- a/xen/arch/x86/hvm/vmx/vmcs.c
> +++ b/xen/arch/x86/hvm/vmx/vmcs.c
> @@ -1068,20 +1068,6 @@ static int construct_vmcs(struct vcpu *v)
> vmx_pin_based_exec_control & ~PIN_BASED_POSTED_INTERRUPT);
> }
>
> - if ( is_pvh_domain(d) )
> - {
> - /* Unrestricted guest (real mode for EPT) */
> - v->arch.hvm_vmx.secondary_exec_control &=
> - ~SECONDARY_EXEC_UNRESTRICTED_GUEST;
> -
> - /* Start in 64-bit mode. PVH 32bitfixme. */
> - vmentry_ctl |= VM_ENTRY_IA32E_MODE; /* GUEST_EFER.LME/LMA ignored */
> -
> - ASSERT(v->arch.hvm_vmx.exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS);
> - ASSERT(v->arch.hvm_vmx.exec_control & CPU_BASED_ACTIVATE_MSR_BITMAP);
> - ASSERT(!(v->arch.hvm_vmx.exec_control & CPU_BASED_RDTSC_EXITING));
> - }
> -
> vmx_update_cpu_exec_control(v);
>
> __vmwrite(VM_EXIT_CONTROLS, vmexit_ctl);
> @@ -1217,11 +1203,7 @@ static int construct_vmcs(struct vcpu *v)
> __vmwrite(GUEST_DS_AR_BYTES, 0xc093);
> __vmwrite(GUEST_FS_AR_BYTES, 0xc093);
> __vmwrite(GUEST_GS_AR_BYTES, 0xc093);
> - if ( is_pvh_domain(d) )
> - /* CS.L == 1, exec, read/write, accessed. */
> - __vmwrite(GUEST_CS_AR_BYTES, 0xa09b);
> - else
> - __vmwrite(GUEST_CS_AR_BYTES, 0xc09b); /* exec/read, accessed */
> + __vmwrite(GUEST_CS_AR_BYTES, 0xc09b); /* exec/read, accessed */
>
> /* Guest IDT. */
> __vmwrite(GUEST_IDTR_BASE, 0);
> @@ -1251,23 +1233,10 @@ static int construct_vmcs(struct vcpu *v)
> | (1U << TRAP_no_device);
> vmx_update_exception_bitmap(v);
>
> - /*
> - * In HVM domains, this happens on the realmode->paging
> - * transition. Since PVH never goes through this transition, we
> - * need to do it at start-of-day.
> - */
> - if ( is_pvh_domain(d) )
> - vmx_update_debug_state(v);
> -
> v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET;
> -
> - /* PVH domains always start in paging mode */
> - if ( is_pvh_domain(d) )
> - v->arch.hvm_vcpu.guest_cr[0] |= X86_CR0_PG;
> -
> hvm_update_guest_cr(v, 0);
>
> - v->arch.hvm_vcpu.guest_cr[4] = is_pvh_domain(d) ? X86_CR4_PAE : 0;
> + v->arch.hvm_vcpu.guest_cr[4] = 0;
> hvm_update_guest_cr(v, 4);
>
> if ( cpu_has_vmx_tpr_shadow )
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index 60b7c92..8404b03 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -2063,9 +2063,6 @@ static int vmx_set_mode(struct vcpu *v, int mode)
> {
> unsigned long attr;
>
> - if ( !is_pvh_vcpu(v) )
> - return 0;
> -
> ASSERT((mode == 4) || (mode == 8));
>
> attr = (mode == 4) ? 0xc09b : 0xa09b;
> @@ -2300,12 +2297,6 @@ const struct hvm_function_table * __init start_vmx(void)
> vmx_function_table.sync_pir_to_irr = NULL;
> }
>
> - if ( cpu_has_vmx_ept
> - && cpu_has_vmx_pat
> - && cpu_has_vmx_msr_bitmap
> - && cpu_has_vmx_secondary_exec_control )
> - vmx_function_table.pvh_supported = 1;
> -
> if ( cpu_has_vmx_tsc_scaling )
> vmx_function_table.tsc_scaling.ratio_frac_bits = 48;
>
> @@ -3800,8 +3791,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
> if ( exit_qualification & 0x10 )
> {
> /* INS, OUTS */
> - if ( unlikely(is_pvh_vcpu(v)) /* PVH fixme */ ||
> - !hvm_emulate_one_insn(x86_insn_is_portio) )
> + if ( !hvm_emulate_one_insn(x86_insn_is_portio) )
> hvm_inject_hw_exception(TRAP_gp_fault, 0);
> }
> else
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index 1661e66..12dabcf 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -3041,7 +3041,7 @@ static struct domain *get_pg_owner(domid_t domid)
> goto out;
> }
>
> - if ( !is_pvh_domain(curr) && unlikely(paging_mode_translate(curr)) )
> + if ( unlikely(paging_mode_translate(curr)) )
> {
> MEM_LOG("Cannot mix foreign mappings with translated domains");
> goto out;
> diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
> index bbfa54e..07e2ccd 100644
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -532,7 +532,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
>
> if ( unlikely(p2m_is_foreign(p2mt)) )
> {
> - /* pvh fixme: foreign types are only supported on ept at present */
> + /* hvm fixme: foreign types are only supported on ept at present */
> gdprintk(XENLOG_WARNING, "Unimplemented foreign p2m type.\n");
> return -EINVAL;
> }
> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> index 2eee9cd..a5651a3 100644
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -589,7 +589,7 @@ int p2m_alloc_table(struct p2m_domain *p2m)
> }
>
> /*
> - * pvh fixme: when adding support for pvh non-hardware domains, this path must
> + * hvm fixme: when adding support for pvh non-hardware domains, this path must
> * cleanup any foreign p2m types (release refcnts on them).
> */
> void p2m_teardown(struct p2m_domain *p2m)
> @@ -2411,10 +2411,10 @@ int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
> struct domain *fdom;
>
> ASSERT(tdom);
> - if ( foreigndom == DOMID_SELF || !is_pvh_domain(tdom) )
> + if ( foreigndom == DOMID_SELF )
> return -EINVAL;
> /*
> - * pvh fixme: until support is added to p2m teardown code to cleanup any
> + * hvm fixme: until support is added to p2m teardown code to cleanup any
> * foreign entries, limit this to hardware domain only.
> */
> if ( !is_hardware_domain(tdom) )
> diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c
> index fc45bfb..81cd6c9 100644
> --- a/xen/arch/x86/physdev.c
> +++ b/xen/arch/x86/physdev.c
> @@ -517,10 +517,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> struct vcpu *curr = current;
> struct physdev_set_iopl set_iopl;
>
> - ret = -ENOSYS;
> - if ( is_pvh_vcpu(curr) )
> - break;
> -
> ret = -EFAULT;
> if ( copy_from_guest(&set_iopl, arg, 1) != 0 )
> break;
> @@ -536,10 +532,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> struct vcpu *curr = current;
> struct physdev_set_iobitmap set_iobitmap;
>
> - ret = -ENOSYS;
> - if ( is_pvh_vcpu(curr) )
> - break;
> -
> ret = -EFAULT;
> if ( copy_from_guest(&set_iobitmap, arg, 1) != 0 )
> break;
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index dab67d5..4a807b8 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -62,10 +62,6 @@ integer_param("maxcpus", max_cpus);
>
> unsigned long __read_mostly cr4_pv32_mask;
>
> -/* Boot dom0 in pvh mode */
> -static bool_t __initdata opt_dom0pvh;
> -boolean_param("dom0pvh", opt_dom0pvh);
> -
> /* **** Linux config option: propagated to domain0. */
> /* "acpi=off": Sisables both ACPI table parsing and interpreter. */
> /* "acpi=force": Override the disable blacklist. */
> @@ -1545,9 +1541,6 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>
> init_guest_cpuid();
>
> - if ( opt_dom0pvh )
> - domcr_flags |= DOMCRF_pvh | DOMCRF_hap;
> -
> if ( dom0_pvh )
> {
> domcr_flags |= DOMCRF_hvm |
> diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
> index 3ad2ab0..b739dc8 100644
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -2013,33 +2013,6 @@ void tsc_set_info(struct domain *d,
> d->arch.vtsc = 0;
> return;
> }
> - if ( is_pvh_domain(d) )
> - {
> - /*
> - * PVH fixme: support more tsc modes.
> - *
> - * NB: The reason this is disabled here appears to be with
> - * additional support required to do the PV RDTSC emulation.
> - * Since we're no longer taking the PV emulation path for
> - * anything, we may be able to remove this restriction.
> - *
> - * pvhfixme: Experiments show that "default" works for PVH,
> - * but "always_emulate" does not for some reason. Figure out
> - * why.
> - */
> - switch ( tsc_mode )
> - {
> - case TSC_MODE_NEVER_EMULATE:
> - break;
> - default:
> - printk(XENLOG_WARNING
> - "PVH currently does not support tsc emulation. Setting timer_mode = never_emulate\n");
> - /* FALLTHRU */
> - case TSC_MODE_DEFAULT:
> - tsc_mode = TSC_MODE_NEVER_EMULATE;
> - break;
> - }
> - }
>
> switch ( d->arch.tsc_mode = tsc_mode )
> {
> diff --git a/xen/common/domain.c b/xen/common/domain.c
> index 4492c9c..b22aacc 100644
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -304,8 +304,6 @@ struct domain *domain_create(domid_t domid, unsigned int domcr_flags,
>
> if ( domcr_flags & DOMCRF_hvm )
> d->guest_type = guest_type_hvm;
> - else if ( domcr_flags & DOMCRF_pvh )
> - d->guest_type = guest_type_pvh;
> else
> d->guest_type = guest_type_pv;
>
> diff --git a/xen/common/domctl.c b/xen/common/domctl.c
> index 93e3029..951a5dc 100644
> --- a/xen/common/domctl.c
> +++ b/xen/common/domctl.c
> @@ -194,9 +194,6 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info)
> case guest_type_hvm:
> info->flags |= XEN_DOMINF_hvm_guest;
> break;
> - case guest_type_pvh:
> - info->flags |= XEN_DOMINF_pvh_guest;
> - break;
> default:
> break;
> }
> @@ -501,7 +498,6 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
> ret = -EINVAL;
> if ( (op->u.createdomain.flags &
> ~(XEN_DOMCTL_CDF_hvm_guest
> - | XEN_DOMCTL_CDF_pvh_guest
> | XEN_DOMCTL_CDF_hap
> | XEN_DOMCTL_CDF_s3_integrity
> | XEN_DOMCTL_CDF_oos_off
> @@ -532,15 +528,9 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
> rover = dom;
> }
>
> - if ( (op->u.createdomain.flags & XEN_DOMCTL_CDF_hvm_guest)
> - && (op->u.createdomain.flags & XEN_DOMCTL_CDF_pvh_guest) )
> - return -EINVAL;
> -
> 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_pvh_guest )
> - domcr_flags |= DOMCRF_pvh;
> if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hap )
> domcr_flags |= DOMCRF_hap;
> if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_s3_integrity )
> diff --git a/xen/common/kernel.c b/xen/common/kernel.c
> index 4b87c60..a4ae612 100644
> --- a/xen/common/kernel.c
> +++ b/xen/common/kernel.c
> @@ -324,11 +324,6 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> (1U << XENFEAT_highmem_assist) |
> (1U << XENFEAT_gnttab_map_avail_bits);
> break;
> - case guest_type_pvh:
> - fi.submap |= (1U << XENFEAT_hvm_safe_pvclock) |
> - (1U << XENFEAT_supervisor_mode_kernel) |
> - (1U << XENFEAT_hvm_callback_vector);
> - break;
> case guest_type_hvm:
> fi.submap |= (1U << XENFEAT_hvm_safe_pvclock) |
> (1U << XENFEAT_hvm_callback_vector) |
> diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c
> index 45046d1..0fe9a53 100644
> --- a/xen/common/vm_event.c
> +++ b/xen/common/vm_event.c
> @@ -606,8 +606,8 @@ int vm_event_domctl(struct domain *d, xen_domctl_vm_event_op_t *vec,
> struct p2m_domain *p2m = p2m_get_hostp2m(d);
>
> rc = -EOPNOTSUPP;
> - /* pvh fixme: p2m_is_foreign types need addressing */
> - if ( is_pvh_vcpu(current) || is_pvh_domain(hardware_domain) )
> + /* hvm fixme: p2m_is_foreign types need addressing */
> + if ( is_hvm_domain(hardware_domain) )
> break;
>
> rc = -ENODEV;
> @@ -707,8 +707,8 @@ int vm_event_domctl(struct domain *d, xen_domctl_vm_event_op_t *vec,
> {
> case XEN_VM_EVENT_ENABLE:
> rc = -EOPNOTSUPP;
> - /* pvh fixme: p2m_is_foreign types need addressing */
> - if ( is_pvh_vcpu(current) || is_pvh_domain(hardware_domain) )
> + /* hvm fixme: p2m_is_foreign types need addressing */
> + if ( is_hvm_domain(hardware_domain) )
> break;
>
> rc = -ENODEV;
> diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
> index 1beef2f..8f0edaf 100644
> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -15,7 +15,6 @@
> #define has_32bit_shinfo(d) ((d)->arch.has_32bit_shinfo)
> #define is_pv_32bit_domain(d) ((d)->arch.is_32bit_pv)
> #define is_pv_32bit_vcpu(v) (is_pv_32bit_domain((v)->domain))
> -#define is_pvh_32bit_domain(d) (is_pvh_domain(d) && has_32bit_shinfo(d))
>
> #define is_hvm_pv_evtchn_domain(d) (has_hvm_container_domain(d) && \
> d->arch.hvm_domain.irq.callback_via_type == HVMIRQ_callback_vector)
> diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
> index 87b203a..8c8c633 100644
> --- a/xen/include/asm-x86/hvm/hvm.h
> +++ b/xen/include/asm-x86/hvm/hvm.h
> @@ -91,9 +91,6 @@ struct hvm_function_table {
> /* Support Hardware-Assisted Paging? */
> bool_t hap_supported;
>
> - /* Necessary hardware support for PVH mode? */
> - bool_t pvh_supported;
> -
> /* Necessary hardware support for alternate p2m's? */
> bool altp2m_supported;
>
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index 85cbb7c..9e3ce21 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -37,7 +37,7 @@
> #include "hvm/save.h"
> #include "memory.h"
>
> -#define XEN_DOMCTL_INTERFACE_VERSION 0x0000000c
> +#define XEN_DOMCTL_INTERFACE_VERSION 0x0000000d
>
> /*
> * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
> @@ -60,11 +60,8 @@ struct xen_domctl_createdomain {
> /* Disable out-of-sync shadow page tables? */
> #define _XEN_DOMCTL_CDF_oos_off 3
> #define XEN_DOMCTL_CDF_oos_off (1U<<_XEN_DOMCTL_CDF_oos_off)
> - /* Is this a PVH guest (as opposed to an HVM or PV guest)? */
> -#define _XEN_DOMCTL_CDF_pvh_guest 4
> -#define XEN_DOMCTL_CDF_pvh_guest (1U<<_XEN_DOMCTL_CDF_pvh_guest)
> /* Is this a xenstore domain? */
> -#define _XEN_DOMCTL_CDF_xs_domain 5
> +#define _XEN_DOMCTL_CDF_xs_domain 4
> #define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain)
> uint32_t flags;
> struct xen_arch_domainconfig config;
> @@ -97,14 +94,11 @@ struct xen_domctl_getdomaininfo {
> /* Being debugged. */
> #define _XEN_DOMINF_debugged 6
> #define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
> -/* domain is PVH */
> -#define _XEN_DOMINF_pvh_guest 7
> -#define XEN_DOMINF_pvh_guest (1U<<_XEN_DOMINF_pvh_guest)
> /* domain is a xenstore domain */
> -#define _XEN_DOMINF_xs_domain 8
> +#define _XEN_DOMINF_xs_domain 7
> #define XEN_DOMINF_xs_domain (1U<<_XEN_DOMINF_xs_domain)
> /* domain has hardware assisted paging */
> -#define _XEN_DOMINF_hap 9
> +#define _XEN_DOMINF_hap 8
> #define XEN_DOMINF_hap (1U<<_XEN_DOMINF_hap)
> /* XEN_DOMINF_shutdown guest-supplied code. */
> #define XEN_DOMINF_shutdownmask 255
> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> index 0929c0b..cc11999 100644
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -312,7 +312,7 @@ struct evtchn_port_ops;
> * will be false, but has_hvm_container_* checks will be true.
> */
> enum guest_type {
> - guest_type_pv, guest_type_pvh, guest_type_hvm
> + guest_type_pv, guest_type_hvm
> };
>
> struct domain
> @@ -555,11 +555,8 @@ struct domain *domain_create(domid_t domid, unsigned int domcr_flags,
> /* DOMCRF_oos_off: dont use out-of-sync optimization for shadow page tables */
> #define _DOMCRF_oos_off 4
> #define DOMCRF_oos_off (1U<<_DOMCRF_oos_off)
> - /* DOMCRF_pvh: Create PV domain in HVM container. */
> -#define _DOMCRF_pvh 5
> -#define DOMCRF_pvh (1U<<_DOMCRF_pvh)
> /* DOMCRF_xs_domain: xenstore domain */
> -#define _DOMCRF_xs_domain 6
> +#define _DOMCRF_xs_domain 5
> #define DOMCRF_xs_domain (1U<<_DOMCRF_xs_domain)
>
> /*
> @@ -875,8 +872,6 @@ void watchdog_domain_destroy(struct domain *d);
>
> #define is_pv_domain(d) ((d)->guest_type == guest_type_pv)
> #define is_pv_vcpu(v) (is_pv_domain((v)->domain))
> -#define is_pvh_domain(d) ((d)->guest_type == guest_type_pvh)
> -#define is_pvh_vcpu(v) (is_pvh_domain((v)->domain))
> #define is_hvm_domain(d) ((d)->guest_type == guest_type_hvm)
> #define is_hvm_vcpu(v) (is_hvm_domain(v->domain))
> #define has_hvm_container_domain(d) ((d)->guest_type != guest_type_pv)
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-03-01 12:36 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-28 17:39 [PATCH v2 0/3] x86: remove PVHv1 Roger Pau Monne
2017-02-28 17:39 ` [PATCH v2 1/3] x86: remove PVHv1 code Roger Pau Monne
2017-02-28 17:44 ` Ian Jackson
2017-02-28 17:51 ` Roger Pau Monne
2017-03-01 13:53 ` Ian Jackson
2017-03-01 14:10 ` Roger Pau Monne
2017-03-01 14:18 ` Ian Jackson
2017-03-01 14:20 ` George Dunlap
2017-03-01 14:32 ` Roger Pau Monne
2017-03-01 14:51 ` Ian Jackson
2017-03-01 15:24 ` Roger Pau Monne
2017-03-01 15:30 ` Ian Jackson
2017-03-01 14:18 ` Roger Pau Monne
2017-03-01 12:07 ` Wei Liu
2017-02-28 17:47 ` Wei Liu
2017-02-28 18:05 ` Andrew Cooper
2017-03-01 12:35 ` George Dunlap [this message]
2017-03-01 13:20 ` Paul Durrant
2017-03-01 16:03 ` Elena Ufimtseva
2017-03-02 6:25 ` Tian, Kevin
2017-02-28 17:39 ` [PATCH v2 2/3] x86: remove has_hvm_container_{domain/vcpu} Roger Pau Monne
2017-02-28 17:52 ` Boris Ostrovsky
2017-03-01 12:36 ` George Dunlap
2017-02-28 17:39 ` [PATCH v2 3/3] x86/PVHv2: move pvh_setup_e820 together with the other pvh functions Roger Pau Monne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d29f64c0-15e9-f153-f9fc-e76207ae566f@citrix.com \
--to=george.dunlap@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=elena.ufimtseva@oracle.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=paul.durrant@citrix.com \
--cc=rcojocaru@bitdefender.com \
--cc=roger.pau@citrix.com \
--cc=tamas@tklengyel.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).