diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 1 | ||||
| -rw-r--r-- | src/core/memory.cpp | 25 |
2 files changed, 17 insertions, 9 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index f8c7f0efd..e825c0526 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -141,6 +141,7 @@ std::unique_ptr<Dynarmic::A64::Jit> ARM_Dynarmic::MakeJit(Common::PageTable& pag | |||
| 141 | config.page_table = reinterpret_cast<void**>(page_table.pointers.data()); | 141 | config.page_table = reinterpret_cast<void**>(page_table.pointers.data()); |
| 142 | config.page_table_address_space_bits = address_space_bits; | 142 | config.page_table_address_space_bits = address_space_bits; |
| 143 | config.silently_mirror_page_table = false; | 143 | config.silently_mirror_page_table = false; |
| 144 | config.absolute_offset_page_table = true; | ||
| 144 | 145 | ||
| 145 | // Multi-process state | 146 | // Multi-process state |
| 146 | config.processor_id = core_index; | 147 | config.processor_id = core_index; |
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 91bf07a92..3c2a29d9b 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -146,7 +146,7 @@ struct Memory::Impl { | |||
| 146 | u8* GetPointer(const VAddr vaddr) { | 146 | u8* GetPointer(const VAddr vaddr) { |
| 147 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | 147 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |
| 148 | if (page_pointer != nullptr) { | 148 | if (page_pointer != nullptr) { |
| 149 | return page_pointer + (vaddr & PAGE_MASK); | 149 | return page_pointer + vaddr; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == | 152 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == |
| @@ -229,7 +229,8 @@ struct Memory::Impl { | |||
| 229 | case Common::PageType::Memory: { | 229 | case Common::PageType::Memory: { |
| 230 | DEBUG_ASSERT(page_table.pointers[page_index]); | 230 | DEBUG_ASSERT(page_table.pointers[page_index]); |
| 231 | 231 | ||
| 232 | const u8* const src_ptr = page_table.pointers[page_index] + page_offset; | 232 | const u8* const src_ptr = |
| 233 | page_table.pointers[page_index] + page_offset + (page_index << PAGE_BITS); | ||
| 233 | std::memcpy(dest_buffer, src_ptr, copy_amount); | 234 | std::memcpy(dest_buffer, src_ptr, copy_amount); |
| 234 | break; | 235 | break; |
| 235 | } | 236 | } |
| @@ -276,7 +277,8 @@ struct Memory::Impl { | |||
| 276 | case Common::PageType::Memory: { | 277 | case Common::PageType::Memory: { |
| 277 | DEBUG_ASSERT(page_table.pointers[page_index]); | 278 | DEBUG_ASSERT(page_table.pointers[page_index]); |
| 278 | 279 | ||
| 279 | u8* const dest_ptr = page_table.pointers[page_index] + page_offset; | 280 | u8* const dest_ptr = |
| 281 | page_table.pointers[page_index] + page_offset + (page_index << PAGE_BITS); | ||
| 280 | std::memcpy(dest_ptr, src_buffer, copy_amount); | 282 | std::memcpy(dest_ptr, src_buffer, copy_amount); |
| 281 | break; | 283 | break; |
| 282 | } | 284 | } |
| @@ -322,7 +324,8 @@ struct Memory::Impl { | |||
| 322 | case Common::PageType::Memory: { | 324 | case Common::PageType::Memory: { |
| 323 | DEBUG_ASSERT(page_table.pointers[page_index]); | 325 | DEBUG_ASSERT(page_table.pointers[page_index]); |
| 324 | 326 | ||
| 325 | u8* dest_ptr = page_table.pointers[page_index] + page_offset; | 327 | u8* dest_ptr = |
| 328 | page_table.pointers[page_index] + page_offset + (page_index << PAGE_BITS); | ||
| 326 | std::memset(dest_ptr, 0, copy_amount); | 329 | std::memset(dest_ptr, 0, copy_amount); |
| 327 | break; | 330 | break; |
| 328 | } | 331 | } |
| @@ -368,7 +371,8 @@ struct Memory::Impl { | |||
| 368 | } | 371 | } |
| 369 | case Common::PageType::Memory: { | 372 | case Common::PageType::Memory: { |
| 370 | DEBUG_ASSERT(page_table.pointers[page_index]); | 373 | DEBUG_ASSERT(page_table.pointers[page_index]); |
| 371 | const u8* src_ptr = page_table.pointers[page_index] + page_offset; | 374 | const u8* src_ptr = |
| 375 | page_table.pointers[page_index] + page_offset + (page_index << PAGE_BITS); | ||
| 372 | WriteBlock(process, dest_addr, src_ptr, copy_amount); | 376 | WriteBlock(process, dest_addr, src_ptr, copy_amount); |
| 373 | break; | 377 | break; |
| 374 | } | 378 | } |
| @@ -446,7 +450,8 @@ struct Memory::Impl { | |||
| 446 | page_type = Common::PageType::Unmapped; | 450 | page_type = Common::PageType::Unmapped; |
| 447 | } else { | 451 | } else { |
| 448 | page_type = Common::PageType::Memory; | 452 | page_type = Common::PageType::Memory; |
| 449 | current_page_table->pointers[vaddr >> PAGE_BITS] = pointer; | 453 | current_page_table->pointers[vaddr >> PAGE_BITS] = |
| 454 | pointer - (vaddr & ~PAGE_MASK); | ||
| 450 | } | 455 | } |
| 451 | break; | 456 | break; |
| 452 | } | 457 | } |
| @@ -493,7 +498,9 @@ struct Memory::Impl { | |||
| 493 | memory); | 498 | memory); |
| 494 | } else { | 499 | } else { |
| 495 | while (base != end) { | 500 | while (base != end) { |
| 496 | page_table.pointers[base] = memory; | 501 | page_table.pointers[base] = memory - (base << PAGE_BITS); |
| 502 | ASSERT_MSG(page_table.pointers[base], | ||
| 503 | "memory mapping base yield a nullptr within the table"); | ||
| 497 | 504 | ||
| 498 | base += 1; | 505 | base += 1; |
| 499 | memory += PAGE_SIZE; | 506 | memory += PAGE_SIZE; |
| @@ -518,7 +525,7 @@ struct Memory::Impl { | |||
| 518 | if (page_pointer != nullptr) { | 525 | if (page_pointer != nullptr) { |
| 519 | // NOTE: Avoid adding any extra logic to this fast-path block | 526 | // NOTE: Avoid adding any extra logic to this fast-path block |
| 520 | T value; | 527 | T value; |
| 521 | std::memcpy(&value, &page_pointer[vaddr & PAGE_MASK], sizeof(T)); | 528 | std::memcpy(&value, &page_pointer[vaddr], sizeof(T)); |
| 522 | return value; | 529 | return value; |
| 523 | } | 530 | } |
| 524 | 531 | ||
| @@ -559,7 +566,7 @@ struct Memory::Impl { | |||
| 559 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | 566 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |
| 560 | if (page_pointer != nullptr) { | 567 | if (page_pointer != nullptr) { |
| 561 | // NOTE: Avoid adding any extra logic to this fast-path block | 568 | // NOTE: Avoid adding any extra logic to this fast-path block |
| 562 | std::memcpy(&page_pointer[vaddr & PAGE_MASK], &data, sizeof(T)); | 569 | std::memcpy(&page_pointer[vaddr], &data, sizeof(T)); |
| 563 | return; | 570 | return; |
| 564 | } | 571 | } |
| 565 | 572 | ||