Avoid crash when access violation address not in page table

This commit is contained in:
Borchev 2024-08-08 12:42:27 -07:00
parent 254b9ffb50
commit 89f447e029
2 changed files with 22 additions and 11 deletions

View file

@ -228,18 +228,20 @@ bool BufferCache::IsRegionRegistered(VAddr addr, size_t size) {
const VAddr end_addr = addr + size;
const u64 page_end = Common::DivCeil(end_addr, CACHING_PAGESIZE);
for (u64 page = addr >> CACHING_PAGEBITS; page < page_end;) {
const BufferId buffer_id = page_table[page];
if (!buffer_id) {
++page;
continue;
if (page_table.contains_page(page)) {
const BufferId buffer_id = page_table[page];
if (buffer_id) {
const Buffer& buffer = slot_buffers[buffer_id];
const VAddr buf_start_addr = buffer.CpuAddr();
const VAddr buf_end_addr = buf_start_addr + buffer.SizeBytes();
if (buf_start_addr < end_addr && addr < buf_end_addr) {
return true;
}
page = Common::DivCeil(end_addr, CACHING_PAGESIZE);
continue;
}
}
Buffer& buffer = slot_buffers[buffer_id];
const VAddr buf_start_addr = buffer.CpuAddr();
const VAddr buf_end_addr = buf_start_addr + buffer.SizeBytes();
if (buf_start_addr < end_addr && addr < buf_end_addr) {
return true;
}
page = Common::DivCeil(end_addr, CACHING_PAGESIZE);
++page;
}
return false;
}

View file

@ -31,6 +31,10 @@ public:
~MultiLevelPageTable() noexcept = default;
[[nodiscard]] Entry* find(size_t page) {
if (!contains_page(page)) {
return nullptr;
}
const size_t l1_page = page >> SecondLevelBits;
const size_t l2_page = page & (NumEntriesPerL1Page - 1);
if (!first_level_map[l1_page]) {
@ -57,6 +61,11 @@ public:
return (*first_level_map[l1_page])[l2_page];
}
[[nodiscard]] const bool contains_page(size_t page) const {
const size_t l1_page = page >> SecondLevelBits;
return l1_page < first_level_map.size();
}
private:
std::vector<L1Page*> first_level_map{};
Common::ObjectPool<L1Page> page_alloc;