From 97e8f2c69a89bda17a305805c9bcc99fae2bafa7 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 13 Mar 2019 22:49:20 -0700 Subject: [PATCH] Add get_gsbase() --- src/kernel/debug.h | 1 + src/kernel/debug.s | 5 +++++ src/kernel/memory_bootstrap.cpp | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/kernel/debug.h b/src/kernel/debug.h index 260c783..d85a398 100644 --- a/src/kernel/debug.h +++ b/src/kernel/debug.h @@ -8,6 +8,7 @@ extern "C" { uintptr_t get_rsp(); uintptr_t get_rip(); uintptr_t get_frame(int frame); + uintptr_t get_gsbase(); } diff --git a/src/kernel/debug.s b/src/kernel/debug.s index ed1f7da..0fb0500 100644 --- a/src/kernel/debug.s +++ b/src/kernel/debug.s @@ -8,6 +8,11 @@ get_rip: pop rax ; do the same thing as 'ret', except with 'jmp' jmp rax ; with the return address still in rax +global get_gsbase +get_gsbase: + rdgsbase rax + ret + global _halt _halt: hlt diff --git a/src/kernel/memory_bootstrap.cpp b/src/kernel/memory_bootstrap.cpp index c84b873..8495dd6 100644 --- a/src/kernel/memory_bootstrap.cpp +++ b/src/kernel/memory_bootstrap.cpp @@ -198,9 +198,12 @@ memory_initialize(uint16_t scratch_pages, const void *memory_map, size_t map_len // make sure the options we want in CR4 are set uint64_t cr4; __asm__ __volatile__ ( "mov %%cr4, %0" : "=r" (cr4) ); - cr4 |= 0x00080; // Enable global pages - cr4 |= 0x00200; // Enable FXSAVE/FXRSTOR - cr4 |= 0x20000; // Enable PCIDs + cr4 |= + 0x000080 | // Enable global pages + 0x000200 | // Enable FXSAVE/FXRSTOR + 0x010000 | // Enable FSGSBASE + 0x020000 | // Enable PCIDs + 0; __asm__ __volatile__ ( "mov %0, %%cr4" :: "r" (cr4) ); // The bootloader reserved "scratch_pages" pages for page tables and