diff options
Diffstat (limited to 'Private/HALKit')
| -rw-r--r-- | Private/HALKit/AMD64/HalDescriptorLoader.cpp | 34 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalInterruptRouting.asm | 43 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalKernelMain.cxx | 11 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalKernelMouse.cxx | 43 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/Processor.hpp | 3 |
5 files changed, 61 insertions, 73 deletions
diff --git a/Private/HALKit/AMD64/HalDescriptorLoader.cpp b/Private/HALKit/AMD64/HalDescriptorLoader.cpp index a5f445e5..df6caf7a 100644 --- a/Private/HALKit/AMD64/HalDescriptorLoader.cpp +++ b/Private/HALKit/AMD64/HalDescriptorLoader.cpp @@ -15,35 +15,21 @@ STATIC ::HCore::Detail::AMD64::InterruptDescriptorAMD64 kInterruptVectorTable[kKernelIdtSize]; STATIC Void RemapPIC(Void) noexcept { - UInt8 a1, a2; - - a1 = HAL::In8(0x21); // save masks - a2 = HAL::In8(0xA1); - // Remap PIC. HAL::Out8(0x20, 0x10 | 0x01); - HAL::rt_wait_400ns(); HAL::Out8(0xA0, 0x10 | 0x01); - HAL::rt_wait_400ns(); - - HAL::Out8(0x21, 0x28); - HAL::rt_wait_400ns(); - HAL::Out8(0xA1, 0x30); - HAL::rt_wait_400ns(); + HAL::Out8(0x21, 32); + HAL::Out8(0xA1, 40); - HAL::Out8(0x21, 0x04); - HAL::rt_wait_400ns(); - HAL::Out8(0xA1, 0x02); + HAL::Out8(0x21, 4); + HAL::Out8(0xA1, 2); - HAL::rt_wait_400ns(); HAL::Out8(0x21, 0x01); - HAL::rt_wait_400ns(); HAL::Out8(0xA1, 0x01); - HAL::rt_wait_400ns(); - HAL::Out8(0x21, a1); - HAL::rt_wait_400ns(); - HAL::Out8(0xA1, a2); + + HAL::Out8(0x21, 0x00); + HAL::Out8(0xA1, 0x00); } } // namespace Detail @@ -64,7 +50,9 @@ Void IDTLoader::Load(Register64 &idt) { MUST_PASS(baseIdt); - for (UInt16 i = 0; i < kKernelIdtSize; i++) { + Detail::RemapPIC(); + + for (UInt16 i = 0; i < kKernelIdtSize; ++i) { MUST_PASS(baseIdt[i]); Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector; @@ -82,8 +70,6 @@ Void IDTLoader::Load(Register64 &idt) { (kKernelIdtSize - 1); hal_load_idt(Detail::kRegIdt); - - Detail::RemapPIC(); } void GDTLoader::Load(Ref<RegisterGDT> &gdt) { GDTLoader::Load(gdt.Leak()); } diff --git a/Private/HALKit/AMD64/HalInterruptRouting.asm b/Private/HALKit/AMD64/HalInterruptRouting.asm index 384f775c..05f14e36 100644 --- a/Private/HALKit/AMD64/HalInterruptRouting.asm +++ b/Private/HALKit/AMD64/HalInterruptRouting.asm @@ -104,21 +104,17 @@ IntNormal 29 IntExp 30 IntNormal 31 -IntNormal 32 - -__HCR_INT_33: - cli +;; Mapped according to PIC remap. +__HCR_INT_32: push rax - mov rcx, kSystemCallLabel - call ke_io_print + call _hal_mouse_handler pop rax - - sti iretq +IntNormal 33 IntNormal 34 IntNormal 35 IntNormal 36 @@ -128,29 +124,30 @@ IntNormal 39 IntNormal 40 IntNormal 41 IntNormal 42 + IntNormal 43 -;; Mapped according to PIC remap. -__HCR_INT_44: +IntNormal 44 + +IntNormal 45 +IntNormal 46 +IntNormal 47 +IntNormal 48 +IntNormal 49 + +__HCR_INT_50: cli push rax - call _hal_mouse_handler + mov rcx, kSystemCallLabel + call ke_io_print pop rax sti iretq - -IntNormal 45 - -IntNormal 46 -IntNormal 47 -IntNormal 48 -IntNormal 49 -IntNormal 50 IntNormal 51 IntNormal 52 IntNormal 53 @@ -171,10 +168,10 @@ IntNormal 60 ;; this one is doing a POST for us. ;; testing interrupts. _ke_power_on_self_test: - int 0x21 - int 0x21 - int 0x21 - int 0x21 + int 50 + int 50 + int 50 + int 50 ret diff --git a/Private/HALKit/AMD64/HalKernelMain.cxx b/Private/HALKit/AMD64/HalKernelMain.cxx index c2b6dfbb..e78be6ec 100644 --- a/Private/HALKit/AMD64/HalKernelMain.cxx +++ b/Private/HALKit/AMD64/HalKernelMain.cxx @@ -8,19 +8,20 @@ #include <FirmwareKit/Handover.hxx> #include <KernelKit/FileManager.hpp> #include <KernelKit/Framebuffer.hpp> +#include <KernelKit/KernelHeap.hpp> #include <KernelKit/PEFCodeManager.hxx> #include <KernelKit/ProcessScheduler.hpp> #include <KernelKit/Rsrc/Splash.rsrc> #include <KernelKit/Rsrc/Util.hxx> -#include <NewKit/Json.hpp> -#include <KernelKit/KernelHeap.hpp> #include <KernelKit/UserHeap.hpp> +#include <NewKit/Json.hpp> ///! @brief Disk contains HCore files. #define kInstalledMedia 0xDD -EXTERN_C HCore::Void _hal_draw_mouse(); EXTERN_C HCore::Void _hal_init_mouse(); +EXTERN_C HCore::Void _hal_draw_mouse(); +EXTERN_C HCore::Void _hal_mouse_handler(); EXTERN_C HCore::VoidPtr kInterruptVectorTable[]; @@ -30,7 +31,9 @@ EXTERN_C void RuntimeMain( /// Setup kernel globals. kKernelVirtualSize = HandoverHeader->f_VirtualSize; - kKernelVirtualStart = (HandoverHeader->f_VirtualStart + kVirtualAddressStartOffset); + kKernelVirtualStart = + reinterpret_cast<HCore::VoidPtr>(reinterpret_cast<HCore::UIntPtr>( + HandoverHeader->f_VirtualStart) + kVirtualAddressStartOffset); kKernelPhysicalSize = HandoverHeader->f_PhysicalSize; kKernelPhysicalStart = HandoverHeader->f_PhysicalStart; diff --git a/Private/HALKit/AMD64/HalKernelMouse.cxx b/Private/HALKit/AMD64/HalKernelMouse.cxx index b71c00ed..cafebc9e 100644 --- a/Private/HALKit/AMD64/HalKernelMouse.cxx +++ b/Private/HALKit/AMD64/HalKernelMouse.cxx @@ -10,6 +10,12 @@ #include <KernelKit/Rsrc/Util.hxx> #include <NewKit/Defines.hpp> +// forward decl. +EXTERN_C HCore::Void _hal_draw_mouse(); +EXTERN_C HCore::Void _hal_init_mouse(); + +EXTERN_C void ke_io_print(const char* bytes); + STATIC HCore::Int32 kPrevX = 0; STATIC HCore::Int32 kPrevY = 0; STATIC HCore::Int32 kX = 0; @@ -30,10 +36,8 @@ STATIC HCore::Boolean kMousePacketReady = false; using namespace HCore; -/// @brief Interrupt handler for the mouse. -/// @return -EXTERN_C Void _hal_mouse_handler() { - HCore::UInt8 data = HCore::HAL::In8(0x60); +Void hal_handle_mouse() { + HCore::UInt8 data = HAL::In8(0x60); switch (kMouseCycle) { case 0: { @@ -57,7 +61,7 @@ EXTERN_C Void _hal_mouse_handler() { if (kMousePacketReady) break; kMousePacket[2] = data; - ++kMouseCycle; + kMousePacketReady = true; kMouseCycle = 0; @@ -69,12 +73,14 @@ EXTERN_C Void _hal_mouse_handler() { // Notify PIC controller that we're done with it's interrupt. - HCore::HAL::Out8(0x20, 0x20); HCore::HAL::Out8(0xA0, 0x20); + HCore::HAL::Out8(0x20, 0x20); } +/// @brief Interrupt handler for the mouse. +EXTERN_C Void _hal_mouse_handler() { hal_handle_mouse(); } + /// @brief Draws the kernel's mouse. -/// @return void EXTERN_C Void _hal_draw_mouse() { if (!kMousePacketReady) return; @@ -86,23 +92,16 @@ EXTERN_C Void _hal_draw_mouse() { xOvf = (kMousePacket[0] & kPS2XOverflow); yOvf = (kMousePacket[0] & kPS2YOverflow); - kX += xNeg ? (256 - kMousePacket[1]) : (256 - (-kMousePacket[1])); - kY += yNeg ? (256 - kMousePacket[2]) : (256 - (-kMousePacket[2])); - ; - - if (xOvf) { - kX += xNeg ? 255 : -255; - } - - if (yOvf) { - kY += yNeg ? 255 : -255; - } + kX = !xNeg ? (256 + kMousePacket[1]) : (256 - (-kMousePacket[1])); + kY = !yNeg ? (256 + kMousePacket[2]) : (256 - (-kMousePacket[2])); if (kY > kHandoverHeader->f_GOP.f_Height) { + kY = 0; return; } if (kX > kHandoverHeader->f_GOP.f_Width) { + kX = 0; return; } @@ -112,11 +111,13 @@ EXTERN_C Void _hal_draw_mouse() { KeDrawRsrc(Pointer, POINTER_HEIGHT, POINTER_WIDTH, kX, kY); KeClearRsrc(); - kPrevX = kMousePacket[1]; - kPrevY = kMousePacket[2]; + kPrevX = kX; + kPrevY = kY; kMousePacketReady = false; } /// @brief Init kernel mouse. -EXTERN_C Void _hal_init_mouse() { kMousePS2.Init(); }
\ No newline at end of file +EXTERN_C Void _hal_init_mouse() { + kMousePS2.Init(); +}
\ No newline at end of file diff --git a/Private/HALKit/AMD64/Processor.hpp b/Private/HALKit/AMD64/Processor.hpp index 2c4a1c67..bbda5edc 100644 --- a/Private/HALKit/AMD64/Processor.hpp +++ b/Private/HALKit/AMD64/Processor.hpp @@ -30,6 +30,7 @@ #define kTrapGate 0xEF #define kTaskGate 0b10001100 #define kGdtCodeSelector 0x08 +#define kVirtualAddressStartOffset 0x100 namespace HCore { namespace Detail::AMD64 { @@ -182,4 +183,4 @@ EXTERN_C void hal_load_gdt(HCore::HAL::RegisterGDT ptr); /// @brief Maximum size of the IDT. #define kKernelIdtSize 0x100 -#define kKernelInterruptId 0x21 +#define kKernelInterruptId 50 |
