xref: /aosp_15_r20/external/cronet/base/apple/scoped_mach_vm.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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