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 off from xc_freebsd_osdep.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      "/dev/xen/evtchn"
33 
osdep_evtchn_open(xenevtchn_handle * xce)34 int osdep_evtchn_open(xenevtchn_handle *xce)
35 {
36     int fd = open(EVTCHN_DEV, O_RDWR|O_CLOEXEC);
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, &notify);
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 ret, fd = xce->fd;
75     struct ioctl_evtchn_bind_unbound_port bind;
76 
77     bind.remote_domain = domid;
78 
79     ret = ioctl(fd, IOCTL_EVTCHN_BIND_UNBOUND_PORT, &bind);
80     return ( ret == 0 ) ? bind.port : ret;
81 }
82 
83 xenevtchn_port_or_error_t
xenevtchn_bind_interdomain(xenevtchn_handle * xce,uint32_t domid,evtchn_port_t remote_port)84 xenevtchn_bind_interdomain(xenevtchn_handle *xce, uint32_t domid, evtchn_port_t remote_port)
85 {
86     int ret, fd = xce->fd;
87     struct ioctl_evtchn_bind_interdomain bind;
88 
89     bind.remote_domain = domid;
90     bind.remote_port = remote_port;
91 
92     ret = ioctl(fd, IOCTL_EVTCHN_BIND_INTERDOMAIN, &bind);
93     return ( ret == 0 ) ? bind.port : ret;
94 }
95 
xenevtchn_bind_virq(xenevtchn_handle * xce,unsigned int virq)96 xenevtchn_port_or_error_t xenevtchn_bind_virq(xenevtchn_handle *xce, unsigned int virq)
97 {
98     int ret, fd = xce->fd;
99     struct ioctl_evtchn_bind_virq bind;
100 
101     bind.virq = virq;
102 
103     ret = ioctl(fd, IOCTL_EVTCHN_BIND_VIRQ, &bind);
104     return ( ret == 0 ) ? bind.port : ret;
105 }
106 
xenevtchn_unbind(xenevtchn_handle * xce,evtchn_port_t port)107 int xenevtchn_unbind(xenevtchn_handle *xce, evtchn_port_t port)
108 {
109     int fd = xce->fd;
110     struct ioctl_evtchn_unbind unbind;
111 
112     unbind.port = port;
113 
114     return ioctl(fd, IOCTL_EVTCHN_UNBIND, &unbind);
115 }
116 
xenevtchn_pending(xenevtchn_handle * xce)117 xenevtchn_port_or_error_t xenevtchn_pending(xenevtchn_handle *xce)
118 {
119     int fd = xce->fd;
120     evtchn_port_t port;
121 
122     if ( read(fd, &port, sizeof(port)) != sizeof(port) )
123         return -1;
124 
125     return port;
126 }
127 
xenevtchn_unmask(xenevtchn_handle * xce,evtchn_port_t port)128 int xenevtchn_unmask(xenevtchn_handle *xce, evtchn_port_t port)
129 {
130     int fd = xce->fd;
131 
132     if ( write(fd, &port, sizeof(port)) != sizeof(port) )
133         return -1;
134     return 0;
135 }
136 
137 /*
138  * Local variables:
139  * mode: C
140  * c-file-style: "BSD"
141  * c-basic-offset: 4
142  * tab-width: 4
143  * indent-tabs-mode: nil
144  * End:
145  */
146