Fixed kernel segfault in VTerm (referenced possible NULL value)
[tpg/acess2.git] / Kernel / drv / kb.c
index edeb685..07e07f5 100644 (file)
@@ -15,6 +15,7 @@
 
 // === IMPORTS ===
 void   Threads_Dump(void);
+void   Heap_Stats(void);
 
 // === PROTOTYPES ===
  int   KB_Install(char **Arguments);
@@ -44,6 +45,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 +56,7 @@ Uint8 gbaKB_States[3][256];
 
 // === CODE ===
 /**
- * \fn int KB_Install(char **Arguments)
+ * \brief Install the keyboard driver
  */
 int KB_Install(char **Arguments)
 {
@@ -73,8 +76,8 @@ int KB_Install(char **Arguments)
 }
 
 /**
- * \fn void KB_IRQHandler()
  * \brief Called on a keyboard IRQ
+ * \param IRQNum       IRQ number (unused)
  */
 void KB_IRQHandler(int IRQNum)
 {
@@ -183,16 +186,31 @@ void KB_IRQHandler(int IRQNum)
        {
                switch(ch)
                {
-               case 'q':       *((int*)1) = 0; break;
-               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[2] = {ch,0};
+                       if(giKB_MagicAddressPos == BITS/4)      break;
+                       giKB_MagicAddress |= atoi(str) << giKB_MagicAddressPos;
+                       giKB_MagicAddressPos ++;
+                       }
+                       break;
+               
+               // 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)
+       // - Darn ugly hacks !!x means (bool)x
+       if( !!gbKB_ShiftState ^ gbKB_CapsState)
        {
                switch(ch)
                {

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