* 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. */
| 1554 | * map. Called by mmap for MAP_ANON, vm_mmap, shm_mmap, and vn_mmap. |
| 1555 | */ |
| 1556 | int |
| 1557 | vm_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) |
no test coverage detected