|
|
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.