From 02473a0e4693f78a149724855a8893144b784cf7 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 4 Apr 2026 14:10:24 +0530 Subject: [PATCH 01/25] Setup basic keyboard init --- kernel/include/kernel/hw/keyboard.h | 67 ++++++++++++++++++++++++++ kernel/src/kernel/entry.c | 2 + kernel/src/kernel/hw/keyboard.c | 73 +++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 kernel/include/kernel/hw/keyboard.h create mode 100644 kernel/src/kernel/hw/keyboard.c diff --git a/kernel/include/kernel/hw/keyboard.h b/kernel/include/kernel/hw/keyboard.h new file mode 100644 index 0000000..522fffe --- /dev/null +++ b/kernel/include/kernel/hw/keyboard.h @@ -0,0 +1,67 @@ +#ifndef KEYBOARD_H +#define KEYBOARD_H + +#include + +constexpr unsigned short kb_ps2_data_port = 0x60; +constexpr unsigned short kb_ps2_status_port = 0x64; +constexpr unsigned short kb_ps2_cmd_port = 0x64; + +constexpr unsigned char kb_ps2_cmd_get_ccb = 0x20; +constexpr unsigned char kb_ps2_cmd_set_ccb = 0x60; +constexpr unsigned char kb_ps2_disable_port_2 = 0xA7; +constexpr unsigned char kb_ps2_enable_port_2 = 0xA8; +constexpr unsigned char kb_ps2_test_port_2 = 0xA9; +constexpr unsigned char kb_ps2_test_controller = 0xAA; +constexpr unsigned char kb_ps2_test_port_1 = 0xAB; +constexpr unsigned char kb_ps2_disable_port_1 = 0xAD; +constexpr unsigned char kb_ps2_enable_port_1 = 0xAE; +constexpr unsigned char kb_ps2_read_controller_ip = 0xC0; +constexpr unsigned char kb_ps2_read_controller_op = 0xD0; +constexpr unsigned char kb_ps2_write_controller_op = 0xD0; +constexpr unsigned char kb_ps2_reset = 0xFF; + +typedef union { + uint8_t raw; + struct { + uint8_t irq1_enable : 1; + uint8_t irq12_enable : 1; + uint8_t system_flag : 1; + uint8_t reserved1 : 1; + uint8_t port_1_clock_disable : 1; + uint8_t port_2_clock_disable : 1; + uint8_t port_1_tl_enable : 1; + uint8_t reserved2 : 1; + } __attribute__ ((packed)); +} kb_ps2_cfg_byte_t; + +typedef union { + uint8_t raw; + struct { + uint8_t system_reset : 1; + uint8_t a20_gate : 1; + uint8_t port_2_clock : 1; + uint8_t port_2_data : 1; + uint8_t op_buffer_is_port_1 : 1; + uint8_t op_buffer_is_port_2 : 1; + uint8_t port_1_clock : 1; + uint8_t port_1_data : 1; + } __attribute__ ((packed)); +} kb_ps2_controller_output_port_t; + +typedef union { + uint8_t raw; + struct { + uint8_t out_buffer_full : 1; + uint8_t in_buffer_full : 1; + uint8_t system_flag : 1; + uint8_t is_controller_command : 1; + uint8_t reserved : 2; + uint8_t is_timeout_error : 1; + uint8_t is_parity_error : 1; + } __attribute__ ((packed)); +} kb_ps2_status_register_t; + +void init_kb (void); + +#endif \ No newline at end of file diff --git a/kernel/src/kernel/entry.c b/kernel/src/kernel/entry.c index 8e953ac..9f660a8 100644 --- a/kernel/src/kernel/entry.c +++ b/kernel/src/kernel/entry.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -104,6 +105,7 @@ static void print_info (void) { __attribute__ ((noreturn)) void _start_stage2 (void) { init_graphics (framebuffer); init_console (framebuffer->width, framebuffer->height, 40, 40, 1, 1, 2); + init_kb (); print_info (); diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c new file mode 100644 index 0000000..7491704 --- /dev/null +++ b/kernel/src/kernel/hw/keyboard.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +static bool is_kb_setup = false; + +static inline kb_ps2_status_register_t kb_read_status_register (void) { + return (kb_ps2_status_register_t){.raw = inb (kb_ps2_status_port)}; +} + +static inline unsigned char kb_send_command (unsigned char command, bool will_return) { + while (kb_read_status_register ().in_buffer_full) + ; + outb (kb_ps2_cmd_port, command); + if (!will_return) return 0; + while (!(kb_read_status_register ().out_buffer_full)) + ; + return inb (kb_ps2_data_port); +} + +static inline void kb_send_data (unsigned char data) { + while (kb_read_status_register ().in_buffer_full) + ; + outb (kb_ps2_data_port, data); +} + +static inline unsigned char kb_read_data (void) { + while (!(kb_read_status_register ().out_buffer_full)) + ; + return inb (kb_ps2_data_port); +} + +static inline kb_ps2_cfg_byte_t kb_read_cfg_byte (void) { + return (kb_ps2_cfg_byte_t){.raw = kb_send_command (kb_ps2_cmd_get_ccb, true)}; +} + +static inline void kb_write_cfg_byte (kb_ps2_cfg_byte_t cfg_byte) { + kb_send_command (kb_ps2_cmd_set_ccb, false); + kb_send_data (cfg_byte.raw); +} + +static inline bool kb_reset (void) { + kb_send_data (kb_ps2_reset); + if (kb_read_data () != 0xFA) return false; + if (kb_read_data () != 0XAA) return false; + return true; +} + +void init_kb (void) { + // TODO: actually verify the PS2 controller exists + + kb_send_command (kb_ps2_disable_port_1, false); + kb_send_command (kb_ps2_disable_port_2, false); + + while (kb_read_status_register ().out_buffer_full) + inb (kb_ps2_data_port); + + kb_ps2_cfg_byte_t cfg_byte = kb_read_cfg_byte (); + cfg_byte.irq1_enable = cfg_byte.irq12_enable = 0; + cfg_byte.port_1_tl_enable = 0; + cfg_byte.port_1_clock_disable = 0; + kb_write_cfg_byte (cfg_byte); + + if (kb_send_command (kb_ps2_test_controller, true) != 0x55) return; + + kb_write_cfg_byte (cfg_byte); + kb_send_command (kb_ps2_enable_port_1, false); + + cfg_byte.irq1_enable = 1; + kb_write_cfg_byte (cfg_byte); + is_kb_setup = kb_reset (); +} From 0099ef11657014980d6c4dc3c08d8db738ccc76f Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 4 Apr 2026 14:38:18 +0530 Subject: [PATCH 02/25] Add keyboard interrupt handler --- kernel/src/kernel/hw/keyboard.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index 7491704..ba4d4bb 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,9 +1,11 @@ -#include #include #include +#include #include +#include -static bool is_kb_setup = false; +static bool is_kb_setup = false; +static charqueue* kb_keypress_charqueue; static inline kb_ps2_status_register_t kb_read_status_register (void) { return (kb_ps2_status_register_t){.raw = inb (kb_ps2_status_port)}; @@ -47,7 +49,16 @@ static inline bool kb_reset (void) { return true; } +static registers_t* kb_handler (registers_t* registers) { + unsigned char scancode = kb_read_data (); + pic_send_eoi (1); + push_charqueue (kb_keypress_charqueue, scancode); + return registers; +} + void init_kb (void) { + kb_keypress_charqueue = create_charqueue (); + // TODO: actually verify the PS2 controller exists kb_send_command (kb_ps2_disable_port_1, false); @@ -70,4 +81,9 @@ void init_kb (void) { cfg_byte.irq1_enable = 1; kb_write_cfg_byte (cfg_byte); is_kb_setup = kb_reset (); + + if (kb_keypress_charqueue != nullptr) { + idt_register_handler (0x21, kb_handler); + pic_clr_mask (1); + } } From 502f54b541a5626414dc8b7219651aa61a389fcf Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Fri, 24 Apr 2026 19:43:01 +0530 Subject: [PATCH 03/25] Ignore compile_commands.json --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ad104d4..d40674c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ iso_root *.o .vscode docs +**/compile_commands.json ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. From e8328a7618c9f5b1276b9bcfd008e99297ec06c2 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Fri, 24 Apr 2026 19:45:00 +0530 Subject: [PATCH 04/25] Remove return from kb_handler and mark registers unused --- kernel/src/kernel/hw/keyboard.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index ba4d4bb..f8a245a 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -49,11 +49,11 @@ static inline bool kb_reset (void) { return true; } -static registers_t* kb_handler (registers_t* registers) { +static void kb_handler (registers_t* registers) { + (void)registers; unsigned char scancode = kb_read_data (); pic_send_eoi (1); push_charqueue (kb_keypress_charqueue, scancode); - return registers; } void init_kb (void) { From 9307478f5a2282011ce9cb1d6ceeb243260e891b Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Fri, 24 Apr 2026 20:47:16 +0530 Subject: [PATCH 05/25] Fix bug where kb handler would permahang because IRQ would be permaset --- kernel/src/kernel/hw/keyboard.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index f8a245a..caba63b 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,3 +1,4 @@ +#include "kclib/stdio.h" #include #include #include @@ -51,9 +52,12 @@ static inline bool kb_reset (void) { static void kb_handler (registers_t* registers) { (void)registers; - unsigned char scancode = kb_read_data (); + if (kb_read_status_register ().out_buffer_full) { + unsigned char scancode = kb_read_data (); + kprintf ("0x%02x ", scancode); + push_charqueue (kb_keypress_charqueue, scancode); + } pic_send_eoi (1); - push_charqueue (kb_keypress_charqueue, scancode); } void init_kb (void) { @@ -69,7 +73,7 @@ void init_kb (void) { kb_ps2_cfg_byte_t cfg_byte = kb_read_cfg_byte (); cfg_byte.irq1_enable = cfg_byte.irq12_enable = 0; - cfg_byte.port_1_tl_enable = 0; + cfg_byte.port_1_tl_enable = 1; cfg_byte.port_1_clock_disable = 0; kb_write_cfg_byte (cfg_byte); @@ -78,9 +82,10 @@ void init_kb (void) { kb_write_cfg_byte (cfg_byte); kb_send_command (kb_ps2_enable_port_1, false); + is_kb_setup = kb_reset (); + cfg_byte.irq1_enable = 1; kb_write_cfg_byte (cfg_byte); - is_kb_setup = kb_reset (); if (kb_keypress_charqueue != nullptr) { idt_register_handler (0x21, kb_handler); From f0862d0148269057fee97e2fc07aa5660a53f389 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 10:01:36 +0530 Subject: [PATCH 06/25] Add a keypress map --- kernel/include/kernel/hw/keypress_map.h | 281 ++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 kernel/include/kernel/hw/keypress_map.h diff --git a/kernel/include/kernel/hw/keypress_map.h b/kernel/include/kernel/hw/keypress_map.h new file mode 100644 index 0000000..8f41931 --- /dev/null +++ b/kernel/include/kernel/hw/keypress_map.h @@ -0,0 +1,281 @@ +#pragma once + +constexpr unsigned char kb_action_escape = 0x80; +constexpr unsigned char kb_action_lctl = 0x81; +constexpr unsigned char kb_action_lshift = 0x82; +constexpr unsigned char kb_action_rshift = 0x83; +constexpr unsigned char kb_action_lalt = 0x84; +constexpr unsigned char kb_action_caps = 0x85; +constexpr unsigned char kb_action_f1 = 0x86; +constexpr unsigned char kb_action_f2 = 0x87; +constexpr unsigned char kb_action_f3 = 0x88; +constexpr unsigned char kb_action_f4 = 0x89; +constexpr unsigned char kb_action_f5 = 0x8A; +constexpr unsigned char kb_action_f6 = 0x8B; +constexpr unsigned char kb_action_f7 = 0x8C; +constexpr unsigned char kb_action_f8 = 0x8D; +constexpr unsigned char kb_action_f9 = 0x8E; +constexpr unsigned char kb_action_f10 = 0x8F; +constexpr unsigned char kb_action_numlk = 0x90; +constexpr unsigned char kb_action_scrllk = 0x91; +constexpr unsigned char kb_action_f11 = 0x92; +constexpr unsigned char kb_action_f12 = 0x93; + +constexpr unsigned char kb_ps2_sc1_released_offset = 0x80; + +constexpr unsigned char keypress_to_char_or_action[256] = {0, + kb_action_escape, + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0', + '-', + '=', + '\b', + '\t', + 'q', + 'w', + 'e', + 'r', + 't', + 'y', + 'u', + 'i', + 'o', + 'p', + '[', + ']', + '\n', + kb_action_lctl, + 'a', + 's', + 'd', + 'f', + 'g', + 'h', + 'j', + 'k', + 'l', + ';', + '\'', + '`', + kb_action_lshift, + '\\', + 'z', + 'x', + 'c', + 'v', + 'b', + 'n', + 'm', + ',', + '.', + '/', + kb_action_rshift, + '*', + kb_action_lalt, + ' ', + kb_action_caps, + kb_action_f1, + kb_action_f2, + kb_action_f3, + kb_action_f4, + kb_action_f5, + kb_action_f6, + kb_action_f7, + kb_action_f8, + kb_action_f9, + kb_action_f10, + kb_action_numlk, + kb_action_scrllk, + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + 0, + 0, + 0, + kb_action_f11, + kb_action_f12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + kb_action_escape, + '!', + '@', + '#', + '$', + '%', + '^', + '&', + '*', + '(', + ')', + '_', + '+', + '\b', + '\t', + 'Q', + 'W', + 'E', + 'R', + 'T', + 'Y', + 'U', + 'I', + 'O', + 'P', + '{', + '}', + '\n', + kb_action_lctl, + 'A', + 'S', + 'D', + 'F', + 'G', + 'H', + 'J', + 'K', + 'L', + ':', + '\"', + '~', + kb_action_lshift, + '|', + 'Z', + 'X', + 'C', + 'V', + 'B', + 'N', + 'M', + '<', + '>', + '?', + kb_action_rshift, + '*', + kb_action_lalt, + ' ', + kb_action_caps, + kb_action_f1, + kb_action_f2, + kb_action_f3, + kb_action_f4, + kb_action_f5, + kb_action_f6, + kb_action_f7, + kb_action_f8, + kb_action_f9, + kb_action_f10, + kb_action_numlk, + kb_action_scrllk, + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + 0, + 0, + 0, + kb_action_f11, + kb_action_f12, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0}; From 587076dfde4a13edc92de23f33c51abef8f558d3 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 10:01:49 +0530 Subject: [PATCH 07/25] Include it + minor fixes --- kernel/include/kernel/hw/keyboard.h | 5 +---- kernel/src/kernel/hw/keyboard.c | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/kernel/include/kernel/hw/keyboard.h b/kernel/include/kernel/hw/keyboard.h index 522fffe..6af4266 100644 --- a/kernel/include/kernel/hw/keyboard.h +++ b/kernel/include/kernel/hw/keyboard.h @@ -1,5 +1,4 @@ -#ifndef KEYBOARD_H -#define KEYBOARD_H +#pragma once #include @@ -63,5 +62,3 @@ typedef union { } kb_ps2_status_register_t; void init_kb (void); - -#endif \ No newline at end of file diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index caba63b..16139de 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,5 +1,6 @@ -#include "kclib/stdio.h" +#include #include +#include #include #include #include From e2acf5866ddd368cb50af8855d960b2d3248a21c Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 10:11:39 +0530 Subject: [PATCH 08/25] Add some extended keyboard actions --- kernel/include/kernel/hw/keypress_map.h | 30 ++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/hw/keypress_map.h b/kernel/include/kernel/hw/keypress_map.h index 8f41931..10d58c0 100644 --- a/kernel/include/kernel/hw/keypress_map.h +++ b/kernel/include/kernel/hw/keypress_map.h @@ -20,6 +20,19 @@ constexpr unsigned char kb_action_numlk = 0x90; constexpr unsigned char kb_action_scrllk = 0x91; constexpr unsigned char kb_action_f11 = 0x92; constexpr unsigned char kb_action_f12 = 0x93; +constexpr unsigned char kb_action_rctl = 0x94; +constexpr unsigned char kb_action_ralt = 0x95; +constexpr unsigned char kb_action_home = 0x96; +constexpr unsigned char kb_action_cup = 0x97; +constexpr unsigned char kb_action_pgup = 0x98; +constexpr unsigned char kb_action_cleft = 0x99; +constexpr unsigned char kb_action_cright = 0x9A; +constexpr unsigned char kb_action_end = 0x9B; +constexpr unsigned char kb_action_cdown = 0x9C; +constexpr unsigned char kb_action_pgdn = 0x9D; +constexpr unsigned char kb_action_insert = 0x9E; +constexpr unsigned char kb_action_delete = 0x9F; +constexpr unsigned char kb_action_ext = 0xE0; constexpr unsigned char kb_ps2_sc1_released_offset = 0x80; @@ -263,7 +276,7 @@ constexpr unsigned char keypress_to_char_or_action[256] = {0, 0, 0, 0, - 0, + kb_action_ext, 0, 0, 0, @@ -279,3 +292,18 @@ constexpr unsigned char keypress_to_char_or_action[256] = {0, 0, 0, 0}; + +constexpr unsigned char ext_keypress_to_action[128] = {[0x1C] = '\n', + [0x1D] = kb_action_rctl, + [0x35] = '/', + [0x38] = kb_action_ralt, + [0x47] = kb_action_home, + [0x48] = kb_action_cup, + [0x49] = kb_action_pgup, + [0x4B] = kb_action_cleft, + [0x4D] = kb_action_cright, + [0x4F] = kb_action_end, + [0x50] = kb_action_cdown, + [0x51] = kb_action_pgdn, + [0x52] = kb_action_insert, + [0x53] = kb_action_delete}; \ No newline at end of file From 157136d78b12e8a0f3d8e2e80c97cf4683fd3a90 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 10:15:16 +0530 Subject: [PATCH 09/25] Add some util functions --- kernel/include/kernel/hw/keypress_map.h | 6 +++++- kernel/src/kernel/hw/keypress.c | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 kernel/src/kernel/hw/keypress.c diff --git a/kernel/include/kernel/hw/keypress_map.h b/kernel/include/kernel/hw/keypress_map.h index 10d58c0..8445dc1 100644 --- a/kernel/include/kernel/hw/keypress_map.h +++ b/kernel/include/kernel/hw/keypress_map.h @@ -306,4 +306,8 @@ constexpr unsigned char ext_keypress_to_action[128] = {[0x1C] = '\n', [0x50] = kb_action_cdown, [0x51] = kb_action_pgdn, [0x52] = kb_action_insert, - [0x53] = kb_action_delete}; \ No newline at end of file + [0x53] = kb_action_delete}; + +int kp_isaction (unsigned char kp); +int kp_ischar (unsigned char kp); +int kp_isext (unsigned char kp); diff --git a/kernel/src/kernel/hw/keypress.c b/kernel/src/kernel/hw/keypress.c new file mode 100644 index 0000000..1d74150 --- /dev/null +++ b/kernel/src/kernel/hw/keypress.c @@ -0,0 +1,5 @@ +#include + +int kp_isaction (unsigned char kp) { return kb_action_escape <= kp && kp <= kb_action_delete; } +int kp_isext (unsigned char kp) { return kp == kb_action_ext; } +int kp_ischar (unsigned char kp) { return kp != 0 && !kp_isaction (kp) && !kp_isext (kp); } From 27a08a51e2cf6494fe62184edf18a28c43fce6da Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:09:03 +0530 Subject: [PATCH 10/25] Add statemachine struct and parser for scancode 1 --- kernel/include/kernel/hw/keypress_map.h | 7 +++ kernel/src/kernel/hw/keypress.c | 78 ++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/hw/keypress_map.h b/kernel/include/kernel/hw/keypress_map.h index 8445dc1..3f600c9 100644 --- a/kernel/include/kernel/hw/keypress_map.h +++ b/kernel/include/kernel/hw/keypress_map.h @@ -308,6 +308,13 @@ constexpr unsigned char ext_keypress_to_action[128] = {[0x1C] = '\n', [0x52] = kb_action_insert, [0x53] = kb_action_delete}; +typedef struct { + bool lctl, rctl, lshift, rshift, lalt, ralt, caps, numlk, scrllk, ext; +} statemachine_t; + int kp_isaction (unsigned char kp); int kp_ischar (unsigned char kp); int kp_isext (unsigned char kp); +int kp_islk (unsigned char kp); + +unsigned char map_keypress (statemachine_t* sm, unsigned char kp); diff --git a/kernel/src/kernel/hw/keypress.c b/kernel/src/kernel/hw/keypress.c index 1d74150..ca58120 100644 --- a/kernel/src/kernel/hw/keypress.c +++ b/kernel/src/kernel/hw/keypress.c @@ -1,5 +1,81 @@ +#include #include -int kp_isaction (unsigned char kp) { return kb_action_escape <= kp && kp <= kb_action_delete; } +int kp_isaction (unsigned char kp) { + return kb_action_escape <= keypress_to_char_or_action[kp] && + keypress_to_char_or_action[kp] <= kb_action_delete; +} int kp_isext (unsigned char kp) { return kp == kb_action_ext; } int kp_ischar (unsigned char kp) { return kp != 0 && !kp_isaction (kp) && !kp_isext (kp); } +int kp_islk (unsigned char kp) { + return keypress_to_char_or_action[kp] == kb_action_caps || + keypress_to_char_or_action[kp] == kb_action_numlk || + keypress_to_char_or_action[kp] == kb_action_scrllk; +} + +unsigned char map_keypress (statemachine_t* sm, unsigned char kp) { + if (kp == 0) return 0; + if (sm->ext) { + sm->ext = false; + if (kp >= kb_ps2_sc1_released_offset) { + unsigned char released = kp - kb_ps2_sc1_released_offset; + if (ext_keypress_to_action[released] == kb_action_ralt) + sm->ralt = false; + else if (ext_keypress_to_action[released] == kb_action_rctl) + sm->rctl = false; + return 0; + } + unsigned char mapped = ext_keypress_to_action[kp]; + if (ext_keypress_to_action[mapped] == kb_action_ralt) + sm->ralt = true; + else if (ext_keypress_to_action[mapped] == kb_action_rctl) + sm->rctl = true; + return mapped; + } + + if (kp_isext (kp)) { + sm->ext = true; + return 0; + } + + if (kp >= kb_ps2_sc1_released_offset) { + unsigned char released = keypress_to_char_or_action[kp - kb_ps2_sc1_released_offset]; + if (released == kb_action_lshift) + sm->lshift = false; + else if (released == kb_action_rshift) + sm->rshift = false; + else if (released == kb_action_lalt) + sm->lalt = false; + else if (released == kb_action_lctl) + sm->lctl = false; + return 0; + } + + if (kp_isaction (kp)) { + unsigned char mapped = keypress_to_char_or_action[kp]; + if (mapped == kb_action_lshift) + sm->lshift = true; + else if (mapped == kb_action_rshift) + sm->rshift = true; + else if (mapped == kb_action_lalt) + sm->lalt = true; + else if (mapped == kb_action_lctl) + sm->lctl = true; + else if (mapped == kb_action_caps) + sm->caps = !sm->caps; + else if (mapped == kb_action_numlk) + sm->numlk = !sm->numlk; + else if (mapped == kb_action_scrllk) + sm->scrllk = !sm->scrllk; + return mapped; + } + + if (kp_ischar (kp)) { + int offset = 128 * (sm->lshift || sm->rshift); + if (isalpha (keypress_to_char_or_action[kp])) + offset = 128 * (sm->caps ^ (sm->lshift || sm->rshift)); + return keypress_to_char_or_action[offset + kp]; + } + + return 0; +} From bebd51b15635c853512168fbf001bb0c4a360b32 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:10:16 +0530 Subject: [PATCH 11/25] Use map_keypress in keyboard handler --- kernel/src/kernel/hw/keyboard.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index 16139de..ce90471 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,13 +1,16 @@ #include +#include #include #include #include #include #include +#include #include -static bool is_kb_setup = false; -static charqueue* kb_keypress_charqueue; +static bool is_kb_setup = false; +static charqueue* kb_keypress_charqueue; +static statemachine_t* kb_statemachine; static inline kb_ps2_status_register_t kb_read_status_register (void) { return (kb_ps2_status_register_t){.raw = inb (kb_ps2_status_port)}; @@ -55,14 +58,19 @@ static void kb_handler (registers_t* registers) { (void)registers; if (kb_read_status_register ().out_buffer_full) { unsigned char scancode = kb_read_data (); - kprintf ("0x%02x ", scancode); - push_charqueue (kb_keypress_charqueue, scancode); + unsigned char processed = map_keypress (kb_statemachine, scancode); + if (processed != 0) { + kprintf ("0x%02x [%1c]", processed, processed); + push_charqueue (kb_keypress_charqueue, processed); + } } pic_send_eoi (1); } void init_kb (void) { kb_keypress_charqueue = create_charqueue (); + kb_statemachine = kmalloc (sizeof (statemachine_t)); + kmemset ((void*)kb_statemachine, 0, sizeof (statemachine_t)); // TODO: actually verify the PS2 controller exists From 92299d1b83a1d474973302e23a5293f04573e177 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:11:05 +0530 Subject: [PATCH 12/25] Remove the while loop from the handler --- kernel/src/kernel/hw/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index ce90471..0cd9fe4 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -57,7 +57,7 @@ static inline bool kb_reset (void) { static void kb_handler (registers_t* registers) { (void)registers; if (kb_read_status_register ().out_buffer_full) { - unsigned char scancode = kb_read_data (); + unsigned char scancode = inb (kb_ps2_data_port); unsigned char processed = map_keypress (kb_statemachine, scancode); if (processed != 0) { kprintf ("0x%02x [%1c]", processed, processed); From 21f49c75ef862b38b2616c0704b0157e9ccefe64 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:19:04 +0530 Subject: [PATCH 13/25] Add pop_next_char --- kernel/include/kernel/hw/keyboard.h | 3 ++- kernel/src/kernel/hw/keyboard.c | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel/include/kernel/hw/keyboard.h b/kernel/include/kernel/hw/keyboard.h index 6af4266..fbbe6fa 100644 --- a/kernel/include/kernel/hw/keyboard.h +++ b/kernel/include/kernel/hw/keyboard.h @@ -61,4 +61,5 @@ typedef union { } __attribute__ ((packed)); } kb_ps2_status_register_t; -void init_kb (void); +void init_kb (void); +unsigned char pop_next_char (void); diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index 0cd9fe4..5a39839 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -60,13 +61,20 @@ static void kb_handler (registers_t* registers) { unsigned char scancode = inb (kb_ps2_data_port); unsigned char processed = map_keypress (kb_statemachine, scancode); if (processed != 0) { - kprintf ("0x%02x [%1c]", processed, processed); + kprintf ("0x%02x [%1c]\t", processed, processed); push_charqueue (kb_keypress_charqueue, processed); } } pic_send_eoi (1); } +unsigned char pop_next_char (void) { + unsigned char ret = 255; + if (peek_charqueue (kb_keypress_charqueue, &ret) != -EEMPQ) + pop_charqueue (kb_keypress_charqueue, &ret); + return ret; +} + void init_kb (void) { kb_keypress_charqueue = create_charqueue (); kb_statemachine = kmalloc (sizeof (statemachine_t)); From 5cc526e32d1ece5130818623c4434c2eec202081 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:23:30 +0530 Subject: [PATCH 14/25] Expose do_sched_yield --- kernel/include/kernel/process.h | 1 + kernel/src/kernel/process.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/process.h b/kernel/include/kernel/process.h index 42b417a..77ec742 100644 --- a/kernel/include/kernel/process.h +++ b/kernel/include/kernel/process.h @@ -38,5 +38,6 @@ int enqueue_process (process_queue* queue, process* new_process); void schedule (registers_t* registers); int process_fork (process* source_process, process** dest_ptr); +int do_sched_yield (void); void init_process (void); diff --git a/kernel/src/kernel/process.c b/kernel/src/kernel/process.c index 8804524..ff1374a 100644 --- a/kernel/src/kernel/process.c +++ b/kernel/src/kernel/process.c @@ -82,7 +82,7 @@ void schedule (registers_t* registers) { } } -static int do_sched_yield (void) { +int do_sched_yield (void) { schedule (get_latest_r_frame ()); return 0; } From ce21aed59dd203b622ffcb6e24f99feae8d03387 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:34:59 +0530 Subject: [PATCH 15/25] Add stdin_read --- kernel/src/kernel/fs/chardev.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/kernel/src/kernel/fs/chardev.c b/kernel/src/kernel/fs/chardev.c index 771c7b4..d7f38f0 100644 --- a/kernel/src/kernel/fs/chardev.c +++ b/kernel/src/kernel/fs/chardev.c @@ -1,8 +1,11 @@ +#include #include #include #include #include #include +#include +#include #include static int stdout_write (inode* node, file* f, void* buf, size_t len) { @@ -18,6 +21,21 @@ static int stdout_write (inode* node, file* f, void* buf, size_t len) { return len; } +static int stdin_read (inode* node, file* f, void* buffer, size_t size) { + (void)node, (void)f; // args not used + char* cbuffer = (char*)buffer; + for (size_t i = 0; i < size; i++) { + unsigned char c = 255; + while ((c = pop_next_char ()) == 255) + do_sched_yield (); + // if (isprint (c)) + // cbuffer[i] = c; + // else + // i--; + } + return (int)size; +} + void init_tty1 (inode* absolute_root) { inode* dev_dir = nullptr; int error = do_mkdir ("dev", &dev_dir, absolute_root); @@ -32,7 +50,7 @@ void init_tty1 (inode* absolute_root) { kmemset (tty1_fops, 0, sizeof (file_operations)); tty1_fops->write = stdout_write; - // tty1_fops->read = // connect to keyboard get_next_char when available + tty1_fops->read = stdin_read; tty1_file->i_iops = nullptr; tty1_file->i_fops = tty1_fops; From d9104403b4d8626ab7c6b8475ebf86b805a45a83 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 11:39:30 +0530 Subject: [PATCH 16/25] Add optional tty handler which keyboard may call --- kernel/include/kernel/hw/keyboard.h | 3 +++ kernel/src/kernel/hw/keyboard.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/include/kernel/hw/keyboard.h b/kernel/include/kernel/hw/keyboard.h index fbbe6fa..3335029 100644 --- a/kernel/include/kernel/hw/keyboard.h +++ b/kernel/include/kernel/hw/keyboard.h @@ -61,5 +61,8 @@ typedef union { } __attribute__ ((packed)); } kb_ps2_status_register_t; +typedef void (*kb_tty_handler_t) (unsigned char); + void init_kb (void); +void register_kb_tty_handler (kb_tty_handler_t handler); unsigned char pop_next_char (void); diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index 5a39839..ccac01e 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -9,9 +9,10 @@ #include #include -static bool is_kb_setup = false; -static charqueue* kb_keypress_charqueue; -static statemachine_t* kb_statemachine; +static bool is_kb_setup = false; +static charqueue* kb_keypress_charqueue; +static statemachine_t* kb_statemachine; +static kb_tty_handler_t kb_tty_handler = nullptr; static inline kb_ps2_status_register_t kb_read_status_register (void) { return (kb_ps2_status_register_t){.raw = inb (kb_ps2_status_port)}; @@ -63,6 +64,7 @@ static void kb_handler (registers_t* registers) { if (processed != 0) { kprintf ("0x%02x [%1c]\t", processed, processed); push_charqueue (kb_keypress_charqueue, processed); + if (kb_tty_handler) kb_tty_handler (processed); } } pic_send_eoi (1); @@ -70,11 +72,13 @@ static void kb_handler (registers_t* registers) { unsigned char pop_next_char (void) { unsigned char ret = 255; - if (peek_charqueue (kb_keypress_charqueue, &ret) != -EEMPQ) + if (peek_charqueue (kb_keypress_charqueue, &ret) == 0) pop_charqueue (kb_keypress_charqueue, &ret); return ret; } +void register_kb_tty_handler (kb_tty_handler_t handler) { kb_tty_handler = handler; } + void init_kb (void) { kb_keypress_charqueue = create_charqueue (); kb_statemachine = kmalloc (sizeof (statemachine_t)); From c4f57ba5ce9103a277cf2772c2a11875765d9d64 Mon Sep 17 00:00:00 2001 From: Kumar Date: Sat, 25 Apr 2026 11:45:27 +0530 Subject: [PATCH 17/25] Block process while waiting for keyboard input (#34) * Add inode info * Inject chardev_info * Add a simple process block * Add block and unblock * Format --- kernel/include/kernel/fs/chardev.h | 5 +++++ kernel/include/kernel/fs/vfs.h | 7 +++++++ kernel/include/kernel/process.h | 3 +++ kernel/src/kernel/fs/chardev.c | 4 ++++ kernel/src/kernel/process.c | 11 +++++++++++ 5 files changed, 30 insertions(+) diff --git a/kernel/include/kernel/fs/chardev.h b/kernel/include/kernel/fs/chardev.h index 3d0c60e..d251dd6 100644 --- a/kernel/include/kernel/fs/chardev.h +++ b/kernel/include/kernel/fs/chardev.h @@ -1,5 +1,10 @@ #pragma once #include +#include + +struct chardev_info { + process_queue rsrc_wait_queue; +}; void init_tty1 (inode* absolute_root); diff --git a/kernel/include/kernel/fs/vfs.h b/kernel/include/kernel/fs/vfs.h index 28e1795..91cce69 100644 --- a/kernel/include/kernel/fs/vfs.h +++ b/kernel/include/kernel/fs/vfs.h @@ -19,6 +19,9 @@ typedef enum { UNDEF, EFILE, DIRECTORY, LINK, CHAR_DEV } file_type_t; typedef struct inode inode; typedef struct file file; +typedef struct chardev_info chardev_info_t; +typedef struct ramfs_info ramfs_info_t; + typedef struct { int (*lookup) (char*, inode**, inode*); int (*create) (char*, inode**, inode*); @@ -40,6 +43,10 @@ struct inode { inode_operations* i_iops; file_operations* i_fops; file_type_t i_type; + union { + chardev_info_t* chardev_info; + ramfs_info_t* ramfs_info; + } i_info; }; struct file { diff --git a/kernel/include/kernel/process.h b/kernel/include/kernel/process.h index 77ec742..608f0e2 100644 --- a/kernel/include/kernel/process.h +++ b/kernel/include/kernel/process.h @@ -35,6 +35,9 @@ process* get_current_process (void); int dequeue_process (process_queue* queue, process** result); int enqueue_process (process_queue* queue, process* new_process); +void process_block (process_queue* wait_queue); +void process_unblock (process* p); + void schedule (registers_t* registers); int process_fork (process* source_process, process** dest_ptr); diff --git a/kernel/src/kernel/fs/chardev.c b/kernel/src/kernel/fs/chardev.c index d7f38f0..c821869 100644 --- a/kernel/src/kernel/fs/chardev.c +++ b/kernel/src/kernel/fs/chardev.c @@ -52,7 +52,11 @@ void init_tty1 (inode* absolute_root) { tty1_fops->write = stdout_write; tty1_fops->read = stdin_read; + chardev_info_t* tty1_info = kmalloc (sizeof (chardev_info_t)); + kmemset (tty1_info, 0, sizeof (chardev_info_t)); + tty1_file->i_iops = nullptr; tty1_file->i_fops = tty1_fops; tty1_file->i_type = CHAR_DEV; + tty1_file->i_info.chardev_info = tty1_info; } \ No newline at end of file diff --git a/kernel/src/kernel/process.c b/kernel/src/kernel/process.c index ff1374a..8635e1c 100644 --- a/kernel/src/kernel/process.c +++ b/kernel/src/kernel/process.c @@ -181,6 +181,17 @@ int process_fork (process* source_process, process** dest_ptr) { return new_process->p_id; } +void process_block (process_queue* wait_queue) { + current_process->p_state = TASK_BLOCKED; + enqueue_process (wait_queue, current_process); + do_sched_yield (); +} + +void process_unblock (process* p) { + p->p_state = TASK_READY; + enqueue_process (&ready_queue, p); +} + static uint64_t sys_fork (uint64_t arg1, uint64_t arg2, uint64_t arg3) { (void)arg1, (void)arg2, (void)arg3; // fork does not use any args process* child = nullptr; From b6306cdea99c19dfd2e51a829118c1a7a70d0ece Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:02:36 +0530 Subject: [PATCH 18/25] Block process when char unavailable --- kernel/src/kernel/fs/chardev.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/kernel/src/kernel/fs/chardev.c b/kernel/src/kernel/fs/chardev.c index c821869..fd5fa10 100644 --- a/kernel/src/kernel/fs/chardev.c +++ b/kernel/src/kernel/fs/chardev.c @@ -8,6 +8,8 @@ #include #include +inode* tty1_ptr = nullptr; + static int stdout_write (inode* node, file* f, void* buf, size_t len) { (void)node, (void)f; // args not used bool stdio_buf = get_update_on_putch (); @@ -21,17 +23,20 @@ static int stdout_write (inode* node, file* f, void* buf, size_t len) { return len; } +static void stdin_kb_handler (unsigned char nextchar) { + (void)nextchar; // factually we don't really need this + process* next_process = nullptr; + while (dequeue_process (&tty1_ptr->i_info.chardev_info->rsrc_wait_queue, &next_process) == 0) + process_unblock (next_process); +} + static int stdin_read (inode* node, file* f, void* buffer, size_t size) { (void)node, (void)f; // args not used char* cbuffer = (char*)buffer; for (size_t i = 0; i < size; i++) { unsigned char c = 255; while ((c = pop_next_char ()) == 255) - do_sched_yield (); - // if (isprint (c)) - // cbuffer[i] = c; - // else - // i--; + process_block(&tty1_ptr->i_info.chardev_info->rsrc_wait_queue); } return (int)size; } @@ -59,4 +64,7 @@ void init_tty1 (inode* absolute_root) { tty1_file->i_fops = tty1_fops; tty1_file->i_type = CHAR_DEV; tty1_file->i_info.chardev_info = tty1_info; + + tty1_ptr = tty1_file; + register_kb_tty_handler (stdin_kb_handler); } \ No newline at end of file From 08fa60840affcb904775c2c409ab29593cda221b Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:12:08 +0530 Subject: [PATCH 19/25] Fix issue causing a permaloop + format --- kernel/src/kernel/fs/chardev.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/src/kernel/fs/chardev.c b/kernel/src/kernel/fs/chardev.c index fd5fa10..41977a5 100644 --- a/kernel/src/kernel/fs/chardev.c +++ b/kernel/src/kernel/fs/chardev.c @@ -26,8 +26,10 @@ static int stdout_write (inode* node, file* f, void* buf, size_t len) { static void stdin_kb_handler (unsigned char nextchar) { (void)nextchar; // factually we don't really need this process* next_process = nullptr; - while (dequeue_process (&tty1_ptr->i_info.chardev_info->rsrc_wait_queue, &next_process) == 0) + while (dequeue_process (&tty1_ptr->i_info.chardev_info->rsrc_wait_queue, &next_process) == 0) { + if (!next_process) break; process_unblock (next_process); + } } static int stdin_read (inode* node, file* f, void* buffer, size_t size) { @@ -36,7 +38,7 @@ static int stdin_read (inode* node, file* f, void* buffer, size_t size) { for (size_t i = 0; i < size; i++) { unsigned char c = 255; while ((c = pop_next_char ()) == 255) - process_block(&tty1_ptr->i_info.chardev_info->rsrc_wait_queue); + process_block (&tty1_ptr->i_info.chardev_info->rsrc_wait_queue); } return (int)size; } From a941be94917df03999b25a567b8cef222ca7a31a Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:23:04 +0530 Subject: [PATCH 20/25] Hover the user process Without this, the kernel process also goes unblocked, which means the scheduler sees that there are no processes to run. That causes it to hang, since we do not handle that specially. --- user/hello/hello.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/hello/hello.c b/user/hello/hello.c index bfec9b6..6ed9923 100644 --- a/user/hello/hello.c +++ b/user/hello/hello.c @@ -14,6 +14,10 @@ void _start (void) { const char* msg = "Hello from USERLAND!!!\n"; syscall3 (4, 1, (long)msg, 24); + + for (;;) + ; + syscall3 (1, 0, 0, 0); while (1) From b9277410758118fa50c4382a4b66af294b0d388f Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:25:30 +0530 Subject: [PATCH 21/25] Change the hover loop of kernel thread to echo keypresses --- kernel/src/kernel/entry.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/src/kernel/entry.c b/kernel/src/kernel/entry.c index 21cdf12..0849ff6 100644 --- a/kernel/src/kernel/entry.c +++ b/kernel/src/kernel/entry.c @@ -148,8 +148,11 @@ __attribute__ ((noreturn)) void _start_stage2 (void) { jump_to_usermode (entry_point, user_stack_base, ¤t->p_user); } - for (;;) - do_syscall (SYSCALL_SCHED_YIELD, 0, 0, 0); + for (;;) { + unsigned char c = 0; + do_syscall (SYSCALL_SYS_READ, 0, (uint64_t)&c, 1); + kprintf ("%c", c); + } } static void get_limine_requests (void) { From fa057ec38012541fa1425fdaeedbe40bd1501e41 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:27:01 +0530 Subject: [PATCH 22/25] Filter by regular character only (no action keys) --- kernel/src/kernel/fs/chardev.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/src/kernel/fs/chardev.c b/kernel/src/kernel/fs/chardev.c index 41977a5..715b34f 100644 --- a/kernel/src/kernel/fs/chardev.c +++ b/kernel/src/kernel/fs/chardev.c @@ -39,6 +39,10 @@ static int stdin_read (inode* node, file* f, void* buffer, size_t size) { unsigned char c = 255; while ((c = pop_next_char ()) == 255) process_block (&tty1_ptr->i_info.chardev_info->rsrc_wait_queue); + if (c < 0x80) + cbuffer[i] = c; + else + i--; } return (int)size; } From 7c2d9783aaaa3f0f313011d3e2e7ea85d73fd598 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:31:52 +0530 Subject: [PATCH 23/25] Remove the print statement for every keypress --- kernel/src/kernel/hw/keyboard.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/kernel/src/kernel/hw/keyboard.c b/kernel/src/kernel/hw/keyboard.c index ccac01e..67d4536 100644 --- a/kernel/src/kernel/hw/keyboard.c +++ b/kernel/src/kernel/hw/keyboard.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -62,7 +61,6 @@ static void kb_handler (registers_t* registers) { unsigned char scancode = inb (kb_ps2_data_port); unsigned char processed = map_keypress (kb_statemachine, scancode); if (processed != 0) { - kprintf ("0x%02x [%1c]\t", processed, processed); push_charqueue (kb_keypress_charqueue, processed); if (kb_tty_handler) kb_tty_handler (processed); } From b493a10eb1a738205873f1df8d705a2bf0688528 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:34:42 +0530 Subject: [PATCH 24/25] Handle backspaces in console --- kernel/src/kernel/console.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/src/kernel/console.c b/kernel/src/kernel/console.c index e1dd8f2..72b79e2 100644 --- a/kernel/src/kernel/console.c +++ b/kernel/src/kernel/console.c @@ -123,6 +123,10 @@ void putchar (unsigned char rc) { idx = ((idx / xc) + 1) * xc; if (idx >= xc * yc) idx -= xc * yc; return; + case '\b': + idx--; + registerChar (0, idx); + return; } registerChar (rc, idx); idx++; From dc671eca576930c03ba8f1448ca221aa75b392d6 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sat, 25 Apr 2026 12:39:48 +0530 Subject: [PATCH 25/25] do_sched_yield can be static --- kernel/include/kernel/process.h | 1 - kernel/src/kernel/process.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/include/kernel/process.h b/kernel/include/kernel/process.h index 608f0e2..d71eacf 100644 --- a/kernel/include/kernel/process.h +++ b/kernel/include/kernel/process.h @@ -41,6 +41,5 @@ void process_unblock (process* p); void schedule (registers_t* registers); int process_fork (process* source_process, process** dest_ptr); -int do_sched_yield (void); void init_process (void); diff --git a/kernel/src/kernel/process.c b/kernel/src/kernel/process.c index 8635e1c..5f1ad80 100644 --- a/kernel/src/kernel/process.c +++ b/kernel/src/kernel/process.c @@ -82,7 +82,7 @@ void schedule (registers_t* registers) { } } -int do_sched_yield (void) { +static int do_sched_yield (void) { schedule (get_latest_r_frame ()); return 0; }