k-tana-zero/k/gdt.h

53 lines
1.0 KiB
C

#ifndef GDT_H
#define GDT_H
#include <stdint.h>
#define GDT_NB_ENTRIES 3
#define GDT_SIZE (GDT_NB_ENTRIES * sizeof(struct gdt_entry))
#define KERNEL_CS_INDEX 1
#define KERNEL_DS_INDEX 2
struct gdt_entry
{
uint16_t limit_1 : 16;
uint16_t base_1 : 16;
uint8_t base_2 : 8;
uint8_t accessed : 1;
uint8_t rw : 1;
uint8_t dc : 1;
uint8_t ex : 1;
uint8_t desc_type : 1;
uint8_t desc_priv : 2;
uint8_t present : 1;
uint8_t limit_2 : 4;
uint8_t available : 1;
uint8_t l : 1;
uint8_t db : 1;
uint8_t granularity : 1;
uint8_t base_3 : 8;
} __attribute__ ((packed));
struct gdt
{
struct gdt_entry entries[GDT_NB_ENTRIES];
};
struct gdt_r
{
uint16_t limit;
uint32_t addr;
} __attribute__ ((packed));
struct segment_selector
{
uint8_t rpl : 2;
uint8_t table_indicator : 1;
uint16_t index : 13;
} __attribute__ ((packed));
void init_gdt();
#endif /* !GDT_H */