summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp1
-rw-r--r--src/core/memory.cpp25
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