summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-12-16 16:22:16 +0000
committerjdike <jdike>2003-12-16 16:22:16 +0000
commit347ab1686e44a845d7472d3c53494b5f3d1a4a60 (patch)
tree7f89ba2860921875d0ea9ea34c6c708a5385dcf2
parent8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a (diff)
downloaduml-history-347ab1686e44a845d7472d3c53494b5f3d1a4a60.tar.gz
Added support for using /dev/anon.
-rw-r--r--arch/um/kernel/mem_user.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/arch/um/kernel/mem_user.c b/arch/um/kernel/mem_user.c
index f56081f..9ad1882 100644
--- a/arch/um/kernel/mem_user.c
+++ b/arch/um/kernel/mem_user.c
@@ -36,6 +36,7 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
+#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include "kern_util.h"
@@ -51,7 +52,7 @@ extern struct mem_region physmem_region;
#define TEMPNAME_TEMPLATE "vm_file-XXXXXX"
-int create_mem_file(unsigned long len)
+static int create_tmp_file(unsigned long len)
{
int fd, err;
char zero;
@@ -61,22 +62,73 @@ int create_mem_file(unsigned long len)
os_print_error(fd, "make_tempfile");
exit(1);
}
+
err = os_mode_fd(fd, 0777);
if(err < 0){
- os_print_error(err, "change_mode");
+ os_print_error(err, "os_mode_fd");
exit(1);
}
err = os_seek_file(fd, len);
if(err < 0){
- os_print_error(err, "seek_file");
+ os_print_error(err, "os_seek_file");
exit(1);
}
zero = 0;
err = os_write_file(fd, &zero, 1);
if(err != 1){
- os_print_error(err, "write_file");
+ os_print_error(err, "os_write_file");
+ exit(1);
+ }
+
+ return(fd);
+}
+
+static int have_devanon = 0;
+
+void check_devanon(void)
+{
+ int fd;
+
+ printk("Checking for /dev/anon on the host...");
+ fd = open("/dev/anon", O_RDWR);
+ if(fd < 0){
+ printk("Not available (open failed with errno %d)\n", errno);
+ return;
+ }
+
+ printk("OK\n");
+ have_devanon = 1;
+}
+
+static int create_anon_file(unsigned long len)
+{
+ void *addr;
+ int fd;
+
+ fd = open("/dev/anon", O_RDWR);
+ if(fd < 0) {
+ os_print_error(fd, "opening /dev/anon");
exit(1);
}
+
+ addr = mmap(NULL, len, PROT_READ | PROT_WRITE , MAP_PRIVATE, fd, 0);
+ if(addr == MAP_FAILED){
+ os_print_error((int) addr, "mapping physmem file");
+ exit(1);
+ }
+ munmap(addr, len);
+
+ return(fd);
+}
+
+int create_mem_file(unsigned long len)
+{
+ int err, fd;
+
+ if(have_devanon)
+ fd = create_anon_file(len);
+ else fd = create_tmp_file(len);
+
err = os_set_exec_close(fd, 1);
if(err < 0)
os_print_error(err, "exec_close");