diff options
author | jdike <jdike> | 2003-12-16 16:22:16 +0000 |
---|---|---|
committer | jdike <jdike> | 2003-12-16 16:22:16 +0000 |
commit | 347ab1686e44a845d7472d3c53494b5f3d1a4a60 (patch) | |
tree | 7f89ba2860921875d0ea9ea34c6c708a5385dcf2 | |
parent | 8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a (diff) | |
download | uml-history-347ab1686e44a845d7472d3c53494b5f3d1a4a60.tar.gz |
Added support for using /dev/anon.
-rw-r--r-- | arch/um/kernel/mem_user.c | 60 |
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"); |