X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fkb.c;h=b67c8e31b305f2ab3490caf0b43997b56a1dc913;hb=046980a1afd982af07dc97aaadb186e31eebb340;hp=6577882cf1686da25d9d1bb74ac51c5e135546bb;hpb=0e9730abc6c9ba710a3f71356720a70d79e407ab;p=tpg%2Facess2.git diff --git a/Kernel/drv/kb.c b/Kernel/drv/kb.c index 6577882c..b67c8e31 100644 --- a/Kernel/drv/kb.c +++ b/Kernel/drv/kb.c @@ -14,14 +14,16 @@ #define USE_KERNEL_MAGIC 1 // === IMPORTS === -void Threads_Dump(); +extern void Threads_ToggleTrace(int TID); +extern void Threads_Dump(void); +extern void Heap_Stats(void); // === PROTOTYPES === int KB_Install(char **Arguments); -void KB_IRQHandler(); +void KB_IRQHandler(int IRQNum); void KB_AddBuffer(char ch); Uint64 KB_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Dest); -void KB_UpdateLEDs(); +void KB_UpdateLEDs(void); int KB_IOCtl(tVFS_Node *Node, int Id, void *Data); // === GLOBALS === @@ -44,6 +46,8 @@ Uint8 gbaKB_States[3][256]; int giKB_KeyLayer = 0; #if USE_KERNEL_MAGIC int gbKB_MagicState = 0; + int giKB_MagicAddress = 0; + int giKB_MagicAddressPos = 0; #endif //Uint64 giKB_ReadBase = 0; //Uint32 gaKB_Buffer[KB_BUFFER_SIZE]; //!< Keyboard Ring Buffer @@ -53,7 +57,7 @@ Uint8 gbaKB_States[3][256]; // === CODE === /** - * \fn int KB_Install(char **Arguments) + * \brief Install the keyboard driver */ int KB_Install(char **Arguments) { @@ -73,10 +77,10 @@ int KB_Install(char **Arguments) } /** - * \fn void KB_IRQHandler() * \brief Called on a keyboard IRQ + * \param IRQNum IRQ number (unused) */ -void KB_IRQHandler() +void KB_IRQHandler(int IRQNum) { Uint8 scancode; Uint32 ch; @@ -183,16 +187,39 @@ void KB_IRQHandler() { switch(ch) { - case 'd': __asm__ __volatile__ ("xchg %bx, %bx"); break; - case 'p': Threads_Dump(); break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + case '8': case '9': case 'a': case 'b': + case 'c': case 'd': case 'e': case 'f': + { + char str[4] = {'0', 'x', ch, 0}; + if(giKB_MagicAddressPos == BITS/4) return; + giKB_MagicAddress |= atoi(str) << giKB_MagicAddressPos; + giKB_MagicAddressPos ++; + } + return; + + // Instruction Tracing + case 't': + Log("Toggle instruction tracing on %i\n", giKB_MagicAddress); + Threads_ToggleTrace( giKB_MagicAddress ); + giKB_MagicAddress = 0; giKB_MagicAddressPos = 0; + return; + + // Thread List Dump + case 'p': Threads_Dump(); return; + // Heap Statistics + case 'h': Heap_Stats(); return; + // Dump Structure + case 's': return; } } #endif - // Is shift pressed - // - Darn ugly hacks !(!x) means (bool)x - if( !(!gbKB_ShiftState) ^ gbKB_CapsState) + // Capitals required? + if( (gbKB_ShiftState != 0) != (gbKB_CapsState != 0)) { + // TODO: Move this to the keyboard map header switch(ch) { case 0: break; @@ -228,10 +255,10 @@ void KB_IRQHandler() } /** - * \fn void KB_UpdateLEDs() + * \fn void KB_UpdateLEDs(void) * \brief Updates the status of the keyboard LEDs */ -void KB_UpdateLEDs() +void KB_UpdateLEDs(void) { Uint8 leds;