summaryrefslogtreecommitdiffstats
path: root/arch/x86/idt/Idt.h
diff options
context:
space:
mode:
authorAlexey Gavrilov <90127298+rebovas@users.noreply.github.com>2024-03-31 14:40:50 +0700
committerGitHub <noreply@github.com>2024-03-31 14:40:50 +0700
commit18b4f9d1bff908fd91a48c1953ebcb8363855a59 (patch)
treed309b630a161823c79dab9a48f67a41a40d76b24 /arch/x86/idt/Idt.h
parenta276644952ed018e77ca64181059434a6bc4ee62 (diff)
parent49cfee4e370892df8404e56d53b04dde196f82f2 (diff)
Merge pull request #6 from rebovas/idt
IDT + uintptr update
Diffstat (limited to 'arch/x86/idt/Idt.h')
-rw-r--r--arch/x86/idt/Idt.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/x86/idt/Idt.h b/arch/x86/idt/Idt.h
new file mode 100644
index 0000000..c90b674
--- /dev/null
+++ b/arch/x86/idt/Idt.h
@@ -0,0 +1,63 @@
+#ifndef IDT_H
+#define IDT_H
+
+
+#include "../gdt/Gdt.h"
+#include <MemoryOperations.h>
+
+// Defines
+
+// Attributes
+#define TSK_GATE 0x5
+#define INT_GATE_16 0x6
+#define TRAP_GATE_16 0x7
+#define INT_GATE_32 0xe
+#define TRAP_GATE_32 0xf
+#define PRESENT_BIT 0x80
+#define RING_KERN 0
+#define RING_DRIVERSH 0x20
+#define RING_DRIVERSL 0x40
+#define RING_APP 0x60
+
+//--------
+
+class DescInterrupt32
+{
+ private:
+ uint16 offsetLow;
+ uint16 segmentSelector;
+ uint8 attributes;
+ uint16 offsetHight;
+ public:
+ DescInterrupt32() = default;
+ DescInterrupt32(const DescInterrupt32 &) = default;
+ DescInterrupt32(uint32 offset, uint16 selector, uint8 attr);
+ uint64 getDescriptor();
+ static DescInterrupt32 InterruptKernelLong(uint32 offset,
+ uint16 selector);
+ static DescInterrupt32 TrapKernelLong(uint32 offset,
+ uint16 selector);
+ static DescInterrupt32 TaskKernel(uint16 selector);
+};
+
+class MngIdt
+{
+ private:
+ const static uint8 size = 255;
+ static uint64 idt[size];
+ static bool isInitialize;
+ static bool idtLoaded;
+ uint8 currIdx;
+ public:
+ MngIdt();
+ MngIdt(const MngIdt &) = delete;
+ bool addDescriptor(DescInterrupt32 desc);
+ bool setDescriptor(DescInterrupt32 desc, uint8 idx);
+ bool canDescriptorWrite(uint8 idx);
+ bool loadIdt();
+ static MngIdt &getInstance();
+};
+
+extern MngIdt mngIdt;
+
+#endif