Be more careful how we restore interrupts. Don't rewrite most of the

PSR only to achieve setting PSR.i back to it's previous value. It
makes it impossible to change any of the 30+ other unrelated bits
when done between intr_disable() and intr_restore(). That's bad.

Instead have intr_disable() return 1 when interrupts were previously
enabled and 0 otherwise and only enable interrupts in intr_restore()
when given a non-0 value.

This change specifically disallows using intr_restore() to disable
interrupts. The reason is simple: interrupts only need to be restored
after they are being disabled, which means that intr_restore() is
called with interrupts disabled and we only need to enable them if
they were previously enabled.

This change does not fix any bugs, other than that it bugged me...

Approved by: re@ (blanket)
This commit is contained in:
marcel 2003-05-24 21:44:24 +00:00
parent 7b4ed28b3c
commit d19c2253df

View File

@ -193,13 +193,14 @@ intr_disable(void)
register_t psr;
__asm __volatile ("mov %0=psr;;" : "=r"(psr));
disable_intr();
return (psr);
return ((psr & IA64_PSR_I) ? 1 : 0);
}
static __inline void
intr_restore(critical_t psr)
intr_restore(register_t ie)
{
__asm __volatile ("mov psr.l=%0;; srlz.d" :: "r"(psr));
if (ie)
enable_intr();
}
#endif /* _KERNEL */