1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/apple/scoped_mach_vm.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/apple/mach_logging.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base::apple {
10*6777b538SAndroid Build Coastguard Worker
reset(vm_address_t address,vm_size_t size)11*6777b538SAndroid Build Coastguard Worker void ScopedMachVM::reset(vm_address_t address, vm_size_t size) {
12*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(address % PAGE_SIZE, 0u);
13*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(size % PAGE_SIZE, 0u);
14*6777b538SAndroid Build Coastguard Worker reset_unaligned(address, size);
15*6777b538SAndroid Build Coastguard Worker }
16*6777b538SAndroid Build Coastguard Worker
reset_unaligned(vm_address_t address,vm_size_t size)17*6777b538SAndroid Build Coastguard Worker void ScopedMachVM::reset_unaligned(vm_address_t address, vm_size_t size) {
18*6777b538SAndroid Build Coastguard Worker if (size_) {
19*6777b538SAndroid Build Coastguard Worker if (address_ < address) {
20*6777b538SAndroid Build Coastguard Worker kern_return_t kr = vm_deallocate(mach_task_self(), address_,
21*6777b538SAndroid Build Coastguard Worker std::min(size_, address - address_));
22*6777b538SAndroid Build Coastguard Worker MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate";
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker if (address_ + size_ > address + size) {
25*6777b538SAndroid Build Coastguard Worker vm_address_t deallocate_start = std::max(address_, address + size);
26*6777b538SAndroid Build Coastguard Worker kern_return_t kr = vm_deallocate(mach_task_self(), deallocate_start,
27*6777b538SAndroid Build Coastguard Worker address_ + size_ - deallocate_start);
28*6777b538SAndroid Build Coastguard Worker MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate";
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker address_ = address;
33*6777b538SAndroid Build Coastguard Worker size_ = size;
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker } // namespace base::apple
37