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-ppc-devel

[XenPPC] [xenppc-unstable] [ppc] fix interrupt disabling in exceptions.S

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [xenppc-unstable] [ppc] fix interrupt disabling in exceptions.S
From: Xen patchbot-xenppc-unstable <patchbot-xenppc-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 08 Jun 2006 21:40:31 +0000
Delivery-date: Thu, 08 Jun 2006 14:46:14 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 93e69598bbc8fbf05156397c73e09887697485ad
# Parent  1bb8eff867204b362e5e4aa018432959b4f64930
[ppc] fix interrupt disabling in exceptions.S
- some assembly incorrectly assumed MSR:EE was already off.
- remove ppc_do_softirq hack by manually saving/restoring a couple
  nonvolatiles.
- use extended form of mtmsrd to save a couple instructions. (Plenty of room
  for optimization remains in exceptions.S...)
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
 xen/arch/ppc/exceptions.c       |    7 ---
 xen/arch/ppc/exceptions.h       |    1 
 xen/arch/ppc/external.c         |    3 -
 xen/arch/ppc/ppc64/exceptions.S |   71 ++++++++++++++++++----------------------
 4 files changed, 34 insertions(+), 48 deletions(-)

diff -r 1bb8eff86720 -r 93e69598bbc8 xen/arch/ppc/exceptions.c
--- a/xen/arch/ppc/exceptions.c Thu Jun 08 17:20:11 2006 -0400
+++ b/xen/arch/ppc/exceptions.c Thu Jun 08 16:38:31 2006 -0500
@@ -33,13 +33,6 @@ extern void program_exception(struct cpu
 extern void program_exception(struct cpu_user_regs *regs, unsigned long 
cookie);
 
 int hdec_sample = 0;
-
-/* XXX fix test_all_events not to need this hack */
-ulong ppc_do_softirq(ulong orig_msr)
-{
-    do_softirq();
-    return orig_msr;
-}
 
 void do_timer(struct cpu_user_regs *regs)
 {
diff -r 1bb8eff86720 -r 93e69598bbc8 xen/arch/ppc/exceptions.h
--- a/xen/arch/ppc/exceptions.h Thu Jun 08 17:20:11 2006 -0400
+++ b/xen/arch/ppc/exceptions.h Thu Jun 08 16:38:31 2006 -0500
@@ -18,7 +18,6 @@ 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);
 
-extern ulong ppc_do_softirq(ulong orig_msr);
 extern void do_timer(struct cpu_user_regs *regs);
 extern void do_dec(struct cpu_user_regs *regs);
 extern void program_exception(
diff -r 1bb8eff86720 -r 93e69598bbc8 xen/arch/ppc/external.c
--- a/xen/arch/ppc/external.c   Thu Jun 08 17:20:11 2006 -0400
+++ b/xen/arch/ppc/external.c   Thu Jun 08 16:38:31 2006 -0500
@@ -50,8 +50,7 @@ void deliver_ee(struct cpu_user_regs *re
                              MSR_RI |
                              MSR_BE | MSR_FP | MSR_PMM | MSR_PR | MSR_SE);
 
-
-    local_irq_disable();
+    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. */
diff -r 1bb8eff86720 -r 93e69598bbc8 xen/arch/ppc/ppc64/exceptions.S
--- a/xen/arch/ppc/ppc64/exceptions.S   Thu Jun 08 17:20:11 2006 -0400
+++ b/xen/arch/ppc/ppc64/exceptions.S   Thu Jun 08 16:38:31 2006 -0500
@@ -304,11 +304,10 @@ exception_vectors_end:
     ld r0, UREGS_ctr(r1)
     mtctr r0
 
-    /* clear MSR:RI to set SRR0/SRR1 */
+    /* clear MSR:RI/EE to set SRR0/SRR1 */
     mfmsr r0
-    li r13, MSR_RI 
-    andc r0, r0, r13
-    mtmsrd r0
+    li r13, 0
+    mtmsrd r0, 1
 
     ld r0, UREGS_pc(r1)
     mtspr SPRN_HSRR0, r0
@@ -367,9 +366,14 @@ ex_hcall_continued:
     LOADADDR r12, do_hcall
     mr r3, r1                           /* pass pointer to cpu_user_regs */
     subi r1, r1, STACK_FRAME_OVERHEAD   /* make a "caller" stack frame */
-    CALL_CFUNC r12
+    CALL_CFUNC r12                      /* call hcall handler */
+
     /* test for pending softirqs, and loop until there are no more. */
+    mfmsr r14
+    ori r14, r14, MSR_EE
+    xori r15, r14, MSR_EE
 hcall_test_all_events:
+    mtmsrd r15, 1                       /* disable interrupts */
     ld r3, PAREA_vcpu(r13)
     lwz r3, VCPU_processor(r3)
     LOADADDR r4, irq_stat
@@ -377,22 +381,16 @@ hcall_test_all_events:
     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:     
+    beq hcall_out                       /* no more softirqs; exit loop */
+
+    LOADADDR r6, do_softirq
+    mtmsrd r14, 1                       /* enable interrupts */
+    CALL_CFUNC r6                       /* process softirqs */
+    b hcall_test_all_events             /* look for more */
+
+hcall_out:
     addi r1, r1, STACK_FRAME_OVERHEAD   /* restore stack to cpu_user_regs */
+    LOAD_GPRS r14, r15, r1              /* we clobbered r14/r15 */
     b fast_resume
 
 
@@ -423,7 +421,11 @@ ex_hdec_continued:
     bne hdec_out
 
     /* test for pending softirqs, and loop until there are no more. */
+    mfmsr r14
+    ori r14, r14, MSR_EE
+    xori r15, r14, MSR_EE
 test_all_events:
+    mtmsrd r15, 1                       /* disable interrupts */
     ld r3, PAREA_vcpu(r13)
     lwz r3, VCPU_processor(r3)
     LOADADDR r4, irq_stat
@@ -431,36 +433,29 @@ test_all_events:
     add r4, r3, r4
     ld r5, IRQSTAT_pending(r4)
     cmpldi r5, 0
-    beq hdec_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 */
+    beq hdec_out                        /* no more softirqs; exit loop */
+
+    LOADADDR r6, do_softirq
+    mtmsrd r14, 1                       /* enable interrupts */
+    CALL_CFUNC r6                       /* process softirqs */
     b test_all_events                   /* look for more */
 
 hdec_out:
     addi r1, r1, STACK_FRAME_OVERHEAD   /* restore stack to cpu_user_regs */
+    LOAD_GPRS r14, r15, r1              /* we clobbered r14/r15 in the loop */
 
 /* r1 points to the to-be-restored cpu_user_regs. These could be mid-hypervisor
  * stack (returning into elsewhere in Xen) or at the top of the stack
  * (restoring the domain). */
 _GLOBAL(full_resume)
-    /* disable MSR:EE, since we got here from inside do_softirq() */
+    /* disable MSR:EE, since we could have come from do_softirq() */
     mfmsr r7
-    li r8, 0
-    ori r8, r8, MSR_EE
-    andc r7, r7, r8
-    mtmsrd r7
+    ori r7, r7, MSR_EE
+    xori r7, r7, MSR_EE
+    mtmsrd r7, 1
 
     LOAD_GPRS r14, r31, r1              /* restore all non-volatiles */
+
 fast_resume:
     ld r10, UREGS_msr(r1)
     rldicl. r11, r10, 4, 63             /* test SRR1:HV */

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

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [xenppc-unstable] [ppc] fix interrupt disabling in exceptions.S, Xen patchbot-xenppc-unstable <=