diff -r 81c9213b3d39 xen/include/public/platform.h --- a/xen/include/public/platform.h Tue Nov 28 18:41:42 2006 +0000 +++ b/xen/include/public/platform.h Thu Aug 30 14:18:04 2007 -0400 @@ -114,6 +114,19 @@ typedef struct xenpf_platform_quirk xenp typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); +typedef uint64_t cputime_t; +DEFINE_XEN_GUEST_HANDLE(cputime_t); +#define XENPF_getidletime 40 +struct xenpf_getidletime { + /* IN variables. */ + uint32_t max_cpus; + XEN_GUEST_HANDLE(uint64_t) buffer; + /* OUT variables. */ + uint32_t num_cpus; +}; +typedef struct xenpf_getidletime xenpf_getidletime_t; +DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); + struct xen_platform_op { uint32_t cmd; uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ @@ -124,6 +137,7 @@ struct xen_platform_op { struct xenpf_read_memtype read_memtype; struct xenpf_microcode_update microcode; struct xenpf_platform_quirk platform_quirk; + struct xenpf_getidletime getidletime; uint8_t pad[128]; } u; }; diff -r 81c9213b3d39 xen/arch/x86/platform_hypercall.c --- a/xen/arch/x86/platform_hypercall.c Tue Nov 28 18:41:42 2006 +0000 +++ b/xen/arch/x86/platform_hypercall.c Thu Aug 30 14:18:12 2007 -0400 @@ -138,6 +138,31 @@ long do_platform_op(XEN_GUEST_HANDLE(xen } break; + case XENPF_getidletime: + { + uint32_t cpu; + uint32_t max_cpus = op->u.getidletime.max_cpus; + uint64_t idletime; + + for_each_online_cpu (cpu) { + if ( cpu >= max_cpus ) + break; + + idletime = idle_vcpu[cpu]->runstate.time[RUNSTATE_running]; + + if ( copy_to_guest_offset(op->u.getidletime.buffer, cpu, &idletime, 1) ) { + ret = -EFAULT; + break; + } + } + + op->u.getidletime.num_cpus = cpu; + + if ( copy_to_guest(u_xenpf_op, op, 1) ) + ret = -EFAULT; + } + break; + default: ret = -ENOSYS; break;