fixing GDT

This commit is contained in:
brenozd
2024-11-03 19:34:35 -03:00
parent 16bf9bfa91
commit e6db640d7d
4 changed files with 58 additions and 52 deletions

View File

@@ -3,10 +3,10 @@ cmake_policy(VERSION 3.30)
project(appa-os LANGUAGES C ASM)
enable_language(ASM-ATT)
set(CMAKE_C_STANDARD 99)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
enable_language(ASM-ATT)
option(BUILD_DOCS "Build documentation" ON)
if(BUILD_DOCS)

View File

@@ -2,9 +2,9 @@
#include <stdio.h>
#include <stdlib.h>
#define GDT_SIZE 5
#define GDT_ENTRY_SIZE 5
static gdt_segment_descriptor_t gdt_descriptors[GDT_SIZE];
static gdt_segment_descriptor_t gdt_descriptors[GDT_ENTRY_SIZE];
static gdt_entry_t gdt;
// https://forum.osdev.org/viewtopic.php?t=37245
@@ -24,40 +24,38 @@ void gdt_flush() {
"movw %%ax, %%fs \n\t"
"movw %%ax, %%gs \n\t"
"movw %%ax, %%ss \n\t"
"ljmp $0x08,$boing%=\n\t"
"boing%=:"
"ljmp $0x0008,$.gdt_flush_end%=\n\t"
".gdt_flush_end%=:"
:
: "r"(ptr)
: "eax");
// asm volatile("lgdtl %0 \n\t"
// "ljmp $0x08,$.L%= \n\t"
// ".L%=: \n\t"
// "mov %1, %%ds \n\t"
// "mov %1, %%es \n\t"
// "mov %1, %%fs \n\t"
// "mov %1, %%gs \n\t"
// "mov %1, %%ss \n\t" ::"m"(gdt),
// "r"(0x10));
}
void gdt_init() {
// This is setting up 4 large seguments overlapped to use paging
// https://stackoverflow.com/a/23979175
gdt.limit = sizeof(gdt_segment_descriptor_t) * GDT_SIZE - 1;
gdt.base = (uint32_t)&gdt_descriptors;
gdt.limit = (sizeof(struct gdt_segment_descriptor) * GDT_ENTRY_SIZE) - 1;
gdt.base = (uint32_t)gdt_descriptors;
// Null Segment
gdt_descriptors[0] = gdt_create_segment_descriptor(0, 0, 0, 0);
// Kernel Mode Code Segment with 4 megabytes
gdt_descriptors[1] = gdt_create_segment_descriptor(0, 0xFFFFFFFF, (uint8_t)(SEG_GRAN(1) | SEG_SIZE(1)),
SEG_PRES(1) | SEG_PRIV(0) | SEG_DESCTYPE(1) | SEG_CODE_EXRD);
gdt_descriptors[2] = gdt_create_segment_descriptor(0, 0xFFFFFFFF, (uint8_t)(SEG_GRAN(1) | SEG_SIZE(1)),
SEG_PRES(1) | SEG_PRIV(0) | SEG_DESCTYPE(1) | SEG_DATA_RDWR);
gdt_descriptors[3] = gdt_create_segment_descriptor(0, 0xFFFFFFFF, (uint8_t)(SEG_GRAN(1) | SEG_SIZE(1)),
SEG_PRES(1) | SEG_PRIV(3) | SEG_DESCTYPE(1) | SEG_CODE_EXRD);
gdt_descriptors[4] = gdt_create_segment_descriptor(0, 0xFFFFFFFF, (uint8_t)(SEG_GRAN(1) | SEG_SIZE(1)),
SEG_PRES(1) | SEG_PRIV(3) | SEG_DESCTYPE(1) | SEG_DATA_RDWR);
gdt_descriptors[1] =
gdt_create_segment_descriptor(0, 0xFFFFFFFF, (GDT_FLAG_GRANULARITY(1) | GDT_FLAG_SIZE(1)) << 4,
GDT_ACCESS_PRESENT(1) | GDT_ACCESS_PRIVILEGE(0) | GDT_ACCESS_DESCRIPTOR_TYPE(1) | GDT_CODE_EXRD);
gdt_descriptors[2] =
gdt_create_segment_descriptor(0, 0xFFFFFFFF, (GDT_FLAG_GRANULARITY(1) | GDT_FLAG_SIZE(1)) << 4,
GDT_ACCESS_PRESENT(1) | GDT_ACCESS_PRIVILEGE(0) | GDT_ACCESS_DESCRIPTOR_TYPE(1) | GDT_DATA_RDWR);
gdt_descriptors[3] =
gdt_create_segment_descriptor(0, 0xFFFFFFFF, (GDT_FLAG_GRANULARITY(1) | GDT_FLAG_SIZE(1)) << 4,
GDT_ACCESS_PRESENT(1) | GDT_ACCESS_PRIVILEGE(3) | GDT_ACCESS_DESCRIPTOR_TYPE(1) | GDT_CODE_EXRD);
gdt_descriptors[4] =
gdt_create_segment_descriptor(0, 0xFFFFFFFF, (GDT_FLAG_GRANULARITY(1) | GDT_FLAG_SIZE(1)) << 4,
GDT_ACCESS_PRESENT(1) | GDT_ACCESS_PRIVILEGE(3) | GDT_ACCESS_DESCRIPTOR_TYPE(1) | GDT_DATA_RDWR);
// TODO: add Task State Segment
// Load and flush the GDT
gdt_flush();

View File

@@ -9,32 +9,40 @@
// Refer to the intel documentation for a description of what each one does.
// Descriptor type (0 for system, 1 for code/data)
#define SEG_DESCTYPE(x) ((x) << 0x04)
#define SEG_PRES(x) ((x) << 0x07) // Present
#define SEG_SAVL(x) ((x) << 0x0C) // Available for system use
#define SEG_LONG(x) ((x) << 0x0D) // Long mode
// Size (0 for 16-bit, 1 for 32)
#define SEG_SIZE(x) ((x) << 0x0E)
// Granularity (0 for 1B - 1MB, 1 for 4KB - 4GB)
#define SEG_GRAN(x) ((x) << 0x0F)
#define SEG_PRIV(x) (((x) & 0x03) << 0x05) // Set privilege level (0 - 3)
#define GDT_ACCESS_DESCRIPTOR_TYPE(x) ((x) << 0x04)
#define SEG_DATA_RD 0x00 // Read-Only
#define SEG_DATA_RDA 0x01 // Read-Only, accessed
#define SEG_DATA_RDWR 0x02 // Read/Write
#define SEG_DATA_RDWRA 0x03 // Read/Write, accessed
#define SEG_DATA_RDEXPD 0x04 // Read-Only, expand-down
#define SEG_DATA_RDEXPDA 0x05 // Read-Only, expand-down, accessed
#define SEG_DATA_RDWREXPD 0x06 // Read/Write, expand-down
#define SEG_DATA_RDWREXPDA 0x07 // Read/Write, expand-down, accessed
#define SEG_CODE_EX 0x08 // Execute-Only
#define SEG_CODE_EXA 0x09 // Execute-Only, accessed
#define SEG_CODE_EXRD 0x0A // Execute/Read
#define SEG_CODE_EXRDA 0x0B // Execute/Read, accessed
#define SEG_CODE_EXC 0x0C // Execute-Only, conforming
#define SEG_CODE_EXCA 0x0D // Execute-Only, conforming, accessed
#define SEG_CODE_EXRDC 0x0E // Execute/Read, conforming
#define SEG_CODE_EXRDCA 0x0F // Execute/Read, conforming, accessed
// Present
#define GDT_ACCESS_PRESENT(x) ((x) << 0x07)
// Set privilege level (0 - 3)
#define GDT_ACCESS_PRIVILEGE(x) (((x) & 0x03) << 0x05)
// Long mode
#define GDT_FLAG_LONG_MODE(x) ((x) << 0x01)
// Size (0 for 16-bit, 1 for 32)
#define GDT_FLAG_SIZE(x) ((x) << 0x02)
// Granularity (0 for 1B - 1MB, 1 for 4KB - 4GB)
#define GDT_FLAG_GRANULARITY(x) ((x) << 0x03)
#define GDT_DATA_RD 0x00 // Read-Only
#define GDT_DATA_RDA 0x01 // Read-Only, accessed
#define GDT_DATA_RDWR 0x02 // Read/Write
#define GDT_DATA_RDWRA 0x03 // Read/Write, accessed
#define GDT_DATA_RDEXPD 0x04 // Read-Only, expand-down
#define GDT_DATA_RDEXPDA 0x05 // Read-Only, expand-down, accessed
#define GDT_DATA_RDWREXPD 0x06 // Read/Write, expand-down
#define GDT_DATA_RDWREXPDA 0x07 // Read/Write, expand-down, accessed
#define GDT_CODE_EX 0x08 // Execute-Only
#define GDT_CODE_EXA 0x09 // Execute-Only, accessed
#define GDT_CODE_EXRD 0x0A // Execute/Read
#define GDT_CODE_EXRDA 0x0B // Execute/Read, accessed
#define GDT_CODE_EXC 0x0C // Execute-Only, conforming
#define GDT_CODE_EXCA 0x0D // Execute-Only, conforming, accessed
#define GDT_CODE_EXRDC 0x0E // Execute/Read, conforming
#define GDT_CODE_EXRDCA 0x0F // Execute/Read, conforming, accessed
struct gdt_segment_descriptor {
uint16_t limit;
@@ -43,7 +51,7 @@ struct gdt_segment_descriptor {
uint8_t access_byte;
uint8_t flags;
uint8_t high_base;
} __attribute__((packed));
} __attribute__((packed, aligned(4)));
typedef struct gdt_segment_descriptor gdt_segment_descriptor_t;

View File

@@ -8,9 +8,9 @@
#define APPA_OS_VERSION_MAJOR 0
#define APPA_OS_VERSION_MINOR 0
#define APPA_OS_VERSION_PATCH 132
#define APPA_OS_VERSION_PATCH 150
#define APPA_OS_COMMIT_HASH cd01d7d8d36862bc00ae88f7cd185c352a7b7eda
#define APPA_OS_BUILD_TIMESTAMP 1730655451
#define APPA_OS_BUILD_TIMESTAMP 1730673250
#endif // INCLUDE_APPA_OS_VERSION_H_