| // Copyright 2021 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #include <lib/memalloc/range.h> |
| #include <lib/stdcompat/span.h> |
| #include <zircon/boot/image.h> |
| |
| #include <string_view> |
| #include <type_traits> |
| |
| namespace memalloc { |
| |
| using namespace std::string_view_literals; |
| |
| std::string_view ToString(Type type) { |
| using namespace std::string_view_literals; |
| |
| switch (type) { |
| case Type::kFreeRam: |
| return "free RAM"sv; |
| case Type::kReserved: |
| return "reserved"sv; |
| case Type::kPeripheral: |
| return "peripheral"sv; |
| case Type::kPoolBookkeeping: |
| return "bookkeeping"sv; |
| case Type::kPhysKernel: |
| return "phys kernel image"sv; |
| case Type::kKernel: |
| return "kernel image"sv; |
| case Type::kFixedAddressKernel: |
| return "fixed-address kernel image"sv; |
| case Type::kKernelStorage: |
| return "decompressed kernel payload"sv; |
| case Type::kDataZbi: |
| return "data ZBI"sv; |
| case Type::kLegacyBootData: |
| return "legacy boot data"; |
| case Type::kIdentityPageTables: |
| return "identity page tables"sv; |
| case Type::kPhysScratch: |
| return "phys scratch"sv; |
| case Type::kPoolTestPayload: |
| return "memalloc::Pool test payload"sv; |
| case Type::kZbiTestPayload: |
| return "ZBI test payload"sv; |
| case Type::kTestRamReserve: |
| return "kernel.test.ram.reserve"sv; |
| case Type::kNvram: |
| return "ZBI_TYPE_NVRAM"sv; |
| case Type::kMaxExtended: |
| return "kMaxExtended"sv; |
| } |
| return "unknown"sv; |
| } |
| |
| cpp20::span<Range> AsRanges(cpp20::span<zbi_mem_range_t> ranges) { |
| static_assert(std::is_standard_layout_v<Range>); |
| static_assert(std::is_standard_layout_v<zbi_mem_range_t>); |
| static_assert(offsetof(Range, addr) == offsetof(zbi_mem_range_t, paddr)); |
| static_assert(offsetof(Range, size) == offsetof(zbi_mem_range_t, length)); |
| static_assert(offsetof(Range, type) == offsetof(zbi_mem_range_t, type)); |
| |
| for (zbi_mem_range_t& range : ranges) { |
| range.reserved = 0; |
| } |
| return {reinterpret_cast<Range*>(ranges.data()), ranges.size()}; |
| } |
| |
| } // namespace memalloc |