diff options
author | 2015-09-10 18:14:52 +0000 | |
---|---|---|
committer | 2015-09-10 18:14:52 +0000 | |
commit | ad68075f1425411d53e481d1eb8a53b3bde01912 (patch) | |
tree | 36be6ce4ac31495074a15ed55b9eeb8b4d94c8a4 | |
parent | Pull in namespace.h when building all .c files using gcc's -include option, (diff) | |
download | wireguard-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.c | 65 | ||||
-rw-r--r-- | sys/dev/wscons/wseventvar.h | 3 | ||||
-rw-r--r-- | sys/dev/wscons/wskbd.c | 12 | ||||
-rw-r--r-- | sys/dev/wscons/wsmouse.c | 12 | ||||
-rw-r--r-- | sys/dev/wscons/wsmux.c | 12 | ||||
-rw-r--r-- | sys/sys/conf.h | 6 |
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) { \ |