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

[XenPPC] [xenppc-unstable] [ppc] implement new upstream local_event_delivery_* interface



# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 43058739a5d32f9048d2305c2f1cd0506597da30
# Parent  7eba79a7639cac7cf96798f601efe177d6c2637e
[ppc] implement new upstream local_event_delivery_* interface
- remove 'arch_event_deliverable' hack
- PPC now uses MSR:EE instead of 'evtchn_upcall_mask'
- define vcpu_regs(vcpu *v), which should replace most users of 'current'
  and 'guest_cpu_user_regs'
---
 xen/arch/ppc/exceptions.h     |    1 -
 xen/arch/ppc/external.c       |   12 +++++-------
 xen/include/asm-ppc/current.h |   21 +++++++++++++++++++--
 xen/include/asm-ppc/domain.h  |    2 --
 xen/include/asm-ppc/event.h   |   28 ++++++++++++++++++++++++----
 5 files changed, 48 insertions(+), 16 deletions(-)

diff -r 7eba79a7639c -r 43058739a5d3 xen/arch/ppc/exceptions.h
--- a/xen/arch/ppc/exceptions.h Mon Jun 12 14:09:38 2006 -0500
+++ b/xen/arch/ppc/exceptions.h Mon Jun 12 14:20:14 2006 -0500
@@ -13,7 +13,6 @@ extern void ack_APIC_irq(void);
 extern void ack_APIC_irq(void);
 extern int ioapic_guest_read(unsigned long physbase, unsigned int reg, u32 
*pval);
 extern int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 
val);
-extern int pirq_acktype(int irq);
 extern void __start_xen_ppc(
     ulong r3, ulong r4, ulong r5, ulong r6, ulong r7, ulong orig_msr);
 extern  multiboot_info_t *boot_of_init(ulong r3, ulong r4, ulong vec, ulong 
r6, ulong r7, ulong orig_msr);
diff -r 7eba79a7639c -r 43058739a5d3 xen/arch/ppc/external.c
--- a/xen/arch/ppc/external.c   Mon Jun 12 14:09:38 2006 -0500
+++ b/xen/arch/ppc/external.c   Mon Jun 12 14:20:14 2006 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 Jimi Xenidis <jimix@xxxxxxxxxxxxxx>, IBM Corporation
+ * Copyright (C) 2005,2006 Jimi Xenidis <jimix@xxxxxxxxxxxxxx>, IBM Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,12 +51,10 @@ void deliver_ee(struct cpu_user_regs *re
                              MSR_BE | MSR_FP | MSR_PMM | MSR_PR | MSR_SE);
 
     BUG_ON(mfmsr() & MSR_EE);
-
-    /* trigger exception only if we have a pending irq, we're resuming a guest
-     * (not the hypervisor), the guest is dom0, and it has MSR:EE set. */
-    if (!event_pending(current)) return;
-    if (!(regs->msr & MSR_EE)) return;
     BUG_ON(regs->msr & MSR_HV);
+
+    if (!local_events_need_delivery())
+        return;
 
     /* XXX OS error: EE was set but RI was not. We could trigger a machine
      * check, or kill the domain... for now just crash Xen so we notice. */
@@ -107,7 +105,7 @@ static unsigned int xen_startup_irq(unsi
     if (xen_local_irq(irq)) {
         return hc_irq->startup(irq);
     }
-       return 0;
+    return 0;
 }
 
 static void xen_shutdown_irq(unsigned int irq)
diff -r 7eba79a7639c -r 43058739a5d3 xen/include/asm-ppc/current.h
--- a/xen/include/asm-ppc/current.h     Mon Jun 12 14:09:38 2006 -0500
+++ b/xen/include/asm-ppc/current.h     Mon Jun 12 14:20:14 2006 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 Hollis Blanchard <hollisb@xxxxxxxxxx>, IBM Corporation
+ * Copyright (C) 2005,2006 Hollis Blanchard <hollisb@xxxxxxxxxx>, IBM 
Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,6 +24,8 @@
 #include <asm/processor.h>
 #include <asm/ppc64/procarea.h>
 
+struct vcpu;
+
 register struct processor_area *parea asm("r13");
 
 static inline struct vcpu *get_current(void)
@@ -32,12 +34,13 @@ static inline struct vcpu *get_current(v
 }
 #define current get_current()
 
-struct vcpu;
 static inline void set_current(struct vcpu *v)
 {
     parea->cur_vcpu = v;
 }
 
+/* The *currently running* guest's register state has been saved at the top of
+ * this processor's hypervisor stack. */
 static inline struct cpu_user_regs *guest_cpu_user_regs(void)
 {
     ulong stack_top = (ulong)parea->hyp_stack_base;
@@ -45,6 +48,20 @@ static inline struct cpu_user_regs *gues
     return (struct cpu_user_regs *)(stack_top - STACK_VOLATILE_AREA
                                     - sizeof (struct cpu_user_regs));
 }
+
+/* XXX *#%(ing circular header dependencies force this to be a macro */
+/* If the vcpu is running, its state is still on the stack, and the vcpu
+ * structure's copy is obsolete. If the vcpu isn't running, the vcpu structure
+ * holds the only copy. This routine always does the right thing. */
+#define vcpu_regs(v) ({                 \
+    struct cpu_user_regs *regs;         \
+    if (v == current)                   \
+        regs = guest_cpu_user_regs();   \
+    else                                \
+        regs = &v->arch.ctxt;           \
+    regs;                               \
+})
+
 
 static inline void reset_stack_and_jump(void (*f)(void))
 {
diff -r 7eba79a7639c -r 43058739a5d3 xen/include/asm-ppc/domain.h
--- a/xen/include/asm-ppc/domain.h      Mon Jun 12 14:09:38 2006 -0500
+++ b/xen/include/asm-ppc/domain.h      Mon Jun 12 14:20:14 2006 -0500
@@ -91,8 +91,6 @@ extern void save_float(struct vcpu *);
 extern void save_float(struct vcpu *);
 extern void load_float(struct vcpu *);
 
-#define arch_event_deliverable (!!((guest_cpu_user_regs())->msr & MSR_EE))
-
 #define RMA_SHARED_INFO 1
 #define RMA_START_INFO 2
 #define RMA_LAST_DOM0 2
diff -r 7eba79a7639c -r 43058739a5d3 xen/include/asm-ppc/event.h
--- a/xen/include/asm-ppc/event.h       Mon Jun 12 14:09:38 2006 -0500
+++ b/xen/include/asm-ppc/event.h       Mon Jun 12 14:20:14 2006 -0500
@@ -8,6 +8,8 @@
 
 #ifndef __ASM_EVENT_H__
 #define __ASM_EVENT_H__
+
+#include <asm/current.h>
 
 /* copied from x86 evtchn_notify() */
 static inline void evtchn_notify(struct vcpu *v)
@@ -22,10 +24,28 @@ static inline void evtchn_notify(struct 
 #endif
 }
 
-/* Note: Bitwise operations result in fast code with no branches. */
-#define event_pending(v)                        \
-    (!!(v)->vcpu_info->evtchn_upcall_pending &  \
-      !(v)->vcpu_info->evtchn_upcall_mask)
+static inline int local_events_need_delivery(void)
+{
+    struct vcpu *v = current;
+    /* Note: Bitwise operations result in fast code with no branches. */
+    return (!!v->vcpu_info->evtchn_upcall_pending &
+            !!(vcpu_regs(v)->msr & MSR_EE));
+}
+
+static inline int local_event_delivery_is_enabled(void)
+{
+    return vcpu_regs(current)->msr & MSR_EE;
+}
+
+static inline void local_event_delivery_disable(void)
+{
+    vcpu_regs(current)->msr &= ~MSR_EE;
+}
+
+static inline void local_event_delivery_enable(void)
+{
+    vcpu_regs(current)->msr |= MSR_EE;
+}
 
 /* No arch specific virq definition now. Default to global. */
 static inline int arch_virq_is_global(int virq)

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


 


Rackspace

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