/branches/rcu/kernel/arch/ia64/src/ski/ski.c |
---|
44,6 → 44,7 |
#include <proc/thread.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
#include <synch/rcu.h> |
#define SKI_KBD_INR 0 |
142,7 → 143,7 |
if(ch == '\r') |
ch = '\n'; |
if (ch) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) { |
chardev_push_character(&ski_uconsole, ch); |
ipc_irq_send_notif(&ski_kbd_irq); |
} else { |
155,7 → 156,7 |
} |
if (last) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify && rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) { |
chardev_push_character(&ski_uconsole, 0); |
ipc_irq_send_notif(&ski_kbd_irq); |
} |
232,9 → 233,9 |
void ski_kbd_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&ski_kbd_irq.lock); |
ski_kbd_irq.notif_cfg.notify = false; |
spinlock_unlock(&ski_kbd_irq.lock); |
//rcu_read_lock() is not needed, ints are disabled |
//rcu: atomic update doesn't need reallocation |
rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = false; |
interrupts_restore(ipl); |
} |
241,9 → 242,10 |
void ski_kbd_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
//rcu: atomic update doesn't need reallocation |
spinlock_lock(&ski_kbd_irq.lock); |
if (ski_kbd_irq.notif_cfg.answerbox) |
ski_kbd_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(ski_kbd_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(ski_kbd_irq.notif_cfg).notify = true; |
spinlock_unlock(&ski_kbd_irq.lock); |
interrupts_restore(ipl); |
} |
/branches/rcu/kernel/arch/ppc32/src/drivers/cuda.c |
---|
41,6 → 41,7 |
#include <sysinfo/sysinfo.h> |
#include <interrupt.h> |
#include <stdarg.h> |
#include <synch/rcu.h> |
#define CUDA_IRQ 10 |
#define SPECIAL '?' |
249,7 → 250,7 |
static void cuda_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 { |
int scan_code = cuda_get_scancode(); |
272,9 → 273,9 |
void cuda_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&cuda_irq.lock); |
cuda_irq.notif_cfg.notify = false; |
spinlock_unlock(&cuda_irq.lock); |
//rcu_read_lock() is not needed, ints are disabled |
//rcu: atomic update doesn't need reallocation |
rcu_dereference_pointer(cuda_irq.notif_cfg).notify = false; |
interrupts_restore(ipl); |
} |
283,9 → 284,10 |
void cuda_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
//rcu: atomic update doesn't need reallocation |
spinlock_lock(&cuda_irq.lock); |
if (cuda_irq.notif_cfg.answerbox) |
cuda_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(cuda_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(cuda_irq.notif_cfg).notify = true; |
spinlock_unlock(&cuda_irq.unlock); |
interrupts_restore(ipl); |
} |
/branches/rcu/kernel/arch/mips32/src/drivers/serial.c |
---|
38,6 → 38,7 |
#include <arch/drivers/serial.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <synch/rcu.h> |
#define SERIAL_IRQ 2 |
112,7 → 113,7 |
/** Process keyboard interrupt. Does not work in simics? */ |
static void serial_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 |
serial_handler(); |
/branches/rcu/kernel/arch/mips32/src/drivers/msim.c |
---|
39,6 → 39,7 |
#include <arch/cp0.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
#include <synch/rcu.h> |
/** Address of devices. */ |
#define MSIM_VIDEORAM 0xB0000000 |
99,7 → 100,7 |
/** Process keyboard interrupt. */ |
static void msim_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 { |
char ch = 0; |
121,9 → 122,9 |
void msim_kbd_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&msim_irq.lock); |
msim_irq.notif_cfg.notify = false; |
spinlock_unlock(&msim_irq.lock); |
//rcu_read_lock() is not needed, ints are disabled |
//rcu: atomic update doesn't need reallocation |
rcu_dereference_pointer(msim_irq.notif_cfg).notify = false; |
interrupts_restore(ipl); |
} |
130,9 → 131,10 |
void msim_kbd_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
//rcu: atomic update doesn't need reallocation |
spinlock_lock(&msim_irq.lock); |
if (msim_irq.notif_cfg.answerbox) |
msim_irq.notif_cfg.notify = true; |
if (rcu_dereference_pointer(msim_irq.notif_cfg).answerbox) |
rcu_dereference_pointer(msim_irq.notif_cfg).notify = true; |
spinlock_unlock(&msim_irq.lock); |
interrupts_restore(ipl); |
} |