summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2015-09-10 18:14:52 +0000
committermpi <mpi@openbsd.org>2015-09-10 18:14:52 +0000
commitad68075f1425411d53e481d1eb8a53b3bde01912 (patch)
tree36be6ce4ac31495074a15ed55b9eeb8b4d94c8a4
parentPull in namespace.h when building all .c files using gcc's -include option, (diff)
downloadwireguard-openbsd-ad68075f1425411d53e481d1eb8a53b3bde01912.tar.xz
wireguard-openbsd-ad68075f1425411d53e481d1eb8a53b3bde01912.zip
kqueue(2) support for wsmouse(4), wskbd(4) and wsmux(4).
Needed for libinput port. ok guenther@, miod@
-rw-r--r--sys/dev/wscons/wsevent.c65
-rw-r--r--sys/dev/wscons/wseventvar.h3
-rw-r--r--sys/dev/wscons/wskbd.c12
-rw-r--r--sys/dev/wscons/wsmouse.c12
-rw-r--r--sys/dev/wscons/wsmux.c12
-rw-r--r--sys/sys/conf.h6
6 files changed, 102 insertions, 8 deletions
diff --git a/sys/dev/wscons/wsevent.c b/sys/dev/wscons/wsevent.c
index 94b5ba15f99..cb4f00d2df0 100644
--- a/sys/dev/wscons/wsevent.c
+++ b/sys/dev/wscons/wsevent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsevent.c,v 1.13 2015/03/14 03:38:50 jsg Exp $ */
+/* $OpenBSD: wsevent.c,v 1.14 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: wsevent.c,v 1.16 2003/08/07 16:31:29 agc Exp $ */
/*
@@ -85,6 +85,16 @@
#include <dev/wscons/wsconsio.h>
#include <dev/wscons/wseventvar.h>
+void filt_wseventdetach(struct knote *);
+int filt_wseventread(struct knote *, long);
+
+const struct filterops wsevent_filtops = {
+ 1,
+ NULL,
+ filt_wseventdetach,
+ filt_wseventread
+};
+
/*
* Initialize a wscons_event queue.
*/
@@ -194,3 +204,56 @@ wsevent_poll(struct wseventvar *ev, int events, struct proc *p)
splx(s);
return (revents);
}
+
+int
+wsevent_kqfilter(struct wseventvar *ev, struct knote *kn)
+{
+ struct klist *klist;
+ int s;
+
+ klist = &ev->sel.si_note;
+
+ switch (kn->kn_filter) {
+ case EVFILT_READ:
+ kn->kn_fop = &wsevent_filtops;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ kn->kn_hook = ev;
+
+ s = splwsevent();
+ SLIST_INSERT_HEAD(klist, kn, kn_selnext);
+ splx(s);
+
+ return (0);
+}
+
+void
+filt_wseventdetach(struct knote *kn)
+{
+ struct wseventvar *ev = kn->kn_hook;
+ struct klist *klist = &ev->sel.si_note;
+ int s;
+
+ s = splwsevent();
+ SLIST_REMOVE(klist, kn, knote, kn_selnext);
+ splx(s);
+}
+
+int
+filt_wseventread(struct knote *kn, long hint)
+{
+ struct wseventvar *ev = kn->kn_hook;
+
+ if (ev->get == ev->put)
+ return (0);
+
+ if (ev->get < ev->put)
+ kn->kn_data = ev->put - ev->get;
+ else
+ kn->kn_data = (WSEVENT_QSIZE - ev->get) + ev->put;
+
+ return (1);
+}
diff --git a/sys/dev/wscons/wseventvar.h b/sys/dev/wscons/wseventvar.h
index 213ffc93a66..f959486c9ee 100644
--- a/sys/dev/wscons/wseventvar.h
+++ b/sys/dev/wscons/wseventvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: wseventvar.h,v 1.7 2010/07/26 01:56:27 guenther Exp $ */
+/* $OpenBSD: wseventvar.h,v 1.8 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: wseventvar.h,v 1.1 1998/03/22 14:24:03 drochner Exp $ */
/*
@@ -106,6 +106,7 @@ void wsevent_init(struct wseventvar *);
void wsevent_fini(struct wseventvar *);
int wsevent_read(struct wseventvar *, struct uio *, int);
int wsevent_poll(struct wseventvar *, int, struct proc *);
+int wsevent_kqfilter(struct wseventvar *, struct knote *);
/*
* PWSEVENT is set just above PSOCK, which is just above TTIPRI, on the
diff --git a/sys/dev/wscons/wskbd.c b/sys/dev/wscons/wskbd.c
index ea36d9d21e5..36a50a10d5b 100644
--- a/sys/dev/wscons/wskbd.c
+++ b/sys/dev/wscons/wskbd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wskbd.c,v 1.81 2014/12/13 21:05:33 doug Exp $ */
+/* $OpenBSD: wskbd.c,v 1.82 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: wskbd.c,v 1.80 2005/05/04 01:52:16 augustss Exp $ */
/*
@@ -1195,6 +1195,16 @@ wskbdpoll(dev_t dev, int events, struct proc *p)
return (wsevent_poll(sc->sc_base.me_evp, events, p));
}
+int
+wskbdkqfilter(dev_t dev, struct knote *kn)
+{
+ struct wskbd_softc *sc = wskbd_cd.cd_devs[minor(dev)];
+
+ if (sc->sc_base.me_evp == NULL)
+ return (ENXIO);
+ return (wsevent_kqfilter(sc->sc_base.me_evp, kn));
+}
+
#if NWSDISPLAY > 0
int
diff --git a/sys/dev/wscons/wsmouse.c b/sys/dev/wscons/wsmouse.c
index 80d08058039..c3b907ae1df 100644
--- a/sys/dev/wscons/wsmouse.c
+++ b/sys/dev/wscons/wsmouse.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsmouse.c,v 1.27 2015/03/14 03:38:50 jsg Exp $ */
+/* $OpenBSD: wsmouse.c,v 1.28 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: wsmouse.c,v 1.35 2005/02/27 00:27:52 perry Exp $ */
/*
@@ -686,6 +686,16 @@ wsmousepoll(dev_t dev, int events, struct proc *p)
return (wsevent_poll(sc->sc_base.me_evp, events, p));
}
+int
+wsmousekqfilter(dev_t dev, struct knote *kn)
+{
+ struct wsmouse_softc *sc = wsmouse_cd.cd_devs[minor(dev)];
+
+ if (sc->sc_base.me_evp == NULL)
+ return (ENXIO);
+ return (wsevent_kqfilter(sc->sc_base.me_evp, kn));
+}
+
#if NWSMUX > 0
int
wsmouse_mux_open(struct wsevsrc *me, struct wseventvar *evp)
diff --git a/sys/dev/wscons/wsmux.c b/sys/dev/wscons/wsmux.c
index c1a3f978fac..90c7b20d3a6 100644
--- a/sys/dev/wscons/wsmux.c
+++ b/sys/dev/wscons/wsmux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsmux.c,v 1.30 2015/08/28 00:03:53 deraadt Exp $ */
+/* $OpenBSD: wsmux.c,v 1.31 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: wsmux.c,v 1.37 2005/04/30 03:47:12 augustss Exp $ */
/*
@@ -542,6 +542,16 @@ wsmuxpoll(dev_t dev, int events, struct proc *p)
return (wsevent_poll(sc->sc_base.me_evp, events, p));
}
+int
+wsmuxkqfilter(dev_t dev, struct knote *kn)
+{
+ struct wsmux_softc *sc = wsmuxdevs[minor(dev)];
+
+ if (sc->sc_base.me_evp == NULL)
+ return (ENXIO);
+ return (wsevent_kqfilter(sc->sc_base.me_evp, kn));
+}
+
/*
* Add mux unit as a child to muxsc.
*/
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index fddc4bbd1d2..9c0907b7232 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: conf.h,v 1.133 2015/06/25 06:43:46 ratchov Exp $ */
+/* $OpenBSD: conf.h,v 1.134 2015/09/10 18:14:52 mpi Exp $ */
/* $NetBSD: conf.h,v 1.33 1996/05/03 20:03:32 christos Exp $ */
/*-
@@ -195,12 +195,12 @@ extern struct cdevsw cdevsw[];
dev_init(c,n,tty), ttpoll, (dev_type_mmap((*))) enodev, \
D_TTY, 0, ttkqfilter }
-/* open, close, read, ioctl, poll, nokqfilter */
+/* open, close, read, ioctl, poll, kqfilter */
#define cdev_mouse_init(c,n) { \
dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
- (dev_type_mmap((*))) enodev }
+ (dev_type_mmap((*))) enodev , 0, 0, dev_init(c,n,kqfilter) }
/* open, close, read, write, ioctl, poll, nokqfilter */
#define cdev_mousewr_init(c,n) { \