diff options
Diffstat (limited to 'pfinet/asm')
-rw-r--r-- | pfinet/asm/system.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pfinet/asm/system.h b/pfinet/asm/system.h index e69de29b..a631c91e 100644 --- a/pfinet/asm/system.h +++ b/pfinet/asm/system.h @@ -0,0 +1,48 @@ +#include <cthreads.h> + +/* This lock is held when "interrupts" are disabled. */ +extern struct mutex global_interrupt_lock; + +/* Save the "processor state" in the longword FLAGS. */ +/* We define 1 to mean that global_interrupt_lock is held. */ + +#define save_flags(x) _real_save_flags (&x) +extern inline void +_real_save_flags (u_long *flagsword) +{ + int locked; + + locked = !mutex_try_lock (&global_interrupt_lock); + if (!locked) + mutex_unlock (&global_interrupt_lock); + *flagsword = locked; +} + +/* Restore state saved in FLAGS. */ +extern inline void +restore_flags (u_long flags) +{ + if (flags) + mutex_try_lock (&global_interrupt_lock); + else + mutex_unlock (&global_interrupt_lock); +} + +/* Prevent "interrupts" from happening. */ +extern inline void +cli () +{ + mutex_try_lock (&global_interrupt_lock); +} + +/* Permit "interrupts". */ +extern inline void +sti () +{ + mutex_unlock (&global_interrupt_lock); +} + + + + + |