PR/4269: Chris Demetriou: msync is missing the MS_* flags.

Also change caddr_t syscall arguments to void *
This commit is contained in:
christos 1997-10-16 23:29:26 +00:00
parent 8bbf1c89e8
commit b82d33e84c
3 changed files with 49 additions and 28 deletions

View File

@ -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);
}
}
/*

View File

@ -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;

View File

@ -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
/*