From c4c26e0e197713e815ef3006a966a8908d05c3e8 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Tue, 9 Sep 2025 21:43:05 +0200 Subject: [PATCH] Fix ps2 keyboard handling --- kernel/hal/x86_64/intr.c | 14 ++++++++------ kernel/proc/ps2kbproc/ps2kbproc.c | 9 +++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/kernel/hal/x86_64/intr.c b/kernel/hal/x86_64/intr.c index c36bd53..06fc30e 100644 --- a/kernel/hal/x86_64/intr.c +++ b/kernel/hal/x86_64/intr.c @@ -201,13 +201,15 @@ void intr_handleintr(IntrStackFrame *frame) { break; case INTR_IRQBASE+1: int32_t c = ps2kb_intr(); - intr_eoi(frame->trapnum - INTR_IRQBASE); - uint8_t *bytes = (uint8_t *)&c; - spinlock_acquire(&PS2KB_BUF.spinlock); - for (size_t i = 0; i < sizeof(c); i++) { - rbuf_push(&PS2KB_BUF.rbuf, bytes[i]); + if (c >= 0) { + uint8_t *bytes = (uint8_t *)&c; + spinlock_acquire(&PS2KB_BUF.spinlock); + for (size_t i = 0; i < sizeof(c); i++) { + rbuf_push(&PS2KB_BUF.rbuf, bytes[i]); + } + spinlock_release(&PS2KB_BUF.spinlock); } - spinlock_release(&PS2KB_BUF.spinlock); + intr_eoi(frame->trapnum - INTR_IRQBASE); break; } } else if (frame->trapnum == 0x80) { diff --git a/kernel/proc/ps2kbproc/ps2kbproc.c b/kernel/proc/ps2kbproc/ps2kbproc.c index 9f853be..747a331 100644 --- a/kernel/proc/ps2kbproc/ps2kbproc.c +++ b/kernel/proc/ps2kbproc/ps2kbproc.c @@ -22,17 +22,18 @@ void ps2kbproc_init(Proc *proc) { void ps2kbproc_fn(void) { for (;;) { - int32_t kbchr; + int32_t kbchr = 0; uint8_t *buf = (uint8_t *)&kbchr; - size_t i = 0; + size_t total = 0; spinlock_acquire(&PS2KB_BUF.spinlock); - for (; i < sizeof(kbchr); i++) { + for (size_t i = 0; i < sizeof(kbchr); i++) { if (rbuf_pop(&PS2KB_BUF.rbuf, &buf[i]) < 0) { break; } + total++; } spinlock_release(&PS2KB_BUF.spinlock); - if (i > 0) { + if (total == sizeof(kbchr)) { spinlock_acquire(&PS2KBPROC->bcast_pipes.spinlock); IpcPipe *head = PS2KBPROC->bcast_pipes.list; while (head != NULL) {