xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_fuchsia.cpp (revision 1f9cb04fc6f537ca6cf5a53c28927340cba218a2)
1*1f9cb04fSpatrick //===-- sanitizer_procmaps_fuchsia.cpp
2*1f9cb04fSpatrick //----------------------------------------===//
3*1f9cb04fSpatrick //
4*1f9cb04fSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*1f9cb04fSpatrick // See https://llvm.org/LICENSE.txt for license information.
6*1f9cb04fSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*1f9cb04fSpatrick //
8*1f9cb04fSpatrick //===----------------------------------------------------------------------===//
9*1f9cb04fSpatrick //
10*1f9cb04fSpatrick // Information about the process mappings (Fuchsia-specific parts).
11*1f9cb04fSpatrick //===----------------------------------------------------------------------===//
12*1f9cb04fSpatrick 
13*1f9cb04fSpatrick #include "sanitizer_platform.h"
14*1f9cb04fSpatrick #if SANITIZER_FUCHSIA
15*1f9cb04fSpatrick #include <zircon/process.h>
16*1f9cb04fSpatrick #include <zircon/syscalls.h>
17*1f9cb04fSpatrick 
18*1f9cb04fSpatrick #include "sanitizer_common.h"
19*1f9cb04fSpatrick #include "sanitizer_procmaps.h"
20*1f9cb04fSpatrick 
21*1f9cb04fSpatrick namespace __sanitizer {
22*1f9cb04fSpatrick 
23*1f9cb04fSpatrick // The cache flag is ignored on Fuchsia because a process can always get this
24*1f9cb04fSpatrick // information via its process-self handle.
MemoryMappingLayout(bool)25*1f9cb04fSpatrick MemoryMappingLayout::MemoryMappingLayout(bool) { Reset(); }
26*1f9cb04fSpatrick 
Reset()27*1f9cb04fSpatrick void MemoryMappingLayout::Reset() {
28*1f9cb04fSpatrick   data_.data.clear();
29*1f9cb04fSpatrick   data_.current = 0;
30*1f9cb04fSpatrick 
31*1f9cb04fSpatrick   size_t count;
32*1f9cb04fSpatrick   zx_status_t status = _zx_object_get_info(
33*1f9cb04fSpatrick       _zx_process_self(), ZX_INFO_PROCESS_MAPS, nullptr, 0, nullptr, &count);
34*1f9cb04fSpatrick   if (status != ZX_OK) {
35*1f9cb04fSpatrick     return;
36*1f9cb04fSpatrick   }
37*1f9cb04fSpatrick 
38*1f9cb04fSpatrick   size_t filled;
39*1f9cb04fSpatrick   do {
40*1f9cb04fSpatrick     data_.data.resize(count);
41*1f9cb04fSpatrick     status = _zx_object_get_info(
42*1f9cb04fSpatrick         _zx_process_self(), ZX_INFO_PROCESS_MAPS, data_.data.data(),
43*1f9cb04fSpatrick         count * sizeof(zx_info_maps_t), &filled, &count);
44*1f9cb04fSpatrick     if (status != ZX_OK) {
45*1f9cb04fSpatrick       data_.data.clear();
46*1f9cb04fSpatrick       return;
47*1f9cb04fSpatrick     }
48*1f9cb04fSpatrick   } while (filled < count);
49*1f9cb04fSpatrick }
50*1f9cb04fSpatrick 
~MemoryMappingLayout()51*1f9cb04fSpatrick MemoryMappingLayout::~MemoryMappingLayout() {}
52*1f9cb04fSpatrick 
Error() const53*1f9cb04fSpatrick bool MemoryMappingLayout::Error() const { return data_.data.empty(); }
54*1f9cb04fSpatrick 
Next(MemoryMappedSegment * segment)55*1f9cb04fSpatrick bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
56*1f9cb04fSpatrick   while (data_.current < data_.data.size()) {
57*1f9cb04fSpatrick     const auto &entry = data_.data[data_.current++];
58*1f9cb04fSpatrick     if (entry.type == ZX_INFO_MAPS_TYPE_MAPPING) {
59*1f9cb04fSpatrick       segment->start = entry.base;
60*1f9cb04fSpatrick       segment->end = entry.base + entry.size;
61*1f9cb04fSpatrick       segment->offset = entry.u.mapping.vmo_offset;
62*1f9cb04fSpatrick       const auto flags = entry.u.mapping.mmu_flags;
63*1f9cb04fSpatrick       segment->protection =
64*1f9cb04fSpatrick           ((flags & ZX_VM_PERM_READ) ? kProtectionRead : 0) |
65*1f9cb04fSpatrick           ((flags & ZX_VM_PERM_WRITE) ? kProtectionWrite : 0) |
66*1f9cb04fSpatrick           ((flags & ZX_VM_PERM_EXECUTE) ? kProtectionExecute : 0);
67*1f9cb04fSpatrick       if (segment->filename && segment->filename_size > 0) {
68*1f9cb04fSpatrick         uptr len = Min(sizeof(entry.name), segment->filename_size) - 1;
69*1f9cb04fSpatrick         internal_strncpy(segment->filename, entry.name, len);
70*1f9cb04fSpatrick         segment->filename[len] = 0;
71*1f9cb04fSpatrick       }
72*1f9cb04fSpatrick       return true;
73*1f9cb04fSpatrick     }
74*1f9cb04fSpatrick   }
75*1f9cb04fSpatrick   return false;
76*1f9cb04fSpatrick }
77*1f9cb04fSpatrick 
78*1f9cb04fSpatrick }  // namespace __sanitizer
79*1f9cb04fSpatrick 
80*1f9cb04fSpatrick #endif  // SANITIZER_FUCHSIA
81