diff --git a/targets/_any/SConscript b/targets/_any/SConscript index 914ecc2..7439416 100644 --- a/targets/_any/SConscript +++ b/targets/_any/SConscript @@ -33,6 +33,10 @@ extern const unsigned {symbol}_SIZE; env.Command([f'{res}.s', f'{res}.hpp'.replace('src/', 'include/')], res, action = _generate_s) env.AddMethod(_resource, 'Resource') +irs_sources = Split(''' + src/drivers/pic.cpp + src/drivers/ps2.cpp +''') any_target_sources = Split(''' src/app/main.cpp @@ -51,5 +55,6 @@ any_target_sources = Split(''' env.Resource(env.File('src/os/resources/lat9-08.psf').abspath, 'LAT9_08') env.Append(KERNEL_SOURCES = [env.File(f) for f in any_target_sources]) +env.Append(KERNEL_ISR_SOURCES = [env.File(f) for f in irs_sources]) Return('env') \ No newline at end of file diff --git a/targets/x86_64/src/kernel/pic.hpp b/targets/_any/include/drivers/pic.hpp similarity index 97% rename from targets/x86_64/src/kernel/pic.hpp rename to targets/_any/include/drivers/pic.hpp index 6c7d045..51def0f 100644 --- a/targets/x86_64/src/kernel/pic.hpp +++ b/targets/_any/include/drivers/pic.hpp @@ -25,6 +25,7 @@ void unmaskIRQ(std::uint8_t irq) noexcept; return (offset & 7) == 0; } +#if defined(__x86_64__) struct InterruptFrame { std::uint64_t ip; @@ -33,6 +34,7 @@ struct InterruptFrame std::uint64_t sp; std::uint64_t ss; }; +#endif using interrupt_handler_t = __attribute__((interrupt)) void(*)(InterruptFrame*); diff --git a/targets/x86_64/src/kernel/keyboard.hpp b/targets/_any/include/drivers/ps2.hpp similarity index 89% rename from targets/x86_64/src/kernel/keyboard.hpp rename to targets/_any/include/drivers/ps2.hpp index 577890e..e9a957e 100644 --- a/targets/x86_64/src/kernel/keyboard.hpp +++ b/targets/_any/include/drivers/ps2.hpp @@ -1,18 +1,13 @@ #pragma once -#if !defined(BAD_APPLE_OS_KERNEL_KEYBOARD_HPP_INCLUDED) -#define BAD_APPLE_OS_KERNEL_KEYBOARD_HPP_INCLUDED +#if !defined(BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED) +#define BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED -#include "./pic.hpp" +#include "drivers/pic.hpp" -namespace kbd +namespace baos::ps2 { -[[nodiscard]] bool initialize() noexcept; - -__attribute__((interrupt)) -void isrKeyboard(InterruptFrame* interruptFrame) noexcept; - enum class Scancode { INVALID = 0, @@ -152,10 +147,13 @@ struct KeyEvent bool repeat : 1 = false; }; -[[nodiscard]] bool readRaw(std::uint8_t& outData) noexcept; -[[nodiscard]] bool read(KeyEvent& outEvent) noexcept; +[[nodiscard]] bool initialize() noexcept; +__attribute__((interrupt)) +void isrKeyboard(InterruptFrame* interruptFrame) noexcept; + +[[nodiscard]] bool readKey(KeyEvent& outEvent) noexcept; [[nodiscard]] const char* keyName(Scancode scancode) noexcept; } -#endif // !defined(BAD_APPLE_OS_KERNEL_KEYBOARD_HPP_INCLUDED) +#endif // !defined(BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED) diff --git a/targets/x86_64/src/kernel/pic.cpp b/targets/_any/src/drivers/pic.cpp similarity index 99% rename from targets/x86_64/src/kernel/pic.cpp rename to targets/_any/src/drivers/pic.cpp index c9403d5..f53142c 100644 --- a/targets/x86_64/src/kernel/pic.cpp +++ b/targets/_any/src/drivers/pic.cpp @@ -1,5 +1,5 @@ -#include "./pic.hpp" +#include "drivers/pic.hpp" namespace { diff --git a/targets/x86_64/src/kernel/keyboard.cpp b/targets/_any/src/drivers/ps2.cpp similarity index 98% rename from targets/x86_64/src/kernel/keyboard.cpp rename to targets/_any/src/drivers/ps2.cpp index bb1a088..3079f8e 100644 --- a/targets/x86_64/src/kernel/keyboard.cpp +++ b/targets/_any/src/drivers/ps2.cpp @@ -1,5 +1,9 @@ -#include "./keyboard.hpp" +#include "drivers/ps2.hpp" + +#include +#include "drivers/pic.hpp" +#include "os/port.hpp" namespace { @@ -46,7 +50,7 @@ void pushKey(std::uint8_t data) noexcept } } -namespace kbd +namespace baos::ps2 { inline bool waitForResponse(unsigned tries = -1) noexcept { @@ -221,7 +225,7 @@ bool gNextIsMoreExtended = false; bool gNextIsExtendedest = false; bool gPrevWasExtendedest = false; -[[nodiscard]] bool read(KeyEvent& outEvent) noexcept +bool readKey(KeyEvent& outEvent) noexcept { if (gPrevWasExtendedest) { @@ -300,7 +304,7 @@ bool gPrevWasExtendedest = false; return true; } -[[nodiscard]] const char* keyName(Scancode scancode) noexcept +const char* keyName(Scancode scancode) noexcept { switch (scancode) { diff --git a/targets/x86_64/SConscript b/targets/x86_64/SConscript index 1e3a82c..f3b02c8 100644 --- a/targets/x86_64/SConscript +++ b/targets/x86_64/SConscript @@ -25,18 +25,17 @@ crtbegin_o = get_crt_object('crtbegin.o') crtend_o = get_crt_object('crtend.o') crti_o = kernel_env.Object('src/crt/crti.s') crtn_o = kernel_env.Object('src/crt/crtn.s') -kernel_env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0].abspath} {crtbegin_o} $_LIBFLAGS -lgcc {crtend_o} {crtn_o[0].abspath}') +kernel_env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0].abspath} {crtbegin_o} -Wl,--start-group $_LIBFLAGS -Wl,--end-group -lgcc {crtend_o} {crtn_o[0].abspath}') + +kernel_isr_sources = env['KERNEL_ISR_SOURCES'] + Split(''' -kernel_irs_sources = Split(''' - src/kernel/keyboard.cpp - src/kernel/pic.cpp ''') kernel_sources = env['KERNEL_SOURCES'] + Split(''' src/cstdlib/memory.s src/kernel/boot.s src/kernel/startup.cpp -''') + [kernel_env.Object(f, CCFLAGS = kernel_env['CCFLAGS'] + ['-mgeneral-regs-only']) for f in kernel_irs_sources] +''') + [kernel_env.Object(f, CCFLAGS = kernel_env['CCFLAGS'] + ['-mgeneral-regs-only']) for f in kernel_isr_sources] kernel_target = kernel_env.File('#kernel.x86_64.bin') prog_kernel = kernel_env.Program( diff --git a/targets/x86_64/src/kernel/startup.cpp b/targets/x86_64/src/kernel/startup.cpp index b276110..adaa569 100644 --- a/targets/x86_64/src/kernel/startup.cpp +++ b/targets/x86_64/src/kernel/startup.cpp @@ -7,8 +7,8 @@ #include "os/draw.hpp" #include "os/serial.hpp" #include "os/tty.hpp" -#include "./keyboard.hpp" -#include "./pic.hpp" +#include "drivers/pic.hpp" +#include "drivers/ps2.hpp" #include "./x86_64.hpp" extern "C" int gKernelEnd; @@ -143,7 +143,9 @@ extern void __isr21(InterruptFrame*); void kernel_main() { - setupInterrupt(INTERRUPT_KEYBOARD, &kbd::isrKeyboard, 0); + using namespace baos; + + setupInterrupt(INTERRUPT_KEYBOARD, &ps2::isrKeyboard, 0); __setGDT(sizeof(GDT), &GDT); __setIDT(sizeof(IDT), &IDT); @@ -153,7 +155,7 @@ void kernel_main() unmaskIRQ(1); // initialize the hardware - const bool kbdInited = kbd::initialize(); + const bool ps2Inited = ps2::initialize(); // done initializing OS stuff, enable interrupts __asm__ __volatile__("sti"); @@ -187,20 +189,20 @@ void kernel_main() return; } - if (!kbdInited) + if (!ps2Inited) { - std::puts("Error initializing the keyboard!\n"); + std::puts("Error initializing the PS2 controller!!\n"); return; } std::puts("This is BadAppleOS and everything is fine!\n"); while (true) { - kbd::KeyEvent event; - while (!kbd::read(event)); + ps2::KeyEvent event; + while (!ps2::readKey(event)); std::printf( "Key event: scancode=%s(0x%X), down=%s, repeat=%s\n", - kbd::keyName(event.scancode), + ps2::keyName(event.scancode), static_cast(event.scancode), event.down ? "true" : "false", event.repeat ? "true" : "false"