diff options
| author | Alexey Gavrilov <90127298+rebovas@users.noreply.github.com> | 2024-03-31 14:40:50 +0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-31 14:40:50 +0700 |
| commit | 18b4f9d1bff908fd91a48c1953ebcb8363855a59 (patch) | |
| tree | d309b630a161823c79dab9a48f67a41a40d76b24 /arch/x86/idt/Idt.h | |
| parent | a276644952ed018e77ca64181059434a6bc4ee62 (diff) | |
| parent | 49cfee4e370892df8404e56d53b04dde196f82f2 (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.h | 63 |
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 |
