PR/4269: Chris Demetriou: msync is missing the MS_* flags.
Also change caddr_t syscall arguments to void *
This commit is contained in:
parent
8bbf1c89e8
commit
b82d33e84c
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: vm_map.c,v 1.28 1997/07/06 12:38:27 fvdl Exp $ */
|
||||
/* $NetBSD: vm_map.c,v 1.29 1997/10/16 23:29:26 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1991, 1993
|
||||
|
@ -1403,7 +1403,8 @@ vm_map_clean(map, start, end, syncio, invalidate)
|
|||
}
|
||||
|
||||
/*
|
||||
* Make a first pass to check for holes.
|
||||
* Make a first pass to check for holes and (if invalidating)
|
||||
* wired pages.
|
||||
*/
|
||||
for (current = entry; current->start < end; current = current->next) {
|
||||
if (current->is_sub_map) {
|
||||
|
@ -1416,6 +1417,10 @@ vm_map_clean(map, start, end, syncio, invalidate)
|
|||
vm_map_unlock_read(map);
|
||||
return(KERN_INVALID_ADDRESS);
|
||||
}
|
||||
if (current->wired_count) {
|
||||
vm_map_unlock_read(map);
|
||||
return(KERN_PAGES_LOCKED);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: vm_mmap.c,v 1.51 1997/09/08 18:19:45 chuck Exp $ */
|
||||
/* $NetBSD: vm_mmap.c,v 1.52 1997/10/16 23:29:29 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
|
@ -122,7 +122,7 @@ sys_mmap(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
register struct sys_mmap_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
syscallarg(int) prot;
|
||||
syscallarg(int) flags;
|
||||
|
@ -279,23 +279,33 @@ sys_msync(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
struct sys_msync_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
syscallarg(int) flags;
|
||||
} */ *uap = v;
|
||||
vm_offset_t addr;
|
||||
vm_size_t size, pageoff;
|
||||
vm_map_t map;
|
||||
int rv;
|
||||
int rv, flags;
|
||||
boolean_t syncio, invalidate;
|
||||
|
||||
addr = (vm_offset_t)SCARG(uap, addr);
|
||||
size = (vm_size_t)SCARG(uap, len);
|
||||
flags = SCARG(uap, flags);
|
||||
#ifdef DEBUG
|
||||
if (mmapdebug & (MDB_FOLLOW|MDB_SYNC))
|
||||
printf("msync(%d): addr %lx len %lx\n",
|
||||
p->p_pid, addr, size);
|
||||
printf("msync(%d): addr %lx len %lx flags %x\n",
|
||||
p->p_pid, addr, size, flags);
|
||||
#endif
|
||||
|
||||
/* sanity check flags */
|
||||
if ((flags & ~(MS_ASYNC | MS_SYNC | MS_INVALIDATE)) != 0 ||
|
||||
(flags & (MS_ASYNC | MS_SYNC | MS_INVALIDATE)) == 0 ||
|
||||
(flags & (MS_ASYNC | MS_SYNC)) == (MS_ASYNC | MS_SYNC))
|
||||
return (EINVAL);
|
||||
if ((flags & (MS_ASYNC | MS_SYNC)) == 0)
|
||||
flags |= MS_SYNC;
|
||||
|
||||
/*
|
||||
* Align the address to a page boundary,
|
||||
* and adjust the size accordingly.
|
||||
|
@ -306,8 +316,8 @@ sys_msync(p, v, retval)
|
|||
size = (vm_size_t) round_page(size);
|
||||
|
||||
/* Disallow wrap-around. */
|
||||
if (addr + (int)size < addr)
|
||||
return (EINVAL);
|
||||
if (addr + size < addr)
|
||||
return (ENOMEM);
|
||||
|
||||
map = &p->p_vmspace->vm_map;
|
||||
/*
|
||||
|
@ -325,7 +335,7 @@ sys_msync(p, v, retval)
|
|||
rv = vm_map_lookup_entry(map, addr, &entry);
|
||||
vm_map_unlock_read(map);
|
||||
if (rv == FALSE)
|
||||
return (EINVAL);
|
||||
return (ENOMEM);
|
||||
addr = entry->start;
|
||||
size = entry->end - entry->start;
|
||||
}
|
||||
|
@ -334,17 +344,20 @@ sys_msync(p, v, retval)
|
|||
printf("msync: cleaning/flushing address range [%lx-%lx)\n",
|
||||
addr, addr+size);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Could pass this in as a third flag argument to implement
|
||||
* Sun's MS_ASYNC.
|
||||
* XXX Asynchronous msync() causes:
|
||||
* . the process to hang on wchan "vospgw", and
|
||||
* . a "vm_object_page_clean: pager_put error" message to
|
||||
* be printed by the kernel.
|
||||
*/
|
||||
syncio = (flags & MS_SYNC) ? TRUE : FALSE;
|
||||
#else
|
||||
syncio = TRUE;
|
||||
/*
|
||||
* XXX bummer, gotta flush all cached pages to ensure
|
||||
* consistency with the file system cache. Otherwise, we could
|
||||
* pass this in to implement Sun's MS_INVALIDATE.
|
||||
*/
|
||||
invalidate = TRUE;
|
||||
#endif
|
||||
invalidate = (flags & MS_INVALIDATE) ? TRUE : FALSE;
|
||||
|
||||
/*
|
||||
* Clean the pages and interpret the return value.
|
||||
*/
|
||||
|
@ -353,9 +366,11 @@ sys_msync(p, v, retval)
|
|||
case KERN_SUCCESS:
|
||||
break;
|
||||
case KERN_INVALID_ADDRESS:
|
||||
return (EINVAL); /* Sun returns ENOMEM? */
|
||||
return (ENOMEM);
|
||||
case KERN_FAILURE:
|
||||
return (EIO);
|
||||
case KERN_PAGES_LOCKED:
|
||||
return (EBUSY);
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
|
@ -369,7 +384,7 @@ sys_munmap(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
register struct sys_munmap_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
} */ *uap = v;
|
||||
vm_offset_t addr;
|
||||
|
@ -442,7 +457,7 @@ sys_mprotect(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
struct sys_mprotect_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(int) len;
|
||||
syscallarg(int) prot;
|
||||
} */ *uap = v;
|
||||
|
@ -487,7 +502,7 @@ sys_minherit(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
struct sys_minherit_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(int) len;
|
||||
syscallarg(int) inherit;
|
||||
} */ *uap = v;
|
||||
|
@ -533,7 +548,7 @@ sys_madvise(p, v, retval)
|
|||
{
|
||||
#if 0
|
||||
struct sys_madvise_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
syscallarg(int) behav;
|
||||
} */ *uap = v;
|
||||
|
@ -552,7 +567,7 @@ sys_mincore(p, v, retval)
|
|||
{
|
||||
#if 0
|
||||
struct sys_mincore_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
syscallarg(char *) vec;
|
||||
} */ *uap = v;
|
||||
|
@ -569,7 +584,7 @@ sys_mlock(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
struct sys_mlock_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
} */ *uap = v;
|
||||
vm_offset_t addr;
|
||||
|
@ -619,7 +634,7 @@ sys_munlock(p, v, retval)
|
|||
register_t *retval;
|
||||
{
|
||||
struct sys_munlock_args /* {
|
||||
syscallarg(caddr_t) addr;
|
||||
syscallarg(void *) addr;
|
||||
syscallarg(size_t) len;
|
||||
} */ *uap = v;
|
||||
vm_offset_t addr;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: vm_param.h,v 1.12 1995/03/26 20:39:16 jtc Exp $ */
|
||||
/* $NetBSD: vm_param.h,v 1.13 1997/10/16 23:29:31 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1991, 1993
|
||||
|
@ -124,6 +124,7 @@ extern int page_shift;
|
|||
#define KERN_RESOURCE_SHORTAGE 6
|
||||
#define KERN_NOT_RECEIVER 7
|
||||
#define KERN_NO_ACCESS 8
|
||||
#define KERN_PAGES_LOCKED 9
|
||||
|
||||
#ifndef ASSEMBLER
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue