# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1173298567 25200
# Node ID 4e367aa898956466747417bff637a681b8b58202
# Parent 9f8e996a678d5825462e2546aff6789064b3aed2
[IA64] Steal time accounting for PV domain - hypervisor side
Signed-off-by: Atsushi SAKAI <sakaia@xxxxxxxxxxxxxx>
---
xen/arch/ia64/linux-xen/entry.S | 2 -
xen/arch/ia64/xen/domain.c | 43 +++++++++++++++++++++++++++++++++++++++
xen/include/asm-ia64/hypercall.h | 3 +-
3 files changed, 46 insertions(+), 2 deletions(-)
diff -r 9f8e996a678d -r 4e367aa89895 xen/arch/ia64/linux-xen/entry.S
--- a/xen/arch/ia64/linux-xen/entry.S Wed Mar 07 12:45:08 2007 -0700
+++ b/xen/arch/ia64/linux-xen/entry.S Wed Mar 07 13:16:07 2007 -0700
@@ -1509,7 +1509,7 @@ ia64_hypercall_table:
data8 do_ni_hypercall /* do_vm_assist */
data8 do_ni_hypercall /* do_update_va_mapping_othe */
data8 do_ni_hypercall /* (x86 only) */
- data8 do_ni_hypercall /* do_vcpu_op */
+ data8 do_vcpu_op /* do_vcpu_op */
data8 do_ni_hypercall /* (x86_64 only) */ /* 25 */
data8 do_ni_hypercall /* do_mmuext_op */
data8 do_ni_hypercall /* do_acm_op */
diff -r 9f8e996a678d -r 4e367aa89895 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Wed Mar 07 12:45:08 2007 -0700
+++ b/xen/arch/ia64/xen/domain.c Wed Mar 07 13:16:07 2007 -0700
@@ -50,6 +50,7 @@
#include <xen/guest_access.h>
#include <asm/tlb_track.h>
#include <asm/perfmon.h>
+#include <public/vcpu.h>
unsigned long dom0_size = 512*1024*1024;
@@ -262,6 +263,9 @@ void context_switch(struct vcpu *prev, s
vcpu_info[current->vcpu_id].evtchn_upcall_mask;
__ia64_per_cpu_var(current_psr_ic_addr) =
(int *)(nd->arch.shared_info_va + XSI_PSR_IC_OFS);
+ /* steal time accounting */
+ if (!guest_handle_is_null(runstate_guest(current)))
+ __copy_to_guest(runstate_guest(current), ¤t->runstate,
1);
} else {
/* When switching to idle domain, only need to disable vhpt
* walker. Then all accesses happen within idle context will
@@ -1257,6 +1261,45 @@ void sync_vcpu_execstate(struct vcpu *v)
// FIXME SMP: Anything else needed here for SMP?
}
+/* This function is taken from xen/arch/x86/domain.c */
+long
+arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg)
+{
+ long rc = 0;
+
+ switch (cmd) {
+ case VCPUOP_register_runstate_memory_area:
+ {
+ struct vcpu_register_runstate_memory_area area;
+ struct vcpu_runstate_info runstate;
+
+ rc = -EFAULT;
+ if (copy_from_guest(&area, arg, 1))
+ break;
+
+ if (!guest_handle_okay(area.addr.h, 1))
+ break;
+
+ rc = 0;
+ runstate_guest(v) = area.addr.h;
+
+ if (v == current) {
+ __copy_to_guest(runstate_guest(v), &v->runstate, 1);
+ } else {
+ vcpu_runstate_get(v, &runstate);
+ __copy_to_guest(runstate_guest(v), &runstate, 1);
+ }
+
+ break;
+ }
+ default:
+ rc = -ENOSYS;
+ break;
+ }
+
+ return rc;
+}
+
static void parse_dom0_mem(char *s)
{
dom0_size = parse_size_and_unit(s, NULL);
diff -r 9f8e996a678d -r 4e367aa89895 xen/include/asm-ia64/hypercall.h
--- a/xen/include/asm-ia64/hypercall.h Wed Mar 07 12:45:08 2007 -0700
+++ b/xen/include/asm-ia64/hypercall.h Wed Mar 07 13:16:07 2007 -0700
@@ -22,6 +22,7 @@ vmx_do_mmu_update(
u64 *pdone,
u64 foreigndom);
-#define arch_do_vcpu_op(cmd, vcpu, arg) (-ENOSYS)
+extern long
+arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);
#endif /* __ASM_IA64_HYPERCALL_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|