Espresso 0.0.0e

This commit is contained in:
2025-06-13 18:03:39 -05:00
parent 6d366537dd
commit 1e5b4a765b
40 changed files with 742 additions and 718 deletions

View File

@ -1,34 +1,52 @@
#include <stdio.h>
#include <gdt.h>
#include <drivers/gdt_ec.h>
#define GDT_ENTRIES 5
uint64_t gdt[GDT_ENTRIES];
#define GDT_ENTRIES 3
struct {
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gp;
struct gdt_entry gdt[GDT_ENTRIES];
struct gdt_ptr gp;
extern void gdt_flush(uint32_t);
void gdt_install()
void gdt_install(bool prnt_gdt)
{
gp.limit = (sizeof(struct gdt_entry) * GDT_ENTRIES) - 1;
gp.base = (uint32_t)&gdt;
create_descriptor(0, 0, 0, 0, prnt_gdt); // Null
create_descriptor(1, 0, 0x000FFFFF, GDT_CODE_PL0, prnt_gdt); // Kernel code
create_descriptor(2, 0, 0x000FFFFF, GDT_DATA_PL0, prnt_gdt); // Kernel data
create_descriptor(3, 0, 0x000FFFFF, GDT_CODE_PL3, prnt_gdt); // User code
create_descriptor(4, 0, 0x000FFFFF, GDT_DATA_PL3, prnt_gdt); // User data
gdt_set_entry(0, 0, 0, 0, 0); /* Null segment */
gdt_set_entry(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); /* Code segment */
gdt_set_entry(2, 0, 0xFFFFFFFF, 0x92, 0xCF); /* Data segment */
gp.limit = sizeof(gdt) - 1;
gp.base = (uint32_t)&gdt;
gdt_flush((uint32_t)&gp);
}
void gdt_set_entry(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran)
void create_descriptor(int index, uint32_t base, uint32_t limit, uint16_t flag, bool prnt_gdt)
{
gdt[num].base_low = (base & 0xFFFF);
gdt[num].base_middle = (base >> 16) & 0xFF;
gdt[num].base_high = (base >> 24) & 0xFF;
uint64_t descriptor;
gdt[num].limit_low = (limit & 0xFFFF);
gdt[num].granularity = (limit >> 16) & 0x0F;
descriptor = limit & 0x000F0000; // limit bits 19:16
descriptor |= (flag << 8) & 0x00F0FF00; // flags and access
descriptor |= (base >> 16) & 0x000000FF; // base bits 23:16
descriptor |= base & 0xFF000000; // base bits 31:24
gdt[num].granularity |= (gran & 0xF0);
gdt[num].access = access;
descriptor <<= 32;
descriptor |= ((uint64_t)base << 16); // base bits 15:0
descriptor |= (limit & 0x0000FFFF); // limit bits 15:0
gdt[index] = descriptor;
if (prnt_gdt)
{
printf("GDT[%d] = 0x%llX\n", index, descriptor);
}
}