1 /****************************************************************************** 2 * evtchn.c 3 * 4 * Driver for receiving and demuxing event-channel signals. 5 * 6 * Copyright (c) 2004-2005, K A Fraser 7 * Multi-process extensions Copyright (c) 2004, Steven Smith 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License version 2 11 * as published by the Free Software Foundation; or, when distributed 12 * separately from the Linux kernel or incorporated into other 13 * software packages, subject to the following license: 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining a copy 16 * of this source file (the "Software"), to deal in the Software without 17 * restriction, including without limitation the rights to use, copy, modify, 18 * merge, publish, distribute, sublicense, and/or sell copies of the Software, 19 * and to permit persons to whom the Software is furnished to do so, subject to 20 * the following conditions: 21 * 22 * The above copyright notice and this permission notice shall be included in 23 * all copies or substantial portions of the Software. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 30 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 31 * IN THE SOFTWARE. 32 */ 33 34 #include <linux/module.h> 35 #include <linux/kernel.h> 36 #include <linux/sched.h> 37 #include <linux/slab.h> 38 #include <linux/string.h> 39 #include <linux/errno.h> 40 #include <linux/fs.h> 41 #include <linux/miscdevice.h> 42 #include <linux/major.h> 43 #include <linux/proc_fs.h> 44 #include <linux/stat.h> 45 #include <linux/poll.h> 46 #include <linux/irq.h> 47 #include <linux/init.h> 48 #include <linux/mutex.h> 49 #include <linux/cpu.h> 50 51 #include <xen/xen.h> 52 #include <xen/events.h> 53 #include <xen/evtchn.h> 54 #include <asm/xen/hypervisor.h> 55 56 struct per_user_data { 57 struct mutex bind_mutex; /* serialize bind/unbind operations */ 58 59 /* Notification ring, accessed via /dev/xen/evtchn. */ 60 #define EVTCHN_RING_SIZE (PAGE_SIZE / sizeof(evtchn_port_t)) 61 #define EVTCHN_RING_MASK(_i) ((_i)&(EVTCHN_RING_SIZE-1)) 62 evtchn_port_t *ring; 63 unsigned int ring_cons, ring_prod, ring_overflow; 64 struct mutex ring_cons_mutex; /* protect against concurrent readers */ 65 66 /* Processes wait on this queue when ring is empty. */ 67 wait_queue_head_t evtchn_wait; 68 struct fasync_struct *evtchn_async_queue; 69 const char *name; 70 }; 71 72 /* 73 * Who's bound to each port? This is logically an array of struct 74 * per_user_data *, but we encode the current enabled-state in bit 0. 75 */ 76 static unsigned long *port_user; 77 static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */ 78 79 static inline struct per_user_data *get_port_user(unsigned port) 80 { 81 return (struct per_user_data *)(port_user[port] & ~1); 82 } 83 84 static inline void set_port_user(unsigned port, struct per_user_data *u) 85 { 86 port_user[port] = (unsigned long)u; 87 } 88 89 static inline bool get_port_enabled(unsigned port) 90 { 91 return port_user[port] & 1; 92 } 93 94 static inline void set_port_enabled(unsigned port, bool enabled) 95 { 96 if (enabled) 97 port_user[port] |= 1; 98 else 99 port_user[port] &= ~1; 100 } 101 102 static irqreturn_t evtchn_interrupt(int irq, void *data) 103 { 104 unsigned int port = (unsigned long)data; 105 struct per_user_data *u; 106 107 spin_lock(&port_user_lock); 108 109 u = get_port_user(port); 110 111 WARN(!get_port_enabled(port), 112 "Interrupt for port %d, but apparently not enabled; per-user %p\n", 113 port, u); 114 115 disable_irq_nosync(irq); 116 set_port_enabled(port, false); 117 118 if ((u->ring_prod - u->ring_cons) < EVTCHN_RING_SIZE) { 119 u->ring[EVTCHN_RING_MASK(u->ring_prod)] = port; 120 wmb(); /* Ensure ring contents visible */ 121 if (u->ring_cons == u->ring_prod++) { 122 wake_up_interruptible(&u->evtchn_wait); 123 kill_fasync(&u->evtchn_async_queue, 124 SIGIO, POLL_IN); 125 } 126 } else 127 u->ring_overflow = 1; 128 129 spin_unlock(&port_user_lock); 130 131 return IRQ_HANDLED; 132 } 133 134 static ssize_t evtchn_read(struct file *file, char __user *buf, 135 size_t count, loff_t *ppos) 136 { 137 int rc; 138 unsigned int c, p, bytes1 = 0, bytes2 = 0; 139 struct per_user_data *u = file->private_data; 140 141 /* Whole number of ports. */ 142 count &= ~(sizeof(evtchn_port_t)-1); 143 144 if (count == 0) 145 return 0; 146 147 if (count > PAGE_SIZE) 148 count = PAGE_SIZE; 149 150 for (;;) { 151 mutex_lock(&u->ring_cons_mutex); 152 153 rc = -EFBIG; 154 if (u->ring_overflow) 155 goto unlock_out; 156 157 c = u->ring_cons; 158 p = u->ring_prod; 159 if (c != p) 160 break; 161 162 mutex_unlock(&u->ring_cons_mutex); 163 164 if (file->f_flags & O_NONBLOCK) 165 return -EAGAIN; 166 167 rc = wait_event_interruptible(u->evtchn_wait, 168 u->ring_cons != u->ring_prod); 169 if (rc) 170 return rc; 171 } 172 173 /* Byte lengths of two chunks. Chunk split (if any) is at ring wrap. */ 174 if (((c ^ p) & EVTCHN_RING_SIZE) != 0) { 175 bytes1 = (EVTCHN_RING_SIZE - EVTCHN_RING_MASK(c)) * 176 sizeof(evtchn_port_t); 177 bytes2 = EVTCHN_RING_MASK(p) * sizeof(evtchn_port_t); 178 } else { 179 bytes1 = (p - c) * sizeof(evtchn_port_t); 180 bytes2 = 0; 181 } 182 183 /* Truncate chunks according to caller's maximum byte count. */ 184 if (bytes1 > count) { 185 bytes1 = count; 186 bytes2 = 0; 187 } else if ((bytes1 + bytes2) > count) { 188 bytes2 = count - bytes1; 189 } 190 191 rc = -EFAULT; 192 rmb(); /* Ensure that we see the port before we copy it. */ 193 if (copy_to_user(buf, &u->ring[EVTCHN_RING_MASK(c)], bytes1) || 194 ((bytes2 != 0) && 195 copy_to_user(&buf[bytes1], &u->ring[0], bytes2))) 196 goto unlock_out; 197 198 u->ring_cons += (bytes1 + bytes2) / sizeof(evtchn_port_t); 199 rc = bytes1 + bytes2; 200 201 unlock_out: 202 mutex_unlock(&u->ring_cons_mutex); 203 return rc; 204 } 205 206 static ssize_t evtchn_write(struct file *file, const char __user *buf, 207 size_t count, loff_t *ppos) 208 { 209 int rc, i; 210 evtchn_port_t *kbuf = (evtchn_port_t *)__get_free_page(GFP_KERNEL); 211 struct per_user_data *u = file->private_data; 212 213 if (kbuf == NULL) 214 return -ENOMEM; 215 216 /* Whole number of ports. */ 217 count &= ~(sizeof(evtchn_port_t)-1); 218 219 rc = 0; 220 if (count == 0) 221 goto out; 222 223 if (count > PAGE_SIZE) 224 count = PAGE_SIZE; 225 226 rc = -EFAULT; 227 if (copy_from_user(kbuf, buf, count) != 0) 228 goto out; 229 230 spin_lock_irq(&port_user_lock); 231 232 for (i = 0; i < (count/sizeof(evtchn_port_t)); i++) { 233 unsigned port = kbuf[i]; 234 235 if (port < NR_EVENT_CHANNELS && 236 get_port_user(port) == u && 237 !get_port_enabled(port)) { 238 set_port_enabled(port, true); 239 enable_irq(irq_from_evtchn(port)); 240 } 241 } 242 243 spin_unlock_irq(&port_user_lock); 244 245 rc = count; 246 247 out: 248 free_page((unsigned long)kbuf); 249 return rc; 250 } 251 252 static int evtchn_bind_to_user(struct per_user_data *u, int port) 253 { 254 int rc = 0; 255 256 /* 257 * Ports are never reused, so every caller should pass in a 258 * unique port. 259 * 260 * (Locking not necessary because we haven't registered the 261 * interrupt handler yet, and our caller has already 262 * serialized bind operations.) 263 */ 264 BUG_ON(get_port_user(port) != NULL); 265 set_port_user(port, u); 266 set_port_enabled(port, true); /* start enabled */ 267 268 rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, IRQF_DISABLED, 269 u->name, (void *)(unsigned long)port); 270 if (rc >= 0) 271 rc = evtchn_make_refcounted(port); 272 else { 273 /* bind failed, should close the port now */ 274 struct evtchn_close close; 275 close.port = port; 276 if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) 277 BUG(); 278 set_port_user(port, NULL); 279 } 280 281 return rc; 282 } 283 284 static void evtchn_unbind_from_user(struct per_user_data *u, int port) 285 { 286 int irq = irq_from_evtchn(port); 287 288 BUG_ON(irq < 0); 289 290 unbind_from_irqhandler(irq, (void *)(unsigned long)port); 291 292 set_port_user(port, NULL); 293 } 294 295 static long evtchn_ioctl(struct file *file, 296 unsigned int cmd, unsigned long arg) 297 { 298 int rc; 299 struct per_user_data *u = file->private_data; 300 void __user *uarg = (void __user *) arg; 301 302 /* Prevent bind from racing with unbind */ 303 mutex_lock(&u->bind_mutex); 304 305 switch (cmd) { 306 case IOCTL_EVTCHN_BIND_VIRQ: { 307 struct ioctl_evtchn_bind_virq bind; 308 struct evtchn_bind_virq bind_virq; 309 310 rc = -EFAULT; 311 if (copy_from_user(&bind, uarg, sizeof(bind))) 312 break; 313 314 bind_virq.virq = bind.virq; 315 bind_virq.vcpu = 0; 316 rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, 317 &bind_virq); 318 if (rc != 0) 319 break; 320 321 rc = evtchn_bind_to_user(u, bind_virq.port); 322 if (rc == 0) 323 rc = bind_virq.port; 324 break; 325 } 326 327 case IOCTL_EVTCHN_BIND_INTERDOMAIN: { 328 struct ioctl_evtchn_bind_interdomain bind; 329 struct evtchn_bind_interdomain bind_interdomain; 330 331 rc = -EFAULT; 332 if (copy_from_user(&bind, uarg, sizeof(bind))) 333 break; 334 335 bind_interdomain.remote_dom = bind.remote_domain; 336 bind_interdomain.remote_port = bind.remote_port; 337 rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, 338 &bind_interdomain); 339 if (rc != 0) 340 break; 341 342 rc = evtchn_bind_to_user(u, bind_interdomain.local_port); 343 if (rc == 0) 344 rc = bind_interdomain.local_port; 345 break; 346 } 347 348 case IOCTL_EVTCHN_BIND_UNBOUND_PORT: { 349 struct ioctl_evtchn_bind_unbound_port bind; 350 struct evtchn_alloc_unbound alloc_unbound; 351 352 rc = -EFAULT; 353 if (copy_from_user(&bind, uarg, sizeof(bind))) 354 break; 355 356 alloc_unbound.dom = DOMID_SELF; 357 alloc_unbound.remote_dom = bind.remote_domain; 358 rc = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, 359 &alloc_unbound); 360 if (rc != 0) 361 break; 362 363 rc = evtchn_bind_to_user(u, alloc_unbound.port); 364 if (rc == 0) 365 rc = alloc_unbound.port; 366 break; 367 } 368 369 case IOCTL_EVTCHN_UNBIND: { 370 struct ioctl_evtchn_unbind unbind; 371 372 rc = -EFAULT; 373 if (copy_from_user(&unbind, uarg, sizeof(unbind))) 374 break; 375 376 rc = -EINVAL; 377 if (unbind.port >= NR_EVENT_CHANNELS) 378 break; 379 380 spin_lock_irq(&port_user_lock); 381 382 rc = -ENOTCONN; 383 if (get_port_user(unbind.port) != u) { 384 spin_unlock_irq(&port_user_lock); 385 break; 386 } 387 388 disable_irq(irq_from_evtchn(unbind.port)); 389 390 spin_unlock_irq(&port_user_lock); 391 392 evtchn_unbind_from_user(u, unbind.port); 393 394 rc = 0; 395 break; 396 } 397 398 case IOCTL_EVTCHN_NOTIFY: { 399 struct ioctl_evtchn_notify notify; 400 401 rc = -EFAULT; 402 if (copy_from_user(¬ify, uarg, sizeof(notify))) 403 break; 404 405 if (notify.port >= NR_EVENT_CHANNELS) { 406 rc = -EINVAL; 407 } else if (get_port_user(notify.port) != u) { 408 rc = -ENOTCONN; 409 } else { 410 notify_remote_via_evtchn(notify.port); 411 rc = 0; 412 } 413 break; 414 } 415 416 case IOCTL_EVTCHN_RESET: { 417 /* Initialise the ring to empty. Clear errors. */ 418 mutex_lock(&u->ring_cons_mutex); 419 spin_lock_irq(&port_user_lock); 420 u->ring_cons = u->ring_prod = u->ring_overflow = 0; 421 spin_unlock_irq(&port_user_lock); 422 mutex_unlock(&u->ring_cons_mutex); 423 rc = 0; 424 break; 425 } 426 427 default: 428 rc = -ENOSYS; 429 break; 430 } 431 mutex_unlock(&u->bind_mutex); 432 433 return rc; 434 } 435 436 static unsigned int evtchn_poll(struct file *file, poll_table *wait) 437 { 438 unsigned int mask = POLLOUT | POLLWRNORM; 439 struct per_user_data *u = file->private_data; 440 441 poll_wait(file, &u->evtchn_wait, wait); 442 if (u->ring_cons != u->ring_prod) 443 mask |= POLLIN | POLLRDNORM; 444 if (u->ring_overflow) 445 mask = POLLERR; 446 return mask; 447 } 448 449 static int evtchn_fasync(int fd, struct file *filp, int on) 450 { 451 struct per_user_data *u = filp->private_data; 452 return fasync_helper(fd, filp, on, &u->evtchn_async_queue); 453 } 454 455 static int evtchn_open(struct inode *inode, struct file *filp) 456 { 457 struct per_user_data *u; 458 459 u = kzalloc(sizeof(*u), GFP_KERNEL); 460 if (u == NULL) 461 return -ENOMEM; 462 463 u->name = kasprintf(GFP_KERNEL, "evtchn:%s", current->comm); 464 if (u->name == NULL) { 465 kfree(u); 466 return -ENOMEM; 467 } 468 469 init_waitqueue_head(&u->evtchn_wait); 470 471 u->ring = (evtchn_port_t *)__get_free_page(GFP_KERNEL); 472 if (u->ring == NULL) { 473 kfree(u->name); 474 kfree(u); 475 return -ENOMEM; 476 } 477 478 mutex_init(&u->bind_mutex); 479 mutex_init(&u->ring_cons_mutex); 480 481 filp->private_data = u; 482 483 return nonseekable_open(inode, filp); 484 } 485 486 static int evtchn_release(struct inode *inode, struct file *filp) 487 { 488 int i; 489 struct per_user_data *u = filp->private_data; 490 491 spin_lock_irq(&port_user_lock); 492 493 free_page((unsigned long)u->ring); 494 495 for (i = 0; i < NR_EVENT_CHANNELS; i++) { 496 if (get_port_user(i) != u) 497 continue; 498 499 disable_irq(irq_from_evtchn(i)); 500 } 501 502 spin_unlock_irq(&port_user_lock); 503 504 for (i = 0; i < NR_EVENT_CHANNELS; i++) { 505 if (get_port_user(i) != u) 506 continue; 507 508 evtchn_unbind_from_user(get_port_user(i), i); 509 } 510 511 kfree(u->name); 512 kfree(u); 513 514 return 0; 515 } 516 517 static const struct file_operations evtchn_fops = { 518 .owner = THIS_MODULE, 519 .read = evtchn_read, 520 .write = evtchn_write, 521 .unlocked_ioctl = evtchn_ioctl, 522 .poll = evtchn_poll, 523 .fasync = evtchn_fasync, 524 .open = evtchn_open, 525 .release = evtchn_release, 526 .llseek = no_llseek, 527 }; 528 529 static struct miscdevice evtchn_miscdev = { 530 .minor = MISC_DYNAMIC_MINOR, 531 .name = "xen/evtchn", 532 .fops = &evtchn_fops, 533 }; 534 static int __init evtchn_init(void) 535 { 536 int err; 537 538 if (!xen_domain()) 539 return -ENODEV; 540 541 port_user = kcalloc(NR_EVENT_CHANNELS, sizeof(*port_user), GFP_KERNEL); 542 if (port_user == NULL) 543 return -ENOMEM; 544 545 spin_lock_init(&port_user_lock); 546 547 /* Create '/dev/xen/evtchn'. */ 548 err = misc_register(&evtchn_miscdev); 549 if (err != 0) { 550 printk(KERN_ERR "Could not register /dev/xen/evtchn\n"); 551 return err; 552 } 553 554 printk(KERN_INFO "Event-channel device installed.\n"); 555 556 return 0; 557 } 558 559 static void __exit evtchn_cleanup(void) 560 { 561 kfree(port_user); 562 port_user = NULL; 563 564 misc_deregister(&evtchn_miscdev); 565 } 566 567 module_init(evtchn_init); 568 module_exit(evtchn_cleanup); 569 570 MODULE_LICENSE("GPL"); 571