From cbd02a848994206bb3d6fdd2cd9b4bb2f1b487f6 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4ldo2@protonmail.com> Date: Sat, 12 Aug 2023 00:57:45 +0000 Subject: [PATCH] Set relocation-model=static --- linkers/x86_64.ld | 2 +- src/arch/x86_64/consts.rs | 55 ++++++++++++++++-------------- src/context/switch.rs | 3 +- targets/x86_64-unknown-kernel.json | 2 +- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/linkers/x86_64.ld b/linkers/x86_64.ld index 9f90acf8da..fc745492cd 100644 --- a/linkers/x86_64.ld +++ b/linkers/x86_64.ld @@ -1,7 +1,7 @@ ENTRY(kstart) OUTPUT_FORMAT(elf64-x86-64) -KERNEL_OFFSET = 0xFFFFFF0000000000; +KERNEL_OFFSET = 0xFFFFFFFF80000000; SECTIONS { . = KERNEL_OFFSET; diff --git a/src/arch/x86_64/consts.rs b/src/arch/x86_64/consts.rs index d50af6bec8..7b49548b3f 100644 --- a/src/arch/x86_64/consts.rs +++ b/src/arch/x86_64/consts.rs @@ -1,32 +1,35 @@ -// Because the memory map is so important to not be aliased, it is defined here, in one place -// The lower 256 PML4 entries are reserved for userspace -// Each PML4 entry references up to 512 GB of memory -// The second from the top (510) PML4 is reserved for the kernel - /// The size of a single PML4 - pub const PML4_SIZE: usize = 0x0000_0080_0000_0000; - pub const PML4_MASK: usize = 0x0000_ff80_0000_0000; +// Because the memory map is so important to not be aliased, it is defined here, in one place. +// +// - The lower half (256 PML4 entries; 128 TiB) is reserved for userspace. These mappings are +// associated with _address spaces_, and change when context switching, unless the address spaces +// match. +// - The upper half is reserved for the kernel. Kernel mappings are preserved across context +// switches. +// +// Each PML4 entry references 512 GiB of virtual memory. - /// Offset of recursive paging (deprecated, but still reserved) - pub const RECURSIVE_PAGE_OFFSET: usize = (-(PML4_SIZE as isize)) as usize; - pub const RECURSIVE_PAGE_PML4: usize = (RECURSIVE_PAGE_OFFSET & PML4_MASK)/PML4_SIZE; +/// The size of a single PML4 +pub const PML4_SIZE: usize = 0x0000_0080_0000_0000; +pub const PML4_MASK: usize = 0x0000_ff80_0000_0000; - /// Offset of kernel - pub const KERNEL_OFFSET: usize = RECURSIVE_PAGE_OFFSET - PML4_SIZE; - pub const KERNEL_PML4: usize = (KERNEL_OFFSET & PML4_MASK)/PML4_SIZE; +/// Offset of kernel +pub const KERNEL_MAX_SIZE: usize = 1_usize << 31; +pub const KERNEL_OFFSET: usize = KERNEL_MAX_SIZE.wrapping_neg(); +pub const KERNEL_PML4: usize = (KERNEL_OFFSET & PML4_MASK)/PML4_SIZE; - /// Offset to kernel heap - pub const KERNEL_HEAP_OFFSET: usize = KERNEL_OFFSET - PML4_SIZE; - pub const KERNEL_HEAP_PML4: usize = (KERNEL_HEAP_OFFSET & PML4_MASK)/PML4_SIZE; - /// Size of kernel heap - pub const KERNEL_HEAP_SIZE: usize = 1 * 1024 * 1024; // 1 MB +/// Offset to kernel heap +pub const KERNEL_HEAP_OFFSET: usize = KERNEL_OFFSET - PML4_SIZE; +pub const KERNEL_HEAP_PML4: usize = (KERNEL_HEAP_OFFSET & PML4_MASK)/PML4_SIZE; +/// Size of kernel heap +pub const KERNEL_HEAP_SIZE: usize = 1 * 1024 * 1024; // 1 MB - /// Offset of physmap - // This needs to match RMM's PHYS_OFFSET - pub const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; - pub const PHYS_PML4: usize = (PHYS_OFFSET & PML4_MASK)/PML4_SIZE; +/// Offset of physmap +// This needs to match RMM's PHYS_OFFSET +pub const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; +pub const PHYS_PML4: usize = (PHYS_OFFSET & PML4_MASK)/PML4_SIZE; - /// Offset to user image - pub const USER_OFFSET: usize = 0; +/// Offset to user image +pub const USER_OFFSET: usize = 0; - /// End offset of the user image, i.e. kernel start - pub const USER_END_OFFSET: usize = 256 * PML4_SIZE; +/// End offset of the user image, i.e. kernel start +pub const USER_END_OFFSET: usize = 256 * PML4_SIZE; diff --git a/src/context/switch.rs b/src/context/switch.rs index 457ea5938b..b7086eaced 100644 --- a/src/context/switch.rs +++ b/src/context/switch.rs @@ -8,7 +8,6 @@ use spin::{RwLock, RwLockWriteGuard}; use crate::context::signal::signal_handler; use crate::context::{arch, contexts, Context}; -use crate::gdt; use crate::interrupt; use crate::percpu::PercpuBlock; use crate::ptrace; @@ -187,7 +186,7 @@ pub unsafe fn switch() -> bool { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { if let Some(ref stack) = next_context.kstack { - gdt::set_tss_stack(stack.as_ptr() as usize + stack.len()); + crate::gdt::set_tss_stack(stack.as_ptr() as usize + stack.len()); } } let percpu = PercpuBlock::current(); diff --git a/targets/x86_64-unknown-kernel.json b/targets/x86_64-unknown-kernel.json index db03c07d01..53deb0514d 100644 --- a/targets/x86_64-unknown-kernel.json +++ b/targets/x86_64-unknown-kernel.json @@ -16,7 +16,7 @@ "features": "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float", "dynamic-linking": false, "executables": false, - "relocation-model": "pic", + "relocation-model": "static", "code-model": "kernel", "disable-redzone": true, "frame-pointer": "always",