From 3113fb08c3ebf56e58eda1056d4c7a48ca7112f0 Mon Sep 17 00:00:00 2001 From: Curle Date: Fri, 8 Jul 2022 02:28:20 +0100 Subject: [PATCH] Some assorted in-progress work. --- CMakeLists.txt | 13 ++- src/global/core-att.s | 128 ++++++++++++++++++++++++++++++ src/global/core.s | 44 +++++----- src/system/core.cpp | 1 - src/system/cpu.cpp | 10 ++- src/system/extern/extern_defs.cpp | 55 +++++++++++++ src/system/memory/physmem.c | 1 + 7 files changed, 224 insertions(+), 28 deletions(-) create mode 100644 src/global/core-att.s create mode 100644 src/system/extern/extern_defs.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 181d9cc..97c33c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,10 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_CROSSCOMPILING 1) +enable_language(ASM) +enable_language(C) +enable_language(CXX) + project(chroma) SET(src_files @@ -29,11 +33,13 @@ SET(src_files ${CMAKE_SOURCE_DIR}/src/system/memory/liballoc.cpp ${CMAKE_SOURCE_DIR}/src/system/memory/physmem.c ${CMAKE_SOURCE_DIR}/src/system/process/process.cpp + ${CMAKE_SOURCE_DIR}/src/system/extern/extern_defs.cpp ${CMAKE_SOURCE_DIR}/src/drivers/elf.cpp ${CMAKE_SOURCE_DIR}/src/drivers/devices/devices.cpp ${CMAKE_SOURCE_DIR}/src/drivers/devices/input/keyboard.cpp ${CMAKE_SOURCE_DIR}/src/drivers/devices/io/apic.cpp ${CMAKE_SOURCE_DIR}/src/drivers/devices/storage/ata.cpp + ${CMAKE_SOURCE_DIR}/src/global/core-att.s ) SET(lib_files @@ -50,6 +56,9 @@ SET(src_no_sse ${CMAKE_SOURCE_DIR}/src/system/interrupts.cpp ) +SET(src_as + ) + SET(src_preamble ${CMAKE_SOURCE_DIR}/src/global/crt0.o ${CMAKE_SOURCE_DIR}/src/global/crti.o @@ -69,6 +78,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) add_executable(kernel) -target_sources(kernel PUBLIC ${src_preamble} PUBLIC ${src_files} PUBLIC ${src_no_sse} PUBLIC ${lib_files} PUBLIC ${src_epilogue}) -target_compile_options(kernel PRIVATE -ffreestanding -O0 -Wall -Wextra -Wall -Werror -fPIC -fno-exceptions -fno-omit-frame-pointer -mno-red-zone -fno-stack-protector -fno-rtti -ggdb3) +target_sources(kernel PUBLIC ${src_preamble} PUBLIC ${src_files} PUBLIC ${src_no_sse} PUBLIC ${lib_files} PUBLIC ${src_as} PUBLIC ${src_epilogue}) +target_compile_options(kernel PRIVATE -ffreestanding -O0 -Wall -Wextra -Wall -Werror -fPIC -fno-exceptions -fno-omit-frame-pointer -mno-red-zone -fno-stack-protector $<$:-fno-rtti> -ggdb3) target_link_options(kernel PRIVATE -T ${CMAKE_SOURCE_DIR}/linker.ld -ffreestanding -O2 -nostdlib -nostartfiles -lgcc) diff --git a/src/global/core-att.s b/src/global/core-att.s new file mode 100644 index 0000000..0e6c74e --- /dev/null +++ b/src/global/core-att.s @@ -0,0 +1,128 @@ +#************************ +#*** Team Kitty, 2021 *** +#*** Chroma *** +#************************ + +# Initial startup routines for new cores. +# New cores start in 16 bit real mode. +# Because of this, this is the only necessary assembler file in the OS. + +# First, bring them up to Protected and Long mode. +# Then enable all necessary auxiliary features. +# Pass off to the CPP code to handle the heavy work, we just want the core running. + +.code16 +.equ BASE, 0x1000 + +.global stack +.extern initcpu + +.extern coreidt +.extern CoreGDT + +# 16-bit startup. +# Initialize registers. +# Load GDT +# Set flags +# Immediately jump to protected mode. + +.global startCore +startCore: + cli + mov $0x0, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %ax, %ss + + lgdtl gdt_protected + + mov %cr0, %eax + or $0x1, %ax + mov %eax, %cr0 + + ljmpl $0x8, $startCore32 + +.code32 + +# Protected mode setup. +# Set page tables +# Set PAE +# Immediately jump to long mode. + +.section .text +startCore32: + mov $0x10, %bx + mov %bx, %ds + mov %bx, %es + mov %bx, %ss + + mov $0xA000, %eax + mov %eax, %cr3 + + mov %cr4, %eax # Enable PAE + or $32, %eax # 1 << 5 + or $128, %eax # 1 << 7 + mov %eax, %cr4 + + mov $0xC0000080, %ecx + rdmsr + or $256, %eax # 1 << 8 + wrmsr + + mov %cr0, %eax + or $2147483648, %eax # 1 << 31 + mov %eax, %cr0 + + lgdt gdt_long + ljmp $0x8, $startCore64 + +# Long mode setup. +# Prepare registers. +# Set flags +# Load the final GDT and IDT +# Jump to the leave function. + +.code64 +startCore64: + mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %ss + + mov $0x0, %ax + mov %ax, %ds + mov %ax, %gs + + lgdt CoreGDT + lidt coreidt + + mov $0x0, %rbp + push $0 + popf + + mov (leave), %rax + jmp leave + +# Final setup. +# Set some flags in registers. +# Jump into C++ code. + +leave: + push %rbp + + mov %cr0, %rax + btr $2, %eax + bts $1, %eax + mov %rax, %cr0 + + mov %cr4, %rax + bts $9, %eax + bts $10, %eax + mov %rax, %cr4 + + call initcpu + +.global endCore +endCore: diff --git a/src/global/core.s b/src/global/core.s index 8875ddd..0d52e89 100644 --- a/src/global/core.s +++ b/src/global/core.s @@ -1,27 +1,29 @@ -;************************ -;*** Team Kitty, 2021 *** -;*** Chroma *** -;************************ +.intel_syntax noprefix +#************************ +#*** Team Kitty, 2021 *** +#*** Chroma *** +#************************ -; Initial startup routines for new cores. -; New cores start in 16 bit real mode. -; Because of this, this is the only necessary assembler file in the OS. +# Initial startup routines for new cores. +# New cores start in 16 bit real mode. +# Because of this, this is the only necessary assembler file in the OS. -; First, bring them up to Protected and Long mode. -; Then enable all necessary auxiliary features. -; Pass off to the CPP code to handle the heavy work, we just want the core running. +# First, bring them up to Protected and Long mode. +# Then enable all necessary auxiliary features. +# Pass off to the CPP code to handle the heavy work, we just want the core running. -[bits 16] -BASE equ 0x1000 +.intel_syntax -global stack -extern initcpu +.code16 +.equ BASE, 0x1000 -extern coreidt -extern coregdt +.global stack +.extern initcpu -global startCore -startCore: +.extern coreidt +.extern coregdt + +.global startCore cli mov ax, 0x0 mov ds, ax @@ -38,9 +40,9 @@ startCore: jmp 0x8:(startCore32 - startCore + BASE) -[bits 32] +.code32 -section .text +.section .text startCore32: mov bx, 0x10 mov ds, bx @@ -67,7 +69,7 @@ startCore32: lgdt [gdt_long - startCore + BASE] jmp 8:(startCore64 - startCore + BASE) -[bits 64] +.code64 startCore64: mov ax, 0x10 mov ds, ax diff --git a/src/system/core.cpp b/src/system/core.cpp index 1bf03ee..34785cd 100644 --- a/src/system/core.cpp +++ b/src/system/core.cpp @@ -25,7 +25,6 @@ extern "C" void initcpu() { __asm__ __volatile__("mov %%fs, %0" : : "r" (Device::APIC::driver->GetCurrentCore()) : ); SerialPrintf("[CORE] Core %d ready.\r\n", Device::APIC::driver->GetCurrentCore()); - // TODO: New GDT __asm__ __volatile__("cli"); Ready = true; __asm__ __volatile__("sti"); diff --git a/src/system/cpu.cpp b/src/system/cpu.cpp index afd0de9..e9ba325 100644 --- a/src/system/cpu.cpp +++ b/src/system/cpu.cpp @@ -44,6 +44,11 @@ __attribute__((aligned(64))) static volatile size_t InitGDT[5] = { 0 }; +__attribute__((aligned(64))) static DESC_TBL CoreGDT = { + .Limit = sizeof(InitGDT), + .Base = (size_t) InitGDT +}; + __attribute__((aligned(64))) static volatile TSS64 TSSEntries; __attribute__((aligned(64))) static volatile IDT_GATE IDTEntries[256]; @@ -111,7 +116,6 @@ void PrepareCPU() { */ void SetupInitialGDT() { - DESC_TBL GDTData; size_t TSSBase = (uint64_t) (&TSSEntries); uint16_t TSSLower = (uint16_t) TSSBase; @@ -119,15 +123,13 @@ void SetupInitialGDT() { uint8_t TSSMid2 = (uint8_t) (TSSBase >> 24); uint32_t TSSHigher = (uint32_t) (TSSBase >> 32); - GDTData.Limit = sizeof(InitGDT) - 1; - GDTData.Base = (size_t) InitGDT; ((TSS_ENTRY*) (&((GDT_ENTRY*) InitGDT)[3]))->BaseLow = TSSLower; ((TSS_ENTRY*) (&((GDT_ENTRY*) InitGDT)[3]))->BaseMid1 = TSSMid1; ((TSS_ENTRY*) (&((GDT_ENTRY*) InitGDT)[3]))->BaseMid2 = TSSMid2; ((TSS_ENTRY*) (&((GDT_ENTRY*) InitGDT)[3]))->BaseHigh = TSSHigher; - WriteGDT(GDTData); + WriteGDT(CoreGDT); WriteTSR(3 << 3); RefreshCS(); } diff --git a/src/system/extern/extern_defs.cpp b/src/system/extern/extern_defs.cpp new file mode 100644 index 0000000..c199bd7 --- /dev/null +++ b/src/system/extern/extern_defs.cpp @@ -0,0 +1,55 @@ +/************************ + *** Team Kitty, 2022 *** + *** Chroma *** + ***********************/ + +#include + +/** + * Contains definitions that are used by external files. + * That means, independent programs or assembler files. + */ + +/** + * The template GDT entry for a newly initialized core. + * Protected Mode. + * TODO: Document what the entries here are. + */ + +__attribute__((aligned(64))) size_t ProtectedGDTEntry[3] = { + 0, + 0x00CF9A000000FFFF, + 0x00CF92000000FFFF +}; + +/** + * The GDT table value to be loaded into each newly initialized core. + * Protected Mode. + */ + +DESC_TBL ProtectedGDT = { + .Limit = sizeof(ProtectedGDTEntry) - 1, + .Base = (size_t) &ProtectedGDTEntry +}; + +/** + * The template GDT entry for a newly initialized core. + * Long Mode. + * TODO: Document what the entries here are. + */ +__attribute__((aligned(64))) size_t LongGDTEntry[3] = { + 0, + 0x00AF98000000FFFF, + 0x00CF92000000FFFF +}; + +/** + * The GDT table value to be loaded into each newly initialized core. + * Long Mode. + */ + +DESC_TBL LongGDT = { + .Limit = sizeof(LongGDTEntry) - 1, + .Base = (size_t) &LongGDTEntry +}; + diff --git a/src/system/memory/physmem.c b/src/system/memory/physmem.c index 27e1dea..9b020ac 100644 --- a/src/system/memory/physmem.c +++ b/src/system/memory/physmem.c @@ -7,6 +7,7 @@ *** Chroma *** ***********************/ + #ifdef __cplusplus extern "C" { #endif