From bd5d1d2adfcab5dda08df1dacaadc0c4d7544393 Mon Sep 17 00:00:00 2001 From: David Welch Date: Tue, 10 Apr 2001 17:48:17 +0000 Subject: [PATCH] Correct problem with keyboard input not being accepted Added kernel debugger Kernel configuration svn path=/trunk/; revision=1780 --- reactos/drivers/input/keyboard/keyboard.c | 28 ++ reactos/drivers/input/keyboard/makefile | 4 +- reactos/ntoskrnl/Makefile | 40 ++- reactos/ntoskrnl/dbg/i386/kdb_help.S | 89 ++++++ reactos/ntoskrnl/dbg/kdb.c | 95 ++++++ reactos/ntoskrnl/dbg/kdb.h | 4 + reactos/ntoskrnl/dbg/kdb_keyboard.c | 354 +++++++++++++++++++++ reactos/ntoskrnl/include/internal/config.h | 4 + reactos/ntoskrnl/include/internal/ke.h | 12 + reactos/ntoskrnl/kd/kdebug.c | 8 +- reactos/ntoskrnl/ke/main.c | 11 +- reactos/ntoskrnl/mkconfig.c | 100 ++++++ 12 files changed, 736 insertions(+), 13 deletions(-) create mode 100644 reactos/ntoskrnl/dbg/i386/kdb_help.S create mode 100644 reactos/ntoskrnl/dbg/kdb.c create mode 100644 reactos/ntoskrnl/dbg/kdb.h create mode 100644 reactos/ntoskrnl/dbg/kdb_keyboard.c create mode 100644 reactos/ntoskrnl/include/internal/config.h create mode 100644 reactos/ntoskrnl/mkconfig.c diff --git a/reactos/drivers/input/keyboard/keyboard.c b/reactos/drivers/input/keyboard/keyboard.c index 936b4df987c..e47abfb03b5 100644 --- a/reactos/drivers/input/keyboard/keyboard.c +++ b/reactos/drivers/input/keyboard/keyboard.c @@ -436,9 +436,19 @@ static BOOLEAN KeyboardHandler(PKINTERRUPT Interrupt, PVOID Context) BYTE thisKey; BOOL isDown; static BYTE lastKey; + CHAR Status; CHECKPOINT; + /* + * Check status + */ + Status = READ_PORT_UCHAR((PUCHAR)KBD_CTRL_PORT); + if (!(Status & KBD_OBF)) + { + return (FALSE); + } + // Read scan code thisKey=READ_PORT_UCHAR((PUCHAR)KBD_DATA_PORT); if ((thisKey==0xE0)||(thisKey==0xE1)) // Extended key @@ -585,6 +595,23 @@ static void KeyboardConnectInterrupt(void) FALSE); } +VOID +KbdClearInput(VOID) +{ + ULONG i; + CHAR Status; + + for (i = 0; i < 100; i++) + { + Status = READ_PORT_UCHAR((PUCHAR)KBD_CTRL_PORT); + if (!(Status & KBD_OBF)) + { + return; + } + (VOID)READ_PORT_UCHAR((PUCHAR)KBD_DATA_PORT); + } +} + static int InitializeKeyboard(void) { // Initialize variables @@ -598,6 +625,7 @@ static int InitializeKeyboard(void) ctrlKeyState=0; extKey=0; + KbdClearInput(); KeyboardConnectInterrupt(); KeInitializeDpc(&KbdDpc,KbdDpcRoutine,NULL); return 0; diff --git a/reactos/drivers/input/keyboard/makefile b/reactos/drivers/input/keyboard/makefile index 7f80f127481..e68a08d4821 100644 --- a/reactos/drivers/input/keyboard/makefile +++ b/reactos/drivers/input/keyboard/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2000/11/20 19:59:11 ekohl Exp $ +# $Id: makefile,v 1.3 2001/04/10 17:48:17 dwelch Exp $ # # PATH_TO_TOP = ../../.. @@ -7,7 +7,7 @@ TARGET=keyboard OBJECTS = $(TARGET).o $(TARGET).coff ../../../ntoskrnl/ntoskrnl.a -CFLAGS = -O2 -I. +CFLAGS = -O2 -I. -g all: $(TARGET).sys $(TARGET).sys.unstripped diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index b43cc1a02fe..f1703349921 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.30 2001/04/09 02:45:03 dwelch Exp $ +# $Id: Makefile,v 1.31 2001/04/10 17:48:16 dwelch Exp $ # # ReactOS Operating System # @@ -16,26 +16,41 @@ ARCH := i386 # # Whether to compile in the kernel debugger # -KDBG := 0 +KDBG := 1 # # Whether to compile for debugging # DBG := 1 +# +# Whether to compile a multiprocessor or single processor version +# +MP := 0 + # # # +CONFIG := + ifeq ($(DBG), 1) -CFLAGS_DBG := -g -DDBG +CFLAGS_DBG := -g +CONFIG += DBG else CFLAGS_DBG := endif ifeq ($(KDBG), 1) -CFLAGS_KDBG := -DKDBG +OBJECTS_KDBG := dbg/kdb.o dbg/kdb_keyboard.o dbg/i386/kdb_help.o +CONFIG += KDBG +else +OBJECTS_KDBG := +endif + +ifeq ($(MP), 1) +CONFIG += MP else -CFLAGS_KDBG := +CONFIG += UP endif TARGETNAME := ntoskrnl @@ -43,11 +58,11 @@ TARGETNAME := ntoskrnl OBJECTS_PATH = objects ASFLAGS = -Iinclude -CFLAGS = -Iinclude -D__NTOSKRNL__ $(CFLAGS_DBG) $(CFLAGS_KDBG) -Wall -Werror +CFLAGS = -Iinclude -D__NTOSKRNL__ $(CFLAGS_DBG) -Wall -Werror include $(PATH_TO_TOP)/rules.mak -all: $(EXE_PREFIX)depends$(EXE_POSTFIX) \ +all: config $(EXE_PREFIX)depends$(EXE_POSTFIX) \ $(OBJECTS_PATH) \ $(TARGETNAME).nostrip.exe \ $(TARGETNAME).exe \ @@ -264,7 +279,8 @@ OBJECTS_DBG = \ dbg/dbgctrl.o \ dbg/errinfo.o \ dbg/print.o \ - dbg/user.o + dbg/user.o \ + $(OBJECTS_KDBG) # Loader OBJECTS_LDR = \ @@ -597,6 +613,14 @@ ex/napi.o: ex/napi.c ../include/ntdll/napi.h ke/main.o: ke/main.c ../include/reactos/buildno.h +mkconfig$(EXE_SUFFIX): mkconfig.c + $(HOST_CC) -g -o mkconfig$(EXE_SUFFIX) mkconfig.c + +config: + $(EXE_PREFIX)mkconfig$(EXE_SUFFIX) include/internal/config.h $(CONFIG) + +.PHONY: config + include $(D1_FILES) .%.d: %.c $(EXE_PREFIX)depends$(EXE_POSTFIX) diff --git a/reactos/ntoskrnl/dbg/i386/kdb_help.S b/reactos/ntoskrnl/dbg/i386/kdb_help.S new file mode 100644 index 00000000000..9eee6a34a71 --- /dev/null +++ b/reactos/ntoskrnl/dbg/i386/kdb_help.S @@ -0,0 +1,89 @@ +#include +#include + +.globl _KdbEnter +_KdbEnter: + /* + * Set up a stack frame + */ + pushl %ebp + movl %esp, %ebp + + /* + * Save registers + */ + pushl %edi + pushl %esi + pushl %ebx + + /* + * Set up a trap frame + */ + pushl $0 /* V86_Gs */ + pushl $0 /* V86_Fs */ + pushl $0 /* V86_Ds */ + pushl $0 /* V86_Es */ + pushl %ss /* Ss */ + pushl %ebp /* Esp */ + pushfl /* Eflags */ + pushl %cs /* Cs */ + pushl 4(%ebp) /* Eip */ + pushl $0 /* ErrorCode */ + pushl 0(%ebp) /* Ebp */ + pushl %ebx /* Ebx */ + pushl %esi /* Esi */ + pushl %edi /* Edi */ + pushl %fs /* Fs */ + pushl $0 /* ExceptionList */ + pushl $0 /* PreviousMode */ + pushl %eax /* Eax */ + pushl %ecx /* Ecx */ + pushl %edx /* Edx */ + pushl %ds /* Ds */ + pushl %es /* Es */ + pushl %gs /* Gs */ + pushl $0 /* Dr7 */ + pushl $0 /* Dr6 */ + pushl $0 /* Dr3 */ + pushl $0 /* Dr2 */ + pushl $0 /* Dr1 */ + pushl $0 /* Dr0 */ + pushl $0 /* TempEip */ + pushl $0 /* TempCs */ + pushl $0 /* DebugPointer */ + pushl $0 /* DebugArgMark */ + pushl $0 /* DebugEip */ + pushl $0 /* DebugEbp */ + + /* + * Push a pointer to the trap frame + */ + pushl %esp + + /* + * Call KDB + */ + call _KdbInternalEnter + + /* + * Pop the argument and destroy the trap frame + */ + popl %eax + addl $KTRAP_FRAME_SIZE, %esp + + /* + * Restore registers + */ + popl %ebx + popl %esi + popl %edi + + /* + * Return + */ + popl %ebp + ret + + + + diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c new file mode 100644 index 00000000000..cda5e5213ce --- /dev/null +++ b/reactos/ntoskrnl/dbg/kdb.c @@ -0,0 +1,95 @@ +/* + * ReactOS kernel + * Copyright (C) 2001 David Welch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id: kdb.c,v 1.1 2001/04/10 17:48:16 dwelch Exp $ + * + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/dbg/kdb.c + * PURPOSE: Kernel debugger + * PROGRAMMER: David Welch (welch@mcmail.com) + * UPDATE HISTORY: + * Created 01/03/01 + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include "kdb.h" + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +KdbGetCommand(PCH Buffer) +{ + CHAR Key; + + for (;;) + { + while ((Key = KdbTryGetCharKeyboard()) == -1); + + if (Key == '\r' || Key == '\n') + { + DbgPrint("\n"); + *Buffer = 0; + return; + } + + DbgPrint("%c", Key); + + *Buffer = Key; + Buffer++; + } +} + +ULONG +KdbMainLoop(VOID) +{ + CHAR Command[256]; + + for (;;) + { + DbgPrint("kdb:> "); + + KdbGetCommand(Command); + + switch (Command[0]) + { + /* Continue. */ + case 'c': + return(0); + + /* Bug check the system */ + case 'p': + KeBugCheck(0); + break; + } + } +} + +VOID +KdbInternalEnter(PKTRAP_FRAME Tf) +{ + __asm__ __volatile__ ("cli\n\t"); + (VOID)KdbMainLoop(); + __asm__ __volatile__("sti\n\t"); +} + diff --git a/reactos/ntoskrnl/dbg/kdb.h b/reactos/ntoskrnl/dbg/kdb.h new file mode 100644 index 00000000000..c5c67f18855 --- /dev/null +++ b/reactos/ntoskrnl/dbg/kdb.h @@ -0,0 +1,4 @@ +ULONG +KdbTryGetCharKeyboard(VOID); +VOID +KdbEnter(VOID); diff --git a/reactos/ntoskrnl/dbg/kdb_keyboard.c b/reactos/ntoskrnl/dbg/kdb_keyboard.c new file mode 100644 index 00000000000..087dc4a8a4c --- /dev/null +++ b/reactos/ntoskrnl/dbg/kdb_keyboard.c @@ -0,0 +1,354 @@ +/* + * ReactOS kernel + * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/dbg/kdb_keyboard.c + * PURPOSE: Keyboard driver + * PROGRAMMER: Victor Kirhenshtein (sauros@iname.com) + * Jason Filby (jasonfilby@yahoo.com) + */ + +/* INCLUDES ****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +#if 1 + +#define KBD_STATUS_REG 0x64 +#define KBD_CNTL_REG 0x64 +#define KBD_DATA_REG 0x60 + +#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ + +#define kbd_read_input() READ_PORT_UCHAR((PUCHAR)KBD_DATA_REG) +#define kbd_read_status() READ_PORT_UCHAR((PUCHAR)KBD_STATUS_REG) + +static unsigned char keyb_layout[2][128] = +{ + "\000\0331234567890-=\177\t" /* 0x00 - 0x0f */ + "qwertyuiop[]\r\000as" /* 0x10 - 0x1f */ + "dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */ + "bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */ + "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */ + "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ + "\r\000/" /* 0x60 - 0x6f */ + , + "\000\033!@#$%^&*()_+\177\t" /* 0x00 - 0x0f */ + "QWERTYUIOP{}\r\000AS" /* 0x10 - 0x1f */ + "DFGHJKL:\"`\000\\ZXCV" /* 0x20 - 0x2f */ + "BNM<>?\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */ + "\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */ + "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ + "\r\000/" /* 0x60 - 0x6f */ +}; + +typedef BYTE byte_t; + +CHAR +KdbTryGetCharKeyboard() +{ + static byte_t last_key = 0; + static byte_t shift = 0; + char c; + while(1) { + unsigned char status = kbd_read_status(); + while (status & KBD_STAT_OBF) { + byte_t scancode; + scancode = kbd_read_input(); + /* check for SHIFT-keys */ + if (((scancode & 0x7F) == 42) || ((scancode & 0x7F) == 54)) + { + shift = !(scancode & 0x80); + continue; + } + /* ignore all other RELEASED-codes */ + if (scancode & 0x80) + last_key = 0; + else if (last_key != scancode) + { + //printf("kbd: %d, %d, %c\n", scancode, last_key, keyb_layout[shift][scancode]); + last_key = scancode; + c = keyb_layout[shift][scancode]; + if (c > 0) return c; + } + } + } +} + +#endif + +#if 0 + +/* GLOBALS *******************************************************************/ + +/* + * Keyboard I/O ports. + */ +#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */ +#define K_STATUS 0x64 /* keybd status (read-only) */ +#define K_CMD 0x64 /* keybd ctlr command (write-only) */ + +/* + * Bit definitions for K_STATUS port. + */ +#define K_OBUF_FUL 0x01 /* output (from keybd) buffer full */ +#define K_IBUF_FUL 0x02 /* input (to keybd) buffer full */ +#define K_SYSFLAG 0x04 /* "System Flag" */ +#define K_CMD_DATA 0x08 /* 1 = input buf has cmd, 0 = data */ +#define K_KBD_INHIBIT 0x10 /* 0 if keyboard inhibited */ +#define K_AUX_OBUF_FUL 0x20 /* 1 = obuf holds aux device data */ +#define K_TIMEOUT 0x40 /* timout error flag */ +#define K_PARITY_ERROR 0x80 /* parity error flag */ + +/* + * Keyboard controller commands (sent to K_CMD port). + */ +#define KC_CMD_READ 0x20 /* read controller command byte */ +#define KC_CMD_WRITE 0x60 /* write controller command byte */ +#define KC_CMD_DIS_AUX 0xa7 /* disable auxiliary device */ +#define KC_CMD_ENB_AUX 0xa8 /* enable auxiliary device */ +#define KC_CMD_TEST_AUX 0xa9 /* test auxiliary device interface */ +#define KC_CMD_SELFTEST 0xaa /* keyboard controller self-test */ +#define KC_CMD_TEST 0xab /* test keyboard interface */ +#define KC_CMD_DUMP 0xac /* diagnostic dump */ +#define KC_CMD_DISABLE 0xad /* disable keyboard */ +#define KC_CMD_ENABLE 0xae /* enable keyboard */ +#define KC_CMD_RDKBD 0xc4 /* read keyboard ID */ +#define KC_CMD_WIN 0xd0 /* read output port */ +#define KC_CMD_WOUT 0xd1 /* write output port */ +#define KC_CMD_ECHO 0xee /* used for diagnostic testing */ +#define KC_CMD_PULSE 0xff /* pulse bits 3-0 based on low nybble */ + +/* + * Keyboard commands (send to K_RDWR). + */ +#define K_CMD_LEDS 0xed /* set status LEDs (caps lock, etc.) */ +#define K_CMD_TYPEMATIC 0xf3 /* set key repeat and delay */ + +/* + * Bit definitions for controller command byte (sent following + * KC_CMD_WRITE command). + * + * Bits 0x02 and 0x80 unused, always set to 0. + */ +#define K_CB_ENBLIRQ 0x01 /* enable data-ready intrpt */ +#define K_CB_SETSYSF 0x04 /* Set System Flag */ +#define K_CB_INHBOVR 0x08 /* Inhibit Override */ +#define K_CB_DISBLE 0x10 /* disable keyboard */ +#define K_CB_IGNPARITY 0x20 /* ignore parity from keyboard */ +#define K_CB_SCAN 0x40 /* standard scan conversion */ + +/* + * Bit definitions for "Indicator Status Byte" (sent after a + * K_CMD_LEDS command). If the bit is on, the LED is on. Undefined + * bit positions must be 0. + */ +#define K_LED_SCRLLK 0x1 /* scroll lock */ +#define K_LED_NUMLK 0x2 /* num lock */ +#define K_LED_CAPSLK 0x4 /* caps lock */ + +/* + * Bit definitions for "Miscellaneous port B" (K_PORTB). + */ +/* read/write */ +#define K_ENABLETMR2 0x01 /* enable output from timer 2 */ +#define K_SPKRDATA 0x02 /* direct input to speaker */ +#define K_ENABLEPRTB 0x04 /* "enable" port B */ +#define K_EIOPRTB 0x08 /* enable NMI on parity error */ +/* read-only */ +#define K_REFRESHB 0x10 /* refresh flag from INLTCONT PAL */ +#define K_OUT2B 0x20 /* timer 2 output */ +#define K_ICKB 0x40 /* I/O channel check (parity error) */ + +/* + * Bit definitions for the keyboard controller's output port. + */ +#define KO_SYSRESET 0x01 /* processor reset */ +#define KO_GATE20 0x02 /* A20 address line enable */ +#define KO_AUX_DATA_OUT 0x04 /* output data to auxiliary device */ +#define KO_AUX_CLOCK 0x08 /* auxiliary device clock */ +#define KO_OBUF_FUL 0x10 /* keyboard output buffer full */ +#define KO_AUX_OBUF_FUL 0x20 /* aux device output buffer full */ +#define KO_CLOCK 0x40 /* keyboard clock */ +#define KO_DATA_OUT 0x80 /* output data to keyboard */ + +/* + * Keyboard return codes. + */ +#define K_RET_RESET_DONE 0xaa /* BAT complete */ +#define K_RET_ECHO 0xee /* echo after echo command */ +#define K_RET_ACK 0xfa /* ack */ +#define K_RET_RESET_FAIL 0xfc /* BAT error */ +#define K_RET_RESEND 0xfe /* resend request */ + +#define SHIFT -1 +#define CTRL -2 +#define META -3 + +static char keymap[128][2] = { + {0}, /* 0 */ + {27, 27}, /* 1 - ESC */ + {'1', '!'}, /* 2 */ + {'2', '@'}, + {'3', '#'}, + {'4', '$'}, + {'5', '%'}, + {'6', '^'}, + {'7', '&'}, + {'8', '*'}, + {'9', '('}, + {'0', ')'}, + {'-', '_'}, + {'=', '+'}, + {8, 8}, /* 14 - Backspace */ + {'\t', '\t'}, /* 15 */ + {'q', 'Q'}, + {'w', 'W'}, + {'e', 'E'}, + {'r', 'R'}, + {'t', 'T'}, + {'y', 'Y'}, + {'u', 'U'}, + {'i', 'I'}, + {'o', 'O'}, + {'p', 'P'}, + {'[', '{'}, + {']', '}'}, /* 27 */ + {'\r', '\r'}, /* 28 - Enter */ + {CTRL, CTRL}, /* 29 - Ctrl */ + {'a', 'A'}, /* 30 */ + {'s', 'S'}, + {'d', 'D'}, + {'f', 'F'}, + {'g', 'G'}, + {'h', 'H'}, + {'j', 'J'}, + {'k', 'K'}, + {'l', 'L'}, + {';', ':'}, + {'\'', '"'}, /* 40 */ + {'`', '~'}, /* 41 */ + {SHIFT, SHIFT}, /* 42 - Left Shift */ + {'\\', '|'}, /* 43 */ + {'z', 'Z'}, /* 44 */ + {'x', 'X'}, + {'c', 'C'}, + {'v', 'V'}, + {'b', 'B'}, + {'n', 'N'}, + {'m', 'M'}, + {',', '<'}, + {'.', '>'}, + {'/', '?'}, /* 53 */ + {SHIFT, SHIFT}, /* 54 - Right Shift */ + {0, 0}, /* 55 - Print Screen */ + {META, META}, /* 56 - Alt */ + {' ', ' '}, /* 57 - Space bar */ + {0, 0}, /* 58 - Caps Lock */ + {0, 0}, /* 59 - F1 */ + {0, 0}, /* 60 - F2 */ + {0, 0}, /* 61 - F3 */ + {0, 0}, /* 62 - F4 */ + {0, 0}, /* 63 - F5 */ + {0, 0}, /* 64 - F6 */ + {0, 0}, /* 65 - F7 */ + {0, 0}, /* 66 - F8 */ + {0, 0}, /* 67 - F9 */ + {0, 0}, /* 68 - F10 */ + {0, 0}, /* 69 - Num Lock */ + {0, 0}, /* 70 - Scroll Lock */ + {'7', '7'}, /* 71 - Numeric keypad 7 */ + {'8', '8'}, /* 72 - Numeric keypad 8 */ + {'9', '9'}, /* 73 - Numeric keypad 9 */ + {'-', '-'}, /* 74 - Numeric keypad '-' */ + {'4', '4'}, /* 75 - Numeric keypad 4 */ + {'5', '5'}, /* 76 - Numeric keypad 5 */ + {'6', '6'}, /* 77 - Numeric keypad 6 */ + {'+', '+'}, /* 78 - Numeric keypad '+' */ + {'1', '1'}, /* 79 - Numeric keypad 1 */ + {'2', '2'}, /* 80 - Numeric keypad 2 */ + {'3', '3'}, /* 81 - Numeric keypad 3 */ + {'0', '0'}, /* 82 - Numeric keypad 0 */ + {'.', '.'}, /* 83 - Numeric keypad '.' */ +}; + +/* FUNCTIONS *****************************************************************/ + +/* + * Quick poll for a pending input character. + * Returns a character if available, -1 otherwise. This routine can return + * false negatives in the following cases: + * + * - a valid character is in transit from the keyboard when called + * - a key release is received (from a previous key press) + * - a SHIFT key press is received (shift state is recorded however) + * - a key press for a multi-character sequence is received + * + * Yes, this is horrible. + */ +ULONG +KdbTryGetCharKeyboard(VOID) +{ + static unsigned shift_state, ctrl_state, meta_state; + unsigned scan_code, ch; + + /* See if a scan code is ready, returning if none. */ + if ((READ_PORT_UCHAR((PUCHAR)K_STATUS) & K_OBUF_FUL) == 0) { + return -1; + } + scan_code = READ_PORT_UCHAR((PUCHAR)K_RDWR); + + /* Handle key releases - only release of SHIFT is important. */ + if (scan_code & 0x80) { + scan_code &= 0x7f; + if (keymap[scan_code][0] == SHIFT) + shift_state = 0; + else if (keymap[scan_code][0] == CTRL) + ctrl_state = 0; + else if (keymap[scan_code][0] == META) + meta_state = 0; + ch = -1; + } else { + /* Translate the character through the keymap. */ + ch = keymap[scan_code][shift_state] | meta_state; + if (ch == SHIFT) { + shift_state = 1; + ch = -1; + } else if (ch == CTRL) { + ctrl_state = 1; + ch = -1; + } else if (ch == META) { + meta_state = 0200; + ch = -1; + } else if (ch == 0) + ch = -1; + else if (ctrl_state) + ch = (keymap[scan_code][1] - '@') | meta_state; + } + + return ch; +} + +#endif diff --git a/reactos/ntoskrnl/include/internal/config.h b/reactos/ntoskrnl/include/internal/config.h new file mode 100644 index 00000000000..02bb0ff63c2 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/config.h @@ -0,0 +1,4 @@ +/* Automatically generated, don't edit */ +#define DBG +#define KDBG +#define UP diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index a8fd3d2f546..8ecbdb16b38 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -22,14 +22,20 @@ /* INCLUDES *****************************************************************/ +#ifndef __ASM__ #include #include +#endif /* not __ASM__ */ /* INTERNAL KERNEL FUNCTIONS ************************************************/ +#ifndef __ASM__ + struct _KTHREAD; +#endif /* not __ASM__ */ + #define KTRAP_FRAME_DEBUGEBP (0x0) #define KTRAP_FRAME_DEBUGEIP (0x4) #define KTRAP_FRAME_DEBUGARGMARK (0x8) @@ -74,6 +80,9 @@ struct _KTHREAD; #define KTRAP_FRAME_RESERVED8 (0x86) #define KTRAP_FRAME_V86_GS (0x88) #define KTRAP_FRAME_RESERVED9 (0x8A) +#define KTRAP_FRAME_SIZE (0x8C) + +#ifndef __ASM__ typedef struct _KTRAP_FRAME { @@ -180,4 +189,7 @@ KiDispatchException(PEXCEPTION_RECORD Er, BOOLEAN SearchFrames); VOID KeTrapFrameToContext(PKTRAP_FRAME TrapFrame, PCONTEXT Context); + +#endif /* not __ASM__ */ + #endif diff --git a/reactos/ntoskrnl/kd/kdebug.c b/reactos/ntoskrnl/kd/kdebug.c index 73ca38c260f..e03f4e4ad3f 100644 --- a/reactos/ntoskrnl/kd/kdebug.c +++ b/reactos/ntoskrnl/kd/kdebug.c @@ -1,4 +1,4 @@ -/* $Id: kdebug.c,v 1.22 2001/04/09 02:45:04 dwelch Exp $ +/* $Id: kdebug.c,v 1.23 2001/04/10 17:48:17 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,6 +13,8 @@ #include #include #include +#include +#include "../dbg/kdb.h" /* serial debug connection */ #define DEFAULT_DEBUG_PORT 2 /* COM2 */ @@ -394,8 +396,10 @@ KdSystemDebugControl(ULONG Code) /* K - Enter the system debugger. */ else if (Code == 10) { -#if KDBG +#ifdef KDBG + KdbEnter(); #else /* KDBG */ + DbgPrint("No local kernel debugger\n"); #endif /* not KDBG */ } } diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 9993ff9860e..58515db12b0 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.85 2001/03/27 21:43:42 dwelch Exp $ +/* $Id: main.c,v 1.86 2001/04/10 17:48:17 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -42,6 +42,8 @@ #include #include #include +#include +#include "../dbg/kdb.h" #define NDEBUG #include @@ -502,6 +504,13 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock) /* Report all resources used by hal */ HalReportResourceUsage (); + + /* + * Enter the kernel debugger before starting up the boot drivers + */ +#ifdef KDBG + KdbEnter(); +#endif /* KDBG */ /* * Initalize services loaded at boot time diff --git a/reactos/ntoskrnl/mkconfig.c b/reactos/ntoskrnl/mkconfig.c new file mode 100644 index 00000000000..5766afef97e --- /dev/null +++ b/reactos/ntoskrnl/mkconfig.c @@ -0,0 +1,100 @@ +#include +#include +#include + +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int +write_if_change(char* outbuf, char* filename) +{ + FILE* out; + unsigned int end; + char* cmpbuf; + unsigned int stat; + + out = fopen(filename, "rb"); + if (out == NULL) + { + out = fopen(filename, "wb"); + if (out == NULL) + { + fprintf(stderr, "Unable to create output file\n"); + return(1); + } + fputs(outbuf, out); + fclose(out); + return(0); + } + + fseek(out, 0, SEEK_END); + end = ftell(out); + cmpbuf = malloc(end); + if (cmpbuf == NULL) + { + fprintf(stderr, "Out of memory\n"); + fclose(out); + return(1); + } + + fseek(out, 0, SEEK_SET); + stat = fread(cmpbuf, 1, end, out); + if (stat != end) + { + fprintf(stderr, "Failed to read data\n"); + fclose(out); + return(1); + } + if (memcmp(cmpbuf, outbuf, max(end, strlen(outbuf))) == 0) + { + fclose(out); + return(0); + } + + fclose(out); + out = fopen(filename, "wb"); + if (out == NULL) + { + fprintf(stderr, "Unable to create output file\n"); + return(1); + } + + stat = fwrite(outbuf, 1, strlen(outbuf), out); + if (strlen(outbuf) != stat) + { + fprintf(stderr, "Unable to write output file\n"); + fclose(out); + return(1); + } + fclose(out); + return(0); +} + +int +main(int argc, char* argv[]) +{ + unsigned int i; + char* outbuf; + char* s; + + if (argc == 1) + { + fprintf(stderr, "Not enough arguments\n"); + return(1); + } + + outbuf = malloc(256 * 1024); + if (outbuf == NULL) + { + fprintf(stderr, "Out of memory 1\n"); + return(1); + } + + s = outbuf; + s = s + sprintf(s, "/* Automatically generated, don't edit */\n"); + for (i = 2; i < argc; i++) + { + s = s + sprintf(s, "#define %s\n", argv[i]); + } + + return(write_if_change(outbuf, argv[1])); +} -- 2.17.1