sigio.c 957 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
  4. */
  5. #include <linux/interrupt.h>
  6. #include <irq_kern.h>
  7. #include <os.h>
  8. #include <sigio.h>
  9. /* Protected by sigio_lock() called from write_sigio_workaround */
  10. static int sigio_irq_fd = -1;
  11. static irqreturn_t sigio_interrupt(int irq, void *data)
  12. {
  13. char c;
  14. os_read_file(sigio_irq_fd, &c, sizeof(c));
  15. return IRQ_HANDLED;
  16. }
  17. int write_sigio_irq(int fd)
  18. {
  19. int err;
  20. err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
  21. 0, "write sigio", NULL);
  22. if (err) {
  23. printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
  24. "err = %d\n", err);
  25. return -1;
  26. }
  27. sigio_irq_fd = fd;
  28. return 0;
  29. }
  30. /* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
  31. static DEFINE_MUTEX(sigio_mutex);
  32. void sigio_lock(void)
  33. {
  34. mutex_lock(&sigio_mutex);
  35. }
  36. void sigio_unlock(void)
  37. {
  38. mutex_unlock(&sigio_mutex);
  39. }