mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-06 16:18:42 +00:00
Avoid crash when access violation address not in page table
This commit is contained in:
parent
254b9ffb50
commit
89f447e029
2 changed files with 22 additions and 11 deletions
|
@ -228,18 +228,20 @@ bool BufferCache::IsRegionRegistered(VAddr addr, size_t size) {
|
||||||
const VAddr end_addr = addr + size;
|
const VAddr end_addr = addr + size;
|
||||||
const u64 page_end = Common::DivCeil(end_addr, CACHING_PAGESIZE);
|
const u64 page_end = Common::DivCeil(end_addr, CACHING_PAGESIZE);
|
||||||
for (u64 page = addr >> CACHING_PAGEBITS; page < page_end;) {
|
for (u64 page = addr >> CACHING_PAGEBITS; page < page_end;) {
|
||||||
const BufferId buffer_id = page_table[page];
|
if (page_table.contains_page(page)) {
|
||||||
if (!buffer_id) {
|
const BufferId buffer_id = page_table[page];
|
||||||
++page;
|
if (buffer_id) {
|
||||||
continue;
|
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];
|
++page;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,10 @@ public:
|
||||||
~MultiLevelPageTable() noexcept = default;
|
~MultiLevelPageTable() noexcept = default;
|
||||||
|
|
||||||
[[nodiscard]] Entry* find(size_t page) {
|
[[nodiscard]] Entry* find(size_t page) {
|
||||||
|
if (!contains_page(page)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
const size_t l1_page = page >> SecondLevelBits;
|
const size_t l1_page = page >> SecondLevelBits;
|
||||||
const size_t l2_page = page & (NumEntriesPerL1Page - 1);
|
const size_t l2_page = page & (NumEntriesPerL1Page - 1);
|
||||||
if (!first_level_map[l1_page]) {
|
if (!first_level_map[l1_page]) {
|
||||||
|
@ -57,6 +61,11 @@ public:
|
||||||
return (*first_level_map[l1_page])[l2_page];
|
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:
|
private:
|
||||||
std::vector<L1Page*> first_level_map{};
|
std::vector<L1Page*> first_level_map{};
|
||||||
Common::ObjectPool<L1Page> page_alloc;
|
Common::ObjectPool<L1Page> page_alloc;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue