diff --git a/src/device/arm/arm.go b/src/device/arm/arm.go index ac11199e..a806bbc6 100644 --- a/src/device/arm/arm.go +++ b/src/device/arm/arm.go @@ -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.