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