Build - Restructured configuration
[tpg/acess2.git] / Kernel / arch / x86_64 / lib.c
index dcd6ec3..5b9609a 100644 (file)
@@ -3,8 +3,22 @@
 #include <acess.h>
 #include <arch.h>
 
+#define DEBUG_TO_E9    1
+#define DEBUG_TO_SERIAL        1
+#define        SERIAL_PORT     0x3F8
+#define        GDB_SERIAL_PORT 0x2F8
+
+
 // === IMPORTS ===
 extern int     GetCPUNum(void);
+extern void    *Proc_GetCurThread(void);
+
+// === GLOBALS ===
+ int   gbDebug_SerialSetup = 0;
+ int   gbGDB_SerialSetup = 0;
+
+// === PROTOTYPEs ===
+ int   putDebugChar(char ch);
 
 // === CODE ===
 /**
@@ -58,7 +72,7 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
        
        #if LOCK_DISABLE_INTS
        // Save interrupt state and clear interrupts
-       __ASM__ ("pushf;\n\tpop %%eax\n\tcli" : "=a"(IF));
+       __ASM__ ("pushf;\n\tpop %0" : "=r"(IF));
        IF &= 0x200;    // AND out all but the interrupt flag
        #endif
        
@@ -85,16 +99,21 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
                        : "a"(0), "r"(cpu), "r"(&Lock->Lock)
                        );
                #elif STACKED_LOCKS == 2
-               __ASM__("lock cmpxchgl %2, (%3)"
+               __ASM__("lock cmpxchgq %2, (%3)"
                        : "=a"(v)
                        : "a"(0), "r"(thread), "r"(&Lock->Lock)
                        );
                #else
-               __ASM__("xchgl %%eax, (%%edi)":"=a"(v):"a"(1),"D"(&Lock->Lock));
+               __ASM__("xchgl %0, (%2)":"=a"(v):"a"(1),"D"(&Lock->Lock));
+               #endif
+               
+               #if LOCK_DISABLE_INTS
+               if( v ) __ASM__("sti"); // Re-enable interrupts
                #endif
        }
        
        #if LOCK_DISABLE_INTS
+       __ASM__("cli");
        Lock->IF = IF;
        #endif
 }
@@ -125,6 +144,70 @@ void SHORTREL(struct sShortSpinlock *Lock)
        #endif
 }
 
+// === DEBUG IO ===
+#if USE_GDB_STUB
+int putDebugChar(char ch)
+{
+       if(!gbGDB_SerialSetup) {
+               outb(GDB_SERIAL_PORT + 1, 0x00);    // Disable all interrupts
+               outb(GDB_SERIAL_PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
+               outb(GDB_SERIAL_PORT + 0, 0x0C);    // Set divisor to 12 (lo byte) 9600 baud
+               outb(GDB_SERIAL_PORT + 1, 0x00);    //  (base is         (hi byte)
+               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;
+       }
+       while( (inb(GDB_SERIAL_PORT + 5) & 0x20) == 0 );
+       outb(GDB_SERIAL_PORT, ch);
+       return 0;
+}
+int getDebugChar(void)
+{
+       if(!gbGDB_SerialSetup) {
+               outb(GDB_SERIAL_PORT + 1, 0x00);    // Disable all interrupts
+               outb(GDB_SERIAL_PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
+               outb(GDB_SERIAL_PORT + 0, 0x0C);    // Set divisor to 12 (lo byte) 9600 baud
+               outb(GDB_SERIAL_PORT + 1, 0x00);    //                   (hi byte)
+               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;
+       }
+       while( (inb(GDB_SERIAL_PORT + 5) & 1) == 0)     ;
+       return inb(GDB_SERIAL_PORT);
+}
+#endif
+
+void Debug_PutCharDebug(char ch)
+{
+       #if DEBUG_TO_E9
+       __asm__ __volatile__ ( "outb %%al, $0xe9" :: "a"(((Uint8)ch)) );
+       #endif
+       
+       #if DEBUG_TO_SERIAL
+       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 + 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
+               gbDebug_SerialSetup = 1;
+       }
+       while( (inb(SERIAL_PORT + 5) & 0x20) == 0 );
+       outb(SERIAL_PORT, ch);
+       #endif
+}
+
+void Debug_PutStringDebug(const char *String)
+{
+       while(*String)
+               Debug_PutCharDebug(*String++);
+}
+
+// === PORT IO ===
 void outb(Uint16 Port, Uint8 Data)
 {
        __asm__ __volatile__ ("outb %%al, %%dx"::"d"(Port),"a"(Data));
@@ -157,6 +240,7 @@ Uint32 ind(Uint16 Port)
 }
 
 // === Endianness ===
+/*
 Uint32 BigEndian32(Uint32 Value)
 {
        Uint32  ret;
@@ -171,6 +255,7 @@ Uint16 BigEndian16(Uint16 Value)
 {
        return  (Value>>8)|(Value<<8);
 }
+*/
 
 // === Memory Manipulation ===
 int memcmp(const void *__dest, const void *__src, size_t __count)
@@ -234,22 +319,22 @@ int memcmp(const void *__dest, const void *__src, size_t __count)
 
 void *memcpy(void *__dest, const void *__src, size_t __count)
 {
-       if( ((tVAddr)__dest & 7) != ((tVAddr)__src & 7) )
-               __asm__ __volatile__ ("rep movsb" : : "D"(__dest),"S"(__src),"c"(__count));
-       else {
-               const Uint8     *src = __src;
-               Uint8   *dst = __dest;
-               while( (tVAddr)src & 7 && __count ) {
-                       *dst++ = *src++;
+       tVAddr  dst = (tVAddr)__dest, src = (tVAddr)__src;
+       if( (dst & 7) != (src & 7) )
+       {
+               __asm__ __volatile__ ("rep movsb" : : "D"(dst),"S"(src),"c"(__count));
+       }
+       else
+       {
+               while( (src & 7) && __count ) {
+                       *(char*)dst++ = *(char*)src++;
                        __count --;
                }
 
-               __asm__ __volatile__ ("rep movsq" : : "D"(dst),"S"(src),"c"(__count/8));
-               src += __count & ~7;
-               dst += __count & ~7;
+               __asm__ __volatile__ ("rep movsq" : "=D"(dst),"=S"(src) : "0"(dst),"1"(src),"c"(__count/8));
                __count = __count & 7;
                while( __count-- )
-                       *dst++ = *src++;
+                       *(char*)dst++ = *(char*)src++;
        }
        return __dest;
 }
@@ -276,3 +361,15 @@ void *memsetd(void *__dest, Uint32 __val, size_t __count)
        return __dest;
 }
 
+Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem)
+{
+       Uint64  ret, rem;
+       __asm__ __volatile__(
+               "div %4"
+               : "=a" (ret), "=d" (rem)
+               : "a" ( Num ), "d" (0), "r" (Den)
+               );
+       if(Rem) *Rem = rem;
+       return ret;
+}
+

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