Files
RedBear-OS/src/arch/x86_shared/ipi.rs
T
2024-07-15 17:48:46 +02:00

56 lines
1.3 KiB
Rust

#[derive(Clone, Copy, Debug)]
#[repr(u8)]
pub enum IpiKind {
Wakeup = 0x40,
Tlb = 0x41,
Switch = 0x42,
Pit = 0x43,
#[cfg(feature = "profiling")]
Profile = 0x44,
}
#[derive(Clone, Copy, Debug)]
#[repr(u8)]
pub enum IpiTarget {
Current = 1,
All = 2,
Other = 3,
}
#[cfg(not(feature = "multi_core"))]
#[inline(always)]
pub fn ipi(_kind: IpiKind, _target: IpiTarget) {}
#[cfg(feature = "multi_core")]
#[inline(always)]
pub fn ipi(kind: IpiKind, target: IpiTarget) {
use crate::device::local_apic::the_local_apic;
#[cfg(feature = "profiling")]
if matches!(kind, IpiKind::Profile) {
let icr = (target as u64) << 18 | 1 << 14 | 0b100 << 8;
unsafe { the_local_apic().set_icr(icr) };
return;
}
let icr = (target as u64) << 18 | 1 << 14 | (kind as u64);
unsafe { the_local_apic().set_icr(icr) };
}
use crate::cpu_set::LogicalCpuId;
#[cfg(feature = "multi_core")]
#[inline(always)]
pub fn ipi_single(kind: IpiKind, target: LogicalCpuId) {
use crate::device::local_apic::the_local_apic;
unsafe {
// TODO: Distinguish between logical and physical CPU IDs
the_local_apic().ipi(target.get(), kind);
}
}
#[cfg(not(feature = "multi_core"))]
#[inline(always)]
pub fn ipi_single(_kind: IpiKind, _target: LogicalCpuId) {}