mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-14 15:56:47 +00:00
Fix SoftIRQ initialization requirements for SMP
This commit is contained in:
parent
d499c1592d
commit
aeba7bec52
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -54,12 +54,6 @@ dependencies = [
|
|||||||
"spinning_top",
|
"spinning_top",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "array-init"
|
|
||||||
version = "2.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
@ -1050,7 +1044,6 @@ dependencies = [
|
|||||||
"acpi",
|
"acpi",
|
||||||
"align_ext",
|
"align_ext",
|
||||||
"aml",
|
"aml",
|
||||||
"array-init",
|
|
||||||
"bit_field",
|
"bit_field",
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"bitvec",
|
"bitvec",
|
||||||
|
@ -16,7 +16,6 @@ targets = ["x86_64-unknown-none"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
align_ext = { path = "libs/align_ext", version = "0.1.0" }
|
align_ext = { path = "libs/align_ext", version = "0.1.0" }
|
||||||
array-init = "2.0"
|
|
||||||
bit_field = "0.10.1"
|
bit_field = "0.10.1"
|
||||||
buddy_system_allocator = "0.9.0"
|
buddy_system_allocator = "0.9.0"
|
||||||
bitflags = "1.3"
|
bitflags = "1.3"
|
||||||
|
@ -15,7 +15,6 @@ use crate::{
|
|||||||
page::{self, meta::KernelMeta, ContPages},
|
page::{self, meta::KernelMeta, ContPages},
|
||||||
PAGE_SIZE,
|
PAGE_SIZE,
|
||||||
},
|
},
|
||||||
trap,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) static AP_BOOT_INFO: Once<ApBootInfo> = Once::new();
|
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);
|
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();
|
crate::arch::irq::enable_local();
|
||||||
|
|
||||||
// Mark the AP as started.
|
// Mark the AP as started.
|
||||||
|
@ -86,7 +86,9 @@ pub unsafe fn init() {
|
|||||||
mm::kspace::init_kernel_page_table(mm::init_page_meta());
|
mm::kspace::init_kernel_page_table(mm::init_page_meta());
|
||||||
mm::misc_init();
|
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();
|
arch::init_on_bsp();
|
||||||
|
|
||||||
bus::init();
|
bus::init();
|
||||||
|
@ -12,10 +12,3 @@ pub use trapframe::TrapFrame;
|
|||||||
|
|
||||||
pub(crate) use self::handler::call_irq_callback_functions;
|
pub(crate) use self::handler::call_irq_callback_functions;
|
||||||
pub use self::irq::{disable_local, DisabledLocalIrqGuard, IrqCallbackFunction, IrqLine};
|
pub use self::irq::{disable_local, DisabledLocalIrqGuard, IrqCallbackFunction, IrqLine};
|
||||||
|
|
||||||
pub(crate) fn init() {
|
|
||||||
unsafe {
|
|
||||||
trapframe::init();
|
|
||||||
}
|
|
||||||
softirq::init();
|
|
||||||
}
|
|
||||||
|
@ -95,9 +95,14 @@ impl SoftIrqLine {
|
|||||||
/// A slice that stores the [`SoftIrqLine`]s, whose ID is equal to its offset in the slice.
|
/// 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();
|
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] =
|
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);
|
LINES.call_once(|| lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user