vm_mmap.c (151252) | vm_mmap.c (157144) |
---|---|
1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 151252 2005-10-12 06:56:00Z dds $"); | 44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 157144 2006-03-26 12:20:54Z jkoshy $"); |
45 46#include "opt_compat.h" | 45 46#include "opt_compat.h" |
47#include "opt_hwpmc_hooks.h" |
|
47#include "opt_mac.h" 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/kernel.h> 52#include <sys/lock.h> 53#include <sys/mutex.h> 54#include <sys/sysproto.h> --- 19 unchanged lines hidden (view full) --- 74#include <vm/vm_object.h> 75#include <vm/vm_page.h> 76#include <vm/vm_pager.h> 77#include <vm/vm_pageout.h> 78#include <vm/vm_extern.h> 79#include <vm/vm_page.h> 80#include <vm/vm_kern.h> 81 | 48#include "opt_mac.h" 49 50#include <sys/param.h> 51#include <sys/systm.h> 52#include <sys/kernel.h> 53#include <sys/lock.h> 54#include <sys/mutex.h> 55#include <sys/sysproto.h> --- 19 unchanged lines hidden (view full) --- 75#include <vm/vm_object.h> 76#include <vm/vm_page.h> 77#include <vm/vm_pager.h> 78#include <vm/vm_pageout.h> 79#include <vm/vm_extern.h> 80#include <vm/vm_page.h> 81#include <vm/vm_kern.h> 82 |
83#ifdef HWPMC_HOOKS 84#include <sys/pmckern.h> 85#endif 86 |
|
82#ifndef _SYS_SYSPROTO_H_ 83struct sbrk_args { 84 int incr; 85}; 86#endif 87 88static int max_proc_mmap; 89SYSCTL_INT(_vm, OID_AUTO, max_proc_mmap, CTLFLAG_RW, &max_proc_mmap, 0, ""); --- 106 unchanged lines hidden (view full) --- 196/* 197 * MPSAFE 198 */ 199int 200mmap(td, uap) 201 struct thread *td; 202 struct mmap_args *uap; 203{ | 87#ifndef _SYS_SYSPROTO_H_ 88struct sbrk_args { 89 int incr; 90}; 91#endif 92 93static int max_proc_mmap; 94SYSCTL_INT(_vm, OID_AUTO, max_proc_mmap, CTLFLAG_RW, &max_proc_mmap, 0, ""); --- 106 unchanged lines hidden (view full) --- 201/* 202 * MPSAFE 203 */ 204int 205mmap(td, uap) 206 struct thread *td; 207 struct mmap_args *uap; 208{ |
209#ifdef HWPMC_HOOKS 210 struct pmckern_map_in pkm; 211#endif |
|
204 struct file *fp; 205 struct vnode *vp; 206 vm_offset_t addr; 207 vm_size_t size, pageoff; 208 vm_prot_t prot, maxprot; 209 void *handle; 210 objtype_t handle_type; 211 int flags, error; --- 147 unchanged lines hidden (view full) --- 359 if (max_proc_mmap && 360 vms->vm_map.nentries >= max_proc_mmap * vms->vm_refcnt) { 361 error = ENOMEM; 362 goto done; 363 } 364 365 error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, 366 flags, handle_type, handle, pos); | 212 struct file *fp; 213 struct vnode *vp; 214 vm_offset_t addr; 215 vm_size_t size, pageoff; 216 vm_prot_t prot, maxprot; 217 void *handle; 218 objtype_t handle_type; 219 int flags, error; --- 147 unchanged lines hidden (view full) --- 367 if (max_proc_mmap && 368 vms->vm_map.nentries >= max_proc_mmap * vms->vm_refcnt) { 369 error = ENOMEM; 370 goto done; 371 } 372 373 error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, 374 flags, handle_type, handle, pos); |
375#ifdef HWPMC_HOOKS 376 /* inform hwpmc(4) if an executable is being mapped */ 377 if (error == 0 && handle_type == OBJT_VNODE && 378 (prot & PROT_EXEC)) { 379 pkm.pm_file = handle; 380 pkm.pm_address = (uintptr_t) addr; 381 PMC_CALL_HOOK(td, PMC_FN_MMAP, (void *) &pkm); 382 } 383#endif |
|
367 if (error == 0) 368 td->td_retval[0] = (register_t) (addr + pageoff); 369done: 370 if (fp) 371 fdrop(fp, td); 372 373 return (error); 374} --- 115 unchanged lines hidden (view full) --- 490/* 491 * MPSAFE 492 */ 493int 494munmap(td, uap) 495 struct thread *td; 496 struct munmap_args *uap; 497{ | 384 if (error == 0) 385 td->td_retval[0] = (register_t) (addr + pageoff); 386done: 387 if (fp) 388 fdrop(fp, td); 389 390 return (error); 391} --- 115 unchanged lines hidden (view full) --- 507/* 508 * MPSAFE 509 */ 510int 511munmap(td, uap) 512 struct thread *td; 513 struct munmap_args *uap; 514{ |
515#ifdef HWPMC_HOOKS 516 struct pmckern_map_out pkm; 517 vm_map_entry_t entry; 518#endif |
|
498 vm_offset_t addr; 499 vm_size_t size, pageoff; 500 vm_map_t map; 501 502 addr = (vm_offset_t) uap->addr; 503 size = uap->len; 504 if (size == 0) 505 return (EINVAL); --- 14 unchanged lines hidden (view full) --- 520 vm_map_lock(map); 521 /* 522 * Make sure entire range is allocated. 523 */ 524 if (!vm_map_check_protection(map, addr, addr + size, VM_PROT_NONE)) { 525 vm_map_unlock(map); 526 return (EINVAL); 527 } | 519 vm_offset_t addr; 520 vm_size_t size, pageoff; 521 vm_map_t map; 522 523 addr = (vm_offset_t) uap->addr; 524 size = uap->len; 525 if (size == 0) 526 return (EINVAL); --- 14 unchanged lines hidden (view full) --- 541 vm_map_lock(map); 542 /* 543 * Make sure entire range is allocated. 544 */ 545 if (!vm_map_check_protection(map, addr, addr + size, VM_PROT_NONE)) { 546 vm_map_unlock(map); 547 return (EINVAL); 548 } |
549#ifdef HWPMC_HOOKS 550 /* 551 * Inform hwpmc if the address range being unmapped contains 552 * an executable region. 553 */ 554 if (vm_map_lookup_entry(map, addr, &entry)) { 555 for (; 556 entry != &map->header && entry->start < addr + size; 557 entry = entry->next) { 558 if (vm_map_check_protection(map, entry->start, 559 entry->end, VM_PROT_EXECUTE) == TRUE) { 560 pkm.pm_address = (uintptr_t) addr; 561 pkm.pm_size = (size_t) size; 562 PMC_CALL_HOOK(td, PMC_FN_MUNMAP, 563 (void *) &pkm); 564 break; 565 } 566 } 567 } 568#endif |
|
528 /* returns nothing but KERN_SUCCESS anyway */ 529 vm_map_delete(map, addr, addr + size); 530 vm_map_unlock(map); 531 return (0); 532} 533 534#ifndef _SYS_SYSPROTO_H_ 535struct mprotect_args { --- 837 unchanged lines hidden --- | 569 /* returns nothing but KERN_SUCCESS anyway */ 570 vm_map_delete(map, addr, addr + size); 571 vm_map_unlock(map); 572 return (0); 573} 574 575#ifndef _SYS_SYSPROTO_H_ 576struct mprotect_args { --- 837 unchanged lines hidden --- |