aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-10-21 16:08:28 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-10-21 16:08:28 +0100
commit05ec439680ec0c24900fd1515fee293752f69ee8 (patch)
tree10b9ad282ea5f2e8810bb7d1db3e508f5a0803e4 /extras
parent9cd9340a83eef7e52b0444c5d927eca149a25cc9 (diff)
downloadxen-05ec439680ec0c24900fd1515fee293752f69ee8.tar.gz
xen-05ec439680ec0c24900fd1515fee293752f69ee8.tar.bz2
xen-05ec439680ec0c24900fd1515fee293752f69ee8.zip
stubdom: mmap on /dev/mem support
This patch adds support for mmap on /dev/mem in a stubdom; it is secure because it only works for memory areas that have been explicitly allowed by the toolstack (xc_domain_iomem_permission). Incidentally this is all that is needed to make MSI-X passthrough work with stubdoms. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/include/lib.h1
-rw-r--r--extras/mini-os/lib/sys.c12
2 files changed, 12 insertions, 1 deletions
diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h
index 0834a18c62..9102d55b81 100644
--- a/extras/mini-os/include/lib.h
+++ b/extras/mini-os/include/lib.h
@@ -145,6 +145,7 @@ enum fd_type {
FTYPE_BLK,
FTYPE_KBD,
FTYPE_FB,
+ FTYPE_MEM,
};
#define MAX_EVTCHN_PORTS 16
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index 8cb5d28479..1284f5a714 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -190,6 +190,11 @@ int open(const char *pathname, int flags, ...)
printk("open(%s) -> %d\n", pathname, fd);
return fd;
}
+ if (!strncmp(pathname, "/dev/mem", strlen("/dev/mem"))) {
+ fd = alloc_fd(FTYPE_MEM);
+ printk("open(/dev/mem) -> %d\n", fd);
+ return fd;
+ }
if (!strncmp(pathname, "/dev/ptmx", strlen("/dev/ptmx")))
return posix_openpt(flags);
printk("open(%s, %x)", pathname, flags);
@@ -1244,13 +1249,18 @@ void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset
ASSERT(prot == (PROT_READ|PROT_WRITE));
ASSERT((fd == -1 && (flags == (MAP_SHARED|MAP_ANON) || flags == (MAP_PRIVATE|MAP_ANON)))
|| (fd != -1 && flags == MAP_SHARED));
- ASSERT(offset == 0);
if (fd == -1)
return map_zero(n, 1);
else if (files[fd].type == FTYPE_XC) {
unsigned long zero = 0;
return map_frames_ex(&zero, n, 0, 0, 1, DOMID_SELF, 0, 0);
+ } else if (files[fd].type == FTYPE_MEM) {
+ int i;
+ unsigned long mfns[n];
+ for (i = 0; i < n; i++)
+ mfns[i] = ((unsigned long) offset + (i * PAGE_SIZE)) >> PAGE_SHIFT;
+ return map_frames_ex(mfns, n, 1, 0, 1, DOMID_IO, 0, _PAGE_PRESENT|_PAGE_RW);
} else ASSERT(0);
}