diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 207fcc1..bfaac99 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index a639704..e565c14 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -24,6 +24,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -518,54 +519,6 @@ return (0x0); } -int sys_mmap(struct thread *td, struct sys_mmap_args *uap) { - vm_offset_t addr = 0x0; - char *tmp = 0x0; - struct file *fd = 0x0; - - addr = (vm_offset_t) uap->addr; - - /* - #ifdef _VMM_DEBUG - */ - if (uap->addr != 0x0) { - kprintf("Address hints are not supported yet.\n"); - } - kprintf("uap->flags: [0x%X]\n", uap->flags); - kprintf("uap->addr: [0x%X]\n", uap->addr); - kprintf("uap->len: [0x%X]\n", uap->len); - kprintf("uap->prot: [0x%X]\n", uap->prot); - kprintf("uap->fd: [%i]\n", uap->fd); - kprintf("uap->pad: [0x%X]\n", uap->pad); - kprintf("uap->pos: [0x%X]\n", uap->pos); - /* - #endif - */ - - if (uap->fd == -1) { - //td->td_retval[0] = (int) vmm_getFreeVirtualPage( _current->id, uap->len / 0x1000, VM_TASK ); - //td->td_retval[0] = (int) - td->td_retval[0] = vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_THRD); - return (0x0); //vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_THRD)); - } - else { - kprintf("uap->flags: [0x%X]\n", uap->flags); - kprintf("uap->addr: [0x%X]\n", uap->addr); - kprintf("uap->len: [0x%X]\n", uap->len); - kprintf("uap->prot: [0x%X]\n", uap->prot); - kprintf("uap->fd: [%i]\n", uap->fd); - kprintf("uap->pad: [0x%X]\n", uap->pad); - kprintf("uap->pos: [0x%X]\n", uap->pos); - //K_PANIC("NOT YET\n"); - getfd(td, &fd, uap->fd); - tmp = (char *) vmm_getFreeVirtualPage(_current->id, uap->len / 0x1000, VM_TASK); - fread(tmp, uap->len, 0x1, fd->fd); - - td->td_retval[0] = (int) tmp; - } - return (0x0); -} - int obreak(struct thread *td, struct obreak_args *uap) { uint32_t i = 0x0; vm_offset_t old = 0x0; diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 170c687..0f298c9 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -28,14 +28,15 @@ *****************************************************************************************/ #include +#include #include #include #include #include /* MrOlsen (2016-01-15) TEMP: Put These somewhere else */ -typedef __uint32_t __vm_size_t; -typedef __vm_size_t vm_size_t; +typedef __uint32_t __vm_size_t; +typedef __vm_size_t vm_size_t; #define EINVAL 22 /* Invalid argument */ #define MAP_ALIGNED(n) ((n) << MAP_ALIGNMENT_SHIFT) #define MAP_ALIGNMENT_SHIFT 24 @@ -43,7 +44,6 @@ #define MAP_ALIGNED_SUPER MAP_ALIGNED(1) /* align on a superpage */ #define NBBY 8 /* number of bits in a byte */ - /* PROTs */ #define PROT_NONE 0x00 /* no permissions */ #define PROT_READ 0x01 /* pages can be read */ @@ -72,7 +72,7 @@ #define MAP_FILE 0x0000 /* map from file (default) */ #define MAP_ANON 0x1000 /* allocated from memory, swap space */ -int freebsd6_mmap( struct thread *td, struct freebsd6_mmap_args *uap ) { +int freebsd6_mmap(struct thread *td, struct freebsd6_mmap_args *uap) { vm_size_t size, pageoff; off_t pos; int align, flags, error; @@ -86,15 +86,15 @@ flags = uap->flags; pos = uap->pos; - kprintf( "uap->flags: [0x%X]\n", uap->flags ); - kprintf( "uap->addr: [0x%X]\n", uap->addr ); - kprintf( "uap->len: [0x%X]\n", uap->len ); - kprintf( "uap->prot: [0x%X]\n", uap->prot ); - kprintf( "uap->fd: [%i]\n", uap->fd ); - kprintf( "uap->pad: [0x%X]\n", uap->pad ); - kprintf( "uap->pos: [0x%X]\n", uap->pos ); + kprintf("uap->flags: [0x%X]\n", uap->flags); + kprintf("uap->addr: [0x%X]\n", uap->addr); + kprintf("uap->len: [0x%X]\n", uap->len); + kprintf("uap->prot: [0x%X]\n", uap->prot); + kprintf("uap->fd: [%i]\n", uap->fd); + kprintf("uap->pad: [0x%X]\n", uap->pad); + kprintf("uap->pos: [0x%X]\n", uap->pos); - if ( (uap->flags & MAP_ANON) != 0 ) + if ((uap->flags & MAP_ANON) != 0) pos = 0; /* @@ -107,26 +107,25 @@ /* Adjust size for rounding (on both ends). */ size += pageoff; - size = (vm_size_t) round_page( size ); + size = (vm_size_t) round_page(size); /* Ensure alignment is at least a page and fits in a pointer. */ align = flags & MAP_ALIGNMENT_MASK; - if ( align != 0 && align != MAP_ALIGNED_SUPER && (align >> MAP_ALIGNMENT_SHIFT >= sizeof(void *) * NBBY || align >> MAP_ALIGNMENT_SHIFT < PAGE_SHIFT) ) + if (align != 0 && align != MAP_ALIGNED_SUPER && (align >> MAP_ALIGNMENT_SHIFT >= sizeof(void *) * NBBY || align >> MAP_ALIGNMENT_SHIFT < PAGE_SHIFT)) return (EINVAL); - if ( flags & MAP_FIXED ) { - kprintf( "FIXED NOT SUPPORTED YET" ); + if (flags & MAP_FIXED) { + kprintf("FIXED NOT SUPPORTED YET"); return (EINVAL); - } - else { + } else { /* At Some Point I Need To Proc Lock Incase It's Threaded */ -/* MrOlsen (2016-01-15) Temporary comment out - if ( addr == 0 || (addr >= round_page( (vm_offset_t) vms->vm_taddr ) && addr < round_page( (vm_offset_t) vms->vm_daddr + lim_max( td->td_proc, RLIMIT_DATA ) )) ) - addr = round_page( (vm_offset_t) vms->vm_daddr + lim_max( td->td_proc, RLIMIT_DATA ) ); -*/ + /* MrOlsen (2016-01-15) Temporary comment out + if ( addr == 0 || (addr >= round_page( (vm_offset_t) vms->vm_taddr ) && addr < round_page( (vm_offset_t) vms->vm_daddr + lim_max( td->td_proc, RLIMIT_DATA ) )) ) + addr = round_page( (vm_offset_t) vms->vm_daddr + lim_max( td->td_proc, RLIMIT_DATA ) ); + */ } - if ( flags & MAP_ANON ) { + if (flags & MAP_ANON) { /* * Mapping blank space is trivial. */ @@ -137,21 +136,57 @@ maxprot = VM_PROT_ALL; cap_maxprot = VM_PROT_ALL; */ - for ( i = addr; i < (addr + size); i += 0x1000 ) { - if ( vmm_remapPage( vmm_findFreePage( _current->id ), i, PAGE_DEFAULT, _current->id ) == 0x0 ) - K_PANIC( "remap Failed" ); + for (i = addr; i < (addr + size); i += 0x1000) { + if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id) == 0x0) + K_PANIC("remap Failed"); } - kprintf( "td->vm_dsize should be adjust but isn't" ); - } - else { + kprintf("td->vm_dsize should be adjust but isn't"); + } else { /* Mapping File */ - kprintf( "File Mapping Not Supported Yet" ); + kprintf("File Mapping Not Supported Yet"); return (EINVAL); } return (0x0); } +int sys_mmap(struct thread *td, struct sys_mmap_args *uap) { + vm_offset_t addr = 0x0; + char *tmp = 0x0; + struct file *fd = 0x0; + + addr = (vm_offset_t) uap->addr; + + if (uap->addr != 0x0) { + kprintf("Address hints are not supported yet.\n"); + td->td_retval[0] = 0x0; + return(-1); + } + + if (uap->fd == -1) { + //td->td_retval[0] = (int) vmm_getFreeVirtualPage( _current->id, uap->len / 0x1000, VM_TASK ); + //td->td_retval[0] = (int) + td->td_retval[0] = vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_THRD); + return (0x0); //vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_THRD)); + } + else { + kprintf("uap->flags: [0x%X]\n", uap->flags); + kprintf("uap->addr: [0x%X]\n", uap->addr); + kprintf("uap->len: [0x%X]\n", uap->len); + kprintf("uap->prot: [0x%X]\n", uap->prot); + kprintf("uap->fd: [%i]\n", uap->fd); + kprintf("uap->pad: [0x%X]\n", uap->pad); + kprintf("uap->pos: [0x%X]\n", uap->pos); + //K_PANIC("NOT YET\n"); + getfd(td, &fd, uap->fd); + tmp = (char *) vmm_getFreeVirtualPage(_current->id, round_page(uap->len) / 0x1000, VM_TASK); + fread(tmp, uap->len, 0x1, fd->fd); + + td->td_retval[0] = (int) tmp; + } + return (0x0); +} + /*** END ***/