| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_BIN_GUEST_VMM_ARCH_X64_E820_H_ |
| #define GARNET_BIN_GUEST_VMM_ARCH_X64_E820_H_ |
| |
| #include <vector> |
| |
| #include <zircon/boot/e820.h> |
| |
| #include "garnet/bin/guest/vmm/dev_mem.h" |
| |
| /** |
| * Used to construct an E820 memory map |
| * |
| * It is not the responsibility of this class to detect or prevent region |
| * overlap of either same or differently typed regions. |
| */ |
| class E820Map { |
| public: |
| /* |
| * Create a new E820 map |
| * |
| * @param pmem_size Size of physical memory. The E820 map will contain as much |
| * RAM regions as can fit in the defined physical memory that do not |
| * collide with the provided dev_mem regions. |
| */ |
| E820Map(size_t mem_size, const DevMem &dev_mem); |
| |
| void AddReservedRegion(zx_gpaddr_t addr, size_t size) { |
| entries.emplace_back(e820entry_t{addr, size, E820_RESERVED}); |
| } |
| |
| size_t size() const { return entries.size(); } |
| |
| void copy(e820entry_t *dest) { |
| std::copy(entries.begin(), entries.end(), dest); |
| } |
| |
| private: |
| std::vector<e820entry_t> entries; |
| }; |
| |
| #endif // GARNET_BIN_GUEST_VMM_ARCH_X64_E820_H_ |