[ros-diffs] [arty] 30348: - Don't touch real segments until after booting. - Hang function isn't too useful.

arty at svn.reactos.org arty at svn.reactos.org
Sun Nov 11 04:19:19 CET 2007


Author: arty
Date: Sun Nov 11 06:19:17 2007
New Revision: 30348

URL: http://svn.reactos.org/svn/reactos?rev=30348&view=rev
Log:
- Don't touch real segments until after booting.
- Hang function isn't too useful.

Modified:
    trunk/reactos/lib/ppcmmu/mmuobject.c

Modified: trunk/reactos/lib/ppcmmu/mmuobject.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/ppcmmu/mmuobject.c?rev=30348&r1=30347&r2=30348&view=diff
==============================================================================
--- trunk/reactos/lib/ppcmmu/mmuobject.c (original)
+++ trunk/reactos/lib/ppcmmu/mmuobject.c Sun Nov 11 06:19:17 2007
@@ -59,7 +59,7 @@
 MmuFreePage *FreeList;
 // Pages are allocated one by one until NextPage == RamSize >> PPC_PAGE_SHIFT
 // Then we take only from the free list
-int Clock = 0, TreeAlloc = 0, GdbAttach = 0;
+int Clock = 0, TreeAlloc = 0, GdbAttach = 0, Booted = 0, Vsid[16];
 paddr_t RamSize, FirstUsablePage, NextPage;
 MmuVsidTree *NextTreePage = 0;
 MmuFreeTree *FreeTree;
@@ -112,7 +112,7 @@
     case 0xa:
     case 0xc:
     case 0x20:
-        if (!callback[action](action,trap_frame)) hang(action, trap_frame);
+        if (!callback[action](action,trap_frame)) TakeException(action, trap_frame);
         break;
 
         /* MMU Functions */
@@ -241,21 +241,10 @@
     return 1;
 }
 
-int hang(int trapCode, ppc_trap_frame_t *trap)
-{
-    if (!GdbAttach)
-    {
-        GdbAttach = 1;
-        SerialSetUp(0, (void *)0x800003f8, 9600);
-    }
-    while(1) SerialInterrupt(trapCode, trap);
-    return 1;
-}
-
 int fpenable(int trapCode, ppc_trap_frame_t *trap)
 {
         /* Turn on FP */
-        trap->srr0 |= 8192;
+        trap->srr1 |= 8192;
         return 1;
 }
 
@@ -286,7 +275,7 @@
     /* Default to hang on unknown exception */
     for(i = 0; i < 30; i++)
     {
-        callback[i] = hang;
+        callback[i] = TakeException;
         if (i != 1) /* Preserve reset handler */
             copy_trap_handler(i);
     }
@@ -569,8 +558,10 @@
     {
 	s_vsid = (vsid << 4) | (i & 15);
 	sr = (GetSR(i) & ~PPC_VSID_MASK) | s_vsid;
-	SetSR(i, sr);
+	if (Booted)
+            SetSR(i, sr);
 	Segs[i] = findvsid(s_vsid);
+        Vsid[i] = s_vsid;
     }
 }
 
@@ -595,6 +586,17 @@
 
 void callkernel(void *fun_ptr, void *arg)
 {
+    int i;
+
+    Booted = 1;
+
+    for (i = 0; i < 16; i++)
+    {
+        // Patch up the vsid map.  We shouldn't muck with these until we're
+        // booted.
+        mmusetvsid(i, i+1, Vsid[i]);
+    }
+
     void (*fun)(void *) = fun_ptr;
     __asm__("mfmsr 3\n\t"
             "ori 3,3,0x30\n\t"




More information about the Ros-diffs mailing list