changeset: 9667:910d71f2bf1b
tag: tip
user: jimix@xxxxxxxxxxxxxxxxxxxxx
date: Wed Mar 29 12:33:40 2006 -0500
summary: [ppc] Must check softirq conditions on return from hcall.
diff -r 06bc81089a95 -r 910d71f2bf1b xen/arch/ppc/ppc64/exceptions.S
--- a/xen/arch/ppc/ppc64/exceptions.S Wed Mar 29 12:32:25 2006 -0500
+++ b/xen/arch/ppc/ppc64/exceptions.S Wed Mar 29 12:33:40 2006 -0500
@@ -365,9 +365,33 @@ ex_hcall_continued:
mr r3, r1 /* pass pointer to cpu_user_regs */
subi r1, r1, STACK_FRAME_OVERHEAD /* make a "caller" stack frame */
CALL_CFUNC r12
-
+ /* test for pending softirqs, and loop until there are no more. */
+hcall_test_all_events:
+ ld r3, PAREA_vcpu(r13)
+ lwz r3, VCPU_processor(r3)
+ LOADADDR r4, irq_stat
+ sldi r3, r3, IRQSTAT_shift
+ add r4, r3, r4
+ ld r5, IRQSTAT_pending(r4)
+ cmpldi r5, 0
+ beq hcall_out
+
+ /* we could use nonvolatile GPRs across do_softirq calls, but those are
+ * volatile across exceptions :( */
+ LOADADDR r6, ppc_do_softirq
+ mfmsr r3 /* we pass this MSR to _do_softirq so
+ * it can give it to us back without
+ * having to save it */
+ ori r8, r3, MSR_EE
+
+ mtmsrd r8 /* enable interrupts */
+ CALL_CFUNC r6 /* process softirqs returns r3 */
+ mtmsrd r3 /* disable interrupts */
+ b hcall_test_all_events /* look for more */
+hcall_out:
addi r1, r1, STACK_FRAME_OVERHEAD /* restore stack to cpu_user_regs */
b fast_resume
+
ex_dec_continued:
EXCEPTION_SAVE_STATE r1
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|