33 lines
941 B
C++
33 lines
941 B
C++
#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<typename Fn>
|
|
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;
|
|
}
|