@@ -1447,7 +1447,8 @@ uint64_t mem_read_dbg(uint32_t virt_addr, uint32_t size) {
1447
1447
default :
1448
1448
ret_val = mmu_read_vmem<uint8_t >(NO_OPCODE, virt_addr);
1449
1449
}
1450
- } catch (std::invalid_argument& exc) {
1450
+ }
1451
+ catch (std::invalid_argument& exc) {
1451
1452
/* restore MMU-related CPU state */
1452
1453
mmu_exception_handler = ppc_exception_handler;
1453
1454
ppc_state.spr [SPR::DSISR] = save_dsisr;
@@ -1456,6 +1457,15 @@ uint64_t mem_read_dbg(uint32_t virt_addr, uint32_t size) {
1456
1457
/* rethrow MMU exception */
1457
1458
throw exc;
1458
1459
}
1460
+ catch (...) {
1461
+ /* restore MMU-related CPU state */
1462
+ mmu_exception_handler = ppc_exception_handler;
1463
+ ppc_state.spr [SPR::DSISR] = save_dsisr;
1464
+ ppc_state.spr [SPR::DAR] = save_dar;
1465
+
1466
+ /* rethrow MMU exception */
1467
+ throw (false );
1468
+ }
1459
1469
1460
1470
/* restore MMU-related CPU state */
1461
1471
mmu_exception_handler = ppc_exception_handler;
@@ -1549,7 +1559,12 @@ bool mmu_translate_dbg(uint32_t guest_va, uint32_t &guest_pa) {
1549
1559
guest_pa = tlb1_entry->phys_tag | (guest_va & 0xFFFUL );
1550
1560
is_mapped = true ;
1551
1561
} while (0 );
1552
- } catch (std::invalid_argument& exc) {
1562
+ }
1563
+ catch (std::invalid_argument& exc) {
1564
+ LOG_F (WARNING, " Unmapped address 0x%08X" , guest_va);
1565
+ is_mapped = false ;
1566
+ }
1567
+ catch (...) {
1553
1568
LOG_F (WARNING, " Unmapped address 0x%08X" , guest_va);
1554
1569
is_mapped = false ;
1555
1570
}
0 commit comments