#pragma once #include "memory/pointer.h" struct KernelSection { uint64_t vma_start; uint64_t vma_end; const char* name; paddr_t phys_start() const { return paddr_t{vma_start >= high_base ? vma_start - high_base : vma_start}; } paddr_t phys_end() const { return paddr_t{vma_end >= high_base ? vma_end - high_base : vma_end}; } }; extern KernelSection __reserved_ranges_start__[], __reserved_ranges_end__[]; template void for_each_reserved_section(Fn&& fn) { for (auto* s = __reserved_ranges_start__; s < __reserved_ranges_end__; ++s) fn(*s); } inline bool is_in_reserved_section(paddr_t ptr, size_t size = 1) { bool res = false; for_each_reserved_section([&](const KernelSection& section) { if (ptr.address < section.phys_end().address && section.phys_start().address < ptr.address + size) { res = true; } }); return res; }