#define pr_fmt(fmt) …
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/major.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/cpu.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <xen/xen.h>
#include <xen/events.h>
#include <xen/evtchn.h>
#include <xen/xen-ops.h>
#include <asm/xen/hypervisor.h>
struct per_user_data { … };
#define UNRESTRICTED_DOMID …
struct user_evtchn { … };
static void evtchn_free_ring(evtchn_port_t *ring)
{ … }
static unsigned int evtchn_ring_offset(struct per_user_data *u,
unsigned int idx)
{ … }
static evtchn_port_t *evtchn_ring_entry(struct per_user_data *u,
unsigned int idx)
{ … }
static int add_evtchn(struct per_user_data *u, struct user_evtchn *evtchn)
{ … }
static void del_evtchn(struct per_user_data *u, struct user_evtchn *evtchn)
{ … }
static struct user_evtchn *find_evtchn(struct per_user_data *u,
evtchn_port_t port)
{ … }
static irqreturn_t evtchn_interrupt(int irq, void *data)
{ … }
static ssize_t evtchn_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{ … }
static ssize_t evtchn_write(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{ … }
static int evtchn_resize_ring(struct per_user_data *u)
{ … }
static int evtchn_bind_to_user(struct per_user_data *u, evtchn_port_t port,
bool is_static)
{ … }
static void evtchn_unbind_from_user(struct per_user_data *u,
struct user_evtchn *evtchn)
{ … }
static long evtchn_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
{ … }
static __poll_t evtchn_poll(struct file *file, poll_table *wait)
{ … }
static int evtchn_fasync(int fd, struct file *filp, int on)
{ … }
static int evtchn_open(struct inode *inode, struct file *filp)
{ … }
static int evtchn_release(struct inode *inode, struct file *filp)
{ … }
static const struct file_operations evtchn_fops = …;
static struct miscdevice evtchn_miscdev = …;
static int __init evtchn_init(void)
{ … }
static void __exit evtchn_cleanup(void)
{ … }
module_init(…) …;
module_exit(evtchn_cleanup);
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;