[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 2/4] x86: remove PVHv1 code
This removal applies to both the hypervisor and the toolstack side of PVHv1. Note that on the toolstack side a new PVH domain type is introduced to libxl. The "none" device model version is removed, together with the "pvh" field in the create info struct (the defines announcing those features are also removed from libxl.h). The canonical way to create a PVH guest in libxl is to add "pvh=1" to the guest config file. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Acked-by: Elena Ufimtseva <elena.ufimtseva@xxxxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> --- Changes since v1: - Remove dom0pvh option from the command line docs. - Bump domctl interface version due to the removed CDF flag. - Introduce LIBXL_DOMAIN_TYPE_PVH. - Remove "none" from the valid device model version options. - Update the xl.cfg(5) man page to reflect the changes. --- Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Elena Ufimtseva <elena.ufimtseva@xxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Paul Durrant <paul.durrant@xxxxxxxxxx> Cc: Jun Nakajima <jun.nakajima@xxxxxxxxx> Cc: Kevin Tian <kevin.tian@xxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx> Cc: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx> Cc: Tamas K Lengyel <tamas@xxxxxxxxxxxxx> --- docs/man/xl.cfg.pod.5.in | 16 +- 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.h | 22 +-- tools/libxl/libxl_console.c | 1 + tools/libxl/libxl_create.c | 64 +++----- tools/libxl/libxl_disk.c | 10 +- tools/libxl/libxl_dm.c | 2 + tools/libxl/libxl_dom.c | 86 ++++++----- tools/libxl/libxl_dom_save.c | 7 +- tools/libxl/libxl_dom_suspend.c | 4 +- tools/libxl/libxl_domain.c | 18 +-- tools/libxl/libxl_internal.h | 1 - tools/libxl/libxl_mem.c | 1 + tools/libxl/libxl_nic.c | 7 +- tools/libxl/libxl_pci.c | 9 +- tools/libxl/libxl_stream_read.c | 8 +- tools/libxl/libxl_stream_write.c | 14 +- tools/libxl/libxl_types.idl | 115 ++++++++------- tools/libxl/libxl_usb.c | 4 +- tools/libxl/libxl_x86.c | 31 ++-- tools/libxl/libxl_x86_acpi.c | 3 +- tools/xl/xl_parse.c | 8 +- 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 +- 55 files changed, 252 insertions(+), 911 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..8e4eb97 100644 --- a/docs/man/xl.cfg.pod.5.in +++ b/docs/man/xl.cfg.pod.5.in @@ -1064,6 +1064,13 @@ 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 create a PVH guest. This requires providing a kernel +on the config file or using a boot loader or firmware. + +Default is 0. + =back =head2 Paravirtualised (PV) Guest Specific Options @@ -1108,10 +1115,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 @@ -1925,11 +1928,6 @@ This device-model is the default for Linux dom0. Use the device-model based upon the historical Xen fork of Qemu. This device-model is still the default for NetBSD dom0. -=item B<none> - -Don't use any device model. This requires a kernel capable of booting -without emulated devices. - =back It is recommended to accept the default value for new guests. If 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 6882e35..b479b9e 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -681,13 +681,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.h b/tools/libxl/libxl.h index 92f1751..9d8e6d2 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -718,12 +718,6 @@ typedef struct libxl__ctx libxl_ctx; #define LIBXL_HAVE_DOMAIN_CREATE_RESTORE_SEND_BACK_FD 1 /* - * LIBXL_HAVE_CREATEINFO_PVH - * If this is defined, then libxl supports creation of a PVH guest. - */ -#define LIBXL_HAVE_CREATEINFO_PVH 1 - -/* * LIBXL_HAVE_DRIVER_DOMAIN_CREATION 1 * * If this is defined, libxl_domain_create_info contains a driver_domain @@ -948,14 +942,6 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src); #define LIBXL_HAVE_GFX_PASSTHRU_KIND /* - * LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE - * - * In the case that LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE is set libxl - * allows the creation of HVM guests without a device model. - */ -#define LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE 1 - -/* * LIBXL_HAVE_CHECKPOINTED_STREAM * * If this is defined, then libxl_checkpointed_stream exists. @@ -1019,6 +1005,14 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src); */ #define LIBXL_HAVE_QED 1 +/* + * LIBXL_HAVE_DOMAIN_TYPE_PVH + * + * If this is defined libxl has the LIBXL_DOMAIN_TYPE_PVH enum as part of + * libxl_domain_type and is able to create PVH guests. + */ +#define LIBXL_HAVE_DOMAIN_TYPE_PVH 1 + typedef char **libxl_string_list; void libxl_string_list_dispose(libxl_string_list *sl); int libxl_string_list_length(const libxl_string_list *sl); diff --git a/tools/libxl/libxl_console.c b/tools/libxl/libxl_console.c index cbc70b7..b8d52a3 100644 --- a/tools/libxl/libxl_console.c +++ b/tools/libxl/libxl_console.c @@ -134,6 +134,7 @@ static int libxl__primary_console_find(libxl_ctx *ctx, uint32_t domid_vm, *type = LIBXL_CONSOLE_TYPE_SERIAL; break; case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: *domid = domid_vm; *cons_num = 0; *type = LIBXL_CONSOLE_TYPE_PV; diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index e741b9a..3215717 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -35,12 +35,9 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc, return ERROR_INVAL; } - if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) { + if (c_info->type != LIBXL_DOMAIN_TYPE_PV) { 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); @@ -68,7 +65,8 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, int i; if (b_info->type != LIBXL_DOMAIN_TYPE_HVM && - b_info->type != LIBXL_DOMAIN_TYPE_PV) { + b_info->type != LIBXL_DOMAIN_TYPE_PV && + b_info->type != LIBXL_DOMAIN_TYPE_PVH) { LOG(ERROR, "invalid domain type"); return ERROR_INVAL; } @@ -123,10 +121,8 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, b_info->u.hvm.bios = LIBXL_BIOS_TYPE_ROMBIOS; break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: b_info->u.hvm.bios = LIBXL_BIOS_TYPE_SEABIOS; break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - break; default: - LOG(ERROR, "unknown device model version"); + LOG(ERROR, "unknown/invalid device model version"); return ERROR_INVAL; } @@ -144,8 +140,6 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, return ERROR_INVAL; } break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - break; default:abort(); } @@ -219,16 +213,19 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, switch (b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: if (b_info->shadow_memkb == LIBXL_MEMKB_DEFAULT) b_info->shadow_memkb = 0; if (b_info->u.hvm.mmio_hole_memkb == LIBXL_MEMKB_DEFAULT) b_info->u.hvm.mmio_hole_memkb = 0; - if (b_info->u.hvm.vga.kind == LIBXL_VGA_INTERFACE_TYPE_UNKNOWN) { - if (b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) - b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_NONE; - else - b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_CIRRUS; + if (b_info->u.hvm.vga.kind == LIBXL_VGA_INTERFACE_TYPE_UNKNOWN && + b_info->type == LIBXL_DOMAIN_TYPE_PVH) { + b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_NONE; + b_info->video_memkb = 0; + } else if (b_info->u.hvm.vga.kind == + LIBXL_VGA_INTERFACE_TYPE_UNKNOWN) { + b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_CIRRUS; } if (!b_info->u.hvm.hdtype) @@ -262,14 +259,6 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, break; } break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - if (b_info->u.hvm.vga.kind != LIBXL_VGA_INTERFACE_TYPE_NONE) { - LOG(ERROR, - "guests without a device model cannot have an emulated video card"); - return ERROR_INVAL; - } - b_info->video_memkb = 0; - break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: default: switch (b_info->u.hvm.vga.kind) { @@ -441,6 +430,7 @@ int libxl__domain_build(libxl__gc *gc, switch (info->type) { case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: ret = libxl__build_hvm(gc, domid, d_config, state); if (ret) goto out; @@ -475,8 +465,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; @@ -532,18 +520,10 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, } flags = 0; - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { + if (info->type != LIBXL_DOMAIN_TYPE_PV) { 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 */ @@ -862,7 +842,7 @@ static void initiate_domain_create(libxl__egc *egc, /* If target_memkb is smaller than max_memkb, the subsequent call * to libxc when building HVM domain will enable PoD mode. */ - pod_enabled = (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) && + pod_enabled = (d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV) && (d_config->b_info.target_memkb < d_config->b_info.max_memkb); /* We cannot have PoD and PCI device assignment at the same time @@ -871,7 +851,7 @@ static void initiate_domain_create(libxl__egc *egc, * guest. To stay on the safe side, we disable PCI device * assignment when PoD is enabled. */ - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM && + if (d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV && d_config->num_pcidevs && pod_enabled) { ret = ERROR_INVAL; LOGD(ERROR, domid, @@ -910,7 +890,7 @@ static void initiate_domain_create(libxl__egc *egc, goto error_out; } - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM && + if (d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV && (libxl_defbool_val(d_config->b_info.u.hvm.nested_hvm) && libxl_defbool_val(d_config->b_info.u.hvm.altp2m))) { ret = ERROR_INVAL; @@ -918,7 +898,7 @@ static void initiate_domain_create(libxl__egc *egc, goto error_out; } - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM && + if (d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV && libxl_defbool_val(d_config->b_info.u.hvm.altp2m) && pod_enabled) { ret = ERROR_INVAL; @@ -1157,6 +1137,7 @@ static void domcreate_stream_done(libxl__egc *egc, switch (info->type) { case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: vments = libxl__calloc(gc, 7, sizeof(char *)); vments[0] = "rtc/timeoffset"; vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : ""; @@ -1344,12 +1325,6 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev, libxl__device_console_add(gc, domid, &console, state, &device); libxl__device_console_dispose(&console); - if (d_config->b_info.device_model_version == - LIBXL_DEVICE_MODEL_VERSION_NONE) { - domcreate_devmodel_started(egc, &dcs->sdss.dm, 0); - return; - } - libxl_device_vkb_init(&vkb); libxl__device_vkb_add(gc, domid, &vkb); libxl_device_vkb_dispose(&vkb); @@ -1371,6 +1346,7 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev, return; } case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: { libxl__device_console console; libxl__device device; diff --git a/tools/libxl/libxl_disk.c b/tools/libxl/libxl_disk.c index 63de75c..f6c61fd 100644 --- a/tools/libxl/libxl_disk.c +++ b/tools/libxl/libxl_disk.c @@ -166,9 +166,7 @@ int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk, /* Force Qdisk backend for CDROM devices of guests with a device model. */ if (disk->is_cdrom != 0 && - libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM && - libxl__device_model_version_running(gc, domid) != - LIBXL_DEVICE_MODEL_VERSION_NONE) { + libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM) { if (!(disk->backend == LIBXL_DISK_BACKEND_QDISK || disk->backend == LIBXL_DISK_BACKEND_UNKNOWN)) { LOGD(ERROR, domid, "Backend for CD devices on HVM guests must be Qdisk"); @@ -777,12 +775,6 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, goto out; } - if (dm_ver == LIBXL_DEVICE_MODEL_VERSION_NONE) { - LOGD(ERROR, domid, "Guests without a device model cannot use cd-insert"); - rc = ERROR_FAIL; - goto out; - } - disks = libxl_device_disk_list(ctx, domid, &num); for (i = 0; i < num; i++) { if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev)) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 281058d..b22c57f 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -649,6 +649,7 @@ static int libxl__build_device_model_args_old(libxl__gc *gc, flexarray_append(dm_args, "-M"); switch (b_info->type) { case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: flexarray_append(dm_args, "xenpv"); for (i = 0; b_info->extra_pv && b_info->extra_pv[i] != NULL; i++) flexarray_append(dm_args, b_info->extra_pv[i]); @@ -1270,6 +1271,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, flexarray_append(dm_args, "-machine"); switch (b_info->type) { case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: flexarray_append(dm_args, "xenpv"); for (i = 0; b_info->extra_pv && b_info->extra_pv[i] != NULL; i++) flexarray_append(dm_args, b_info->extra_pv[i]); diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index d519c8d..5c64969 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -38,10 +38,23 @@ libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid) LOG(ERROR, "unable to get domain type for domid=%"PRIu32, domid); return LIBXL_DOMAIN_TYPE_INVALID; } - if (info.flags & XEN_DOMINF_hvm_guest) - return LIBXL_DOMAIN_TYPE_HVM; - else + if (info.flags & XEN_DOMINF_hvm_guest) { + char *hvm_path = GCSPRINTF("%s/hvmloader", + libxl__xs_get_dompath(gc, domid)); + + /* + * Check if domain has a /local/domain/<domid>/hvmloader path + * in order to figure out if it's a HVM or PVH domain, because + * from the hypervisor point of view, they are both the same. + * (ie: xc_domain_getinfolist is unable to provide this information). + */ + if (libxl__xs_read(gc, XBT_NULL, hvm_path)) + return LIBXL_DOMAIN_TYPE_HVM; + else + return LIBXL_DOMAIN_TYPE_PVH; + } else { return LIBXL_DOMAIN_TYPE_PV; + } } int libxl__domain_cpupool(libxl__gc *gc, uint32_t domid) @@ -432,7 +445,7 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, state->store_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->store_domid); state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid); - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { + if (info->type != LIBXL_DOMAIN_TYPE_PV) { hvm_set_conf_params(ctx->xch, domid, info); #if defined(__i386__) || defined(__x86_64__) rc = hvm_set_viridian_features(gc, domid, info); @@ -521,7 +534,7 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, if (info->cpuid != NULL) libxl_cpuid_set(ctx, domid, info->cpuid); - if (info->type == LIBXL_DOMAIN_TYPE_HVM + if (info->type != LIBXL_DOMAIN_TYPE_PV && !libxl_ms_vm_genid_is_zero(&info->u.hvm.ms_vm_genid)) { rc = libxl__ms_vm_genid_set(gc, domid, &info->u.hvm.ms_vm_genid); @@ -690,7 +703,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); @@ -793,7 +805,7 @@ static int hvm_build_set_params(xc_interface *handle, uint32_t domid, uint64_t str_mfn, cons_mfn; int i; - if (info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (info->type == LIBXL_DOMAIN_TYPE_HVM) { va_map = xc_map_foreign_range(handle, domid, XC_PAGE_SIZE, PROT_READ | PROT_WRITE, HVM_INFO_PFN); @@ -848,8 +860,8 @@ static int hvm_build_set_xs_values(libxl__gc *gc, } /* Only one module can be passed. PVHv2 guests do not support this. */ - if (dom->acpi_modules[0].guest_addr_out && - info->device_model_version !=LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (dom->acpi_modules[0].guest_addr_out && + info->type == LIBXL_DOMAIN_TYPE_HVM) { path = GCSPRINTF("/local/domain/%d/"HVM_XS_ACPI_PT_ADDRESS, domid); ret = libxl__xs_printf(gc, XBT_NULL, path, "0x%"PRIx64, @@ -919,41 +931,36 @@ static int libxl__domain_firmware(libxl__gc *gc, void *data; const char *bios_filename = NULL; - if (info->u.hvm.firmware) - firmware = info->u.hvm.firmware; - else { - switch (info->device_model_version) - { - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: - firmware = "hvmloader"; - break; - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: - firmware = "hvmloader"; - break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - if (info->kernel == NULL) { - LOG(ERROR, "no device model requested without a kernel"); + if (info->type != LIBXL_DOMAIN_TYPE_PVH) { + if (info->u.hvm.firmware) + firmware = info->u.hvm.firmware; + else { + switch (info->device_model_version) + { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: + firmware = "hvmloader"; + break; + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + firmware = "hvmloader"; + break; + default: + LOG(ERROR, "invalid device model version %d", + info->device_model_version); rc = ERROR_FAIL; goto out; } - break; - default: - LOG(ERROR, "invalid device model version %d", - info->device_model_version); + } + rc = xc_dom_kernel_file(dom, libxl__abs_path(gc, firmware, + libxl__xenfirmwaredir_path())); + } else { + if (info->kernel == NULL) { + LOG(ERROR, "trying to boot a PVH guest without a kernel"); rc = ERROR_FAIL; goto out; } - } - - if (info->kernel != NULL && - info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { - /* Try to load a kernel instead of the firmware. */ rc = xc_dom_kernel_file(dom, info->kernel); if (rc == 0 && info->ramdisk != NULL) rc = xc_dom_ramdisk_file(dom, info->ramdisk); - } else { - rc = xc_dom_kernel_file(dom, libxl__abs_path(gc, firmware, - libxl__xenfirmwaredir_path())); } if (rc != 0) { @@ -961,7 +968,8 @@ static int libxl__domain_firmware(libxl__gc *gc, goto out; } - if (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) { + if (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN && + info->type == LIBXL_DOMAIN_TYPE_HVM) { if (info->u.hvm.system_firmware) { bios_filename = info->u.hvm.system_firmware; } else { @@ -1005,7 +1013,7 @@ static int libxl__domain_firmware(libxl__gc *gc, if (info->u.hvm.acpi_firmware) { - if (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (info->type == LIBXL_DOMAIN_TYPE_PVH) { LOGE(ERROR, "PVH guests do not allow loading ACPI modules"); rc = ERROR_FAIL; goto out; @@ -1043,9 +1051,7 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, uint64_t mmio_start, lowmem_end, highmem_end, mem_size; libxl_domain_build_info *const info = &d_config->b_info; struct xc_dom_image *dom = NULL; - bool device_model = - info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE ? - true : false; + bool device_model = info->type == LIBXL_DOMAIN_TYPE_PVH ? false : true; xc_dom_loginit(ctx->xch); diff --git a/tools/libxl/libxl_dom_save.c b/tools/libxl/libxl_dom_save.c index 77fe30e..3698b58 100644 --- a/tools/libxl/libxl_dom_save.c +++ b/tools/libxl/libxl_dom_save.c @@ -176,9 +176,6 @@ void libxl__domain_common_switch_qemu_logdirty(libxl__egc *egc, case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: domain_suspend_switch_qemu_xen_logdirty(egc, domid, enable, lds); break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - lds->callback(egc, lds, 0); - break; default: LOGD(ERROR, domid, "logdirty switch failed" ", no valid device model version found, abandoning suspend"); @@ -363,10 +360,10 @@ void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss) if (rc) goto out; switch (type) { - case LIBXL_DOMAIN_TYPE_HVM: { + case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: dss->hvm = 1; break; - } case LIBXL_DOMAIN_TYPE_PV: dss->hvm = 0; break; diff --git a/tools/libxl/libxl_dom_suspend.c b/tools/libxl/libxl_dom_suspend.c index 6314a00..ccfcd66 100644 --- a/tools/libxl/libxl_dom_suspend.c +++ b/tools/libxl/libxl_dom_suspend.c @@ -90,8 +90,6 @@ int libxl__domain_suspend_device_model(libxl__gc *gc, if (ret) unlink(filename); break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - break; default: return ERROR_INVAL; } @@ -148,7 +146,7 @@ static void domain_suspend_callback_common(libxl__egc *egc, /* Convenience aliases */ const uint32_t domid = dsps->domid; - if (dsps->type == LIBXL_DOMAIN_TYPE_HVM) { + if (dsps->type != LIBXL_DOMAIN_TYPE_PV) { xc_hvm_param_get(CTX->xch, domid, HVM_PARAM_CALLBACK_IRQ, &hvm_pvdrv); xc_hvm_param_get(CTX->xch, domid, HVM_PARAM_ACPI_S_STATE, &hvm_s_state); } diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c index 08eccd0..43210d5 100644 --- a/tools/libxl/libxl_domain.c +++ b/tools/libxl/libxl_domain.c @@ -571,14 +571,11 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) } if (type == LIBXL_DOMAIN_TYPE_HVM) { - if (libxl__device_model_version_running(gc, domid) != - LIBXL_DEVICE_MODEL_VERSION_NONE) { - rc = libxl__domain_resume_device_model(gc, domid); - if (rc < 0) { - LOGD(ERROR, domid, "Failed to unpause device model for domain:%d", - rc); - goto out; - } + rc = libxl__domain_resume_device_model(gc, domid); + if (rc < 0) { + LOGD(ERROR, domid, "Failed to unpause device model for domain:%d", + rc); + goto out; } } ret = xc_domain_unpause(ctx->xch, domid); @@ -1013,6 +1010,7 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__destroy_domid_state *dis) } /* fall through */ case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: dm_present = libxl__dm_active(gc, domid); break; case LIBXL_DOMAIN_TYPE_INVALID: @@ -1349,7 +1347,6 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) case LIBXL_DOMAIN_TYPE_HVM: switch (libxl__device_model_version_running(gc, domid)) { case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: - case LIBXL_DEVICE_MODEL_VERSION_NONE: break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: rc = libxl__set_vcpuonline_qmp(gc, domid, cpumap, &info); @@ -1359,6 +1356,7 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) } break; case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: break; default: rc = ERROR_INVAL; @@ -1584,7 +1582,6 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, max_vcpus, map); break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: - case LIBXL_DEVICE_MODEL_VERSION_NONE: rc = libxl__update_avail_vcpus_xenstore(gc, domid, max_vcpus, map); break; @@ -1593,6 +1590,7 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid, } break; case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: rc = libxl__update_avail_vcpus_xenstore(gc, domid, max_vcpus, map); break; 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_mem.c b/tools/libxl/libxl_mem.c index f5d2530..aeb295b 100644 --- a/tools/libxl/libxl_mem.c +++ b/tools/libxl/libxl_mem.c @@ -461,6 +461,7 @@ int libxl_domain_need_memory(libxl_ctx *ctx, *need_memkb = b_info->target_memkb; switch (b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: *need_memkb += b_info->shadow_memkb + LIBXL_HVM_EXTRA_MEMORY; if (libxl_defbool_val(b_info->device_model_stubdomain)) *need_memkb += 32 * 1024; diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c index 61b55ca..5e6d7d2 100644 --- a/tools/libxl/libxl_nic.c +++ b/tools/libxl/libxl_nic.c @@ -91,18 +91,17 @@ int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, switch (libxl__domain_type(gc, domid)) { case LIBXL_DOMAIN_TYPE_HVM: if (!nic->nictype) { - if (hotplug || - (libxl__device_model_version_running(gc, domid) == - LIBXL_DEVICE_MODEL_VERSION_NONE)) + if (hotplug) nic->nictype = LIBXL_NIC_TYPE_VIF; else nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; } break; case LIBXL_DOMAIN_TYPE_PV: + case LIBXL_DOMAIN_TYPE_PVH: if (nic->nictype == LIBXL_NIC_TYPE_VIF_IOEMU) { LOGD(ERROR, domid, - "trying to create PV guest with an emulated interface"); + "trying to create PV/PVH guest with an emulated interface"); return ERROR_INVAL; } nic->nictype = LIBXL_NIC_TYPE_VIF; diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index b14df16..9bb69cd 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -1200,8 +1200,15 @@ int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcide libxl_device_pci *assigned; int num_assigned, i, rc; int stubdomid = 0; + libxl_domain_type type = libxl__domain_type(gc, domid); + + if (type == LIBXL_DOMAIN_TYPE_PVH) { + LOGD(ERROR, domid, + "PCI pass-through is not yet supported for PVH guests"); + return ERROR_FAIL; + } - if (libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM) { + if (type == LIBXL_DOMAIN_TYPE_HVM) { rc = xc_test_assign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev)); if (rc) { LOGD(ERROR, domid, diff --git a/tools/libxl/libxl_stream_read.c b/tools/libxl/libxl_stream_read.c index 89c2f21..4666185 100644 --- a/tools/libxl/libxl_stream_read.c +++ b/tools/libxl/libxl_stream_read.c @@ -248,7 +248,7 @@ void libxl__stream_read_start(libxl__egc *egc, chs->legacy_fd = stream->fd; chs->hvm = - (stream->dcs->guest_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM); + (stream->dcs->guest_config->b_info.type != LIBXL_DOMAIN_TYPE_PV); chs->completion_callback = conversion_done; rc = libxl__convert_legacy_stream(egc, &stream->chs); @@ -584,8 +584,7 @@ static bool process_record(libxl__egc *egc, break; case REC_TYPE_EMULATOR_XENSTORE_DATA: - if (dcs->guest_config->b_info.device_model_version == - LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (dcs->guest_config->b_info.type == LIBXL_DOMAIN_TYPE_PVH) { rc = ERROR_FAIL; LOG(ERROR, "Received a xenstore emulator record when none was expected"); @@ -613,8 +612,7 @@ static bool process_record(libxl__egc *egc, break; case REC_TYPE_EMULATOR_CONTEXT: - if (dcs->guest_config->b_info.device_model_version == - LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (dcs->guest_config->b_info.type == LIBXL_DOMAIN_TYPE_PVH) { rc = ERROR_FAIL; LOG(ERROR, "Received an emulator context record when none was expected"); diff --git a/tools/libxl/libxl_stream_write.c b/tools/libxl/libxl_stream_write.c index c96a6a2..48ca8fb 100644 --- a/tools/libxl/libxl_stream_write.c +++ b/tools/libxl/libxl_stream_write.c @@ -181,7 +181,6 @@ static void setup_emulator_write(libxl__egc *egc, sws_record_done_cb cb) { assert(stream->emu_sub_hdr.id != EMULATOR_UNKNOWN); - assert(stream->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE); setup_generic_write(egc, stream, what, hdr, emu_hdr, body, cb); } @@ -261,10 +260,6 @@ void libxl__stream_write_start(libxl__egc *egc, stream->emu_sub_hdr.id = EMULATOR_QEMU_UPSTREAM; break; - case LIBXL_DEVICE_MODEL_VERSION_NONE: - stream->emu_sub_hdr.id = EMULATOR_UNKNOWN; - break; - default: rc = ERROR_FAIL; LOGD(ERROR, dss->domid, "Unknown emulator for HVM domain"); @@ -395,11 +390,6 @@ static void write_emulator_xenstore_record(libxl__egc *egc, char *buf = NULL; uint32_t len = 0; - if (stream->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { - emulator_xenstore_record_done(egc, stream); - return; - } - rc = libxl__save_emulator_xenstore_data(dss, &buf, &len); if (rc) goto err; @@ -449,9 +439,9 @@ static void write_emulator_context_record(libxl__egc *egc, struct stat st; int rc; - assert(dss->type == LIBXL_DOMAIN_TYPE_HVM); + assert(dss->type != LIBXL_DOMAIN_TYPE_PV); - if (stream->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { + if (dss->type == LIBXL_DOMAIN_TYPE_PVH) { emulator_context_record_done(egc, stream); return; } diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index a612d1f..8523f07 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -75,6 +75,7 @@ libxl_domain_type = Enumeration("domain_type", [ (-1, "INVALID"), (1, "HVM"), (2, "PV"), + (3, "PVH"), ], init_val = "LIBXL_DOMAIN_TYPE_INVALID") libxl_rdm_reserve_strategy = Enumeration("rdm_reserve_strategy", [ @@ -98,7 +99,6 @@ libxl_device_model_version = Enumeration("device_model_version", [ (0, "UNKNOWN"), (1, "QEMU_XEN_TRADITIONAL"), # Historical qemu-xen device model (qemu-dm) (2, "QEMU_XEN"), # Upstream based qemu-xen device model - (3, "NONE"), # No device model ]) libxl_console_type = Enumeration("console_type", [ @@ -440,6 +440,63 @@ libxl_rdm_reserve = Struct("rdm_reserve", [ ("policy", libxl_rdm_reserve_policy), ]) +libxl_domain_build_info_hvm = Struct("domain_build_info_hvm", [ + ("firmware", string), + ("bios", libxl_bios_type), + ("pae", libxl_defbool), + ("apic", libxl_defbool), + # The following acpi field is deprecated. + # Please use the unified acpi field above + # which works for both x86 and ARM. + ("acpi", libxl_defbool), + ("acpi_s3", libxl_defbool), + ("acpi_s4", libxl_defbool), + ("nx", libxl_defbool), + ("viridian", libxl_defbool), + ("viridian_enable", libxl_bitmap), + ("viridian_disable", libxl_bitmap), + ("timeoffset", string), + ("hpet", libxl_defbool), + ("vpt_align", libxl_defbool), + ("mmio_hole_memkb", MemKB), + ("timer_mode", libxl_timer_mode), + ("nested_hvm", libxl_defbool), + ("altp2m", libxl_defbool), + ("system_firmware", string), + ("smbios_firmware", string), + ("acpi_firmware", string), + ("hdtype", libxl_hdtype), + ("nographic", libxl_defbool), + ("vga", libxl_vga_interface_info), + ("vnc", libxl_vnc_info), + # keyboard layout, default is en-us keyboard + ("keymap", string), + ("sdl", libxl_sdl_info), + ("spice", libxl_spice_info), + + ("gfx_passthru", libxl_defbool), + ("gfx_passthru_kind", libxl_gfx_passthru_kind), + + ("serial", string), + ("boot", string), + ("usb", libxl_defbool), + ("usbversion", integer), + # usbdevice: + # - "tablet" for absolute mouse, + # - "mouse" for PS/2 protocol relative mouse + ("usbdevice", string), + ("soundhw", string), + ("xen_platform_pci", libxl_defbool), + ("usbdevice_list", libxl_string_list), + ("vendor_device", libxl_vendor_device), + # See libxl_ms_vm_genid_generate() + ("ms_vm_genid", libxl_ms_vm_genid), + ("serial_list", libxl_string_list), + ("rdm", libxl_rdm_reserve), + ("rdm_mem_boundary_memkb", MemKB), + ]) + + libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), ("avail_vcpus", libxl_bitmap), @@ -497,60 +554,8 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("device_tree", string), ("acpi", libxl_defbool), ("u", KeyedUnion(None, libxl_domain_type, "type", - [("hvm", Struct(None, [("firmware", string), - ("bios", libxl_bios_type), - ("pae", libxl_defbool), - ("apic", libxl_defbool), - # The following acpi field is deprecated. - # Please use the unified acpi field above - # which works for both x86 and ARM. - ("acpi", libxl_defbool), - ("acpi_s3", libxl_defbool), - ("acpi_s4", libxl_defbool), - ("nx", libxl_defbool), - ("viridian", libxl_defbool), - ("viridian_enable", libxl_bitmap), - ("viridian_disable", libxl_bitmap), - ("timeoffset", string), - ("hpet", libxl_defbool), - ("vpt_align", libxl_defbool), - ("mmio_hole_memkb", MemKB), - ("timer_mode", libxl_timer_mode), - ("nested_hvm", libxl_defbool), - ("altp2m", libxl_defbool), - ("system_firmware", string), - ("smbios_firmware", string), - ("acpi_firmware", string), - ("hdtype", libxl_hdtype), - ("nographic", libxl_defbool), - ("vga", libxl_vga_interface_info), - ("vnc", libxl_vnc_info), - # keyboard layout, default is en-us keyboard - ("keymap", string), - ("sdl", libxl_sdl_info), - ("spice", libxl_spice_info), - - ("gfx_passthru", libxl_defbool), - ("gfx_passthru_kind", libxl_gfx_passthru_kind), - - ("serial", string), - ("boot", string), - ("usb", libxl_defbool), - ("usbversion", integer), - # usbdevice: - # - "tablet" for absolute mouse, - # - "mouse" for PS/2 protocol relative mouse - ("usbdevice", string), - ("soundhw", string), - ("xen_platform_pci", libxl_defbool), - ("usbdevice_list", libxl_string_list), - ("vendor_device", libxl_vendor_device), - # See libxl_ms_vm_genid_generate() - ("ms_vm_genid", libxl_ms_vm_genid), - ("serial_list", libxl_string_list), - ("rdm", libxl_rdm_reserve), - ("rdm_mem_boundary_memkb", MemKB), - ])), + [("hvm", libxl_domain_build_info_hvm), + ("pvh", libxl_domain_build_info_hvm), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), ("bootloader", string), diff --git a/tools/libxl/libxl_usb.c b/tools/libxl/libxl_usb.c index d8948d5..d6bdbb8 100644 --- a/tools/libxl/libxl_usb.c +++ b/tools/libxl/libxl_usb.c @@ -45,13 +45,13 @@ static int libxl__device_usbctrl_setdefault(libxl__gc *gc, uint32_t domid, libxl_domain_type domtype = libxl__domain_type(gc, domid); if (usbctrl->type == LIBXL_USBCTRL_TYPE_AUTO) { - if (domtype == LIBXL_DOMAIN_TYPE_PV) { + if (domtype != LIBXL_DOMAIN_TYPE_HVM) { rc = usbback_is_loaded(gc); if (rc < 0) goto out; usbctrl->type = rc ? LIBXL_USBCTRL_TYPE_PV : LIBXL_USBCTRL_TYPE_QUSB; - } else if (domtype == LIBXL_DOMAIN_TYPE_HVM) { + } else { /* FIXME: See if we can detect PV frontend */ usbctrl->type = LIBXL_USBCTRL_TYPE_DEVICEMODEL; } diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 5da7504..547a88f 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -8,20 +8,13 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, xc_domain_configuration_t *xc_config) { - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) { - if (d_config->b_info.device_model_version != - LIBXL_DEVICE_MODEL_VERSION_NONE) { - xc_config->emulation_flags = XEN_X86_EMU_ALL; - } else if (libxl_defbool_val(d_config->b_info.u.hvm.apic)) { - /* - * HVM guests without device model may want - * to have LAPIC emulation. - */ - xc_config->emulation_flags = XEN_X86_EMU_LAPIC; - } - } else { + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) + xc_config->emulation_flags = XEN_X86_EMU_ALL; + else if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PVH && + libxl_defbool_val(d_config->b_info.u.hvm.apic)) + xc_config->emulation_flags = XEN_X86_EMU_LAPIC; + else xc_config->emulation_flags = 0; - } return 0; } @@ -266,7 +259,7 @@ static int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, struct e820entry map[E820MAX]; libxl_domain_build_info *b_info; - if (d_config == NULL || d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) + if (d_config == NULL || d_config->c_info.type != LIBXL_DOMAIN_TYPE_PV) return ERROR_INVAL; b_info = &d_config->b_info; @@ -338,11 +331,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_PV) { + 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); } @@ -382,8 +372,7 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc *gc, { int rc = 0; - if ((info->type == LIBXL_DOMAIN_TYPE_HVM) && - (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE)) { + if (info->type == LIBXL_DOMAIN_TYPE_PVH) { rc = libxl__dom_load_acpi(gc, info, dom); if (rc != 0) LOGE(ERROR, "libxl_dom_load_acpi failed"); diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c index c0a6e32..cb17e45 100644 --- a/tools/libxl/libxl_x86_acpi.c +++ b/tools/libxl/libxl_x86_acpi.c @@ -171,8 +171,7 @@ int libxl__dom_load_acpi(libxl__gc *gc, void *acpi_pages; unsigned long page_mask; - if ((b_info->type != LIBXL_DOMAIN_TYPE_HVM) || - (b_info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE)) + if (b_info->type != LIBXL_DOMAIN_TYPE_PVH) goto out; libxl_ctxt.page_size = XC_DOM_PAGE_SIZE(dom); diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index 1ef0c27..92df7fd 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -725,6 +725,7 @@ void parse_config_data(const char *config_source, int pci_seize = 0; int i, e; char *kernel_basename; + libxl_defbool pvh; libxl_domain_create_info *c_info = &d_config->c_info; libxl_domain_build_info *b_info = &d_config->b_info; @@ -760,7 +761,9 @@ 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", &pvh, 0)) + c_info->type = LIBXL_DOMAIN_TYPE_PVH; + xlu_cfg_get_defbool(config, "hap", &c_info->hap, 0); if (xlu_cfg_replace_string (config, "name", &c_info->name, 0)) { @@ -942,6 +945,7 @@ void parse_config_data(const char *config_source, switch(b_info->type) { case LIBXL_DOMAIN_TYPE_HVM: + case LIBXL_DOMAIN_TYPE_PVH: kernel_basename = libxl_basename(b_info->kernel); if (!strcmp(kernel_basename, "hvmloader")) { fprintf(stderr, "WARNING: you seem to be using \"kernel\" " @@ -1696,8 +1700,6 @@ skip_usbdev: } else if (!strcmp(buf, "qemu-xen")) { b_info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; - } else if (!strcmp(buf, "none")) { - b_info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_NONE; } else { fprintf(stderr, "Unknown device_model_version \"%s\" specified\n", buf); diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c index 1957dea..a1e9f00 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 479aee6..84a289d 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -350,7 +350,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; @@ -361,12 +361,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; @@ -385,7 +380,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); } @@ -900,7 +895,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); @@ -952,18 +947,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); @@ -1019,21 +1002,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); @@ -1286,7 +1255,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 1244161..86055d1 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 02b48e8..944af39 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -632,9 +632,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; @@ -1507,7 +1506,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 7432c70..c1e2cd4 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 f170a3d..2770ff4 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 0c1b711..9791756 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -1065,20 +1065,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); @@ -1214,11 +1200,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); @@ -1248,23 +1230,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 4e49bd1..59df948 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2136,9 +2136,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; @@ -2369,12 +2366,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; @@ -3869,8 +3860,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 faa638b..fe683bd 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -2014,33 +2014,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 ff5267f..d182d75 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 eccc25e..da0f6ba 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) -- 2.10.1 (Apple Git-78) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |