--- /dev/null
+/*
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * debug_hooks.c
+ * - Keyboard/serial kernel debug hooks
+ */
+#include <acess.h>
+#include <debug_hooks.h>
+
+// === CODE ===
+void DebugHook_HandleInput(tDebugHook *HookHandle, size_t Length, const char *Input)
+{
+ switch(*Input)
+ {
+ case '0' ... '9':
+ HookHandle->Value *= 10;
+ HookHandle->Value += *Input - '0';
+ break;
+ // Instruction Tracing
+ case 't':
+ Log("Toggle instruction tracing on %i\n", HookHandle->Value);
+ Threads_ToggleTrace( HookHandle->Value );
+ HookHandle->Value = 0;
+ break;
+
+ // Thread List Dump
+ case 'p': Threads_Dump(); return;
+ // Heap Statistics
+ case 'h': Heap_Stats(); return;
+ // PMem Statistics
+ case 'm': MM_DumpStatistics(); return;
+ // Dump Structure
+ case 's': return;
+
+ // Validate structures
+ //case 'v':
+ // Validate_VirtualMemoryUsage();
+ // return;
+ }
+}
+
#include <drv_pty.h>
#include <debug_hooks.h>
+extern void Validate_VirtualMemoryUsage(void);
+
// === TYPES ===
struct sSerialPort
{
return ;
if( Port == gSerial_KernelDebugPort )
{
+ static tDebugHook info;
static int serial_debug_mode = 0;
// Kernel serial debug hooks.
- if( serial_debug_mode )
+ if( serial_debug_mode == 2 )
+ {
+ // Leave latched mode
+ if( Ch == '.' )
+ serial_debug_mode = 0;
+ else
+ DebugHook_HandleInput(&info, 1, &Ch);
+ return ;
+ }
+ else if( serial_debug_mode )
{
- switch(Ch)
- {
- case 'p':
- Threads_Dump();
- break;
- case 'h':
- Heap_Dump();
- break;
- case 'X'-'A'+1:
+ if( Ch == 'X'-'A'+1 ) {
PTY_SendInput(Port->PTY, &Ch, 1);
- break;
+ serial_debug_mode = 0;
+ }
+ else if( Ch == '~' ) {
+ // Enter latched mode
+ serial_debug_mode = 2;
+ }
+ else {
+ DebugHook_HandleInput(&info, 1, &Ch);
+ serial_debug_mode = 0;
}
- serial_debug_mode = 0;
return ;
}
else if( Ch == 'X'-'A'+1 )
#define USE_KERNEL_MAGIC 1
+extern void Validate_VirtualMemoryUsage(void);
+
// === PROTOTYPES ===
int Keyboard_Install(char **Arguments);
int Keyboard_Cleanup(void);
{ .Type = &gKB_NodeType }
};
#if USE_KERNEL_MAGIC
- int giKB_MagicAddress = 0;
- int giKB_MagicAddressPos = 0;
+tDebugHook gKB_DebugHookInfo;
#endif
// === CODE ===
Log_Error("Keyboard", "TODO: Implement Keyboard_RemoveInstance");
}
+inline bool IsPressed(tKeyboard *Kb, Uint8 KeySym)
+{
+ return !!(Kb->KeyStates[KeySym/8] & (1 << (KeySym&7)));
+}
+
/*
* Handle a key press/release event
* - See Input/Keyboard/include/keyboard.h
break;
}
- // --- Check for Kernel Magic Combos
+ // Magic debug hooks
#if USE_KERNEL_MAGIC
- if(bPressed
- && Source->KeyStates[KEYSYM_LEFTCTRL/8] & (1 << (KEYSYM_LEFTCTRL&7))
- && Source->KeyStates[KEYSYM_LEFTALT/8] & (1 << (KEYSYM_LEFTALT &7)) )
+ if(bPressed && IsPressed(Source, KEYSYM_LEFTCTRL) && IsPressed(Source, KEYSYM_LEFTALT))
{
- int val;
- switch(trans)
- {
- case '0': val = 0; goto _av; case '1': val = 1; goto _av;
- case '2': val = 2; goto _av; case '3': val = 3; goto _av;
- case '4': val = 4; goto _av; case '5': val = 5; goto _av;
- case '6': val = 6; goto _av; case '7': val = 7; goto _av;
- case '8': val = 8; goto _av; case '9': val = 9; goto _av;
- case 'a': val = 10; goto _av; case 'b': val = 11; goto _av;
- case 'c': val = 12; goto _av; case 'd': val = 13; goto _av;
- case 'e': val = 14; goto _av; case 'f': val = 15; goto _av;
- _av:
- if(giKB_MagicAddressPos == BITS/4) break;
- giKB_MagicAddress |= (Uint)val << giKB_MagicAddressPos;
- giKB_MagicAddressPos ++;
- break;
-
- // 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;
- // PMem Statistics
- case 'm': MM_DumpStatistics(); return;
- // Dump Structure
- case 's': return;
+ if( trans == '~' ) {
+ // TODO: Latch mode
}
+ else {
+ char str[5]; // utf8 only supports 8 bytes
+ size_t len = WriteUTF8((Uint8*)str, trans);
+ str[len] = '\0';
+ DebugHook_HandleInput(&gKB_DebugHookInfo, len, str);
+ }
+ return ;
}
#endif
+ // Ctrl-Alt-Del == Reboot
#if defined(ARCHDIR_is_x86) || defined(ARCHDIR_is_x86_64)
if(bPressed
- && Source->KeyStates[KEYSYM_LEFTCTRL/8] & (1 << (KEYSYM_LEFTCTRL&7))
- && Source->KeyStates[KEYSYM_LEFTALT/8] & (1 << (KEYSYM_LEFTALT &7)) )
+ && (IsPressed(Source, KEYSYM_LEFTCTRL) || IsPressed(Source, KEYSYM_RIGHTCTRL))
+ && (IsPressed(Source, KEYSYM_LEFTALT) || IsPressed(Source, KEYSYM_LEFTALT))
+ )
{
if( HIDKeySym == KEYSYM_DELETE )
{