arm: allow nesting in DisableInterrupts and EnableInterrupts

This finally fixes a TODO left in the code.
This commit is contained in:
Ayke van Laethem
2020-04-06 17:30:56 +02:00
committed by Ron Evans
parent 6389e45d99
commit 23e88bfb15
+9 -10
View File
@@ -191,22 +191,21 @@ func SetPriority(irq uint32, priority uint32) {
NVIC.IPR[regnum].Set((uint32(NVIC.IPR[regnum].Get()) &^ mask) | priority)
}
// DisableInterrupts disables all interrupts, and returns the old state.
//
// TODO: it doesn't actually return the old state, meaning that it cannot be
// nested.
// DisableInterrupts disables all interrupts, and returns the old interrupt
// state.
func DisableInterrupts() uintptr {
Asm("cpsid if")
return 0
return AsmFull(`
mrs {}, PRIMASK
cpsid if
`, nil)
}
// EnableInterrupts enables all interrupts again. The value passed in must be
// the mask returned by DisableInterrupts.
//
// TODO: it doesn't actually use the old state, meaning that it cannot be
// nested.
func EnableInterrupts(mask uintptr) {
Asm("cpsie if")
AsmFull("msr PRIMASK, {mask}", map[string]interface{}{
"mask": mask,
})
}
// SystemReset performs a hard system reset.