# 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
|