From: Roger Pau Monne Date: Wed, 23 Jul 2014 15:59:48 +0000 (+0200) Subject: libxc: expand cpuid features exposed to PVH guests X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4556 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=807999107bbf6401f37b550c7d156e13765e0f5b;p=xen.git libxc: expand cpuid features exposed to PVH guests 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 --- 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;