49,6 → 49,7 |
#include <interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <ipc/irq.h> |
#include <generic/synch/rcu.h> |
|
/* Keyboard commands. */ |
#define KBD_ENABLE 0xf4 |
107,13 → 108,11 |
i8042_data_write(i8042_COMMAND); |
i8042_wait(); |
|
spinlock_lock(&i8042_kbd_irq.lock); |
i8042_kbd_irq.notif_cfg.notify = false; |
spinlock_unlock(&i8042_kbd_irq.lock); |
//rcu_read_lock() is not needed, ints are disabled |
//rcu: atomic update doesn't need reallocation |
rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = false; |
|
spinlock_lock(&i8042_mouse_irq.lock); |
i8042_mouse_irq.notif_cfg.notify = false; |
spinlock_unlock(&i8042_mouse_irq.lock); |
rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = false; |
|
interrupts_restore(ipl); |
} |
121,15 → 120,15 |
void i8042_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
|
//rcu: atomic update doesn't need reallocation |
spinlock_lock(&i8042_kbd_irq.lock); |
if (i8042_kbd_irq.notif_cfg.answerbox) |
i8042_kbd_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = true; |
spinlock_unlock(&i8042_kbd_irq.lock); |
|
spinlock_lock(&i8042_mouse_irq.lock); |
if (i8042_mouse_irq.notif_cfg.answerbox) |
i8042_mouse_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = true; |
spinlock_unlock(&i8042_mouse_irq.lock); |
|
interrupts_restore(ipl); |
142,7 → 141,7 |
|
static void i8042_kbd_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox) |
ipc_irq_send_notif(irq); |
else { |
uint8_t x; |
164,7 → 163,7 |
|
static void i8042_mouse_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox) |
ipc_irq_send_notif(irq); |
} |
|