From f4bdb5388e5437df7d419ac2ce11b78733899109 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Thu, 27 Jul 2023 16:44:52 +0200 Subject: [PATCH] Remove AtomicU64 requirement for starting APs. --- src/acpi/madt.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/acpi/madt.rs b/src/acpi/madt.rs index 64d7c06fbb..a46a5fdc66 100644 --- a/src/acpi/madt.rs +++ b/src/acpi/madt.rs @@ -6,7 +6,7 @@ use crate::paging::{KernelMapper, Page, PageFlags, PhysicalAddress, RmmA, RmmArc use super::sdt::Sdt; use super::find_sdt; -use core::sync::atomic::{AtomicU8, AtomicU64, Ordering}; +use core::sync::atomic::{AtomicU8, Ordering}; use crate::device::local_apic::LOCAL_APIC; use crate::interrupt; @@ -91,24 +91,24 @@ impl Madt { let stack_start = allocate_frames(64).expect("no more frames in acpi stack_start").start_address().data() + crate::PHYS_OFFSET; let stack_end = stack_start + 64 * 4096; - let ap_ready = (TRAMPOLINE + 8) as *const AtomicU64; - let ap_cpu_id = unsafe { ap_ready.offset(1) }; - let ap_page_table = unsafe { ap_ready.offset(2) }; - let ap_stack_start = unsafe { ap_ready.offset(3) }; - let ap_stack_end = unsafe { ap_ready.offset(4) }; - let ap_code = unsafe { ap_ready.offset(5) }; + let ap_ready = (TRAMPOLINE + 8) as *mut u64; + let ap_cpu_id = unsafe { ap_ready.add(1) }; + let ap_page_table = unsafe { ap_ready.add(2) }; + let ap_stack_start = unsafe { ap_ready.add(3) }; + let ap_stack_end = unsafe { ap_ready.add(4) }; + let ap_code = unsafe { ap_ready.add(5) }; // Set the ap_ready to 0, volatile unsafe { - (*ap_ready).store(0, Ordering::SeqCst); - (*ap_cpu_id) - .store(ap_local_apic.id as u64, Ordering::SeqCst); - (*ap_page_table) - .store(page_table_physaddr as u64, Ordering::SeqCst); - (*ap_stack_start) - .store(stack_start as u64, Ordering::SeqCst); - (*ap_stack_end).store(stack_end as u64, Ordering::SeqCst); - (*ap_code).store(kstart_ap as u64, Ordering::SeqCst); + ap_ready.write(0); + ap_cpu_id.write(ap_local_apic.id.into()); + ap_page_table.write(page_table_physaddr as u64); + ap_stack_start.write(stack_start as u64); + ap_stack_end.write(stack_end as u64); + ap_code.write(kstart_ap as u64); + + // TODO: Is this necessary (this fence)? + core::arch::asm!(""); }; AP_READY.store(false, Ordering::SeqCst); @@ -144,7 +144,7 @@ impl Madt { // Wait for trampoline ready print!(" Wait..."); - while unsafe { (*ap_ready).load(Ordering::SeqCst) } == 0 { + while unsafe { (*ap_ready.cast::()).load(Ordering::SeqCst) } == 0 { interrupt::pause(); } print!(" Trampoline...");