#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 ===
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
// === CODE ===
/**
- * \fn int KB_Install(char **Arguments)
+ * \brief Install the keyboard driver
*/
int KB_Install(char **Arguments)
{
temp = inb(0x61);
outb(0x61, temp | 0x80);
outb(0x61, temp & 0x7F);
+ inb(0x60); // Clear keyboard buffer
IRQ_AddHandler(1, KB_IRQHandler);
DevFS_AddDevice( &gKB_DevInfo );
}
/**
- * \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;
// int keyNum;
- //if( inportb(0x64) & 0x20 ) return;
+ // Check port 0x64 to tell if this is from the aux port
+ //if( inb(0x64) & 0x20 ) return;
scancode = inb(0x60); // Read from the keyboard's data buffer
//Log_Debug("Keyboard", "scancode = %02x", scancode);
- //Log("KB_IRQHandler: scancode = 0x%02x", scancode);
-
// Ignore ACKs
if(scancode == 0xFA) {
- // Oh man! This is anachic (I'm leaving it here to represent the
- // mess that Acess once was)
+ // Oh man! This is anarchic (I'm leaving it here to represent
+ // the mess that Acess once was)
//kb_lastChar = KB_ACK;
return;
}
{
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;
}
/**
- * \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;