summaryrefslogtreecommitdiffhomepage
path: root/Private/HALKit
diff options
context:
space:
mode:
Diffstat (limited to 'Private/HALKit')
-rw-r--r--Private/HALKit/AMD64/HalDescriptorLoader.cpp34
-rw-r--r--Private/HALKit/AMD64/HalInterruptRouting.asm43
-rw-r--r--Private/HALKit/AMD64/HalKernelMain.cxx11
-rw-r--r--Private/HALKit/AMD64/HalKernelMouse.cxx43
-rw-r--r--Private/HALKit/AMD64/Processor.hpp3
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