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] No direct entry to __enter_scheduler allowed. Must alway

To: xen-changelog@xxxxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] No direct entry to __enter_scheduler allowed. Must always pass through
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Sat, 26 Mar 2005 01:12:37 +0000
Delivery-date: Sat, 26 Mar 2005 02:06:53 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-archive: <http://sourceforge.net/mailarchive/forum.php?forum=xen-changelog>
List-help: <mailto:xen-changelog-request@lists.sourceforge.net?subject=help>
List-id: <xen-changelog.lists.sourceforge.net>
List-post: <mailto:xen-changelog@lists.sourceforge.net>
List-subscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=subscribe>
List-unsubscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-admin@xxxxxxxxxxxxxxxxxxxxx
ChangeSet 1.1802.1.1, 2005/03/26 01:12:37+00:00, cl349@xxxxxxxxxxxxxxxxxxxx

        No direct entry to __enter_scheduler allowed. Must always pass through
        softirq handler. Also domain_crash() now returns and defers
        descheduling from local CPU: old behaviour is still provided by
        domain_crash_synchronous().
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 arch/x86/domain.c       |    3 ++-
 arch/x86/memory.c       |   44 ++++++++------------------------------------
 arch/x86/shadow.c       |   16 ++++++++++------
 arch/x86/traps.c        |    4 ++--
 arch/x86/x86_32/entry.S |   10 +++++-----
 common/domain.c         |   26 +++++++++++++++-----------
 common/schedule.c       |    5 +++--
 include/xen/sched.h     |   15 ++++++++++++---
 8 files changed, 57 insertions(+), 66 deletions(-)


diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     2005-03-25 21:06:36 -05:00
+++ b/xen/arch/x86/domain.c     2005-03-25 21:06:36 -05:00
@@ -82,7 +82,8 @@
     /* Just some sanity to ensure that the scheduler is set up okay. */
     ASSERT(current->id == IDLE_DOMAIN_ID);
     domain_unpause_by_systemcontroller(current);
-    __enter_scheduler();
+    raise_softirq(SCHEDULE_SOFTIRQ);
+    do_softirq();
 
     /*
      * Declares CPU setup done to the boot processor.
diff -Nru a/xen/arch/x86/memory.c b/xen/arch/x86/memory.c
--- a/xen/arch/x86/memory.c     2005-03-25 21:06:37 -05:00
+++ b/xen/arch/x86/memory.c     2005-03-25 21:06:37 -05:00
@@ -1686,7 +1686,7 @@
         MEM_LOG("ptwr: Could not read pte at %p\n", ptep);
         /*
          * Really a bug. We could read this PTE during the initial fault,
-         * and pagetables can't have changed meantime. XXX Multi-CPU guests?
+         * and pagetables can't have changed meantime.
          */
         BUG();
     }
@@ -1713,7 +1713,7 @@
         MEM_LOG("ptwr: Could not update pte at %p\n", ptep);
         /*
          * Really a bug. We could write this PTE during the initial fault,
-         * and pagetables can't have changed meantime. XXX Multi-CPU guests?
+         * and pagetables can't have changed meantime.
          */
         BUG();
     }
@@ -1771,6 +1771,7 @@
                 *pl2e = mk_l2_pgentry(l2_pgentry_val(*pl2e) | _PAGE_PRESENT); 
             }
             domain_crash();
+            return;
         }
         
         if ( unlikely(sl1e != NULL) )
@@ -1834,13 +1835,17 @@
     /* Get the L2 index at which this L1 p.t. is always mapped. */
     l2_idx = page->u.inuse.type_info & PGT_va_mask;
     if ( unlikely(l2_idx >= PGT_va_unknown) )
+    {
         domain_crash(); /* Urk! This L1 is mapped in multiple L2 slots! */
+        return 0;
+    }
     l2_idx >>= PGT_va_shift;
 
     if ( l2_idx == (addr >> L2_PAGETABLE_SHIFT) )
     {
         MEM_LOG("PTWR failure! Pagetable maps itself at %08lx\n", addr);
         domain_crash();
+        return 0;
     }
 
     /*
@@ -1908,6 +1913,7 @@
         unmap_domain_mem(ptwr_info[cpu].ptinfo[which].pl1e);
         ptwr_info[cpu].ptinfo[which].l1va = 0;
         domain_crash();
+        return 0;
     }
     
     return EXCRET_fault_fixed;
@@ -1937,40 +1943,6 @@
 /************************************************************************/
 
 #ifndef NDEBUG
-
-void ptwr_status(void)
-{
-    unsigned long pte, *ptep, pfn;
-    struct pfn_info *page;
-    int cpu = smp_processor_id();
-
-    ptep = (unsigned long *)&linear_pg_table
-        [ptwr_info[cpu].ptinfo[PTWR_PT_INACTIVE].l1va>>PAGE_SHIFT];
-
-    if ( __get_user(pte, ptep) ) {
-        MEM_LOG("ptwr: Could not read pte at %p\n", ptep);
-        domain_crash();
-    }
-
-    pfn = pte >> PAGE_SHIFT;
-    page = &frame_table[pfn];
-    printk("need to alloc l1 page %p\n", page);
-    /* make pt page writable */
-    printk("need to make read-only l1-page at %p is %08lx\n",
-           ptep, pte);
-
-    if ( ptwr_info[cpu].ptinfo[PTWR_PT_ACTIVE].l1va == 0 )
-        return;
-
-    if ( __get_user(pte, (unsigned long *)
-                    ptwr_info[cpu].ptinfo[PTWR_PT_ACTIVE].l1va) ) {
-        MEM_LOG("ptwr: Could not read pte at %p\n", (unsigned long *)
-                ptwr_info[cpu].ptinfo[PTWR_PT_ACTIVE].l1va);
-        domain_crash();
-    }
-    pfn = pte >> PAGE_SHIFT;
-    page = &frame_table[pfn];
-}
 
 void audit_domain(struct domain *d)
 {
diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     2005-03-25 21:06:36 -05:00
+++ b/xen/arch/x86/shadow.c     2005-03-25 21:06:36 -05:00
@@ -580,15 +580,13 @@
                              &linear_pg_table[va >> PAGE_SHIFT])) )
     {
         SH_VVLOG("shadow_fault - EXIT: read gpte faulted" );
-        shadow_unlock(m);
-        return 0;
+        goto fail;
     }
 
     if ( unlikely(!(gpte & _PAGE_PRESENT)) )
     {
         SH_VVLOG("shadow_fault - EXIT: gpte not present (%lx)",gpte );
-        shadow_unlock(m);
-        return 0;
+        goto fail;
     }
 
     /* Write fault? */
@@ -598,8 +596,7 @@
         {
             /* Write fault on a read-only mapping. */
             SH_VVLOG("shadow_fault - EXIT: wr fault on RO page (%lx)", gpte);
-            shadow_unlock(m);
-            return 0;
+            goto fail;
         }
 
         l1pte_write_fault(m, &gpte, &spte);
@@ -616,7 +613,10 @@
     /* XXX Watch out for read-only L2 entries! (not used in Linux). */
     if ( unlikely(__put_user(gpte, (unsigned long *)
                              &linear_pg_table[va >> PAGE_SHIFT])) )
+    {
         domain_crash();
+        goto fail;
+    }
 
     /*
      * Update of shadow PTE can fail because the L1 p.t. is not shadowed,
@@ -637,6 +637,10 @@
 
     check_pagetable(m, current->mm.pagetable, "post-sf");
     return EXCRET_fault_fixed;
+
+ fail:
+    shadow_unlock(m);
+    return 0;
 }
 
 
diff -Nru a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      2005-03-25 21:06:37 -05:00
+++ b/xen/arch/x86/traps.c      2005-03-25 21:06:37 -05:00
@@ -654,8 +654,6 @@
     struct domain *d = current;
     struct trap_bounce *tb = &d->thread.trap_bounce;
 
-    DEBUGGER_trap_entry(TRAP_debug, regs);
-
     __asm__ __volatile__("movl %%db6,%0" : "=r" (condition));
 
     /* Mask out spurious debug traps due to lazy DR7 setting */
@@ -665,6 +663,8 @@
         __asm__("movl %0,%%db7" : : "r" (0));
         goto out;
     }
+
+    DEBUGGER_trap_entry(TRAP_debug, regs);
 
     if ( !GUEST_FAULT(regs) )
     {
diff -Nru a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S
--- a/xen/arch/x86/x86_32/entry.S       2005-03-25 21:06:37 -05:00
+++ b/xen/arch/x86/x86_32/entry.S       2005-03-25 21:06:37 -05:00
@@ -112,7 +112,7 @@
         jmp   test_all_events
 DBLFIX1:GET_CURRENT(%ebx)
         testb $TF_failsafe_return,DOMAIN_thread_flags(%ebx)
-        jnz   domain_crash             # cannot reenter failsafe code
+        jnz   domain_crash_synchronous # cannot reenter failsafe code
         orb   $TF_failsafe_return,DOMAIN_thread_flags(%ebx)
         jmp   test_all_events          # will return via failsafe code
 .previous
@@ -330,7 +330,7 @@
        .long FLT23,FIX7 , FLT24,FIX7 , FLT25,FIX7 , FLT26,FIX7 , FLT27,FIX7
 .previous
 .section __ex_table,"a"
-        .long DBLFLT2,domain_crash
+        .long DBLFLT2,domain_crash_synchronous
 .previous
 
         ALIGN
@@ -620,9 +620,9 @@
         jmp test_all_events
 
 .section __ex_table,"a"
-        .long VFLT1,domain_crash
-        .long VFLT2,domain_crash
-        .long VFLT3,domain_crash
+        .long VFLT1,domain_crash_synchronous
+        .long VFLT2,domain_crash_synchronous
+        .long VFLT3,domain_crash_synchronous
 .previous
 
 .data
diff -Nru a/xen/common/domain.c b/xen/common/domain.c
--- a/xen/common/domain.c       2005-03-25 21:06:37 -05:00
+++ b/xen/common/domain.c       2005-03-25 21:06:37 -05:00
@@ -9,6 +9,7 @@
 #include <xen/lib.h>
 #include <xen/errno.h>
 #include <xen/sched.h>
+#include <xen/softirq.h>
 #include <xen/mm.h>
 #include <xen/event.h>
 #include <xen/time.h>
@@ -146,8 +147,15 @@
 
     send_guest_virq(dom0, VIRQ_DOM_EXC);
     
-    __enter_scheduler();
-    BUG();
+    raise_softirq(SCHEDULE_SOFTIRQ);
+}
+
+
+void domain_crash_synchronous(void)
+{
+    domain_crash();
+    for ( ; ; )
+        do_softirq();
 }
 
 void domain_shutdown(u8 reason)
@@ -169,18 +177,14 @@
         }
     }
 


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>