From 05ec439680ec0c24900fd1515fee293752f69ee8 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 21 Oct 2009 16:08:28 +0100 Subject: 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 --- extras/mini-os/include/lib.h | 1 + extras/mini-os/lib/sys.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'extras') 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); } -- cgit v1.2.3