1/*- 2 * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org> 3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 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. 14 * 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 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30#include "opt_evdev.h" 31 32#include <sys/param.h> 33#include <sys/conf.h> 34#include <sys/fcntl.h> 35#include <sys/kernel.h> 36#include <sys/lock.h> 37#include <sys/malloc.h> 38#include <sys/module.h> 39#include <sys/poll.h> 40#include <sys/proc.h> 41#include <sys/selinfo.h> 42#include <sys/systm.h> 43#include <sys/sx.h> 44#include <sys/uio.h> 45 46#include <dev/evdev/evdev.h> 47#include <dev/evdev/evdev_private.h> 48#include <dev/evdev/input.h> 49#include <dev/evdev/uinput.h> 50 51#ifdef UINPUT_DEBUG 52#define debugf(state, fmt, args...) printf("uinput: " fmt "\n", ##args) 53#else 54#define debugf(state, fmt, args...) 55#endif 56 57#define UINPUT_BUFFER_SIZE 16 58 59#define UINPUT_LOCK(state) sx_xlock(&(state)->ucs_lock) 60#define UINPUT_UNLOCK(state) sx_unlock(&(state)->ucs_lock) 61#define UINPUT_LOCK_ASSERT(state) sx_assert(&(state)->ucs_lock, SA_LOCKED) 62#define UINPUT_EMPTYQ(state) \ 63 ((state)->ucs_buffer_head == (state)->ucs_buffer_tail) 64 65enum uinput_state 66{ 67 UINPUT_NEW = 0, 68 UINPUT_CONFIGURED, 69 UINPUT_RUNNING 70}; 71 72static evdev_event_t uinput_ev_event; 73 74static d_open_t uinput_open; 75static d_read_t uinput_read; 76static d_write_t uinput_write; 77static d_ioctl_t uinput_ioctl; 78static d_poll_t uinput_poll; 79static d_kqfilter_t uinput_kqfilter; 80static void uinput_dtor(void *); 81 82static int uinput_kqread(struct knote *kn, long hint); 83static void uinput_kqdetach(struct knote *kn); 84 85static struct cdevsw uinput_cdevsw = { 86 .d_version = D_VERSION, 87 .d_open = uinput_open, 88 .d_read = uinput_read, 89 .d_write = uinput_write, 90 .d_ioctl = uinput_ioctl, 91 .d_poll = uinput_poll, 92 .d_kqfilter = uinput_kqfilter, 93 .d_name = "uinput", 94}; 95 96static struct cdev *uinput_cdev; 97 98static struct evdev_methods uinput_ev_methods = { 99 .ev_open = NULL, 100 .ev_close = NULL, 101 .ev_event = uinput_ev_event, 102}; 103 104static struct filterops uinput_filterops = { 105 .f_isfd = 1, 106 .f_attach = NULL, 107 .f_detach = uinput_kqdetach, 108 .f_event = uinput_kqread, 109}; 110 111struct uinput_cdev_state 112{ 113 enum uinput_state ucs_state; 114 struct evdev_dev * ucs_evdev; 115 struct sx ucs_lock; 116 size_t ucs_buffer_head; 117 size_t ucs_buffer_tail; 118 struct selinfo ucs_selp; 119 bool ucs_blocked; 120 bool ucs_selected; 121 struct input_event ucs_buffer[UINPUT_BUFFER_SIZE]; 122}; 123 124static void uinput_enqueue_event(struct uinput_cdev_state *, uint16_t, 125 uint16_t, int32_t); 126static int uinput_setup_provider(struct uinput_cdev_state *, 127 struct uinput_user_dev *); 128static int uinput_cdev_create(void); 129static void uinput_notify(struct uinput_cdev_state *); 130 131static void 132uinput_knllock(void *arg) 133{ 134 struct sx *sx = arg; 135 136 sx_xlock(sx); 137} 138 139static void 140uinput_knlunlock(void *arg) 141{ 142 struct sx *sx = arg; 143 144 sx_unlock(sx); 145} 146 147static void 148uinput_knl_assert_locked(void *arg) 149{ 150 151 sx_assert((struct sx*)arg, SA_XLOCKED); 152} 153 154static void 155uinput_knl_assert_unlocked(void *arg) 156{ 157 158 sx_assert((struct sx*)arg, SA_UNLOCKED); 159} 160 161static void 162uinput_ev_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, 163 int32_t value) 164{ 165 struct uinput_cdev_state *state = evdev_get_softc(evdev); 166 167 if (type == EV_LED) 168 evdev_push_event(evdev, type, code, value); 169 170 UINPUT_LOCK(state); 171 if (state->ucs_state == UINPUT_RUNNING) { 172 uinput_enqueue_event(state, type, code, value); 173 uinput_notify(state); 174 } 175 UINPUT_UNLOCK(state); 176} 177 178static void 179uinput_enqueue_event(struct uinput_cdev_state *state, uint16_t type, 180 uint16_t code, int32_t value) 181{ 182 size_t head, tail; 183 184 UINPUT_LOCK_ASSERT(state); 185 186 head = state->ucs_buffer_head; 187 tail = (state->ucs_buffer_tail + 1) % UINPUT_BUFFER_SIZE; 188 189 microtime(&state->ucs_buffer[tail].time); 190 state->ucs_buffer[tail].type = type; 191 state->ucs_buffer[tail].code = code; 192 state->ucs_buffer[tail].value = value; 193 state->ucs_buffer_tail = tail; 194 195 /* If queue is full remove oldest event */ 196 if (tail == head) { 197 debugf(state, "state %p: buffer overflow", state); 198 199 head = (head + 1) % UINPUT_BUFFER_SIZE; 200 state->ucs_buffer_head = head; 201 } 202} 203 204static int 205uinput_open(struct cdev *dev, int oflags, int devtype, struct thread *td) 206{ 207 struct uinput_cdev_state *state; 208 209 state = malloc(sizeof(struct uinput_cdev_state), M_EVDEV, 210 M_WAITOK | M_ZERO); 211 state->ucs_evdev = evdev_alloc(); 212 213 sx_init(&state->ucs_lock, "uinput"); 214 knlist_init(&state->ucs_selp.si_note, &state->ucs_lock, uinput_knllock, 215 uinput_knlunlock, uinput_knl_assert_locked, 216 uinput_knl_assert_unlocked); 217 218 devfs_set_cdevpriv(state, uinput_dtor); 219 return (0); 220} 221 222static void 223uinput_dtor(void *data) 224{ 225 struct uinput_cdev_state *state = (struct uinput_cdev_state *)data; 226 227 evdev_free(state->ucs_evdev); 228 229 knlist_clear(&state->ucs_selp.si_note, 0); 230 seldrain(&state->ucs_selp); 231 knlist_destroy(&state->ucs_selp.si_note); 232 sx_destroy(&state->ucs_lock); 233 free(data, M_EVDEV); 234} 235 236static int 237uinput_read(struct cdev *dev, struct uio *uio, int ioflag) 238{ 239 struct uinput_cdev_state *state; 240 struct input_event *event; 241 int remaining, ret; 242 243 ret = devfs_get_cdevpriv((void **)&state); 244 if (ret != 0) 245 return (ret); 246 247 debugf(state, "read %zd bytes by thread %d", uio->uio_resid, 248 uio->uio_td->td_tid); 249 250 /* Zero-sized reads are allowed for error checking */ 251 if (uio->uio_resid != 0 && uio->uio_resid < sizeof(struct input_event)) 252 return (EINVAL); 253 254 remaining = uio->uio_resid / sizeof(struct input_event); 255 256 UINPUT_LOCK(state); 257 258 if (state->ucs_state != UINPUT_RUNNING) 259 ret = EINVAL; 260 261 if (ret == 0 && UINPUT_EMPTYQ(state)) { 262 if (ioflag & O_NONBLOCK) 263 ret = EWOULDBLOCK; 264 else { 265 if (remaining != 0) { 266 state->ucs_blocked = true; 267 ret = sx_sleep(state, &state->ucs_lock, 268 PCATCH, "uiread", 0); 269 } 270 } 271 } 272 273 while (ret == 0 && !UINPUT_EMPTYQ(state) && remaining > 0) { 274 event = &state->ucs_buffer[state->ucs_buffer_head]; 275 state->ucs_buffer_head = (state->ucs_buffer_head + 1) % 276 UINPUT_BUFFER_SIZE; 277 remaining--; 278 ret = uiomove(event, sizeof(struct input_event), uio); 279 } 280 281 UINPUT_UNLOCK(state); 282 283 return (ret); 284} 285 286static int 287uinput_write(struct cdev *dev, struct uio *uio, int ioflag) 288{ 289 struct uinput_cdev_state *state; 290 struct uinput_user_dev userdev; 291 struct input_event event; 292 int ret = 0; 293 294 ret = devfs_get_cdevpriv((void **)&state); 295 if (ret != 0) 296 return (ret); 297 298 debugf(state, "write %zd bytes by thread %d", uio->uio_resid, 299 uio->uio_td->td_tid); 300 301 UINPUT_LOCK(state); 302 303 if (state->ucs_state != UINPUT_RUNNING) { 304 /* Process written struct uinput_user_dev */ 305 if (uio->uio_resid != sizeof(struct uinput_user_dev)) { 306 debugf(state, "write size not multiple of " 307 "struct uinput_user_dev size"); 308 ret = EINVAL; 309 } else { 310 ret = uiomove(&userdev, sizeof(struct uinput_user_dev), 311 uio); 312 if (ret == 0) 313 uinput_setup_provider(state, &userdev); 314 } 315 } else { 316 /* Process written event */ 317 if (uio->uio_resid % sizeof(struct input_event) != 0) { 318 debugf(state, "write size not multiple of " 319 "struct input_event size"); 320 ret = EINVAL; 321 } 322 323 while (ret == 0 && uio->uio_resid > 0) { 324 uiomove(&event, sizeof(struct input_event), uio); 325 ret = evdev_push_event(state->ucs_evdev, event.type, 326 event.code, event.value); 327 } 328 } 329 330 UINPUT_UNLOCK(state); 331 332 return (ret); 333} 334 335static int 336uinput_setup_dev(struct uinput_cdev_state *state, struct input_id *id, 337 char *name, uint32_t ff_effects_max) 338{ 339 340 if (name[0] == 0) 341 return (EINVAL); 342 343 evdev_set_name(state->ucs_evdev, name); 344 evdev_set_id(state->ucs_evdev, id->bustype, id->vendor, id->product, 345 id->version); 346 state->ucs_state = UINPUT_CONFIGURED; 347 348 return (0); 349} 350 351static int 352uinput_setup_provider(struct uinput_cdev_state *state, 353 struct uinput_user_dev *udev) 354{ 355 struct input_absinfo absinfo; 356 int i, ret; 357 358 debugf(state, "setup_provider called, udev=%p", udev); 359 360 ret = uinput_setup_dev(state, &udev->id, udev->name, 361 udev->ff_effects_max); 362 if (ret) 363 return (ret); 364 365 bzero(&absinfo, sizeof(struct input_absinfo)); 366 for (i = 0; i < ABS_CNT; i++) { 367 if (!bit_test(state->ucs_evdev->ev_abs_flags, i)) 368 continue; 369 370 absinfo.minimum = udev->absmin[i]; 371 absinfo.maximum = udev->absmax[i]; 372 absinfo.fuzz = udev->absfuzz[i]; 373 absinfo.flat = udev->absflat[i]; 374 evdev_set_absinfo(state->ucs_evdev, i, &absinfo); 375 } 376 377 return (0); 378} 379 380static int 381uinput_poll(struct cdev *dev, int events, struct thread *td) 382{ 383 struct uinput_cdev_state *state; 384 int revents = 0; 385 386 if (devfs_get_cdevpriv((void **)&state) != 0) 387 return (POLLNVAL); 388 389 debugf(state, "poll by thread %d", td->td_tid); 390 391 /* Always allow write */ 392 if (events & (POLLOUT | POLLWRNORM)) 393 revents |= (events & (POLLOUT | POLLWRNORM)); 394 395 if (events & (POLLIN | POLLRDNORM)) { 396 UINPUT_LOCK(state); 397 if (!UINPUT_EMPTYQ(state)) 398 revents = events & (POLLIN | POLLRDNORM); 399 else { 400 state->ucs_selected = true; 401 selrecord(td, &state->ucs_selp); 402 } 403 UINPUT_UNLOCK(state); 404 } 405 406 return (revents); 407} 408 409static int 410uinput_kqfilter(struct cdev *dev, struct knote *kn) 411{ 412 struct uinput_cdev_state *state; 413 int ret; 414 415 ret = devfs_get_cdevpriv((void **)&state); 416 if (ret != 0) 417 return (ret); 418 419 switch(kn->kn_filter) { 420 case EVFILT_READ: 421 kn->kn_fop = &uinput_filterops; 422 break; 423 default: 424 return(EINVAL); 425 } 426 kn->kn_hook = (caddr_t)state; 427 428 knlist_add(&state->ucs_selp.si_note, kn, 0); 429 return (0); 430} 431 432static int 433uinput_kqread(struct knote *kn, long hint) 434{ 435 struct uinput_cdev_state *state; 436 int ret; 437 438 state = (struct uinput_cdev_state *)kn->kn_hook; 439 440 UINPUT_LOCK_ASSERT(state); 441 442 ret = !UINPUT_EMPTYQ(state); 443 return (ret); 444} 445 446static void 447uinput_kqdetach(struct knote *kn) 448{ 449 struct uinput_cdev_state *state; 450 451 state = (struct uinput_cdev_state *)kn->kn_hook; 452 knlist_remove(&state->ucs_selp.si_note, kn, 0); 453} 454 455static void 456uinput_notify(struct uinput_cdev_state *state) 457{ 458 459 UINPUT_LOCK_ASSERT(state); 460 461 if (state->ucs_blocked) { 462 state->ucs_blocked = false; 463 wakeup(state); 464 } 465 if (state->ucs_selected) { 466 state->ucs_selected = false; 467 selwakeup(&state->ucs_selp); 468 } 469 KNOTE_LOCKED(&state->ucs_selp.si_note, 0); 470} 471 472static int 473uinput_ioctl_sub(struct uinput_cdev_state *state, u_long cmd, caddr_t data) 474{ 475 struct uinput_setup *us; 476 struct uinput_abs_setup *uabs; 477 int ret, len, intdata; 478 char buf[NAMELEN]; 479 480 UINPUT_LOCK_ASSERT(state); 481 482 len = IOCPARM_LEN(cmd); 483 if ((cmd & IOC_DIRMASK) == IOC_VOID && len == sizeof(int)) 484 intdata = *(int *)data; 485 486 switch (IOCBASECMD(cmd)) { 487 case UI_GET_SYSNAME(0): 488 if (state->ucs_state != UINPUT_RUNNING) 489 return (ENOENT); 490 if (len == 0) 491 return (EINVAL); 492 snprintf(data, len, "event%d", state->ucs_evdev->ev_unit); 493 return (0); 494 } 495 496 switch (cmd) { 497 case UI_DEV_CREATE: 498 if (state->ucs_state != UINPUT_CONFIGURED) 499 return (EINVAL); 500 501 evdev_set_methods(state->ucs_evdev, state, &uinput_ev_methods); 502 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_SOFTREPEAT); 503 ret = evdev_register(state->ucs_evdev); 504 if (ret == 0) 505 state->ucs_state = UINPUT_RUNNING; 506 return (ret); 507 508 case UI_DEV_DESTROY: 509 if (state->ucs_state != UINPUT_RUNNING) 510 return (0); 511 512 evdev_unregister(state->ucs_evdev); 513 bzero(state->ucs_evdev, sizeof(struct evdev_dev)); 514 state->ucs_state = UINPUT_NEW; 515 return (0); 516 517 case UI_DEV_SETUP: 518 if (state->ucs_state == UINPUT_RUNNING) 519 return (EINVAL); 520 521 us = (struct uinput_setup *)data; 522 return (uinput_setup_dev(state, &us->id, us->name, 523 us->ff_effects_max)); 524 525 case UI_ABS_SETUP: 526 if (state->ucs_state == UINPUT_RUNNING) 527 return (EINVAL); 528 529 uabs = (struct uinput_abs_setup *)data; 530 if (uabs->code > ABS_MAX) 531 return (EINVAL); 532 533 evdev_support_abs(state->ucs_evdev, uabs->code, 534 uabs->absinfo.value, uabs->absinfo.minimum, 535 uabs->absinfo.maximum, uabs->absinfo.fuzz, 536 uabs->absinfo.flat, uabs->absinfo.resolution); 537 return (0); 538 539 case UI_SET_EVBIT: 540 if (state->ucs_state == UINPUT_RUNNING || 541 intdata > EV_MAX || intdata < 0) 542 return (EINVAL); 543 evdev_support_event(state->ucs_evdev, intdata); 544 return (0); 545 546 case UI_SET_KEYBIT: 547 if (state->ucs_state == UINPUT_RUNNING || 548 intdata > KEY_MAX || intdata < 0) 549 return (EINVAL); 550 evdev_support_key(state->ucs_evdev, intdata); 551 return (0); 552 553 case UI_SET_RELBIT: 554 if (state->ucs_state == UINPUT_RUNNING || 555 intdata > REL_MAX || intdata < 0) 556 return (EINVAL); 557 evdev_support_rel(state->ucs_evdev, intdata); 558 return (0); 559 560 case UI_SET_ABSBIT: 561 if (state->ucs_state == UINPUT_RUNNING || 562 intdata > ABS_MAX || intdata < 0) 563 return (EINVAL); 564 evdev_set_abs_bit(state->ucs_evdev, intdata); 565 return (0); 566 567 case UI_SET_MSCBIT: 568 if (state->ucs_state == UINPUT_RUNNING || 569 intdata > MSC_MAX || intdata < 0) 570 return (EINVAL); 571 evdev_support_msc(state->ucs_evdev, intdata); 572 return (0); 573 574 case UI_SET_LEDBIT: 575 if (state->ucs_state == UINPUT_RUNNING || 576 intdata > LED_MAX || intdata < 0) 577 return (EINVAL); 578 evdev_support_led(state->ucs_evdev, intdata); 579 return (0); 580 581 case UI_SET_SNDBIT: 582 if (state->ucs_state == UINPUT_RUNNING || 583 intdata > SND_MAX || intdata < 0) 584 return (EINVAL); 585 evdev_support_snd(state->ucs_evdev, intdata); 586 return (0); 587 588 case UI_SET_FFBIT: 589 if (state->ucs_state == UINPUT_RUNNING || 590 intdata > FF_MAX || intdata < 0) 591 return (EINVAL); 592 /* Fake unsupported ioctl */ 593 return (0); 594 595 case UI_SET_PHYS: 596 if (state->ucs_state == UINPUT_RUNNING) 597 return (EINVAL); 598 ret = copyinstr(*(void **)data, buf, sizeof(buf), NULL); 599 /* Linux returns EINVAL when string does not fit the buffer */ 600 if (ret == ENAMETOOLONG) 601 ret = EINVAL; 602 if (ret != 0) 603 return (ret); 604 evdev_set_phys(state->ucs_evdev, buf); 605 return (0); 606 607 case UI_SET_BSDUNIQ: 608 if (state->ucs_state == UINPUT_RUNNING) 609 return (EINVAL); 610 ret = copyinstr(*(void **)data, buf, sizeof(buf), NULL); 611 if (ret != 0) 612 return (ret); 613 evdev_set_serial(state->ucs_evdev, buf); 614 return (0); 615 616 case UI_SET_SWBIT: 617 if (state->ucs_state == UINPUT_RUNNING || 618 intdata > SW_MAX || intdata < 0) 619 return (EINVAL); 620 evdev_support_sw(state->ucs_evdev, intdata); 621 return (0); 622 623 case UI_SET_PROPBIT: 624 if (state->ucs_state == UINPUT_RUNNING || 625 intdata > INPUT_PROP_MAX || intdata < 0) 626 return (EINVAL); 627 evdev_support_prop(state->ucs_evdev, intdata); 628 return (0); 629 630 case UI_BEGIN_FF_UPLOAD: 631 case UI_END_FF_UPLOAD: 632 case UI_BEGIN_FF_ERASE: 633 case UI_END_FF_ERASE: 634 if (state->ucs_state == UINPUT_RUNNING) 635 return (EINVAL); 636 /* Fake unsupported ioctl */ 637 return (0); 638 639 case UI_GET_VERSION: 640 *(unsigned int *)data = UINPUT_VERSION; 641 return (0); 642 } 643 644 return (EINVAL); 645} 646 647static int 648uinput_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, 649 struct thread *td) 650{ 651 struct uinput_cdev_state *state; 652 int ret; 653 654 ret = devfs_get_cdevpriv((void **)&state); 655 if (ret != 0) 656 return (ret); 657 658 debugf(state, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); 659 660 UINPUT_LOCK(state); 661 ret = uinput_ioctl_sub(state, cmd, data); 662 UINPUT_UNLOCK(state); 663 664 return (ret); 665} 666 667static int 668uinput_cdev_create(void) 669{ 670 struct make_dev_args mda; 671 int ret; 672 673 make_dev_args_init(&mda); 674 mda.mda_flags = MAKEDEV_WAITOK | MAKEDEV_CHECKNAME; 675 mda.mda_devsw = &uinput_cdevsw; 676 mda.mda_uid = UID_ROOT; 677 mda.mda_gid = GID_WHEEL; 678 mda.mda_mode = 0600; 679 680 ret = make_dev_s(&mda, &uinput_cdev, "uinput"); 681 682 return (ret); 683} 684 685static int 686uinput_cdev_destroy(void) 687{ 688 689 destroy_dev(uinput_cdev); 690 691 return (0); 692} 693 694static int 695uinput_modevent(module_t mod __unused, int cmd, void *data) 696{ 697 int ret = 0; 698 699 switch (cmd) { 700 case MOD_LOAD: 701 ret = uinput_cdev_create(); 702 break; 703 704 case MOD_UNLOAD: 705 ret = uinput_cdev_destroy(); 706 break; 707 708 case MOD_SHUTDOWN: 709 break; 710 711 default: 712 ret = EINVAL; 713 break; 714 } 715 716 return (ret); 717} 718 719DEV_MODULE(uinput, uinput_modevent, NULL); 720MODULE_VERSION(uinput, 1); 721MODULE_DEPEND(uinput, evdev, 1, 1, 1); 722