Fix SoftIRQ initialization requirements for SMP

This commit is contained in:
Zhang Junyang 2024-08-26 15:49:06 +08:00 committed by Tate, Hongliang Tian
parent d499c1592d
commit aeba7bec52
6 changed files with 14 additions and 20 deletions

7
Cargo.lock generated
View File

@ -54,12 +54,6 @@ dependencies = [
"spinning_top",
]
[[package]]
name = "array-init"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
[[package]]
name = "arrayvec"
version = "0.5.2"
@ -1050,7 +1044,6 @@ dependencies = [
"acpi",
"align_ext",
"aml",
"array-init",
"bit_field",
"bitflags 1.3.2",
"bitvec",

View File

@ -16,7 +16,6 @@ targets = ["x86_64-unknown-none"]
[dependencies]
align_ext = { path = "libs/align_ext", version = "0.1.0" }
array-init = "2.0"
bit_field = "0.10.1"
buddy_system_allocator = "0.9.0"
bitflags = "1.3"

View File

@ -15,7 +15,6 @@ use crate::{
page::{self, meta::KernelMeta, ContPages},
PAGE_SIZE,
},
trap,
};
pub(crate) static AP_BOOT_INFO: Once<ApBootInfo> = Once::new();
@ -120,7 +119,10 @@ fn ap_early_entry(local_apic_id: u32) -> ! {
cpu::set_this_cpu_id(local_apic_id);
}
trap::init();
// SAFETY: this function is only called once on this AP.
unsafe {
trapframe::init();
}
crate::arch::irq::enable_local();
// Mark the AP as started.

View File

@ -86,7 +86,9 @@ pub unsafe fn init() {
mm::kspace::init_kernel_page_table(mm::init_page_meta());
mm::misc_init();
trap::init();
trapframe::init();
// SAFETY: This function is called only once in the entire system.
unsafe { trap::softirq::init() };
arch::init_on_bsp();
bus::init();

View File

@ -12,10 +12,3 @@ pub use trapframe::TrapFrame;
pub(crate) use self::handler::call_irq_callback_functions;
pub use self::irq::{disable_local, DisabledLocalIrqGuard, IrqCallbackFunction, IrqLine};
pub(crate) fn init() {
unsafe {
trapframe::init();
}
softirq::init();
}

View File

@ -95,9 +95,14 @@ impl SoftIrqLine {
/// A slice that stores the [`SoftIrqLine`]s, whose ID is equal to its offset in the slice.
static LINES: Once<[SoftIrqLine; SoftIrqLine::NR_LINES as usize]> = Once::new();
pub(super) fn init() {
/// Initializes the softirq lines.
///
/// # Safety
///
/// This function must be called only once.
pub unsafe fn init() {
let lines: [SoftIrqLine; SoftIrqLine::NR_LINES as usize] =
array_init::array_init(|i| SoftIrqLine::new(i as u8));
core::array::from_fn(|i| SoftIrqLine::new(i as u8));
LINES.call_once(|| lines);
}