2 * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org>
3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@cicgroup.ru>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #include "opt_evdev.h"
32 #include <sys/types.h>
33 #include <sys/systm.h>
34 #include <sys/param.h>
35 #include <sys/fcntl.h>
36 #include <sys/kernel.h>
37 #include <sys/module.h>
42 #include <sys/selinfo.h>
43 #include <sys/malloc.h>
47 #include <dev/evdev/input.h>
48 #include <dev/evdev/uinput.h>
49 #include <dev/evdev/evdev.h>
50 #include <dev/evdev/evdev_private.h>
53 #define debugf(state, fmt, args...) printf("uinput: " fmt "\n", ##args)
55 #define debugf(state, fmt, args...)
58 #define UINPUT_BUFFER_SIZE 16
60 #define UINPUT_LOCK(state) sx_xlock(&(state)->ucs_lock)
61 #define UINPUT_UNLOCK(state) sx_unlock(&(state)->ucs_lock)
62 #define UINPUT_LOCK_ASSERT(state) sx_assert(&(state)->ucs_lock, SA_LOCKED)
63 #define UINPUT_EMPTYQ(state) \
64 ((state)->ucs_buffer_head == (state)->ucs_buffer_tail)
73 static evdev_event_t uinput_ev_event;
75 static d_open_t uinput_open;
76 static d_read_t uinput_read;
77 static d_write_t uinput_write;
78 static d_ioctl_t uinput_ioctl;
79 static d_poll_t uinput_poll;
80 static d_kqfilter_t uinput_kqfilter;
81 static void uinput_dtor(void *);
83 static int uinput_kqread(struct knote *kn, long hint);
84 static void uinput_kqdetach(struct knote *kn);
86 static struct cdevsw uinput_cdevsw = {
87 .d_version = D_VERSION,
88 .d_open = uinput_open,
89 .d_read = uinput_read,
90 .d_write = uinput_write,
91 .d_ioctl = uinput_ioctl,
92 .d_poll = uinput_poll,
93 .d_kqfilter = uinput_kqfilter,
97 static struct cdev *uinput_cdev;
99 static struct evdev_methods uinput_ev_methods = {
102 .ev_event = uinput_ev_event,
105 static struct filterops uinput_filterops = {
108 .f_detach = uinput_kqdetach,
109 .f_event = uinput_kqread,
112 struct uinput_cdev_state
114 enum uinput_state ucs_state;
115 struct evdev_dev * ucs_evdev;
117 size_t ucs_buffer_head;
118 size_t ucs_buffer_tail;
119 struct selinfo ucs_selp;
122 struct input_event ucs_buffer[UINPUT_BUFFER_SIZE];
125 static void uinput_enqueue_event(struct uinput_cdev_state *, uint16_t,
127 static int uinput_setup_provider(struct uinput_cdev_state *,
128 struct uinput_user_dev *);
129 static int uinput_cdev_create(void);
130 static void uinput_notify(struct uinput_cdev_state *);
133 uinput_knllock(void *arg)
141 uinput_knlunlock(void *arg)
149 uinput_knl_assert_locked(void *arg)
152 sx_assert((struct sx*)arg, SA_XLOCKED);
156 uinput_knl_assert_unlocked(void *arg)
159 sx_assert((struct sx*)arg, SA_UNLOCKED);
163 uinput_ev_event(struct evdev_dev *evdev, void *softc, uint16_t type,
164 uint16_t code, int32_t value)
166 struct uinput_cdev_state *state = softc;
169 evdev_push_event(evdev, type, code, value);
172 if (state->ucs_state == UINPUT_RUNNING) {
173 uinput_enqueue_event(state, type, code, value);
174 uinput_notify(state);
176 UINPUT_UNLOCK(state);
180 uinput_enqueue_event(struct uinput_cdev_state *state, uint16_t type,
181 uint16_t code, int32_t value)
185 UINPUT_LOCK_ASSERT(state);
187 head = state->ucs_buffer_head;
188 tail = (state->ucs_buffer_tail + 1) % UINPUT_BUFFER_SIZE;
190 microtime(&state->ucs_buffer[tail].time);
191 state->ucs_buffer[tail].type = type;
192 state->ucs_buffer[tail].code = code;
193 state->ucs_buffer[tail].value = value;
194 state->ucs_buffer_tail = tail;
196 /* If queue is full remove oldest event */
198 debugf(state, "state %p: buffer overflow", state);
200 head = (head + 1) % UINPUT_BUFFER_SIZE;
201 state->ucs_buffer_head = head;
206 uinput_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
208 struct uinput_cdev_state *state;
210 state = malloc(sizeof(struct uinput_cdev_state), M_EVDEV,
212 state->ucs_evdev = evdev_alloc();
214 sx_init(&state->ucs_lock, "uinput");
215 knlist_init(&state->ucs_selp.si_note, &state->ucs_lock, uinput_knllock,
216 uinput_knlunlock, uinput_knl_assert_locked,
217 uinput_knl_assert_unlocked);
219 devfs_set_cdevpriv(state, uinput_dtor);
224 uinput_dtor(void *data)
226 struct uinput_cdev_state *state = (struct uinput_cdev_state *)data;
228 evdev_free(state->ucs_evdev);
230 knlist_clear(&state->ucs_selp.si_note, 0);
231 seldrain(&state->ucs_selp);
232 knlist_destroy(&state->ucs_selp.si_note);
233 sx_destroy(&state->ucs_lock);
238 uinput_read(struct cdev *dev, struct uio *uio, int ioflag)
240 struct uinput_cdev_state *state;
241 struct input_event *event;
244 ret = devfs_get_cdevpriv((void **)&state);
248 debugf(state, "read %zd bytes by thread %d", uio->uio_resid,
249 uio->uio_td->td_tid);
251 /* Zero-sized reads are allowed for error checking */
252 if (uio->uio_resid != 0 && uio->uio_resid < sizeof(struct input_event))
255 remaining = uio->uio_resid / sizeof(struct input_event);
259 if (state->ucs_state != UINPUT_RUNNING)
262 if (ret == 0 && UINPUT_EMPTYQ(state)) {
263 if (ioflag & O_NONBLOCK)
266 if (remaining != 0) {
267 state->ucs_blocked = true;
268 ret = sx_sleep(state, &state->ucs_lock,
269 PCATCH, "uiread", 0);
274 while (ret == 0 && !UINPUT_EMPTYQ(state) && remaining > 0) {
275 event = &state->ucs_buffer[state->ucs_buffer_head];
276 state->ucs_buffer_head = (state->ucs_buffer_head + 1) %
279 ret = uiomove(event, sizeof(struct input_event), uio);
282 UINPUT_UNLOCK(state);
288 uinput_write(struct cdev *dev, struct uio *uio, int ioflag)
290 struct uinput_cdev_state *state;
291 struct uinput_user_dev userdev;
292 struct input_event event;
295 ret = devfs_get_cdevpriv((void **)&state);
299 debugf(state, "write %zd bytes by thread %d", uio->uio_resid,
300 uio->uio_td->td_tid);
304 if (state->ucs_state != UINPUT_RUNNING) {
305 /* Process written struct uinput_user_dev */
306 if (uio->uio_resid != sizeof(struct uinput_user_dev)) {
307 debugf(state, "write size not multiple of "
308 "struct uinput_user_dev size");
311 ret = uiomove(&userdev, sizeof(struct uinput_user_dev),
314 uinput_setup_provider(state, &userdev);
317 /* Process written event */
318 if (uio->uio_resid % sizeof(struct input_event) != 0) {
319 debugf(state, "write size not multiple of "
320 "struct input_event size");
324 while (ret == 0 && uio->uio_resid > 0) {
325 uiomove(&event, sizeof(struct input_event), uio);
326 ret = evdev_push_event(state->ucs_evdev, event.type,
327 event.code, event.value);
331 UINPUT_UNLOCK(state);
337 uinput_setup_dev(struct uinput_cdev_state *state, struct input_id *id,
338 char *name, uint32_t ff_effects_max)
344 evdev_set_name(state->ucs_evdev, name);
345 evdev_set_id(state->ucs_evdev, id->bustype, id->vendor, id->product,
347 state->ucs_state = UINPUT_CONFIGURED;
353 uinput_setup_provider(struct uinput_cdev_state *state,
354 struct uinput_user_dev *udev)
356 struct input_absinfo absinfo;
359 debugf(state, "setup_provider called, udev=%p", udev);
361 ret = uinput_setup_dev(state, &udev->id, udev->name,
362 udev->ff_effects_max);
366 bzero(&absinfo, sizeof(struct input_absinfo));
367 for (i = 0; i < ABS_CNT; i++) {
368 if (!bit_test(state->ucs_evdev->ev_abs_flags, i))
371 absinfo.minimum = udev->absmin[i];
372 absinfo.maximum = udev->absmax[i];
373 absinfo.fuzz = udev->absfuzz[i];
374 absinfo.flat = udev->absflat[i];
375 evdev_set_absinfo(state->ucs_evdev, i, &absinfo);
382 uinput_poll(struct cdev *dev, int events, struct thread *td)
384 struct uinput_cdev_state *state;
387 if (devfs_get_cdevpriv((void **)&state) != 0)
390 debugf(state, "poll by thread %d", td->td_tid);
392 /* Always allow write */
393 if (events & (POLLOUT | POLLWRNORM))
394 revents |= (events & (POLLOUT | POLLWRNORM));
396 if (events & (POLLIN | POLLRDNORM)) {
398 if (!UINPUT_EMPTYQ(state))
399 revents = events & (POLLIN | POLLRDNORM);
401 state->ucs_selected = true;
402 selrecord(td, &state->ucs_selp);
404 UINPUT_UNLOCK(state);
411 uinput_kqfilter(struct cdev *dev, struct knote *kn)
413 struct uinput_cdev_state *state;
416 ret = devfs_get_cdevpriv((void **)&state);
420 switch(kn->kn_filter) {
422 kn->kn_fop = &uinput_filterops;
427 kn->kn_hook = (caddr_t)state;
429 knlist_add(&state->ucs_selp.si_note, kn, 0);
434 uinput_kqread(struct knote *kn, long hint)
436 struct uinput_cdev_state *state;
439 state = (struct uinput_cdev_state *)kn->kn_hook;
441 UINPUT_LOCK_ASSERT(state);
443 ret = !UINPUT_EMPTYQ(state);
448 uinput_kqdetach(struct knote *kn)
450 struct uinput_cdev_state *state;
452 state = (struct uinput_cdev_state *)kn->kn_hook;
453 knlist_remove(&state->ucs_selp.si_note, kn, 0);
457 uinput_notify(struct uinput_cdev_state *state)
460 UINPUT_LOCK_ASSERT(state);
462 if (state->ucs_blocked) {
463 state->ucs_blocked = false;
466 if (state->ucs_selected) {
467 state->ucs_selected = false;
468 selwakeup(&state->ucs_selp);
470 KNOTE_LOCKED(&state->ucs_selp.si_note, 0);
474 uinput_ioctl_sub(struct uinput_cdev_state *state, u_long cmd, caddr_t data)
476 struct uinput_setup *us;
477 struct uinput_abs_setup *uabs;
478 int ret, len, intdata;
481 UINPUT_LOCK_ASSERT(state);
483 len = IOCPARM_LEN(cmd);
484 if ((cmd & IOC_DIRMASK) == IOC_VOID && len == sizeof(int))
485 intdata = *(int *)data;
487 switch (IOCBASECMD(cmd)) {
488 case UI_GET_SYSNAME(0):
489 if (state->ucs_state != UINPUT_RUNNING)
493 snprintf(data, len, "event%d", state->ucs_evdev->ev_unit);
499 if (state->ucs_state != UINPUT_CONFIGURED)
502 evdev_set_methods(state->ucs_evdev, state, &uinput_ev_methods);
503 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_SOFTREPEAT);
504 ret = evdev_register(state->ucs_evdev);
506 state->ucs_state = UINPUT_RUNNING;
510 if (state->ucs_state != UINPUT_RUNNING)
513 evdev_unregister(state->ucs_evdev);
514 bzero(state->ucs_evdev, sizeof(struct evdev_dev));
515 state->ucs_state = UINPUT_NEW;
519 if (state->ucs_state == UINPUT_RUNNING)
522 us = (struct uinput_setup *)data;
523 return (uinput_setup_dev(state, &us->id, us->name,
524 us->ff_effects_max));
527 if (state->ucs_state == UINPUT_RUNNING)
530 uabs = (struct uinput_abs_setup *)data;
531 if (uabs->code > ABS_MAX)
534 evdev_support_abs(state->ucs_evdev, uabs->code,
535 uabs->absinfo.value, uabs->absinfo.minimum,
536 uabs->absinfo.maximum, uabs->absinfo.fuzz,
537 uabs->absinfo.flat, uabs->absinfo.resolution);
541 if (state->ucs_state == UINPUT_RUNNING ||
542 intdata > EV_MAX || intdata < 0)
544 evdev_support_event(state->ucs_evdev, intdata);
548 if (state->ucs_state == UINPUT_RUNNING ||
549 intdata > KEY_MAX || intdata < 0)
551 evdev_support_key(state->ucs_evdev, intdata);
555 if (state->ucs_state == UINPUT_RUNNING ||
556 intdata > REL_MAX || intdata < 0)
558 evdev_support_rel(state->ucs_evdev, intdata);
562 if (state->ucs_state == UINPUT_RUNNING ||
563 intdata > ABS_MAX || intdata < 0)
565 evdev_set_abs_bit(state->ucs_evdev, intdata);
569 if (state->ucs_state == UINPUT_RUNNING ||
570 intdata > MSC_MAX || intdata < 0)
572 evdev_support_msc(state->ucs_evdev, intdata);
576 if (state->ucs_state == UINPUT_RUNNING ||
577 intdata > LED_MAX || intdata < 0)
579 evdev_support_led(state->ucs_evdev, intdata);
583 if (state->ucs_state == UINPUT_RUNNING ||
584 intdata > SND_MAX || intdata < 0)
586 evdev_support_snd(state->ucs_evdev, intdata);
590 if (state->ucs_state == UINPUT_RUNNING ||
591 intdata > FF_MAX || intdata < 0)
593 /* Fake unsupported ioctl */
597 if (state->ucs_state == UINPUT_RUNNING)
599 ret = copyinstr(*(void **)data, buf, sizeof(buf), NULL);
600 /* Linux returns EINVAL when string does not fit the buffer */
601 if (ret == ENAMETOOLONG)
605 evdev_set_phys(state->ucs_evdev, buf);
609 if (state->ucs_state == UINPUT_RUNNING ||
610 intdata > SW_MAX || intdata < 0)
612 evdev_support_sw(state->ucs_evdev, intdata);
616 if (state->ucs_state == UINPUT_RUNNING ||
617 intdata > INPUT_PROP_MAX || intdata < 0)
619 evdev_support_prop(state->ucs_evdev, intdata);
622 case UI_BEGIN_FF_UPLOAD:
623 case UI_END_FF_UPLOAD:
624 case UI_BEGIN_FF_ERASE:
625 case UI_END_FF_ERASE:
626 if (state->ucs_state == UINPUT_RUNNING)
628 /* Fake unsupported ioctl */
632 *(unsigned int *)data = UINPUT_VERSION;
640 uinput_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
643 struct uinput_cdev_state *state;
646 ret = devfs_get_cdevpriv((void **)&state);
650 debugf(state, "ioctl called: cmd=0x%08lx, data=%p", cmd, data);
653 ret = uinput_ioctl_sub(state, cmd, data);
654 UINPUT_UNLOCK(state);
660 uinput_cdev_create(void)
662 struct make_dev_args mda;
665 make_dev_args_init(&mda);
666 mda.mda_flags = MAKEDEV_WAITOK | MAKEDEV_CHECKNAME;
667 mda.mda_devsw = &uinput_cdevsw;
668 mda.mda_uid = UID_ROOT;
669 mda.mda_gid = GID_WHEEL;
672 ret = make_dev_s(&mda, &uinput_cdev, "uinput");
678 uinput_cdev_destroy(void)
681 destroy_dev(uinput_cdev);
687 uinput_modevent(module_t mod __unused, int cmd, void *data)
693 ret = uinput_cdev_create();
697 ret = uinput_cdev_destroy();
711 DEV_MODULE(uinput, uinput_modevent, NULL);
712 MODULE_VERSION(uinput, 1);
713 MODULE_DEPEND(uinput, evdev, 1, 1, 1);