evtchn.h revision 190633
1/******************************************************************************
2 * evtchn.h
3 *
4 * Communication via Xen event channels.
5 * Also definitions for the device that demuxes notifications to userspace.
6 *
7 * Copyright (c) 2004, K A Fraser
8 *
9 * $FreeBSD: head/sys/xen/evtchn.h 190633 2009-04-01 20:23:47Z piso $
10 */
11
12#ifndef __ASM_EVTCHN_H__
13#define __ASM_EVTCHN_H__
14#include <machine/pcpu.h>
15#include <xen/hypervisor.h>
16#include <machine/xen/synch_bitops.h>
17#include <machine/frame.h>
18
19/*
20 * LOW-LEVEL DEFINITIONS
21 */
22
23/*
24 * Unlike notify_remote_via_evtchn(), this is safe to use across
25 * save/restore. Notifications on a broken connection are silently dropped.
26 */
27void notify_remote_via_irq(int irq);
28
29
30/* Entry point for notifications into Linux subsystems. */
31void evtchn_do_upcall(struct trapframe *frame);
32
33/* Entry point for notifications into the userland character device. */
34void evtchn_device_upcall(int port);
35
36void mask_evtchn(int port);
37
38void unmask_evtchn(int port);
39
40#ifdef SMP
41void rebind_evtchn_to_cpu(int port, unsigned int cpu);
42#else
43#define rebind_evtchn_to_cpu(port, cpu)	((void)0)
44#endif
45
46static inline
47int test_and_set_evtchn_mask(int port)
48{
49	shared_info_t *s = HYPERVISOR_shared_info;
50	return synch_test_and_set_bit(port, s->evtchn_mask);
51}
52
53static inline void
54clear_evtchn(int port)
55{
56	shared_info_t *s = HYPERVISOR_shared_info;
57	synch_clear_bit(port, &s->evtchn_pending[0]);
58}
59
60static inline void
61notify_remote_via_evtchn(int port)
62{
63        struct evtchn_send send = { .port = port };
64        (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
65}
66
67/*
68 * Use these to access the event channel underlying the IRQ handle returned
69 * by bind_*_to_irqhandler().
70 */
71int irq_to_evtchn_port(int irq);
72
73void ipi_pcpu(unsigned int cpu, int vector);
74
75/*
76 * CHARACTER-DEVICE DEFINITIONS
77 */
78
79#define PORT_NORMAL    0x0000
80#define PORT_EXCEPTION 0x8000
81#define PORTIDX_MASK   0x7fff
82
83/* /dev/xen/evtchn resides at device number major=10, minor=200 */
84#define EVTCHN_MINOR 200
85
86/* /dev/xen/evtchn ioctls: */
87/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */
88#define EVTCHN_RESET  _IO('E', 1)
89/* EVTCHN_BIND: Bind to the specified event-channel port. */
90#define EVTCHN_BIND   _IO('E', 2)
91/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
92#define EVTCHN_UNBIND _IO('E', 3)
93
94#endif /* __ASM_EVTCHN_H__ */
95