From 0b77abfc236928c4c22cdf25634c3943a0dccd29 Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Wed, 16 Apr 2025 18:54:48 +0200 Subject: [PATCH] feat(io): IoPort --- kernel/src/CppLib/Alloc.cpp | 10 +++++++++ kernel/src/Io/IoPort.hpp | 41 +++++++++++++++++++++++++++++++++++++ kernel/src/Main.cpp | 7 +------ 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 kernel/src/Io/IoPort.hpp diff --git a/kernel/src/CppLib/Alloc.cpp b/kernel/src/CppLib/Alloc.cpp index 164d638..abbc8c7 100644 --- a/kernel/src/CppLib/Alloc.cpp +++ b/kernel/src/CppLib/Alloc.cpp @@ -12,11 +12,21 @@ void* operator new(std::size_t size) return Memory::g_heap->Request(size); } +void* operator new[](std::size_t size) +{ + return Memory::g_heap->Request(size); +} + void operator delete(void* block) { Memory::g_heap->Free(block); } +void operator delete[](void* block) +{ + delete block; +} + void operator delete(void* block, long unsigned int) { Memory::g_heap->Free(block); diff --git a/kernel/src/Io/IoPort.hpp b/kernel/src/Io/IoPort.hpp new file mode 100644 index 0000000..3170784 --- /dev/null +++ b/kernel/src/Io/IoPort.hpp @@ -0,0 +1,41 @@ +/* + * PortIo.hpp + * Inline Intel port IO functions + * Copyright (c) 2025 Daniel Hammer +*/ + +#pragma once +#include + +namespace Io { + // OSDev website has the parameters for out(b/w/l) in the opposite order in their example, + // (port, then value), but the manpage on GNU ('man outb') has it in this order. + + inline void Out8(uint8_t value, uint16_t port) { + asm ("outb %0, %1" : : "a"(value), "Nd"(port) : "memory"); + } + + inline void Out16(uint16_t value, uint16_t port) { + asm ("outw %0, %1" : : "a"(value), "Nd"(port) : "memory"); + } + + inline void Out32(uint32_t value, uint16_t port) { + asm ("outl %0, %1" : : "a"(value), "Nd"(port) : "memory"); + } + + inline uint8_t In8(uint16_t port) { + asm ("inb %0" : : "Nd"(port) : "memory"); + } + + inline uint16_t In16(uint16_t port) { + asm ("inw %0" : : "Nd"(port) : "memory"); + } + + inline uint32_t In32(uint16_t port) { + asm ("inl %0" : : "Nd"(port) : "memory"); + } + + inline void IoPortWait() { + Out8(0x80, 0); + } +}; \ No newline at end of file diff --git a/kernel/src/Main.cpp b/kernel/src/Main.cpp index ee89697..efddf84 100644 --- a/kernel/src/Main.cpp +++ b/kernel/src/Main.cpp @@ -7,7 +7,6 @@ #include #include #include - #include #include #include @@ -16,20 +15,16 @@ #include #include #include - #include #include #include - #include #include - #include - #include - #include #include +#include using namespace Kt;