Kernel - x86 Fixed a couple of bugs
authorJohn Hodge <[email protected]>
Sat, 11 Jun 2011 13:37:10 +0000 (21:37 +0800)
committerJohn Hodge <[email protected]>
Sat, 11 Jun 2011 13:37:10 +0000 (21:37 +0800)
- Page fault handler used a spinlock, needed interupts enabled
- Added a check for HLT() IF=0
- Added a backtrace to kernel panic code
- Random bugcatching in mm_phys

Kernel/arch/x86/errors.c
Kernel/arch/x86/include/arch.h
Kernel/arch/x86/kpanic.c
Kernel/arch/x86/lib.c
Kernel/arch/x86/mm_phys.c

index 22ad1a3..dcedcd5 100644 (file)
@@ -75,6 +75,7 @@ void ErrorHandler(tRegs *Regs)
        // Page Fault
        if(Regs->int_num == 14)
        {
+               __asm__ __volatile__ ("sti");   // Should be OK, TODO: Test
                __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr));
                MM_PageFault( cr, Regs->err_code, Regs );
                return ;
index 66d7a79..ade7491 100644 (file)
@@ -58,7 +58,16 @@ struct sShortSpinlock {
 /**
  * \brief Halt the CPU (shorter version of yield)
  */
+#if 1
+#define        HALT()  do { \
+       Uint32  flags; \
+       __asm__ __volatile__ ("pushf;pop %0" : "=a"(flags)); \
+       if( !(flags & 0x200) )  Panic("HALT called with interrupts disabled"); \
+       __asm__ __volatile__ ("hlt"); \
+} while(0)
+#else
 #define        HALT()  __asm__ __volatile__ ("hlt")
+#endif
 /**
  * \brief Fire a magic breakpoint (bochs)
  */
index 0950be8..ccb1073 100644 (file)
@@ -6,11 +6,16 @@
 
 #include <acess.h>
 
+
+
 #define        FB      ((Uint16 *)(KERNEL_BASE|0xB8000))
 #define BGC    0x4F00  // White on Red
 //#define BGC  0xC000  // Black on Bright Red
 //#define BGC  0x1F00  // White on Blue (BSOD!)
 
+extern Uint32  GetEIP(void);
+extern void    Error_Backtrace(Uint32 eip, Uint32 ebp);
+
  int   giKP_Pos = 0;
 
 const struct {
@@ -70,7 +75,7 @@ void KernelPanic_SetMode(void)
        if( giKP_Pos )  return ;
        
        // Restore VGA 0xB8000 text mode
-       #if 0
+       #if 1
        for( i = 0; i < NUM_REGVALUES; i++ )
        {
                // Reset Flip-Flop
@@ -90,6 +95,13 @@ void KernelPanic_SetMode(void)
        {
                FB[i] = BGC;
        }
+       
+       {
+               Uint32  eip = GetEIP();
+               Uint32  ebp;
+               __asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp));
+               Error_Backtrace(eip, ebp);
+       }
 }
 
 void KernelPanic_PutChar(char Ch)
index dbdb98d..a3f98be 100644 (file)
@@ -178,7 +178,7 @@ int putDebugChar(char ch)
                outb(GDB_SERIAL_PORT + 3, 0x03);    // 8 bits, no parity, one stop bit (8N1)
                outb(GDB_SERIAL_PORT + 2, 0xC7);    // Enable FIFO with 14-byte threshold and clear it
                outb(GDB_SERIAL_PORT + 4, 0x0B);    // IRQs enabled, RTS/DSR set
-               gbDebug_SerialSetup = 1;
+               gbGDB_SerialSetup = 1;
        }
        while( (inb(GDB_SERIAL_PORT + 5) & 0x20) == 0 );
        outb(GDB_SERIAL_PORT, ch);
@@ -194,7 +194,7 @@ int getDebugChar(void)
                outb(GDB_SERIAL_PORT + 3, 0x03);    // 8 bits, no parity, one stop bit
                outb(GDB_SERIAL_PORT + 2, 0xC7);    // Enable FIFO with 14-byte threshold and clear it
                outb(GDB_SERIAL_PORT + 4, 0x0B);    // IRQs enabled, RTS/DSR set
-               gbDebug_SerialSetup = 1;
+               gbGDB_SerialSetup = 1;
        }
        while( (inb(GDB_SERIAL_PORT + 5) & 1) == 0)     ;
        return inb(GDB_SERIAL_PORT);
index a1feb46..29c280d 100644 (file)
@@ -1,4 +1,4 @@
-/*
+"/*
  * Acess2
  * - Physical memory manager
  */
@@ -248,6 +248,13 @@ tPAddr MM_AllocPhys(void)
                Panic("The fuck? Too many pages! (indx = 0x%x)", indx);
        }
        
+       if( indx >= giPageCount ) {
+               Mutex_Release( &glPhysAlloc );
+               Log_Error("PMem", "MM_AllocPhys - indx(%i) > giPageCount(%i)", indx, giPageCount);
+               LEAVE('i', 0);
+               return 0;
+       }
+       
        // Mark page used
        if(gaPageReferences)
                gaPageReferences[ indx ] = 1;

UCC git Repository :: git.ucc.asn.au