aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-24 14:16:47 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-24 14:16:47 +0100
commitc039177d82c7504697c98f4e30aa203acf972098 (patch)
tree75423ded2e23f9e53f56805a28aae67f7729c7e0
parent7d0b678231c097279f86221eed0138df8badb3a4 (diff)
downloadxen-c039177d82c7504697c98f4e30aa203acf972098.tar.gz
xen-c039177d82c7504697c98f4e30aa203acf972098.tar.bz2
xen-c039177d82c7504697c98f4e30aa203acf972098.zip
x86: XENPF_set_processor_pminfo handler adjustments
Only handle information passed up from dom0 when actually controlling the respective functionality. Only count up CPUs once for each CPU. Allow dom0 to provide information incrementally. Signed-off-by: Jan Beulich <jbeulich@novell.com>
-rw-r--r--xen/arch/x86/platform_hypercall.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index 0e2579d23d..5a882c7057 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -355,6 +355,11 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
struct processor_pminfo *pmpt;
struct processor_performance *pxpt;
+ if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_PX) )
+ {
+ ret = -ENOSYS;
+ break;
+ }
if ( cpuid < 0 )
{
ret = -EINVAL;
@@ -373,6 +378,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
memcpy ((void *)&pxpt->status_register,
(void *)&xenpxpt->status_register,
sizeof(struct xen_pct_register));
+ pxpt->init |= XEN_PX_PCT;
}
if ( xenpxpt->flags & XEN_PX_PSS )
{
@@ -390,6 +396,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
break;
}
pxpt->state_count = xenpxpt->state_count;
+ pxpt->init |= XEN_PX_PSS;
}
if ( xenpxpt->flags & XEN_PX_PSD )
{
@@ -397,14 +404,18 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
memcpy ((void *)&pxpt->domain_info,
(void *)&xenpxpt->domain_info,
sizeof(struct xen_psd_package));
+ pxpt->init |= XEN_PX_PSD;
}
if ( xenpxpt->flags & XEN_PX_PPC )
+ {
pxpt->ppc = xenpxpt->ppc;
+ pxpt->init |= XEN_PX_PPC;
+ }
- if ( xenpxpt->flags == ( XEN_PX_PCT | XEN_PX_PSS |
- XEN_PX_PSD | XEN_PX_PPC ) )
+ if ( pxpt->init == ( XEN_PX_PCT | XEN_PX_PSS |
+ XEN_PX_PSD | XEN_PX_PPC ) )
{
- pxpt->init =1;
+ pxpt->init |= 0x80000000;
cpu_count++;
}
if ( cpu_count == num_online_cpus() )
@@ -418,10 +429,20 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
}
case XEN_PM_CX:
+ if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_CX) )
+ {
+ ret = -ENOSYS;
+ break;
+ }
ret = set_cx_pminfo(op->u.set_pminfo.id, &op->u.set_pminfo.power);
break;
case XEN_PM_TX:
+ if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_TX) )
+ {
+ ret = -ENOSYS;
+ break;
+ }
ret = -EINVAL;
break;