79 lines
1.5 KiB
C++
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 |