123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #define SPL_INLINE
- #include <types.h>
- #include <lib.h>
- #include <cpu.h>
- #include <spl.h>
- #include <thread.h>
- #include <current.h>
- void
- splraise(int oldspl, int newspl)
- {
- struct thread *cur = curthread;
-
- KASSERT(oldspl == IPL_NONE);
- KASSERT(newspl == IPL_HIGH);
- if (!CURCPU_EXISTS()) {
-
- return;
- }
- if (cur->t_iplhigh_count == 0) {
- cpu_irqoff();
- }
- cur->t_iplhigh_count++;
- }
- void
- spllower(int oldspl, int newspl)
- {
- struct thread *cur = curthread;
-
- KASSERT(oldspl == IPL_HIGH);
- KASSERT(newspl == IPL_NONE);
- if (!CURCPU_EXISTS()) {
-
- return;
- }
- cur->t_iplhigh_count--;
- if (cur->t_iplhigh_count == 0) {
- cpu_irqon();
- }
- }
- int
- splx(int spl)
- {
- struct thread *cur = curthread;
- int ret;
- if (cur->t_curspl < spl) {
-
- splraise(cur->t_curspl, spl);
- ret = cur->t_curspl;
- cur->t_curspl = spl;
- }
- else if (cur->t_curspl > spl) {
-
- ret = cur->t_curspl;
- cur->t_curspl = spl;
- spllower(ret, spl);
- }
- else {
-
- ret = spl;
- }
- return ret;
- }
|