From 06b84d59cff8ad95f5cf9ef8716ec50ef3893080 Mon Sep 17 00:00:00 2001 From: Amelia Coutard Date: Sun, 24 Dec 2023 23:06:50 +0100 Subject: [PATCH] =?utf8?q?J'ai=20r=C3=A9fl=C3=A9chi=20un=20peu=20aux=20typ?= =?utf8?q?es=20entiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- kernel/src/elf64.cpp | 6 ++--- kernel/src/elf64.hpp | 4 +-- kernel/src/interrupts.cpp | 10 ++++---- kernel/src/interrupts.hpp | 14 +++++------ kernel/src/kernel.cpp | 46 +++++++++++++++++------------------ kernel/src/lib/multiboot2.hpp | 4 +-- kernel/src/lib/phys_ptr.hpp | 37 ++++++++++++++-------------- kernel/src/paging.hpp | 38 ++++++++++++++--------------- kernel/src/ring3.cpp | 16 ++++++------ kernel/src/ring3.hpp | 6 ++--- kernel/src/serial.cpp | 2 +- kernel/src/utils.hpp | 2 +- libcpp/memory.hpp | 11 ++++++++- libcpp/types.hpp | 13 +++++----- test_module/src/test.cpp | 4 +-- 15 files changed, 112 insertions(+), 101 deletions(-) diff --git a/kernel/src/elf64.cpp b/kernel/src/elf64.cpp index 1b3f7c9..239cb6b 100644 --- a/kernel/src/elf64.cpp +++ b/kernel/src/elf64.cpp @@ -14,7 +14,7 @@ #include "elf64.hpp" void os::elf::load_elf(os::process& result, amy::byte* start, amy::size length, const paging::PML4T& original_PML4T) { - os::assert(length >= 0 && (unsigned long long)(length) >= sizeof(os::elf::header), "Elf file isn't big enough to contain a header: there is an error."); + os::assert(length >= amy::byte_size(), "Elf file isn't big enough to contain a header: there is an error."); // TODO: Check that the elf file sections are all fully inside the file. // Load test-module elf file: @@ -55,8 +55,8 @@ void os::elf::load_elf(os::process& result, amy::byte* start, amy::size length, result.r15 = 0; // Copy kernel mappings to the new virtual address space. - memset(result.PML4T->contents, 0, 256 * sizeof(os::paging::PML4E)); - memcpy(result.PML4T->contents + 256, original_PML4T.contents + 256, 256 * sizeof(os::paging::PML4E)); + memset(result.PML4T->contents, 0, 256 * amy::byte_size()); + memcpy(result.PML4T->contents + 256, original_PML4T.contents + 256, 256 * amy::byte_size()); for (amy::size i = 0; i < elf_header.entry_count_program_header_table; i++) { const os::elf::program_header program_header = *(os::elf::program_header*)( diff --git a/kernel/src/elf64.hpp b/kernel/src/elf64.hpp index 8ae4df3..9347353 100644 --- a/kernel/src/elf64.hpp +++ b/kernel/src/elf64.hpp @@ -42,7 +42,7 @@ namespace os { namespace elf { amy::u16 entry_count_section_header_table; amy::u16 index_section_names_section_header_table; }; - static_assert(sizeof(header) == 64); + static_assert(amy::byte_size
() == 64); struct program_header { amy::u32 type; @@ -54,7 +54,7 @@ namespace os { namespace elf { amy::u64 p_memsz; amy::u64 align; }; - static_assert(sizeof(program_header) == 56); + static_assert(amy::byte_size() == 56); void load_elf(os::process& result, amy::byte* start, amy::size length, const paging::PML4T& original_PML4T); } } // namespace os::elf diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index 11ca4d7..2288039 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -29,18 +29,18 @@ void os::disable_PIC() { outb(0x21, 0xFF); } void os::set_APIC_base(os::phys_ptr ptr) { - os::set_msr(0x1B, (ptr.get_phys_addr() & 0xFFFFFFFFFFFFF000) | 0x800); + os::set_msr(0x1B, (ptr.get_phys_addr() & 0xFFFF'FFFF'FFFF'F000) | 0x800); } os::phys_ptr os::get_APIC_base() { - return os::phys_ptr{os::get_msr(0x1B) & 0xFFFFFFFFFFFFF000}; + return os::phys_ptr{amy::ptr(os::get_msr(0x1B)) & amy::ptr(0xFFFF'FFFF'FFFF'F000)}; } -amy::u32 os::get_APIC_reg(amy::dptr offset) { +amy::u32 os::get_APIC_reg(amy::diff offset) { return get_APIC_base()[offset / 4]; } -void os::set_APIC_reg(amy::dptr offset, amy::u32 v) { +void os::set_APIC_reg(amy::diff offset, amy::u32 v) { get_APIC_base()[offset / 4] = v; } -extern "C" void set_APIC_reg_asm(amy::dptr offset, amy::u32 v) { +extern "C" void set_APIC_reg_asm(amy::diff offset, amy::u32 v) { os::set_APIC_reg(offset, v); } diff --git a/kernel/src/interrupts.hpp b/kernel/src/interrupts.hpp index 2d9aa47..564a4b6 100644 --- a/kernel/src/interrupts.hpp +++ b/kernel/src/interrupts.hpp @@ -33,13 +33,13 @@ struct ide { amy::u32 offset_high; amy::u32 reserved_2 = 0; }; -static_assert(sizeof(ide) == 16); +static_assert(amy::byte_size() == 16); template using idt __attribute__((aligned(0x1000))) = ide[interrupt_nb]; struct __attribute__((packed)) idtr { amy::u16 size; - amy::u64 offset; + amy::ptr offset; }; void lidt(idtr idtr); @@ -47,11 +47,11 @@ bool is_APIC_builtin(); void disable_PIC(); void set_APIC_base(phys_ptr ptr); phys_ptr get_APIC_base(); -amy::u32 get_APIC_reg(amy::dptr offset); -void set_APIC_reg(amy::dptr offset, amy::u32 v); +amy::u32 get_APIC_reg(amy::diff offset); +void set_APIC_reg(amy::diff offset, amy::u32 v); struct isr_info { - amy::uptr addr; + amy::ptr addr; enum class type_t { trap_gate = 0xF, interrupt_gate = 0xE }; type_t type : 4; amy::u8 dpl: 2 = 0b00; @@ -82,8 +82,8 @@ void enable_interrupts(const isr_info (&ISRs)[interrupt_nb], os::idt(&idt[0]), + .size = amy::byte_size() - 1, + .offset = reinterpret_cast(&idt[0]), }; lidt(idtr); sti(); diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index bffc658..cc709be 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -38,21 +38,21 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr>(reinterpret_cast(bootstrap_pages_for_memory) - 0xFFFF'FFFF'8000'0000), - .size = sizeof(bootstrap_pages_for_memory) / sizeof(bootstrap_pages_for_memory[0]) + .ptr = os::phys_ptr>(amy::ptr(&bootstrap_pages_for_memory) & amy::ptr(~0xFFFF'FFFF'8000'0000)), + .size = amy::byte_size() / amy::byte_size() }); os::assert(os::cpu_has_msr(), "MSRs aren't supported."); // Initialise kernel map. - os::assert(amy::iptr(&_kernel_phys_start) % 4096 == 0, "Kernel isn't page aligned !"); - os::assert(amy::iptr(&_kernel_phys_rw_start) % 4096 == 0, "Kernel isn't page aligned !"); - os::assert(amy::iptr(&_kernel_phys_end) % 4096 == 0, "Kernel isn't page aligned !"); - for (amy::size i = amy::iptr(&_kernel_phys_start); i < amy::iptr(&_kernel_phys_rw_start); ) { - if (i % (1024 * 1024 * 1024) == 0 && i + 1024 * 1024 * 1024 < amy::iptr(&_kernel_phys_rw_start)) { + os::assert(amy::ptr(&_kernel_phys_start) % 4096 == 0, "Kernel isn't page aligned !"); + os::assert(amy::ptr(&_kernel_phys_rw_start) % 4096 == 0, "Kernel isn't page aligned !"); + os::assert(amy::ptr(&_kernel_phys_end) % 4096 == 0, "Kernel isn't page aligned !"); + for (amy::size i = amy::ptr(&_kernel_phys_start); i < amy::ptr(&_kernel_phys_rw_start); ) { + if (i % (1024 * 1024 * 1024) == 0 && i + 1024 * 1024 * 1024 < amy::ptr(&_kernel_phys_rw_start)) { os::paging::map_page<2, 3>(os::paging::global_PML4T, (os::paging::page<2>*)(0xFFFF'FFFF'8000'0000 + i), os::phys_ptr>(i), { .RW = false, .US = false, .PWT = false, .PCD = false, .A = false, .D = false, .PAT = false, .G = true, .AVL = 0, .NX = false }); i += 1024 * 1024 * 1024; - } else if (i % (1024 * 1024 * 2) == 0 && i + 1024 * 1024 * 2 < amy::iptr(&_kernel_phys_rw_start)) { + } else if (i % (1024 * 1024 * 2) == 0 && i + 1024 * 1024 * 2 < amy::ptr(&_kernel_phys_rw_start)) { os::paging::map_page<1, 3>(os::paging::global_PML4T, (os::paging::page<1>*)(0xFFFF'FFFF'8000'0000 + i), os::phys_ptr>(i), { .RW = false, .US = false, .PWT = false, .PCD = false, .A = false, .D = false, .PAT = false, .G = true, .AVL = 0, .NX = false }); i += 1024 * 1024 * 2; @@ -62,12 +62,12 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr(os::paging::global_PML4T, (os::paging::page<2>*)(0xFFFF'FFFF'8000'0000 + i), os::phys_ptr>(i), { .RW = true, .US = false, .PWT = false, .PCD = false, .A = false, .D = false, .PAT = false, .G = true, .AVL = 0, .NX = true }); i += 1024 * 1024 * 1024; - } else if (i % (1024 * 1024 * 2) == 0 && i + 1024 * 1024 * 2 < amy::iptr(&_kernel_phys_rw_start)) { + } else if (i % (1024 * 1024 * 2) == 0 && i + 1024 * 1024 * 2 < amy::ptr(&_kernel_phys_rw_start)) { os::paging::map_page<1, 3>(os::paging::global_PML4T, (os::paging::page<1>*)(0xFFFF'FFFF'8000'0000 + i), os::phys_ptr>(i), { .RW = true, .US = false, .PWT = false, .PCD = false, .A = false, .D = false, .PAT = false, .G = true, .AVL = 0, .NX = true }); i += 1024 * 1024 * 2; @@ -83,8 +83,8 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr {} : {}\n", (void*)s, (void*)e, multiboot2::memory_map_type(it, i)); if (multiboot2::memory_map_type(it, i) != 1) { continue; @@ -94,7 +94,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr( os::paging::global_PML4T, @@ -126,11 +126,11 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr{amy::uptr(&os::paging::global_PML4T) - 0xFFFF'FFFF'8000'0000}); + os::paging::load_pml4t(os::phys_ptr{amy::ptr(&os::paging::global_PML4T) & amy::ptr(~0xFFFF'FFFF'8000'0000)}); { // Enable interrupts really early so I don't have to manually manage memory... Will make better later, when I make utils.hpp/incrementing_int64_map better. os::isr_info isr_info[32]; - for (amy::size i = 0; (unsigned long long)(i) < sizeof(isr_info) / sizeof(isr_info[0]); i++) { + for (amy::size i = 0; i < amy::byte_size() / amy::byte_size(); i++) { isr_info[i].type = os::isr_info::type_t::trap_gate; } asm ("movq $handler_0x00,%0" : "=ri"(isr_info[0x00].addr) : ); @@ -175,7 +175,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr() <= 1024 * 1024 * 1024, "Error: processes array too big."); { amy::size const index = (amy::size(&os::processes) >> (12 + 9 * 3)) & 0x1FF; os::paging::global_PML4T.contents[index].paging_table_info({.RW = true, .US = false, .PWT = false, .PCD = false, .A = false, .AVL = 0, .NX = false}); @@ -217,7 +217,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr{}: {}\n", multiboot2::modules_mod_start(it), multiboot2::modules_mod_end(it), multiboot2::modules_string(it)); module_specified = true; - os::elf::load_elf(os::get_process(os::processes.create()), + os::elf::load_elf(os::get_process(amy::pid(os::processes.create())), (amy::byte*)multiboot2::modules_mod_start(it), multiboot2::modules_mod_end(it) - multiboot2::modules_mod_start(it), os::paging::global_PML4T); @@ -229,11 +229,11 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr> kernel_s{amy::uptr(&_kernel_phys_start)}; - const os::phys_ptr> kernel_e{amy::uptr(&_kernel_phys_end)}; + const os::phys_ptr> kernel_s{amy::ptr(&_kernel_phys_start)}; + const os::phys_ptr> kernel_e{amy::ptr(&_kernel_phys_end)}; // Remove kernel from available RAM: - for (amy::iptr i = 0; i < available_ram_length; i++) { + for (amy::ptr i = 0; i < available_ram_length; i++) { if (kernel_e < available_ram[i].start_address || available_ram[i].end_address < kernel_s) { continue; } @@ -254,7 +254,7 @@ extern "C" void kmain(unsigned long magic, os::phys_ptr ptr) { return (ptr->size - 16) / memory_map_entry_size(ptr); } - inline amy::u64 memory_map_base_addr(os::phys_ptr ptr, amy::size index) { - return *reinterpret_cast(&ptr->rest[8 + memory_map_entry_size(ptr) * index + 0]); + inline amy::ptr memory_map_base_addr(os::phys_ptr ptr, amy::size index) { + return *reinterpret_cast(&ptr->rest[8 + memory_map_entry_size(ptr) * index + 0]); } inline amy::u64 memory_map_length(os::phys_ptr ptr, amy::size index) { return *reinterpret_cast(&ptr->rest[8 + memory_map_entry_size(ptr) * index + 8]); diff --git a/kernel/src/lib/phys_ptr.hpp b/kernel/src/lib/phys_ptr.hpp index 400f5e9..4fb474a 100644 --- a/kernel/src/lib/phys_ptr.hpp +++ b/kernel/src/lib/phys_ptr.hpp @@ -14,6 +14,7 @@ #pragma once #include +#include namespace os { @@ -23,8 +24,8 @@ class phys_ptr; template <> class phys_ptr { public: - constexpr explicit phys_ptr(amy::uptr phys_addr): phys_addr(phys_addr) {} - constexpr phys_ptr(amy::nptr): phys_addr(~0ull) {} + constexpr explicit phys_ptr(amy::ptr phys_addr): phys_addr(phys_addr) {} + constexpr phys_ptr(amy::nil_t): phys_addr(0xF000'0000'0000'0000) {} inline void* operator->() const { return get_virt_addr(); @@ -33,7 +34,7 @@ public: return get_virt_addr(); } - constexpr amy::uptr get_phys_addr() const { + constexpr amy::ptr get_phys_addr() const { return phys_addr; } @@ -49,16 +50,16 @@ private: return reinterpret_cast(phys_addr + 0xFFFF800000000000); } - amy::uptr phys_addr; + amy::ptr phys_addr; }; template class phys_ptr { public: - constexpr explicit phys_ptr(amy::uptr phys_addr): phys_addr(phys_addr) {} - constexpr phys_ptr(amy::nptr): phys_addr(~0ull) {} + constexpr explicit phys_ptr(amy::ptr phys_addr): phys_addr(phys_addr) {} + constexpr phys_ptr(amy::nil_t): phys_addr(0xF000'0000'0000'0000) {} - T& operator[](amy::size i) const { + T& operator[](amy::diff i) const { return get_virt_addr()[i]; } T& operator*() const { @@ -93,27 +94,27 @@ public: operator--(); return old; } - constexpr phys_ptr& operator+=(amy::dptr offset) { + constexpr phys_ptr& operator+=(amy::diff offset) { return *this = *this + offset; } - constexpr phys_ptr& operator-=(amy::dptr offset) { + constexpr phys_ptr& operator-=(amy::diff offset) { return *this = *this - offset; } - friend constexpr phys_ptr operator+(phys_ptr ptr, amy::dptr offset) { - return phys_ptr{ptr.phys_addr + offset * sizeof(T)}; + friend constexpr phys_ptr operator+(phys_ptr ptr, amy::diff offset) { + return phys_ptr{ptr.phys_addr + offset * amy::byte_size()}; } - friend constexpr phys_ptr operator+(amy::dptr offset, phys_ptr ptr) { + friend constexpr phys_ptr operator+(amy::diff offset, phys_ptr ptr) { return ptr + offset; } - friend constexpr phys_ptr operator-(phys_ptr ptr, amy::dptr offset) { - return phys_ptr{ptr.phys_addr - offset * sizeof(T)}; + friend constexpr phys_ptr operator-(phys_ptr ptr, amy::diff offset) { + return phys_ptr{ptr.phys_addr - offset * amy::byte_size()}; } - friend constexpr amy::dptr operator-(phys_ptr a, phys_ptr b) { - return (a.phys_addr - b.phys_addr) / sizeof(T); + friend constexpr amy::diff operator-(phys_ptr a, phys_ptr b) { + return (a.phys_addr - b.phys_addr) / amy::byte_size(); } - constexpr amy::uptr get_phys_addr() const { + constexpr amy::ptr get_phys_addr() const { return phys_addr; } @@ -141,7 +142,7 @@ private: return reinterpret_cast(phys_addr + 0xFFFF800000000000); } - amy::uptr phys_addr; + amy::ptr phys_addr; }; } // namespace os diff --git a/kernel/src/paging.hpp b/kernel/src/paging.hpp index bae5657..7b8087d 100644 --- a/kernel/src/paging.hpp +++ b/kernel/src/paging.hpp @@ -77,7 +77,7 @@ template struct paging_entry { } os::phys_ptr> page_ptr() { os::assert(is_page(), "Cannot access page physical pointer for a non-page."); - amy::uptr addr = data & (depth == 0 ? 0x0000'FFFF'FFFF'F000 : 0x0000'FFFF'FFFF'E000); + amy::ptr addr = data & (depth == 0 ? 0x0000'FFFF'FFFF'F000 : 0x0000'FFFF'FFFF'E000); return os::phys_ptr>(addr | ((addr & 0x0000'8000'0000'0000) != 0 ? 0xFFFF'8000'0000'0000 : 0)); } void page_ptr(os::phys_ptr> page) { @@ -104,7 +104,7 @@ template struct paging_entry { } os::phys_ptr> paging_table_ptr() { os::assert(!is_page(), "Cannot access paging table physical pointer for a page."); - amy::uptr addr = data & 0x0000'FFFF'FFFF'F000; + amy::ptr addr = data & 0x0000'FFFF'FFFF'F000; return os::phys_ptr>(addr | ((addr & 0x0000'8000'0000'0000) != 0 ? 0xFFFF'8000'0000'0000 : 0)); } void paging_table_ptr(os::phys_ptr> table) { @@ -150,25 +150,25 @@ template struct __attribute__((aligned(0x1000))) page { amy::byte contents[0x1000ull << (9 * depth)]; }; -static_assert(sizeof(page<0>) == 0x1000); -static_assert(sizeof(page<1>) == 0x1000 * 512); -static_assert(sizeof(page<2>) == 0x1000ull * 512 * 512); -static_assert(sizeof(paging_table<3>) == 0x1000); +static_assert(amy::byte_size>() == 0x1000); +static_assert(amy::byte_size>() == 0x1000 * 512); +static_assert(amy::byte_size>() == 0x1000ull * 512 * 512); +static_assert(amy::byte_size>() == 0x1000); static_assert(alignof(paging_table<3>) == 0x1000); static_assert(alignof(paging_entry<3>) == 8); -static_assert(sizeof(paging_entry<3>) == 8); -static_assert(sizeof(paging_table<2>) == 0x1000); +static_assert(amy::byte_size>() == 8); +static_assert(amy::byte_size>() == 0x1000); static_assert(alignof(paging_table<2>) == 0x1000); static_assert(alignof(paging_entry<2>) == 8); -static_assert(sizeof(paging_entry<2>) == 8); -static_assert(sizeof(paging_table<1>) == 0x1000); +static_assert(amy::byte_size>() == 8); +static_assert(amy::byte_size>() == 0x1000); static_assert(alignof(paging_table<1>) == 0x1000); static_assert(alignof(paging_entry<1>) == 8); -static_assert(sizeof(paging_entry<1>) == 8); -static_assert(sizeof(paging_table<0>) == 0x1000); +static_assert(amy::byte_size>() == 8); +static_assert(amy::byte_size>() == 0x1000); static_assert(alignof(paging_table<0>) == 0x1000); static_assert(alignof(paging_entry<0>) == 8); -static_assert(sizeof(paging_entry<0>) == 8); +static_assert(amy::byte_size>() == 8); using PML4T = paging_table<3>; using PML4E = paging_entry<3>; @@ -184,7 +184,7 @@ extern PML4T global_PML4T; template void map_page(paging_table& paging_table, page const* vaddr, phys_ptr> paddr, os::paging::page_info page_info); template -void on_all_pages(const paging_table& paging_table, auto f, amy::uptr vaddr_offset = 0); +void on_all_pages(const paging_table& paging_table, auto f, amy::diff vaddr_offset = 0); void load_pml4t(phys_ptr PML4T); @@ -209,7 +209,7 @@ private: phys_ptr next; amy::size size; }; - static_assert(sizeof(page) == 0x1000); + static_assert(amy::byte_size() == 0x1000); static_assert(alignof(page) == 0x1000); phys_ptr begin; @@ -218,7 +218,7 @@ private: template void map_page(paging_table& paging_table, page const* vaddr, phys_ptr> paddr, os::paging::page_info page_info) { - amy::size const index = (amy::uptr(vaddr) >> (12 + 9 * paging_depth)) & 0x1FF; + amy::size const index = (amy::ptr(vaddr) >> (12 + 9 * paging_depth)) & 0x1FF; if constexpr (depth == paging_depth) { os::assert(!paging_table.contents[index].is_present(), "Virtual address 0x{} is already mapped.", vaddr); paging_table.contents[index].page_info(page_info); @@ -240,13 +240,13 @@ void map_page(paging_table& paging_table, page const* vaddr } template -void on_all_pages(const paging_table& paging_table, auto f, amy::uptr vaddr_offset) { +void on_all_pages(const paging_table& paging_table, auto f, amy::diff vaddr_offset) { for (amy::size i = 0; i < 512; i++) { if (!is_present(paging_table.contents[i])) { continue; } - amy::uptr const new_offset = ([&]() { - amy::uptr const new_offset = vaddr_offset + (i << (12 + 9 * depth)); + amy::diff const new_offset = ([&]() { + amy::diff const new_offset = vaddr_offset + (i << (12 + 9 * depth)); return new_offset | (new_offset >> 47 ? 0xFFFF'8000'0000'0000 : 0); })(); if constexpr (depth == 3) { diff --git a/kernel/src/ring3.cpp b/kernel/src/ring3.cpp index 4625e1e..5df22c5 100644 --- a/kernel/src/ring3.cpp +++ b/kernel/src/ring3.cpp @@ -16,7 +16,7 @@ #include "serial.hpp" #include "paging.hpp" -void os::run_first_process(amy::i64 pid) { +void os::run_first_process(amy::pid pid) { current_pid = pid; os::paging::load_pml4t(os::get_process(current_pid).PML4T); os::ftl_to_userspace((void*)os::get_process(current_pid).rip, (amy::byte*)os::get_process(current_pid).rsp); @@ -41,12 +41,12 @@ void os::enable_syscalls() { } void schedule_next_process() { - if (os::processes.present(os::current_pid + 1)) { - os::current_pid += 1; + if (os::processes.present(amy::i64(os::current_pid) + 1)) { + os::current_pid = amy::pid(amy::i64(os::current_pid) + 1); } else { - os::current_pid = 0; + os::current_pid = amy::pid(0); } - os::paging::load_pml4t(os::processes.get(os::current_pid).PML4T); + os::paging::load_pml4t(os::processes.get(amy::i64(os::current_pid)).PML4T); } // extern "C" int os::syscall_mount_kernel_device(amy::fd wd, char device, char const* path, amy::size path_len, int mount_type); @@ -62,7 +62,7 @@ extern "C" amy::fd os::syscall_open(amy::fd, char const*, amy::size, int) { } extern "C" amy::size os::syscall_read(amy::fd file, char* data, amy::size len) { - os::assert(file == 0, "Read isn't really implemented for now."); + os::assert(file == amy::fd(0), "Read isn't really implemented for now."); os::assert(len >= 0, "Read expects a positive size."); if (len == 0) { return 0; @@ -82,7 +82,7 @@ extern "C" amy::size os::syscall_read(amy::fd file, char* data, amy::size len) { } extern "C" amy::size os::syscall_write(amy::fd file, char const* data, amy::size len) { - os::assert(file == 0, "Write isn't really implemented for now."); + os::assert(file == amy::fd(0), "Write isn't really implemented for now."); os::assert(len >= 0, "Write expects a positive size."); if (len == 0) { return 0; @@ -111,5 +111,5 @@ extern "C" void os::syscall_rax_error_handler() { os::incrementing_int64_map& os::processes = *reinterpret_cast*>(0xFFFF'C000'0000'0000); amy::pid os::current_pid; os::process& os::get_process(amy::pid pid) { - return processes.get(pid); + return processes.get(amy::i64(pid)); } diff --git a/kernel/src/ring3.hpp b/kernel/src/ring3.hpp index b79b7a5..6859526 100644 --- a/kernel/src/ring3.hpp +++ b/kernel/src/ring3.hpp @@ -39,7 +39,7 @@ struct __attribute__((packed)) tss { struct process; extern "C" void ftl_to_userspace(void* program, amy::byte* stack); -void run_first_process(amy::i64 pid); +void run_first_process(amy::pid pid); extern "C" void load_tss(); extern "C" void syscall_64bit_handler(); @@ -82,10 +82,10 @@ struct process { incrementing_int64_map ports; }; -static_assert(0xFFFF'C000'0000'0000 + sizeof(incrementing_int64_map) < 0xFFFF'FFFF'8000'0000); +static_assert(0xFFFF'C000'0000'0000 + amy::byte_size>() < 0xFFFF'FFFF'8000'0000); extern incrementing_int64_map& processes; extern "C" amy::pid current_pid; -extern "C" process& get_process(amy::i64 pid); +extern "C" process& get_process(amy::pid pid); } // namespace os diff --git a/kernel/src/serial.cpp b/kernel/src/serial.cpp index a686584..5f2f58a 100644 --- a/kernel/src/serial.cpp +++ b/kernel/src/serial.cpp @@ -95,7 +95,7 @@ void os::print_formatted(const char* format, const void* val) { os::assert(format[0] == '}', "Format string unsupported. TODO."); os::print("0x"); for (int i = 60; i >= 0; i -= 4) { - const int v = (reinterpret_cast(val) >> i) & 0xF; + const int v = (reinterpret_cast(val) >> i) & 0xF; os::printc(v < 10 ? v + '0' : v - 10 + 'a'); } } diff --git a/kernel/src/utils.hpp b/kernel/src/utils.hpp index 035760e..b3a8edb 100644 --- a/kernel/src/utils.hpp +++ b/kernel/src/utils.hpp @@ -75,7 +75,7 @@ public: private: struct elem_t { bool present; - alignas(T) amy::byte buffer[sizeof(T)]; + alignas(T) amy::byte buffer[amy::byte_size()]; }; amy::i64 n = 0; static constexpr amy::i64 max_n = 4096; diff --git a/libcpp/memory.hpp b/libcpp/memory.hpp index 81ae2a6..40c38d5 100644 --- a/libcpp/memory.hpp +++ b/libcpp/memory.hpp @@ -29,9 +29,18 @@ inline void operator delete[](void*, void*) noexcept {} namespace amy { -// Taken from glibcxx, should be fine copyright-wise: +// "Launder" taken from glibcxx, should be fine copyright-wise: template [[nodiscard]] constexpr T* launder(T* p) noexcept { return __builtin_launder(p); } + + +template constexpr size byte_size() { + return sizeof(T); +} +template constexpr size byte_align() { + return alignof(T); +} + } // namespace amy diff --git a/libcpp/types.hpp b/libcpp/types.hpp index 2e7f2d6..94c4598 100644 --- a/libcpp/types.hpp +++ b/libcpp/types.hpp @@ -27,14 +27,15 @@ using u32 = uint32_t; using i64 = int64_t; using u64 = uint64_t; -using iptr = intptr_t; -using uptr = uintptr_t; -using dptr = __PTRDIFF_TYPE__; -using nptr = decltype(nullptr); +using ptr = intptr_t; +constexpr auto nil = nullptr; +using nil_t = decltype(nil); using size = i64; +using diff = i64; +static_assert(sizeof(diff) >= sizeof(__PTRDIFF_TYPE__)); -using pid = i64; -using fd = i64; +enum class pid : i64 {}; +enum class fd : i64 {}; } // namespace amy diff --git a/test_module/src/test.cpp b/test_module/src/test.cpp index a66ecd2..421ce3f 100644 --- a/test_module/src/test.cpp +++ b/test_module/src/test.cpp @@ -37,8 +37,8 @@ extern "C" int close(amy::fd file); extern "C" void loop_de_loop(); extern "C" void _start() { - sys::mount_kernel_device(-1, 'I', "/", 1, MOUNT_REPLACE); // 'I' is the I/O device. /serial is the serial port /fb is the framebuffer - const amy::fd serial = sys::open(-1, "/serial", 7, MODE_WRITE); + sys::mount_kernel_device(amy::fd(-1), 'I', "/", 1, MOUNT_REPLACE); // 'I' is the I/O device. /serial is the serial port /fb is the framebuffer + const amy::fd serial = sys::open(amy::fd(-1), "/serial", 7, MODE_WRITE); sys::write(serial, "Entrez votre nom: ", 18); char data[32]; -- 2.47.0