Rev 2131 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2131 | Rev 2456 | ||
---|---|---|---|
Line 42... | Line 42... | ||
42 | #include <ddi/irq.h> |
42 | #include <ddi/irq.h> |
43 | #include <ipc/irq.h> |
43 | #include <ipc/irq.h> |
44 | #include <proc/thread.h> |
44 | #include <proc/thread.h> |
45 | #include <synch/spinlock.h> |
45 | #include <synch/spinlock.h> |
46 | #include <arch/asm.h> |
46 | #include <arch/asm.h> |
- | 47 | #include <synch/rcu.h> |
|
47 | 48 | ||
48 | #define SKI_KBD_INR 0 |
49 | #define SKI_KBD_INR 0 |
49 | 50 | ||
50 | static irq_t ski_kbd_irq; |
51 | static irq_t ski_kbd_irq; |
51 | static devno_t ski_kbd_devno; |
52 | static devno_t ski_kbd_devno; |
Line 140... | Line 141... | ||
140 | 141 | ||
141 | ch = ski_getchar(); |
142 | ch = ski_getchar(); |
142 | if(ch == '\r') |
143 | if(ch == '\r') |
143 | ch = '\n'; |
144 | ch = '\n'; |
144 | if (ch) { |
145 | if (ch) { |
145 | if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
146 | if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) { |
146 | chardev_push_character(&ski_uconsole, ch); |
147 | chardev_push_character(&ski_uconsole, ch); |
147 | ipc_irq_send_notif(&ski_kbd_irq); |
148 | ipc_irq_send_notif(&ski_kbd_irq); |
148 | } else { |
149 | } else { |
149 | chardev_push_character(&ski_console, ch); |
150 | chardev_push_character(&ski_console, ch); |
150 | } |
151 | } |
Line 153... | Line 154... | ||
153 | interrupts_restore(ipl); |
154 | interrupts_restore(ipl); |
154 | return; |
155 | return; |
155 | } |
156 | } |
156 | 157 | ||
157 | if (last) { |
158 | if (last) { |
158 | if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
159 | if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) { |
159 | chardev_push_character(&ski_uconsole, 0); |
160 | chardev_push_character(&ski_uconsole, 0); |
160 | ipc_irq_send_notif(&ski_kbd_irq); |
161 | ipc_irq_send_notif(&ski_kbd_irq); |
161 | } |
162 | } |
162 | last = 0; |
163 | last = 0; |
163 | } |
164 | } |
Line 230... | Line 231... | ||
230 | } |
231 | } |
231 | 232 | ||
232 | void ski_kbd_grab(void) |
233 | void ski_kbd_grab(void) |
233 | { |
234 | { |
234 | ipl_t ipl = interrupts_disable(); |
235 | ipl_t ipl = interrupts_disable(); |
235 | spinlock_lock(&ski_kbd_irq.lock); |
236 | //rcu_read_lock() is not needed, ints are disabled |
236 | ski_kbd_irq.notif_cfg.notify = false; |
237 | //rcu: atomic update doesn't need reallocation |
237 | spinlock_unlock(&ski_kbd_irq.lock); |
238 | rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = false; |
238 | interrupts_restore(ipl); |
239 | interrupts_restore(ipl); |
239 | } |
240 | } |
240 | 241 | ||
241 | void ski_kbd_release(void) |
242 | void ski_kbd_release(void) |
242 | { |
243 | { |
243 | ipl_t ipl = interrupts_disable(); |
244 | ipl_t ipl = interrupts_disable(); |
- | 245 | //rcu: atomic update doesn't need reallocation |
|
244 | spinlock_lock(&ski_kbd_irq.lock); |
246 | spinlock_lock(&ski_kbd_irq.lock); |
245 | if (ski_kbd_irq.notif_cfg.answerbox) |
247 | if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) |
246 | ski_kbd_irq.notif_cfg.notify = true; |
248 | rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = true; |
247 | spinlock_unlock(&ski_kbd_irq.lock); |
249 | spinlock_unlock(&ski_kbd_irq.lock); |
248 | interrupts_restore(ipl); |
250 | interrupts_restore(ipl); |
249 | } |
251 | } |
250 | 252 | ||
251 | 253 |