mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-04-21 03:54:45 +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 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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue