1 /******************************************************************************
2 *
3 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
4 * Use is subject to license terms.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation;
9 * version 2.1 of the License.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; If not, see <http://www.gnu.org/licenses/>.
18 *
19 * Split out from xc_netbsd.c
20 */
21
22 #include <errno.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25
26 #include <sys/ioctl.h>
27
28 #include <xen/sys/evtchn.h>
29
30 #include "private.h"
31
32 #define EVTCHN_DEV_NAME "/dev/xenevt"
33
osdep_evtchn_open(xenevtchn_handle * xce)34 int osdep_evtchn_open(xenevtchn_handle *xce)
35 {
36 int fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR);
37 if ( fd == -1 )
38 return -1;
39 xce->fd = fd;
40 return 0;
41 }
42
osdep_evtchn_close(xenevtchn_handle * xce)43 int osdep_evtchn_close(xenevtchn_handle *xce)
44 {
45 if ( xce->fd == -1 )
46 return 0;
47
48 return close(xce->fd);
49 }
50
osdep_evtchn_restrict(xenevtchn_handle * xce,domid_t domid)51 int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
52 {
53 errno = -EOPNOTSUPP;
54 return -1;
55 }
56
xenevtchn_fd(xenevtchn_handle * xce)57 int xenevtchn_fd(xenevtchn_handle *xce)
58 {
59 return xce->fd;
60 }
61
xenevtchn_notify(xenevtchn_handle * xce,evtchn_port_t port)62 int xenevtchn_notify(xenevtchn_handle *xce, evtchn_port_t port)
63 {
64 int fd = xce->fd;
65 struct ioctl_evtchn_notify notify;
66
67 notify.port = port;
68
69 return ioctl(fd, IOCTL_EVTCHN_NOTIFY, ¬ify);
70 }
71
xenevtchn_bind_unbound_port(xenevtchn_handle * xce,uint32_t domid)72 xenevtchn_port_or_error_t xenevtchn_bind_unbound_port(xenevtchn_handle * xce, uint32_t domid)
73 {
74 int fd = xce->fd;
75 struct ioctl_evtchn_bind_unbound_port bind;
76 int ret;
77
78 bind.remote_domain = domid;
79
80 ret = ioctl(fd, IOCTL_EVTCHN_BIND_UNBOUND_PORT, &bind);
81 if (ret == 0)
82 return bind.port;
83 else
84 return -1;
85 }
86
xenevtchn_bind_interdomain(xenevtchn_handle * xce,uint32_t domid,evtchn_port_t remote_port)87 xenevtchn_port_or_error_t xenevtchn_bind_interdomain(xenevtchn_handle *xce, uint32_t domid,
88 evtchn_port_t remote_port)
89 {
90 int fd = xce->fd;
91 struct ioctl_evtchn_bind_interdomain bind;
92 int ret;
93
94 bind.remote_domain = domid;
95 bind.remote_port = remote_port;
96
97 ret = ioctl(fd, IOCTL_EVTCHN_BIND_INTERDOMAIN, &bind);
98 if (ret == 0)
99 return bind.port;
100 else
101 return -1;
102 }
103
xenevtchn_unbind(xenevtchn_handle * xce,evtchn_port_t port)104 int xenevtchn_unbind(xenevtchn_handle *xce, evtchn_port_t port)
105 {
106 int fd = xce->fd;
107 struct ioctl_evtchn_unbind unbind;
108
109 unbind.port = port;
110
111 return ioctl(fd, IOCTL_EVTCHN_UNBIND, &unbind);
112 }
113
xenevtchn_bind_virq(xenevtchn_handle * xce,unsigned int virq)114 xenevtchn_port_or_error_t xenevtchn_bind_virq(xenevtchn_handle *xce, unsigned int virq)
115 {
116 int fd = xce->fd;
117 struct ioctl_evtchn_bind_virq bind;
118 int err;
119
120 bind.virq = virq;
121
122 err = ioctl(fd, IOCTL_EVTCHN_BIND_VIRQ, &bind);
123 if (err)
124 return -1;
125 else
126 return bind.port;
127 }
128
xenevtchn_pending(xenevtchn_handle * xce)129 xenevtchn_port_or_error_t xenevtchn_pending(xenevtchn_handle *xce)
130 {
131 int fd = xce->fd;
132 evtchn_port_t port;
133
134 if ( read_exact(fd, (char *)&port, sizeof(port)) == -1 )
135 return -1;
136
137 return port;
138 }
139
xenevtchn_unmask(xenevtchn_handle * xce,evtchn_port_t port)140 int xenevtchn_unmask(xenevtchn_handle *xce, evtchn_port_t port)
141 {
142 int fd = xce->fd;
143 return write_exact(fd, (char *)&port, sizeof(port));
144 }
145
146 /*
147 * Local variables:
148 * mode: C
149 * c-file-style: "BSD"
150 * c-basic-offset: 4
151 * tab-width: 4
152 * indent-tabs-mode: nil
153 * End:
154 */
155