From 26853c32c8543aa5d35e9ef0f9e91bde37853c84 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 24 Dec 2022 10:28:41 +0000 Subject: [PATCH] Implemented GDT initialisation --- arch/x86_64/cpu.c | 14 ++++++++ arch/x86_64/gdt.c | 27 +++++++++++++++ arch/x86_64/gdt_load.S | 28 ++++++++++++++++ arch/x86_64/idt.c | 0 arch/x86_64/include/socks/machine/_gdt.h | 42 ++++++++++++++++++++++++ arch/x86_64/include/socks/machine/_tss.h | 0 arch/x86_64/include/socks/machine/cpu.h | 7 +++- arch/x86_64/tss.c | 0 include/socks/compiler.h | 2 +- init/main.c | 12 ++++++- 10 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 arch/x86_64/cpu.c create mode 100644 arch/x86_64/gdt.c create mode 100644 arch/x86_64/gdt_load.S create mode 100644 arch/x86_64/idt.c create mode 100644 arch/x86_64/include/socks/machine/_gdt.h create mode 100644 arch/x86_64/include/socks/machine/_tss.h create mode 100644 arch/x86_64/tss.c diff --git a/arch/x86_64/cpu.c b/arch/x86_64/cpu.c new file mode 100644 index 0000000..b4c7f81 --- /dev/null +++ b/arch/x86_64/cpu.c @@ -0,0 +1,14 @@ +#include +#include + +int ml_cpu_block_init(ml_cpu_block *p) +{ + gdt_init(&p->c_gdt, &p->c_gdt_ptr); + return 0; +} + +int ml_cpu_block_use(ml_cpu_block *p) +{ + gdt_load(&p->c_gdt_ptr); + return 0; +} diff --git a/arch/x86_64/gdt.c b/arch/x86_64/gdt.c new file mode 100644 index 0000000..1bcfc65 --- /dev/null +++ b/arch/x86_64/gdt.c @@ -0,0 +1,27 @@ +#include +#include + +static void init_entry(struct gdt_entry *entry, int access, int flags) +{ + entry->ge_limit_low = 0xFFFF; + entry->ge_base_low = 0x00; + entry->ge_base_mid = 0x00; + entry->ge_access = access; + entry->ge_gran = flags; + entry->ge_base_hi = 0x00; +} + +int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp) +{ + memset(&gdt->g_entries[0], 0x0, sizeof gdt->g_entries[0]); + + init_entry(&gdt->g_entries[1], GDT_A_PRESENT | GDT_A_CODEREAD | GDT_A_CODE, GDT_F_64BIT); + init_entry(&gdt->g_entries[2], GDT_A_PRESENT | GDT_A_DATAWRITE | GDT_A_DATA, GDT_F_64BIT); + init_entry(&gdt->g_entries[3], GDT_A_PRESENT | GDT_A_USER | GDT_A_CODEREAD | GDT_A_CODE, GDT_F_64BIT); + init_entry(&gdt->g_entries[4], GDT_A_PRESENT | GDT_A_USER | GDT_A_DATAWRITE | GDT_A_DATA, GDT_F_64BIT); + + gdtp->g_ptr = (uint64_t)gdt; + gdtp->g_limit = sizeof(*gdt) - 1; + + return 0; +} diff --git a/arch/x86_64/gdt_load.S b/arch/x86_64/gdt_load.S new file mode 100644 index 0000000..dc57492 --- /dev/null +++ b/arch/x86_64/gdt_load.S @@ -0,0 +1,28 @@ +.section .text + +.global gdt_load +.type gdt_load, @function + +gdt_load: + pushq %rbp + movq %rsp, %rbp + + lgdt (%rdi) + + mov $0x10, %ax + mov %ax, %ss + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + + movabsq $(gdt_load2), %rax + + push $0x08 + push %rax + + lretq + +gdt_load2: + popq %rbp + ret diff --git a/arch/x86_64/idt.c b/arch/x86_64/idt.c new file mode 100644 index 0000000..e69de29 diff --git a/arch/x86_64/include/socks/machine/_gdt.h b/arch/x86_64/include/socks/machine/_gdt.h new file mode 100644 index 0000000..af4c02f --- /dev/null +++ b/arch/x86_64/include/socks/machine/_gdt.h @@ -0,0 +1,42 @@ +#ifndef SOCKS_X86_64__GDT_H_ +#define SOCKS_X86_64__GDT_H_ + +#include +#include + +#define NR_GDT_ENTRIES 5 + +#define GDT_A_PRESENT (1 << 7) +#define GDT_A_USER (3 << 5) +#define GDT_A_CODE (3 << 3) +#define GDT_A_DATA (8 << 1) +#define GDT_A_RPLK (1 << 5) +#define GDT_A_CODEREAD (1 << 1) +#define GDT_A_DATAWRITE (1 << 1) +#define GDT_A_GROWUP (1 << 5) +#define GDT_F_64BIT (0x2F) +#define GDT_F_32BIT (0x4F) +#define GDT_F_16BIT (0xF) + +struct gdt_entry { + uint16_t ge_limit_low; + uint16_t ge_base_low; + uint8_t ge_base_mid; + uint8_t ge_access; + uint8_t ge_gran; + uint8_t ge_base_hi; +} __packed; + +struct gdt { + struct gdt_entry g_entries[NR_GDT_ENTRIES]; +} __packed; + +struct gdt_ptr { + uint16_t g_limit; + uint64_t g_ptr; +} __packed; + +extern int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp); +extern int gdt_load(struct gdt_ptr *gdtp); + +#endif diff --git a/arch/x86_64/include/socks/machine/_tss.h b/arch/x86_64/include/socks/machine/_tss.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/x86_64/include/socks/machine/cpu.h b/arch/x86_64/include/socks/machine/cpu.h index fbfbbfc..0d9002f 100644 --- a/arch/x86_64/include/socks/machine/cpu.h +++ b/arch/x86_64/include/socks/machine/cpu.h @@ -1,10 +1,15 @@ #ifndef SOCKS_X86_64_CPU_H_ #define SOCKS_X86_64_CPU_H_ -typedef struct ml_cpu_block { +#include +typedef struct ml_cpu_block { + struct gdt c_gdt; + struct gdt_ptr c_gdt_ptr; } ml_cpu_block; +extern int ml_init_bootcpu(void); + extern int ml_cpu_block_init(ml_cpu_block *p); extern int ml_cpu_block_use(ml_cpu_block *p); diff --git a/arch/x86_64/tss.c b/arch/x86_64/tss.c new file mode 100644 index 0000000..e69de29 diff --git a/include/socks/compiler.h b/include/socks/compiler.h index 3848ce8..a79d015 100644 --- a/include/socks/compiler.h +++ b/include/socks/compiler.h @@ -2,7 +2,7 @@ #define SOCKS_COMPILER_H_ #define __used __attribute__((used)) - +#define __packed __attribute__((packed)) #define __section(name) __attribute__((section(name))) #endif diff --git a/init/main.c b/init/main.c index 1ef73f2..2b68f09 100644 --- a/init/main.c +++ b/init/main.c @@ -3,12 +3,22 @@ #include #include #include +#include + +static ml_cpu_block g_bootstrap_cpu = {}; + +void bootstrap_cpu_init(void) +{ + ml_cpu_block_init(&g_bootstrap_cpu); + ml_cpu_block_use(&g_bootstrap_cpu); +} void kernel_init(uintptr_t arg) { + bootstrap_cpu_init(); console_init(); - for (int i = 0; i < 20; i++) { + for (int i = 0; i < 8; i++) { printf("Line %d\n", i); } }