1/* 2 * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) 3 * Licensed under the GPL 4 */ 5 6#include "linux/kernel.h" 7#include "linux/list.h" 8#include "linux/slab.h" 9#include "linux/signal.h" 10#include "linux/interrupt.h" 11#include "init.h" 12#include "sigio.h" 13#include "irq_user.h" 14#include "irq_kern.h" 15#include "os.h" 16 17/* Protected by sigio_lock() called from write_sigio_workaround */ 18static int sigio_irq_fd = -1; 19 20static irqreturn_t sigio_interrupt(int irq, void *data) 21{ 22 char c; 23 24 os_read_file(sigio_irq_fd, &c, sizeof(c)); 25 reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); 26 return IRQ_HANDLED; 27} 28 29int write_sigio_irq(int fd) 30{ 31 int err; 32 33 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt, 34 IRQF_DISABLED|IRQF_SAMPLE_RANDOM, "write sigio", 35 NULL); 36 if(err){ 37 printk("write_sigio_irq : um_request_irq failed, err = %d\n", 38 err); 39 return -1; 40 } 41 sigio_irq_fd = fd; 42 return 0; 43} 44 45/* These are called from os-Linux/sigio.c to protect its pollfds arrays. */ 46static DEFINE_SPINLOCK(sigio_spinlock); 47 48void sigio_lock(void) 49{ 50 spin_lock(&sigio_spinlock); 51} 52 53void sigio_unlock(void) 54{ 55 spin_unlock(&sigio_spinlock); 56} 57