Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / lib.c
index 175f9a5..2039924 100644 (file)
@@ -8,6 +8,7 @@
 #include <threads_int.h>
 #include <arch_int.h>
 #include <hal_proc.h>  // GetCPUNum
+#include <drv_serial.h>
 
 #define TRACE_LOCKS    0
 
@@ -28,6 +29,7 @@ extern tMutex glPhysAlloc;
 Uint64 __divmod64(Uint64 Num, Uint64 Den, Uint64 *Rem);
 Uint64 __udivdi3(Uint64 Num, Uint64 Den);
 Uint64 __umoddi3(Uint64 Num, Uint64 Den);
+void   Debug_SerialIRQHandler(int irq, void *unused);
 
 // === GLOBALS ===
  int   gbDebug_SerialSetup = 0;
@@ -85,6 +87,12 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
        __ASM__ ("pushf;\n\tpop %0" : "=r"(IF));
        IF &= 0x200;    // AND out all but the interrupt flag
        
+       if( CPU_HAS_LOCK(Lock) )
+       {
+               Panic("Double lock of %p, %p req, %p has", Lock, __builtin_return_address(0), Lock->LockedBy);
+               for(;;);
+       }
+
        #if TRACE_LOCKS
        if( TRACE_LOCK_COND )
        {
@@ -98,6 +106,7 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
        // Wait for another CPU to release
        __AtomicTestSetLoop( (Uint*)&Lock->Lock, cpu );
        Lock->IF = IF;
+       Lock->LockedBy = __builtin_return_address(0);
        
        #if TRACE_LOCKS
        if( TRACE_LOCK_COND )
@@ -177,12 +186,14 @@ void Debug_PutCharDebug(char ch)
        if(!gbDebug_SerialSetup) {
                outb(SERIAL_PORT + 1, 0x00);    // Disable all interrupts
                outb(SERIAL_PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
-               outb(SERIAL_PORT + 0, 0x0C);    // Set divisor to 12 (lo byte) 9600 baud
-               outb(SERIAL_PORT + 1, 0x00);    //                   (hi byte)
+               outb(SERIAL_PORT + 0, 0x01);    // Set divisor to 1 (lo byte) - 115200 baud
+               outb(SERIAL_PORT + 1, 0x00);    //                  (hi byte)
                outb(SERIAL_PORT + 3, 0x03);    // 8 bits, no parity, one stop bit
                outb(SERIAL_PORT + 2, 0xC7);    // Enable FIFO with 14-byte threshold and clear it
                outb(SERIAL_PORT + 4, 0x0B);    // IRQs enabled, RTS/DSR set
+               outb(SERIAL_PORT + 1, 0x05);    // Enable ERBFI (Rx Full), ELSI (Line Status)
                gbDebug_SerialSetup = 1;
+               IRQ_AddHandler(4, Debug_SerialIRQHandler, NULL);
        }
        while( (inb(SERIAL_PORT + 5) & 0x20) == 0 );
        outb(SERIAL_PORT, ch);
@@ -195,6 +206,17 @@ void Debug_PutStringDebug(const char *String)
                Debug_PutCharDebug(*String++);
 }
 
+void Debug_SerialIRQHandler(int irq, void *unused)
+{
+       if( (inb(SERIAL_PORT+5) & 0x01) == 0 ) {
+               Debug("IRQ4, no data");
+               return ;
+       }
+       
+       char ch = inb(SERIAL_PORT);
+       Serial_ByteReceived(gSerial_KernelDebugPort, ch);
+}
+
 // === IO Commands ===
 void outb(Uint16 Port, Uint8 Data)
 {
@@ -344,6 +366,10 @@ DEF_DIVMOD(64);
 
 Uint64 DivMod64U(Uint64 Num, Uint64 Div, Uint64 *Rem)
 {
+       if( Div == 16 ) {
+               if(Rem) *Rem = Num & 15;
+               return Num >> 4;
+       }
        if( Div < 0x100000000ULL && Num < 0xFFFFFFFF * Div ) {
                Uint32  rem, ret_32;
                __asm__ __volatile__(

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