[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [IA64] emulate PAL_HALT_LIGHT on domU



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 8ad37880564dff8599f2f410f7bd0c54a50a29e2
# Parent  a1482fd7453049806fb1eabd7320615405ca7910
[IA64] emulate PAL_HALT_LIGHT on domU

This patch emulates Guest PAL_HALT_LIGHT on domU by using do_block and timer.
It also adds the function of the timer interrupt to domU at the vcpu woke up.

Signed-off-by: Atsushi SAKAI <sakaia@xxxxxxxxxxxxxx>
[warning fixes and static inlining]
Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
---
 xen/arch/ia64/vmx/vlsapic.c   |    2 --
 xen/arch/ia64/xen/domain.c    |   11 +++++++++++
 xen/arch/ia64/xen/hypercall.c |    4 +++-
 xen/arch/ia64/xen/xentime.c   |   14 --------------
 xen/include/asm-ia64/domain.h |    1 +
 xen/include/asm-ia64/time.h   |   24 ++++++++++++++++++++++++
 xen/include/asm-ia64/vcpu.h   |    8 ++++++++
 7 files changed, 47 insertions(+), 17 deletions(-)

diff -r a1482fd74530 -r 8ad37880564d xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/arch/ia64/vmx/vlsapic.c       Mon Jul 10 13:12:41 2006 -0600
@@ -165,8 +165,6 @@ void vtm_set_itc(VCPU *vcpu, uint64_t ne
 
 
 #define TIMER_SLOP (50*1000) /* ns */  /* copy from timer.c */
-extern u64 cycle_to_ns(u64 cyle);
-
 
 void vtm_set_itm(VCPU *vcpu, uint64_t val)
 {
diff -r a1482fd74530 -r 8ad37880564d xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c        Mon Jul 10 13:12:41 2006 -0600
@@ -248,6 +248,14 @@ void startup_cpu_idle_loop(void)
        continue_cpu_idle_loop();
 }
 
+void hlt_timer_fn(void *data)
+{
+       struct vcpu *v = data;
+       if (vcpu_timer_expired(v))
+               vcpu_pend_timer(v);
+       vcpu_unblock(v);   
+}
+
 struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id)
 {
        struct vcpu *v;
@@ -303,6 +311,8 @@ struct vcpu *alloc_vcpu_struct(struct do
            v->arch.breakimm = d->arch.breakimm;
            v->arch.last_processor = INVALID_PROCESSOR;
        }
+       if (!VMX_DOMAIN(v))
+               init_timer(&v->arch.hlt_timer, hlt_timer_fn, v, v->processor);
 
        return v;
 }
@@ -315,6 +325,7 @@ void free_vcpu_struct(struct vcpu *v)
                if (v->arch.privregs != NULL)
                        free_xenheap_pages(v->arch.privregs,
                                      get_order_from_shift(XMAPPEDREGS_SHIFT));
+               kill_timer(&v->arch.hlt_timer);
        }
 
        free_xenheap_pages(v, KERNEL_STACK_SIZE_ORDER);
diff -r a1482fd74530 -r 8ad37880564d xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/arch/ia64/xen/hypercall.c     Mon Jul 10 13:12:41 2006 -0600
@@ -220,7 +220,9 @@ fw_hypercall (struct pt_regs *regs)
                        }
                        else {
                                pal_halt_light_count++;
-                               do_sched_op_compat(SCHEDOP_yield, 0);
+                               set_timer(&v->arch.hlt_timer,
+                                         vcpu_get_next_timer_ns(v));
+                               do_sched_op_compat(SCHEDOP_block, 0);
                        }
                        regs->r8 = 0;
                        regs->r9 = 0;
diff -r a1482fd74530 -r 8ad37880564d xen/arch/ia64/xen/xentime.c
--- a/xen/arch/ia64/xen/xentime.c       Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/arch/ia64/xen/xentime.c       Mon Jul 10 13:12:41 2006 -0600
@@ -41,20 +41,6 @@ static s_time_t        stime_irq = 0x0; 
 static s_time_t        stime_irq = 0x0;       /* System time at last 'time 
update' */
 unsigned long itc_scale, ns_scale;
 unsigned long itc_at_irq;
-
-/* We don't expect an absolute cycle value here, since then no way
- * to prevent overflow for large norminator. Normally this conversion
- * is used for relative offset.
- */
-u64 cycle_to_ns(u64 cycle)
-{
-    return (cycle * itc_scale) >> 32;
-}
-
-u64 ns_to_cycle(u64 ns)
-{
-    return (ns * ns_scale) >> 32;
-}
 
 static inline u64 get_time_delta(void)
 {
diff -r a1482fd74530 -r 8ad37880564d xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/include/asm-ia64/domain.h     Mon Jul 10 13:12:41 2006 -0600
@@ -170,6 +170,7 @@ struct arch_vcpu {
     unsigned long old_rsc;
     int mode_flags;
     fpswa_ret_t fpswa_ret;     /* save return values of FPSWA emulation */
+    struct timer hlt_timer;
     struct arch_vmx_struct arch_vmx; /* Virtual Machine Extensions */
 
 #define INVALID_PROCESSOR       INT_MAX
diff -r a1482fd74530 -r 8ad37880564d xen/include/asm-ia64/time.h
--- a/xen/include/asm-ia64/time.h       Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/include/asm-ia64/time.h       Mon Jul 10 13:12:41 2006 -0600
@@ -1,2 +1,26 @@
+#ifndef _XEN_IA64_TIME_H
+#define _XEN_IA64_TIME_H
+
 #include <asm/linux/time.h>
 #include <asm/timex.h>
+
+extern unsigned long itc_scale;
+extern unsigned long ns_scale;
+
+/* We don't expect an absolute cycle value here, since then no way
+ * to prevent overflow for large norminator. Normally this conversion
+ * is used for relative offset.
+ */
+static inline u64
+cycle_to_ns(u64 cycle)
+{
+    return (cycle * itc_scale) >> 32;
+}
+
+static inline u64
+ns_to_cycle(u64 ns)
+{
+    return (ns * ns_scale) >> 32;
+}
+
+#endif /* _XEN_IA64_TIME_H */
diff -r a1482fd74530 -r 8ad37880564d xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Sun Jul 09 22:50:43 2006 -0600
+++ b/xen/include/asm-ia64/vcpu.h       Mon Jul 10 13:12:41 2006 -0600
@@ -4,9 +4,11 @@
 // TODO: Many (or perhaps most) of these should eventually be
 // static inline functions
 
+#include <asm/delay.h>
 #include <asm/fpu.h>
 #include <asm/tlb.h>
 #include <asm/ia64_int.h>
+#include <asm/time.h>
 #include <public/arch-ia64.h>
 typedef        unsigned long UINT64;
 typedef        unsigned int UINT;
@@ -177,6 +179,12 @@ itir_mask(UINT64 itir)
     return (~((1UL << itir_ps(itir)) - 1));
 }
 
+static inline u64
+vcpu_get_next_timer_ns(VCPU *vcpu)
+{
+    return cycle_to_ns(PSCBX(vcpu, domain_itm) - ia64_get_itc()) + NOW();
+}
+
 #define verbose(a...) do {if (vcpu_verbose) printf(a);} while(0)
 
 //#define vcpu_quick_region_check(_tr_regions,_ifa) 1

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.