| 516 | } |
| 517 | |
| 518 | int |
| 519 | kern_msync(struct thread *td, uintptr_t addr0, size_t size, int flags) |
| 520 | { |
| 521 | vm_offset_t addr; |
| 522 | vm_size_t pageoff; |
| 523 | vm_map_t map; |
| 524 | int rv; |
| 525 | |
| 526 | addr = addr0; |
| 527 | pageoff = (addr & PAGE_MASK); |
| 528 | addr -= pageoff; |
| 529 | size += pageoff; |
| 530 | size = (vm_size_t) round_page(size); |
| 531 | if (addr + size < addr) |
| 532 | return (EINVAL); |
| 533 | |
| 534 | if ((flags & (MS_ASYNC|MS_INVALIDATE)) == (MS_ASYNC|MS_INVALIDATE)) |
| 535 | return (EINVAL); |
| 536 | |
| 537 | map = &td->td_proc->p_vmspace->vm_map; |
| 538 | |
| 539 | /* |
| 540 | * Clean the pages and interpret the return value. |
| 541 | */ |
| 542 | rv = vm_map_sync(map, addr, addr + size, (flags & MS_ASYNC) == 0, |
| 543 | (flags & MS_INVALIDATE) != 0); |
| 544 | switch (rv) { |
| 545 | case KERN_SUCCESS: |
| 546 | return (0); |
| 547 | case KERN_INVALID_ADDRESS: |
| 548 | return (ENOMEM); |
| 549 | case KERN_INVALID_ARGUMENT: |
| 550 | return (EBUSY); |
| 551 | case KERN_FAILURE: |
| 552 | return (EIO); |
| 553 | default: |
| 554 | return (EINVAL); |
| 555 | } |
| 556 | } |
| 557 | |
| 558 | #ifndef _SYS_SYSPROTO_H_ |
| 559 | struct munmap_args { |
no test coverage detected