| // Copyright 2020 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/zbi-format/memory.h> |
| #include <lib/zbi-format/zbi.h> |
| #include <lib/zbitl/error-stdio.h> |
| #include <lib/zbitl/view.h> |
| #include <zircon/assert.h> |
| |
| #include <ktl/optional.h> |
| #include <ktl/span.h> |
| #include <phys/main.h> |
| |
| #include <ktl/enforce.h> |
| |
| void InitMemory(void* zbi, AddressSpace* aspace) { |
| ktl::span<zbi_mem_range_t> zbi_ranges; |
| ktl::optional<memalloc::Range> nvram_range; |
| |
| zbitl::View<zbitl::ByteView> view{ |
| zbitl::StorageFromRawHeader(static_cast<const zbi_header_t*>(zbi))}; |
| for (auto [header, payload] : view) { |
| switch (header->type) { |
| case ZBI_TYPE_MEM_CONFIG: |
| zbi_ranges = { |
| const_cast<zbi_mem_range_t*>(reinterpret_cast<const zbi_mem_range_t*>(payload.data())), |
| payload.size_bytes() / sizeof(zbi_mem_range_t)}; |
| break; |
| |
| case ZBI_TYPE_NVRAM: |
| ZX_ASSERT(payload.size_bytes() >= sizeof(zbi_nvram_t)); |
| const zbi_nvram_t* nvram = reinterpret_cast<const zbi_nvram_t*>(payload.data()); |
| nvram_range = { |
| .addr = nvram->base, |
| .size = nvram->length, |
| .type = memalloc::Type::kNvram, |
| }; |
| break; |
| } |
| } |
| if (auto result = view.take_error(); result.is_error()) { |
| zbitl::PrintViewError(result.error_value()); |
| ZX_PANIC("error occurred while parsing the data ZBI"); |
| } |
| |
| ZX_ASSERT_MSG(!zbi_ranges.empty(), "no MEM_CONFIG item found in the data ZBI"); |
| |
| ZbiInitMemory(zbi, zbi_ranges, nvram_range, aspace); |
| } |