From c48cbd2c659e998ead1c77e18d3e64fdc153925c Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 18 Jan 2014 22:07:12 +0100 Subject: [PATCH] Create GDT entries for user code and data --- kernel/include/gdt.hpp | 2 ++ kernel/src/boot/boot_16.cpp | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/kernel/include/gdt.hpp b/kernel/include/gdt.hpp index 181ae3a8..550f139e 100644 --- a/kernel/include/gdt.hpp +++ b/kernel/include/gdt.hpp @@ -13,6 +13,8 @@ namespace gdt { constexpr const uint16_t CODE_SELECTOR = 0x08; constexpr const uint16_t DATA_SELECTOR = 0x10; constexpr const uint16_t LONG_SELECTOR = 0x18; +constexpr const uint16_t USER_DATA_SELECTOR = 0x20; +constexpr const uint16_t USER_CODE_SELECTOR = 0x28; } //end of namespace gdt diff --git a/kernel/src/boot/boot_16.cpp b/kernel/src/boot/boot_16.cpp index f4ad09f2..10ef9553 100644 --- a/kernel/src/boot/boot_16.cpp +++ b/kernel/src/boot/boot_16.cpp @@ -323,13 +323,29 @@ constexpr uint16_t data_selector(){ SEG_PRIV(0) | SEG_DATA_RDWR; } +constexpr uint16_t user_data_selector(){ + return + SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | + SEG_LONG(1) | SEG_SIZE(1) | SEG_GRAN(1) | + SEG_PRIV(3) | SEG_DATA_RDWR; +} + +constexpr uint16_t user_code_64_selector(){ + return + SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | + SEG_LONG(1) | SEG_SIZE(0) | SEG_GRAN(1) | + SEG_PRIV(3) | SEG_CODE_EXRD; +} + void setup_gdt(){ //TODO On some machines, this should be aligned to 16 bits static const uint64_t gdt[] = { 0, //Null Selector gdt_entry(0, 0xFFFFF, code_32_selector()), gdt_entry(0, 0xFFFFF, data_selector()), - gdt_entry(0, 0xFFFFF, code_64_selector()) + gdt_entry(0, 0xFFFFF, code_64_selector()), + gdt_entry(0, 0xFFFFF, user_data_selector()), + gdt_entry(0, 0xFFFFF, user_code_64_selector()) }; static gdt_ptr gdtr;