diff --git a/src/arch/aarch64/start.rs b/src/arch/aarch64/start.rs index eec8770794..59edc57921 100644 --- a/src/arch/aarch64/start.rs +++ b/src/arch/aarch64/start.rs @@ -3,7 +3,7 @@ //! It must create the IDT with the correct entries, those entries are //! defined in other files inside of the `arch` module use core::{ - arch::global_asm, + arch::naked_asm, cell::SyncUnsafeCell, slice, sync::atomic::{AtomicBool, Ordering}, @@ -29,9 +29,11 @@ struct StackAlign(T); static STACK: SyncUnsafeCell> = SyncUnsafeCell::new(StackAlign([0; 128 * 1024])); -global_asm!(" - .globl kstart - kstart: +// FIXME use extern "custom" +#[unsafe(naked)] +#[unsafe(no_mangle)] +extern "C" fn kstart() { + naked_asm!(" // BSS should already be zero adrp x9, {bss_test_zero} ldr x9, [x9, :lo12:{bss_test_zero}] @@ -56,12 +58,13 @@ global_asm!(" mov x9, 0 br x9 ", - bss_test_zero = sym BSS_TEST_ZERO, - data_test_nonzero = sym DATA_TEST_NONZERO, - stack = sym STACK, - stack_size = const size_of_val(&STACK), - start = sym start, -); + bss_test_zero = sym BSS_TEST_ZERO, + data_test_nonzero = sym DATA_TEST_NONZERO, + stack = sym STACK, + stack_size = const size_of_val(&STACK), + start = sym start, + ); +} /// The entry to Rust, all things must be initialized unsafe extern "C" fn start(args_ptr: *const KernelArgs) -> ! { diff --git a/src/arch/riscv64/start.rs b/src/arch/riscv64/start.rs index a74717b07c..2591272ae1 100644 --- a/src/arch/riscv64/start.rs +++ b/src/arch/riscv64/start.rs @@ -1,5 +1,5 @@ use core::{ - arch::{asm, global_asm}, + arch::naked_asm, cell::SyncUnsafeCell, sync::atomic::{AtomicUsize, Ordering}, }; @@ -44,9 +44,11 @@ struct StackAlign(T); static STACK: SyncUnsafeCell> = SyncUnsafeCell::new(StackAlign([0; 128 * 1024])); -global_asm!(" - .globl kstart - kstart: +// FIXME use extern "custom" +#[unsafe(naked)] +#[unsafe(no_mangle)] +extern "C" fn kstart() { + naked_asm!(" mv gp, x0 // ensure gp relative accesses crash mv tp, x0 // reset percpu until it is initialized csrw sscratch, tp @@ -70,13 +72,14 @@ global_asm!(" .Lkstart_crash: jr x0 ", - bss_test_zero = sym BSS_TEST_ZERO, - data_test_nonzero = sym DATA_TEST_NONZERO, - exception_handler = sym exception_handler, - stack = sym STACK, - stack_size = const size_of_val(&STACK), - start = sym start, -); + bss_test_zero = sym BSS_TEST_ZERO, + data_test_nonzero = sym DATA_TEST_NONZERO, + exception_handler = sym exception_handler, + stack = sym STACK, + stack_size = const size_of_val(&STACK), + start = sym start, + ); +} /// The entry to Rust, all things must be initialized unsafe extern "C" fn start(args_ptr: *const KernelArgs) -> ! { diff --git a/src/arch/x86_shared/start.rs b/src/arch/x86_shared/start.rs index 1cd795896e..c7920f8074 100644 --- a/src/arch/x86_shared/start.rs +++ b/src/arch/x86_shared/start.rs @@ -3,7 +3,7 @@ //! It must create the IDT with the correct entries, those entries are //! defined in other files inside of the `arch` module use core::{ - arch::global_asm, + arch::naked_asm, cell::SyncUnsafeCell, hint, mem::offset_of, @@ -32,10 +32,13 @@ struct StackAlign(T); static STACK: SyncUnsafeCell> = SyncUnsafeCell::new(StackAlign([0; 128 * 1024])); -#[cfg(target_arch = "x86")] -global_asm!(" - .globl kstart - kstart: +// FIXME use extern "custom" +#[unsafe(naked)] +#[unsafe(no_mangle)] +extern "C" fn kstart() { + naked_asm!( + #[cfg(target_arch = "x86")] + " // BSS should already be zero cmp dword ptr [{bss_test_zero}], 0 jne .Lkstart_crash @@ -50,20 +53,12 @@ global_asm!(" jmp {start} .Lkstart_crash: - mov eax, 0 + xor eax, eax jmp eax ", - bss_test_zero = sym BSS_TEST_ZERO, - data_test_nonzero = sym DATA_TEST_NONZERO, - stack = sym STACK, - stack_size = const size_of_val(&STACK), - start = sym start, -); -#[cfg(target_arch = "x86_64")] -global_asm!(" - .globl kstart - kstart: + #[cfg(target_arch = "x86_64")] + " // BSS should already be zero cmp qword ptr [rip + {bss_test_zero}], 0 jne .Lkstart_crash @@ -81,15 +76,17 @@ global_asm!(" jmp {start} .Lkstart_crash: - mov rax, 0 + xor rax, rax jmp rax ", - bss_test_zero = sym BSS_TEST_ZERO, - data_test_nonzero = sym DATA_TEST_NONZERO, - stack = sym STACK, - stack_size = const size_of_val(&STACK), - start = sym start, -); + + bss_test_zero = sym BSS_TEST_ZERO, + data_test_nonzero = sym DATA_TEST_NONZERO, + stack = sym STACK, + stack_size = const size_of_val(&STACK), + start = sym start, + ); +} /// The entry to Rust, all things must be initialized unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! { @@ -173,28 +170,20 @@ pub struct KernelArgsAp { } // FIXME use extern "custom" -unsafe extern "C" { - pub fn kstart_ap(); -} - -#[cfg(target_arch = "x86")] -global_asm!(" - .globl kstart_ap - kstart_ap: +#[unsafe(naked)] +pub extern "C" fn kstart_ap() { + naked_asm!( + #[cfg(target_arch = "x86")] + " mov esp, dword ptr [edi + {args_stack}] mov [esp + 4], edi mov [esp + 8], esp jmp {start_ap} ", - args_stack = const offset_of!(KernelArgsAp, stack_end), - start_ap = sym start_ap, -); -#[cfg(target_arch = "x86_64")] -global_asm!(" - .globl kstart_ap - kstart_ap: + #[cfg(target_arch = "x86_64")] + " // Note: The System V ABI requires the stack to be aligned to 16 bytes // before the call instruction. As we jump rather than call it has to // be offset by 8 bytes. Additionally reserve a bit more space at the @@ -205,9 +194,11 @@ global_asm!(" jmp {start_ap} ", - args_stack = const offset_of!(KernelArgsAp, stack_end), - start_ap = sym start_ap, -); + + args_stack = const offset_of!(KernelArgsAp, stack_end), + start_ap = sym start_ap, + ); +} /// Entry to rust for an AP unsafe extern "C" fn start_ap(args_ptr: *const KernelArgsAp) -> ! { diff --git a/src/main.rs b/src/main.rs index 5160477a57..399a2137ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,6 +40,7 @@ // Ensure that all must_use results are used #![deny(unused_must_use)] #![warn(static_mut_refs)] // FIXME deny once all occurrences are fixed +#![feature(asm_cfg)] // Stabilized in 1.93 #![feature(if_let_guard)] #![feature(int_roundings)] #![feature(iter_next_chunk)]