|
|
1.1 ! root 1: #include <oskit/dev/dev.h> ! 2: ! 3: #include <machine/spl.h> ! 4: #include "ds_oskit.h" ! 5: ! 6: extern spl_t curr_ipl; ! 7: ! 8: /* ! 9: * Enable/disable interrupts. ! 10: */ ! 11: ! 12: static spl_t osenv_intr_spl; ! 13: ! 14: void ! 15: osenv_intr_disable(void) ! 16: { ! 17: /* We can be called with interrupts already disabled! */ ! 18: if (curr_ipl > SPLIO) ! 19: /* We are already at higher priority than oskit code normally runs. ! 20: I think this only happens in the calls from oskit_rtc_{get,set}. ! 21: On the assumption that osenv_intr_enable will be called in ! 22: parity from the same interrupt level, we will want to stay at the ! 23: same high interrupt level. */ ! 24: osenv_intr_spl = curr_ipl; ! 25: else if (curr_ipl < SPLIO) ! 26: /* We are at a level where oskit interrupts are enabled, so we must go ! 27: to splio. osenv_intr_enable we will return to the current level. */ ! 28: osenv_intr_spl = splio (); ! 29: } ! 30: ! 31: void ! 32: osenv_intr_enable(void) ! 33: { ! 34: /* We assume we are at splio or higher. */ ! 35: spl_t s = osenv_intr_spl; ! 36: osenv_intr_spl = SPL0; ! 37: splx (s); ! 38: } ! 39: ! 40: /* ! 41: * Return the current interrupt enable flag. ! 42: */ ! 43: int ! 44: osenv_intr_enabled(void) ! 45: { ! 46: return curr_ipl < SPLIO; ! 47: } ! 48: ! 49: /* ! 50: * Disable interrupts returning the old value. Combo of: ! 51: * save = osenv_intr_enabled(); ! 52: * osenv_intr_disable(); ! 53: */ ! 54: int ! 55: osenv_intr_save_disable(void) ! 56: { ! 57: if (osenv_intr_enabled ()) ! 58: { ! 59: osenv_intr_disable (); ! 60: return 1; ! 61: } ! 62: return 0; ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.