1 /*
2 *
3 * Copyright 2007-2008 Samuel Thibault <samuel.thibault@eu.citrix.com>.
4 * All rights reserved.
5 * Use is subject to license terms.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation;
10 * version 2.1 of the License.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; If not, see <http://www.gnu.org/licenses/>.
19 *
20 * Splitfrom xc_minios.c
21 */
22
23 #include <mini-os/types.h>
24 #include <mini-os/os.h>
25 #include <mini-os/lib.h>
26
27 #include <mini-os/gntmap.h>
28 #include <sys/mman.h>
29
30 #include <errno.h>
31 #include <unistd.h>
32
33 #include "private.h"
34
35 void minios_gnttab_close_fd(int fd);
36
osdep_gnttab_open(xengnttab_handle * xgt)37 int osdep_gnttab_open(xengnttab_handle *xgt)
38 {
39 int fd = alloc_fd(FTYPE_GNTMAP);
40 if ( fd == -1 )
41 return -1;
42 gntmap_init(&files[fd].gntmap);
43 xgt->fd = fd;
44 return 0;
45 }
46
osdep_gnttab_close(xengnttab_handle * xgt)47 int osdep_gnttab_close(xengnttab_handle *xgt)
48 {
49 if ( xgt->fd == -1 )
50 return 0;
51
52 return close(xgt->fd);
53 }
54
minios_gnttab_close_fd(int fd)55 void minios_gnttab_close_fd(int fd)
56 {
57 gntmap_fini(&files[fd].gntmap);
58 files[fd].type = FTYPE_NONE;
59 }
60
osdep_gnttab_grant_map(xengnttab_handle * xgt,uint32_t count,int flags,int prot,uint32_t * domids,uint32_t * refs,uint32_t notify_offset,evtchn_port_t notify_port)61 void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
62 uint32_t count, int flags, int prot,
63 uint32_t *domids, uint32_t *refs,
64 uint32_t notify_offset,
65 evtchn_port_t notify_port)
66 {
67 int fd = xgt->fd;
68 int stride = 1;
69 if (flags & XENGNTTAB_GRANT_MAP_SINGLE_DOMAIN)
70 stride = 0;
71 if (notify_offset != -1 || notify_port != -1) {
72 errno = ENOSYS;
73 return NULL;
74 }
75 return gntmap_map_grant_refs(&files[fd].gntmap,
76 count, domids, stride,
77 refs, prot & PROT_WRITE);
78 }
79
osdep_gnttab_unmap(xengnttab_handle * xgt,void * start_address,uint32_t count)80 int osdep_gnttab_unmap(xengnttab_handle *xgt,
81 void *start_address,
82 uint32_t count)
83 {
84 int fd = xgt->fd;
85 int ret;
86 ret = gntmap_munmap(&files[fd].gntmap,
87 (unsigned long) start_address,
88 count);
89 if (ret < 0) {
90 errno = -ret;
91 return -1;
92 }
93 return ret;
94 }
95
osdep_gnttab_set_max_grants(xengnttab_handle * xgt,uint32_t count)96 int osdep_gnttab_set_max_grants(xengnttab_handle *xgt, uint32_t count)
97 {
98 int fd = xgt->fd;
99 int ret;
100 ret = gntmap_set_max_grants(&files[fd].gntmap,
101 count);
102 if (ret < 0) {
103 errno = -ret;
104 return -1;
105 }
106 return ret;
107 }
108
osdep_gnttab_grant_copy(xengnttab_handle * xgt,uint32_t count,xengnttab_grant_copy_segment_t * segs)109 int osdep_gnttab_grant_copy(xengnttab_handle *xgt,
110 uint32_t count,
111 xengnttab_grant_copy_segment_t *segs)
112 {
113 return -1;
114 }
115 /*
116 * Local variables:
117 * mode: C
118 * c-file-style: "BSD"
119 * c-basic-offset: 4
120 * tab-width: 4
121 * indent-tabs-mode: nil
122 * End:
123 */
124