From 341018d6d1f3fa305805b0cae0412d96e4668828 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Thu, 29 Jan 2026 10:34:50 +1100 Subject: [PATCH] keyboard!!!! :D --- OVMFbin/OVMF_VARS-pure-efi.fd | Bin 131072 -> 131072 bytes kernel/bin/CustomOS.img | Bin 48000000 -> 48000000 bytes kernel/bin/kernel.elf | Bin 28032 -> 28624 bytes kernel/lib/IO.o | Bin 0 -> 1456 bytes kernel/lib/interrupts/interrupts.o | Bin 2072 -> 3880 bytes kernel/lib/kernel.o | Bin 1960 -> 1960 bytes kernel/lib/kernelUtil.o | Bin 5632 -> 6016 bytes kernel/src/IO.cpp | 17 ++++++++ kernel/src/IO.h | 6 +++ kernel/src/interrupts/interrupts.cpp | 56 +++++++++++++++++++++++++++ kernel/src/interrupts/interrupts.h | 19 ++++++++- kernel/src/kernel.cpp | 2 - kernel/src/kernelUtil.cpp | 13 +++++++ 13 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 kernel/lib/IO.o create mode 100644 kernel/src/IO.cpp create mode 100644 kernel/src/IO.h diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index 9bf4b9b2b88f43018a867e9bc20aea39d1108e1c..77e762c723d9b392da6cb63bb92a6b9128896682 100644 GIT binary patch delta 66 zcmZo@;Am*z*ifOx_;>O_EA7b#%(hHU2stuYz$$OD)*L6sf13|lo#otYwd|PZW`k81 WTtS59rVjz^%^SXL-|&rb0|x-{I3LXb delta 439 zcmZo@;Am*z*ifOx_;T`D9qq{n%(iTf&^BV6d`nMh@){il##fuq>YU}Ayv;;y^8vF- zjFat*lqP@BW!YR|QN%d;oUYR31zIeV1*~!=-_TP5Yj{nnhBu^YcuT5=ccf}~PpXCw gq-yv`tcDI97sgLO#gl_KeF$K0{_uVC1gi}k0A4JzRsaA1 diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index 1e056f2e858818db92f6388c9b1856307106a407..655e3c121714ce103fdcffdb1117f2d843e56a50 100644 GIT binary patch delta 8613 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 delta 7031 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 diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index e7789081a3b406c145cc5d08aaece2e673ec807b..3b7fde3cc1ba8d5139e3e2ae23bc653c7ff08c58 100755 GIT binary patch delta 5520 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 delta 3910 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 CICa+m literal 0 HcmV?d00001 diff --git a/kernel/lib/interrupts/interrupts.o b/kernel/lib/interrupts/interrupts.o index 8d516959ccf58eb7458ea0baa27902e2e7c0f564..9cd6d79b88ef52f1d1d55aae221cc498e8a16c73 100644 GIT binary patch literal 3880 zcmchaO>7%Q6vxMLnz&6muj(g3x*d$uT5o79m{ji?V`}Fi< zkM?EK#;Kp$jp<~_m`ctW)9X-bOnq|w2W(tj{{Q72vY2zmS-+U+&3;W^SIe3|4#X>P zGWm|@XN*&e9sL7Gk7f0K{ir^mKR#%Djrv zhWR&ZWW^&FZUs`Cg0WeW`b{2-WJ%hu{ksYVqB=Z zWbA(Q`lhy*8@gMY`pyQ=G)}FXY&zZiQs~9?FKl?e1+~UM(7Jz98wcI2)E+~BgBngQ z=oj^m^hN#S#HWeNi7ScE^d-0z?;gIBIqqDQ!wY-yM!7im^7!#u{2m$qoyQw~^93@u z>TpP-_;p3)*bi2BV|6s>?b>SA2Ho43-rEacd*H&DYWo17o^<4G$-Q-iHu2Xap9YUc z@kMCY%m3vX{FgQOHQ-p!Rq$xu9)NFw1*(^SGjP;mbu4Fnx`>DJe)RHQea%M4O*+Z6NIZ#e-v@2m&3VA}Yv;*}g{aU*U zcFx6`yVCo+vq^jC5wikIFa~H>Y1GZR!x-$8!NWy!%);27j5T7GfnsNOp_F~bEVyGr z!$k(egD?o!^%dWCAOyoR1HvyzjZ&Y@S<(4S}e_0Xny-)9`_ z+$sAD(&M}v;3EAM#_^R+{0qi6GX4kSt&F$H-y!DbeCrwf< z-^)1H4>Hc{$uZ9LPczQ-V~lhCX~wz!4C7q?I^$gb2IE|Ro^h^!k8!TQ$T-(8G0yd0 zG0yehFwXTqGS2lsGtTwPjB|Yuf8b!a?_7U7<6Pg)IM-{K1PsGc;`I-De`}o1^>KyM zx&D^Ir)A&!6oNM8r}H`_?~6E{%N+`*b6JEd6C3(L$rFZemz@>Y%s(ajC+yL1*(sGR$DM#Nn8_NJXSTeB|Kv0n zjknaKWQoiER=()Knwp-UAXJ;!7G#tzWqvf&Wz18y~?REEs*W`@O&J)t^?u(a8V+ delta 332 zcmZ1>H$z~82Gb0diCWGqXZc?Lo9GZXIiAUI@+2m?$?KTH7!4;IGAmEkVAf#NnHfl4 z9y7-ClNDK{C(q$gfwJ!KsBoT#s9-Rh%*kuc#K1V&iPw%vh7qVzZ1N0V4JHM~$%lCD zxB?g<>J|VE<}>5G0X5iTvL~N8*9WNN0fxz4d}fmm@NzIsVVHah$ZX)_U@8H*MGgR$ CVLsyk diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index 398d0c2e79c84c699de976b3d9cac1f29216a605..907aff0faddaa0179682af557fea1a7c6169be67 100644 GIT binary patch delta 46 zcmZ3%zk+|l0+!eR7#JolnZcMe*_N@HF=_Kb#^X#tPA5w_-7AIcDnW@U0Yo@2shuQzbQ2fEvHn~nB3q;s^}sX$C#3>@#^ zoJ-VPNRqFNP*QGE#~sQt6z)22(TDKL>8BqJ-GX1vp}==Wh|1$8B{Q*YpCnF2iR9Pq`@93gMF@hgOQOin&*bNuhbXT(E1*6vUnaWNh?->|qi z$Uek3LHGD81J?P(vI}|lBkn^yVsUY82jU47FDBluK91s@h@Ut4h|zCxWji5@5^!Iy zp#nkZ@%Ga)9Q0<7*dzIf?;%7SOnmmJuke2%HZQ}H_XnMWh8pW!=r(=C0bkV-_ND`L zbvGQ=!t^~{(2`u&wIo|mp`|708U%bv_S1|h_`-Ap>Kue*X!#QCxe9%~3D<8@^oGNAL~X1+xJ||b9`fV&$_Vz|SJ8Kg2?(X^31#U_5JqNc*0Y029l@7( z11@DVdQ1=sQN_hGUU|k1#AO55n*Oip-B6W{QcgJ`(C1$*75&$eQg7Hc3Xef!bCTDf zB~d3Gjyl!CUA)J13zs=xXyHN5ms+?}f6eCLRn?>=#PkSjC~(et#{_-^71h|h71Rzv zy%V@5@Oz<)N8m3)yj$QkA>J$SUz-mjwk)Dy#WvP!wvcyy& zAIabqIG{hfcFcDqfeR4Tv!v{Tyq+OLDjez=rO5Wq461rsDe`*_K-@?xW!09};Y^GD E1Ft;1Qvd(} diff --git a/kernel/src/IO.cpp b/kernel/src/IO.cpp new file mode 100644 index 0000000..5afd648 --- /dev/null +++ b/kernel/src/IO.cpp @@ -0,0 +1,17 @@ +#include "IO.h" + +void outb(uint16_t port, uint8_t value){ + asm volatile ("outb %0, %1" : : "a"(value), "Nd"(port)); +} + +uint8_t inb(uint16_t port){ + uint8_t returnVal; + asm volatile ("inb %1, %0" + : "=a"(returnVal) + : "Nd"(port)); + return returnVal; +} + +void io_wait(){ + asm volatile ("outb %%al, $0x80" : : "a"(0)); +} \ No newline at end of file diff --git a/kernel/src/IO.h b/kernel/src/IO.h new file mode 100644 index 0000000..973af11 --- /dev/null +++ b/kernel/src/IO.h @@ -0,0 +1,6 @@ +#pragma once +#include + +void outb(uint16_t port, uint8_t value); +uint8_t inb(uint16_t port); +void io_wait(); \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.cpp b/kernel/src/interrupts/interrupts.cpp index ead8eb9..4cf7d17 100644 --- a/kernel/src/interrupts/interrupts.cpp +++ b/kernel/src/interrupts/interrupts.cpp @@ -1,5 +1,6 @@ #include "interrupts.h" #include "../panic.h" +#include "../IO.h" __attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame) { Panic("Page Fault"); @@ -14,4 +15,59 @@ __attribute__((interrupt)) void DoubleFault_Handler(struct interrupt_frame* fram __attribute__((interrupt)) void GPFault_Handler(struct interrupt_frame* frame) { Panic("General Protection Fault"); while (true); +} + +__attribute__((interrupt)) void KeyboardInterrupt_Handler(struct interrupt_frame* frame) { + GlobalRenderer->Print("A"); + + uint8_t scancode = inb(0x60); + + PIC_EndMaster(); +} + +void PIC_EndMaster() { + outb(PIC1_COMMAND, PIC_EOI); +} + +void PIC_EndSlave() { + outb(PIC2_COMMAND, PIC_EOI); + outb(PIC1_COMMAND, PIC_EOI); +} + +void RemapPIC() { + uint8_t a1, a2; + + a1 = inb(PIC1_DATA); + io_wait(); + a2 = inb(PIC2_DATA); + io_wait(); + + // init master + outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); + io_wait(); + // init slave + outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); + io_wait(); + + outb(PIC1_DATA, 0x20); + io_wait(); + outb(PIC2_DATA, 0x28); + io_wait(); + + // tell the pic chips how they correspond to eachother so they can chat + outb(PIC1_DATA, 4); + io_wait(); + outb(PIC2_DATA, 2); + io_wait(); + + outb(PIC1_DATA, ICW4_8086); + io_wait(); + outb(PIC2_DATA, ICW4_8086); + io_wait(); + + // restore bitmasks we saved earlier + outb(PIC1_DATA, a1); + io_wait(); + outb(PIC2_DATA, a2); + io_wait(); } \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.h b/kernel/src/interrupts/interrupts.h index c14ef68..5529e8c 100644 --- a/kernel/src/interrupts/interrupts.h +++ b/kernel/src/interrupts/interrupts.h @@ -1,8 +1,23 @@ #pragma once #include "../BasicRenderer.h" -struct interrupt_frame; +#define PIC1_COMMAND 0x20 +#define PIC1_DATA 0x21 +#define PIC2_COMMAND 0xA0 +#define PIC2_DATA 0xA1 +#define PIC_EOI 0x20 +#define ICW1_INIT 0x10 +#define ICW1_ICW4 0x01 +#define ICW4_8086 0x01 + +struct interrupt_frame; __attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame); __attribute__((interrupt)) void DoubleFault_Handler(struct interrupt_frame* frame); -__attribute__((interrupt)) void GPFault_Handler(struct interrupt_frame* frame); \ No newline at end of file +__attribute__((interrupt)) void GPFault_Handler(struct interrupt_frame* frame); + +__attribute__((interrupt)) void KeyboardInterrupt_Handler(struct interrupt_frame* frame); + +void RemapPIC(); +void PIC_EndMaster(); +void PIC_EndSlave(); \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index b0c76ba..7f792e4 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -8,8 +8,6 @@ extern "C" void _start(BootInfo* bootInfo) { GlobalRenderer->Print("Kernel initialized successfully!"); GlobalRenderer->Next(); - asm("int $0x0e"); - // make sure we never return from our OS while (true); } \ No newline at end of file diff --git a/kernel/src/kernelUtil.cpp b/kernel/src/kernelUtil.cpp index 6de702c..178db35 100644 --- a/kernel/src/kernelUtil.cpp +++ b/kernel/src/kernelUtil.cpp @@ -8,6 +8,7 @@ extern "C" void __stack_chk_fail(void) { #include "gdt/gdt.h" #include "interrupts/IDT.h" #include "interrupts/interrupts.h" +#include "IO.h" KernelInfo kernelInfo; PageTableManager pageTableManager = NULL; @@ -64,8 +65,20 @@ void PrepareInterrupts() { int_GPFault->type_attr = IDT_TA_InterruptGate; int_GPFault->selector = 0x08; // kernel code segment + IDTDescEntry* int_Keyboard = (IDTDescEntry*)(idtr.Offset + 0x21 * sizeof(IDTDescEntry)); + int_Keyboard->SetOffset((uint64_t)KeyboardInterrupt_Handler); + int_Keyboard->type_attr = IDT_TA_InterruptGate; + int_Keyboard->selector = 0x08; // kernel code segment + // load idt asm("lidt %0" : : "m" (idtr)); + + // remap pic so we can get hardware interrupts + RemapPIC(); + outb(PIC1_DATA, 0b11111101); // unmask 2nd interrupt + outb(PIC2_DATA, 0b11111111); + + asm ("sti"); } BasicRenderer r = BasicRenderer(NULL, NULL);