WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] emulate PAL_HALT_LIGHT on domU
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 28 Jul 2006 16:20:51 +0000
Delivery-date: Fri, 28 Jul 2006 09:27:30 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] emulate PAL_HALT_LIGHT on domU, Xen patchbot-unstable <=