79 lines
1.5 KiB
C++

#ifndef GDT_H
#define GDT_H
#include "types.h"
struct __attribute__((packed)) tss_struct {
uint16_t link;
uint16_t _reserved0;
uint32_t esp0;
uint16_t ss0;
uint16_t _reserved1;
uint32_t esp1;
uint16_t ss1;
uint16_t _reserved2;
uint32_t esp2;
uint16_t ss2;
uint16_t _reserved3;
uint32_t cr3;
uint32_t eip;
uint32_t eflags;
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
uint32_t esp;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
uint16_t es;
uint16_t _reserved4;
uint16_t cs;
uint16_t _reserved5;
uint16_t ss;
uint16_t _reserved6;
uint16_t ds;
uint16_t _reserved7;
uint16_t fs;
uint16_t _reserved8;
uint16_t gs;
uint16_t _reserved9;
uint16_t ldtr;
uint16_t _reserved10;
uint16_t _reserved11;
uint16_t iopb;
constexpr tss_struct();
};
struct __attribute__((packed)) gdt_entry {
uint32_t limit_lo : 16;
uint32_t base_lo : 16;
uint32_t base_mid : 8;
uint32_t accessed : 1;
uint32_t read_write : 1;
uint32_t direction : 1;
uint32_t executable : 1;
uint32_t system_segment : 1;
uint32_t privilege : 2;
uint32_t present : 1;
uint32_t limit_hi : 4;
uint32_t __ignored__ : 2;
uint32_t size : 1;
uint32_t granularity : 1;
uint32_t base_hi : 8;
constexpr gdt_entry(uint32_t limit, uint32_t base, bool rw, bool exec, bool system, uint8_t ring);
constexpr gdt_entry();
};
struct __attribute__((packed)) gdt_descr {
uint16_t size;
uint32_t offset;
};
void init_gdt();
#endif