MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vm_mmap_object

Function vm_mmap_object

freebsd/vm/vm_mmap.c:1556–1665  ·  view source on GitHub ↗

* Internal version of mmap that maps a specific VM object into an * map. Called by mmap for MAP_ANON, vm_mmap, shm_mmap, and vn_mmap. */

Source from the content-addressed store, hash-verified

1554 * map. Called by mmap for MAP_ANON, vm_mmap, shm_mmap, and vn_mmap.
1555 */
1556int
1557vm_mmap_object(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
1558 vm_prot_t maxprot, int flags, vm_object_t object, vm_ooffset_t foff,
1559 boolean_t writecounted, struct thread *td)
1560{
1561 vm_offset_t max_addr;
1562 int docow, error, findspace, rv;
1563 bool curmap, fitit;
1564
1565 curmap = map == &td->td_proc->p_vmspace->vm_map;
1566 if (curmap) {
1567 error = kern_mmap_racct_check(td, map, size);
1568 if (error != 0)
1569 return (error);
1570 }
1571
1572 /*
1573 * We currently can only deal with page aligned file offsets.
1574 * The mmap() system call already enforces this by subtracting
1575 * the page offset from the file offset, but checking here
1576 * catches errors in device drivers (e.g. d_single_mmap()
1577 * callbacks) and other internal mapping requests (such as in
1578 * exec).
1579 */
1580 if (foff & PAGE_MASK)
1581 return (EINVAL);
1582
1583 if ((flags & MAP_FIXED) == 0) {
1584 fitit = TRUE;
1585 *addr = round_page(*addr);
1586 } else {
1587 if (*addr != trunc_page(*addr))
1588 return (EINVAL);
1589 fitit = FALSE;
1590 }
1591
1592 if (flags & MAP_ANON) {
1593 if (object != NULL || foff != 0)
1594 return (EINVAL);
1595 docow = 0;
1596 } else if (flags & MAP_PREFAULT_READ)
1597 docow = MAP_PREFAULT;
1598 else
1599 docow = MAP_PREFAULT_PARTIAL;
1600
1601 if ((flags & (MAP_ANON|MAP_SHARED)) == 0)
1602 docow |= MAP_COPY_ON_WRITE;
1603 if (flags & MAP_NOSYNC)
1604 docow |= MAP_DISABLE_SYNCER;
1605 if (flags & MAP_NOCORE)
1606 docow |= MAP_DISABLE_COREDUMP;
1607 /* Shared memory is also shared with children. */
1608 if (flags & MAP_SHARED)
1609 docow |= MAP_INHERIT_SHARE;
1610 if (writecounted)
1611 docow |= MAP_WRITECOUNT;
1612 if (flags & MAP_STACK) {
1613 if (object != NULL)

Callers 5

vfs_vnops.cFile · 0.85
uipc_shm.cFile · 0.85
copyout_mapFunction · 0.85
vm_mmap.cFile · 0.85
vm_mmapFunction · 0.85

Calls 7

kern_mmap_racct_checkFunction · 0.85
vm_map_find_minFunction · 0.85
lim_maxFunction · 0.85
vm_map_findFunction · 0.85
vm_map_fixedFunction · 0.85
vm_map_wire_lockedFunction · 0.85
vm_mmap_to_errnoFunction · 0.85

Tested by

no test coverage detected