62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
/*
|
|
* gdt.hpp
|
|
* Intel Global Descriptor Table
|
|
* Copyright (c) 2025 Daniel Hammer
|
|
*/
|
|
|
|
#pragma once
|
|
#include <cstdint>
|
|
|
|
using namespace std;
|
|
|
|
namespace Hal {
|
|
class GDTEntry {
|
|
public:
|
|
uint16_t LimitLow;
|
|
uint16_t BaseLow;
|
|
uint8_t BaseMiddle;
|
|
uint8_t AccessByte;
|
|
uint8_t GranularityByte;
|
|
uint8_t BaseHigh;
|
|
}__attribute__((packed));
|
|
|
|
struct BasicGDT {
|
|
GDTEntry Null; // 0x00
|
|
GDTEntry KernelCode; // 0x08
|
|
GDTEntry KernelData; // 0x10
|
|
GDTEntry UserData; // 0x18 (before UserCode for SYSRET)
|
|
GDTEntry UserCode; // 0x20
|
|
GDTEntry TSS; // 0x28 (low 8 bytes of 16-byte TSS descriptor)
|
|
GDTEntry TSSHigh; // 0x30 (high 8 bytes of 16-byte TSS descriptor)
|
|
}__attribute__((packed));
|
|
|
|
struct GDTPointer {
|
|
uint16_t Size;
|
|
uint64_t GDTAddress;
|
|
}__attribute__((packed));
|
|
|
|
struct TSS64 {
|
|
uint32_t reserved0;
|
|
uint64_t rsp0;
|
|
uint64_t rsp1;
|
|
uint64_t rsp2;
|
|
uint64_t reserved1;
|
|
uint64_t ist1;
|
|
uint64_t ist2;
|
|
uint64_t ist3;
|
|
uint64_t ist4;
|
|
uint64_t ist5;
|
|
uint64_t ist6;
|
|
uint64_t ist7;
|
|
uint64_t reserved2;
|
|
uint16_t reserved3;
|
|
uint16_t iopbOffset;
|
|
}__attribute__((packed));
|
|
|
|
extern TSS64 g_tss;
|
|
|
|
void BridgeLoadGDT();
|
|
void PrepareGDT();
|
|
void LoadTSS();
|
|
};
|