From 807999107bbf6401f37b550c7d156e13765e0f5b Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Wed, 23 Jul 2014 17:59:48 +0200 Subject: [PATCH] libxc: expand cpuid features exposed to PVH guests MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Expand the cpuid features exposed to PVH guests, this includes exposing PSE, PGE and 1GB pages (which will be masked by the hypervisor if not supported by the hardware). Signed-off-by: Roger Pau Monné Reviewed-by: Andrew Cooper Cc: Ian Jackson Cc: Ian Campbell Cc: Andrew Cooper Acked-by: Ian Campbell --- tools/libxc/xc_cpuid_x86.c | 14 +++++++++----- tools/libxc/xc_domain.c | 1 + tools/libxc/xenctrl.h | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index 8acb9fb9ef..6b81641f60 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -21,6 +21,7 @@ */ #include +#include #include "xc_private.h" #include "xc_cpufeature.h" #include @@ -437,7 +438,7 @@ static void xc_cpuid_hvm_policy( static void xc_cpuid_pv_policy( xc_interface *xch, domid_t domid, - const unsigned int *input, unsigned int *regs) + const unsigned int *input, unsigned int *regs, bool pvh) { DECLARE_DOMCTL; unsigned int guest_width; @@ -460,8 +461,10 @@ static void xc_cpuid_pv_policy( if ( (input[0] & 0x7fffffff) == 0x00000001 ) { clear_bit(X86_FEATURE_VME, regs[3]); - clear_bit(X86_FEATURE_PSE, regs[3]); - clear_bit(X86_FEATURE_PGE, regs[3]); + if ( !pvh ) { + clear_bit(X86_FEATURE_PSE, regs[3]); + clear_bit(X86_FEATURE_PGE, regs[3]); + } clear_bit(X86_FEATURE_MCE, regs[3]); clear_bit(X86_FEATURE_MCA, regs[3]); clear_bit(X86_FEATURE_MTRR, regs[3]); @@ -530,7 +533,8 @@ static void xc_cpuid_pv_policy( { set_bit(X86_FEATURE_SYSCALL, regs[3]); } - clear_bit(X86_FEATURE_PAGE1GB, regs[3]); + if ( !pvh ) + clear_bit(X86_FEATURE_PAGE1GB, regs[3]); clear_bit(X86_FEATURE_RDTSCP, regs[3]); clear_bit(X86_FEATURE_SVM, regs[2]); @@ -578,7 +582,7 @@ static int xc_cpuid_policy( if ( info.hvm ) xc_cpuid_hvm_policy(xch, domid, input, regs); else - xc_cpuid_pv_policy(xch, domid, input, regs); + xc_cpuid_pv_policy(xch, domid, input, regs, info.pvh); return 0; } diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 0230c6c866..c67ac9af6c 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -348,6 +348,7 @@ 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->shutdown_reason = (domctl.u.getdomaininfo.flags>>XEN_DOMINF_shutdownshift) & diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 5beb846271..1c5d0db5ad 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -432,7 +432,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; + hvm:1, debugged:1, pvh:1; unsigned int shutdown_reason; /* only meaningful if shutdown==1 */ unsigned long nr_pages; /* current number, not maximum */ unsigned long nr_outstanding_pages; -- 2.30.2