diff --git a/src/arch/aarch64/interrupt/mod.rs b/src/arch/aarch64/interrupt/mod.rs index d5a26c8bcf..42b7da824d 100644 --- a/src/arch/aarch64/interrupt/mod.rs +++ b/src/arch/aarch64/interrupt/mod.rs @@ -48,3 +48,15 @@ pub unsafe fn halt() { pub fn pause() { unsafe { asm!("nop") }; } + +#[inline(always)] +pub unsafe fn init() { + // Setup interrupt handlers + asm!( + " + ldr {tmp}, =exception_vector_base + msr vbar_el1, {tmp} + ", + tmp = out(reg) _, + ); +} diff --git a/src/arch/aarch64/start.rs b/src/arch/aarch64/start.rs index ec0641bc39..0d9b4fb426 100644 --- a/src/arch/aarch64/start.rs +++ b/src/arch/aarch64/start.rs @@ -12,7 +12,9 @@ use fdt::Fdt; use log::info; use crate::{ - allocator, device, dtb, + allocator, + arch::interrupt, + device, dtb, dtb::register_dev_memory_ranges, paging, startup::memory::{register_bootloader_areas, register_memory_region, BootloaderMemoryKind}, @@ -149,14 +151,7 @@ pub unsafe extern "C" fn kstart(args_ptr: *const KernelArgs) -> ! { args.bootstrap_base + args.bootstrap_size ); - // Setup interrupt handlers - core::arch::asm!( - " - ldr {tmp}, =exception_vector_base - msr vbar_el1, {tmp} - ", - tmp = out(reg) _, - ); + interrupt::init(); // Initialize RMM register_bootloader_areas(args.areas_base, args.areas_size); diff --git a/src/arch/riscv64/interrupt/mod.rs b/src/arch/riscv64/interrupt/mod.rs index 761440046b..a838690900 100644 --- a/src/arch/riscv64/interrupt/mod.rs +++ b/src/arch/riscv64/interrupt/mod.rs @@ -53,6 +53,7 @@ pub fn pause() { } } +#[inline(always)] pub unsafe fn init() { // Setup interrupt handlers asm!(