mirror of
https://github.com/rdmsr/zag.git
synced 2026-11-01 15:48:21 +00:00
fix(ke/um): implement IPL correctly
This commit is contained in:
+21
-12
@@ -22,28 +22,37 @@ fn set_signals(enabled: bool) bool {
|
|||||||
return c.sigismember(&oldmask, c.SIGUSR1) == 0;
|
return c.sigismember(&oldmask, c.SIGUSR1) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the hardware IPL.
|
threadlocal var hardware_ipl: ke.Ipl = .Passive;
|
||||||
|
threadlocal var interrupts_enabled: bool = true;
|
||||||
|
|
||||||
pub fn set_hardware_ipl(ipl: ke.Ipl) void {
|
pub fn set_hardware_ipl(ipl: ke.Ipl) void {
|
||||||
if (@intFromEnum(ipl) > @intFromEnum(ke.Ipl.get_max_software())) {
|
hardware_ipl = ipl;
|
||||||
_ = disable_interrupts();
|
update_signals();
|
||||||
} else {
|
|
||||||
_ = enable_interrupts();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Disable interrupts and return the previous state.
|
|
||||||
pub fn disable_interrupts() bool {
|
pub fn disable_interrupts() bool {
|
||||||
return set_signals(false);
|
const old = interrupts_enabled;
|
||||||
|
interrupts_enabled = false;
|
||||||
|
update_signals();
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enable interrupts and return the previous state.
|
|
||||||
pub fn enable_interrupts() bool {
|
pub fn enable_interrupts() bool {
|
||||||
return set_signals(true);
|
const old = interrupts_enabled;
|
||||||
|
interrupts_enabled = true;
|
||||||
|
update_signals();
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Restore an interrupt state.
|
|
||||||
pub fn restore_interrupts(val: bool) void {
|
pub fn restore_interrupts(val: bool) void {
|
||||||
_ = set_signals(val);
|
interrupts_enabled = val;
|
||||||
|
update_signals();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_signals() void {
|
||||||
|
const should_enable = interrupts_enabled and
|
||||||
|
@intFromEnum(hardware_ipl) <= @intFromEnum(ke.Ipl.get_max_software());
|
||||||
|
_ = set_signals(should_enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_resched_ipi(cpu: u32) void {
|
pub fn send_resched_ipi(cpu: u32) void {
|
||||||
|
|||||||
Reference in New Issue
Block a user