diff --git a/src/device.rs b/src/device.rs index 6b3fcb1..8b62424 100644 --- a/src/device.rs +++ b/src/device.rs @@ -127,6 +127,7 @@ impl Device { gpr: [0; 32], clock_rate: 0, pc: 0xBFC00000, + pc_phys: 0, llbit: false, lo: 0, hi: 0, diff --git a/src/device/cpu.rs b/src/device/cpu.rs index e56db38..f037b96 100644 --- a/src/device/cpu.rs +++ b/src/device/cpu.rs @@ -22,6 +22,7 @@ pub struct Cpu { pub branch_state: BranchState, pub gpr: [u64; 32], pub pc: u64, + pub pc_phys: u64, pub lo: u64, pub hi: u64, pub running: u8, @@ -241,6 +242,7 @@ pub fn run(device: &mut device::Device) { if err { continue; // TLB exception } + device.cpu.pc_phys = phys_address; if cached { device::cache::icache_fetch(device, phys_address) } else { diff --git a/src/device/cpu_instructions.rs b/src/device/cpu_instructions.rs index 301c703..24b3921 100644 --- a/src/device/cpu_instructions.rs +++ b/src/device/cpu_instructions.rs @@ -49,18 +49,10 @@ pub fn bits_above_mask>(x: T) -> u64 { } pub fn check_relative_idle_loop(device: &mut device::Device, opcode: u32) { - let (phys_address, _, err) = device::memory::translate_address( - device, - device.cpu.pc, - device::memory::AccessType::Lookup, - ); - if err { - return; - } if imm(opcode) as i16 == -1 - && device.memory.fast_read[(phys_address >> 16) as usize]( + && device.memory.fast_read[(device.cpu.pc_phys >> 16) as usize]( device, - phys_address + 4, + device.cpu.pc_phys + 4, device::memory::AccessSize::Word, ) == 0 { @@ -69,18 +61,10 @@ pub fn check_relative_idle_loop(device: &mut device::Device, opcode: u32) { } pub fn check_absolute_idle_loop(device: &mut device::Device, opcode: u32) { - let (phys_address, _, err) = device::memory::translate_address( - device, - device.cpu.pc, - device::memory::AccessType::Lookup, - ); - if err { - return; - } - if (opcode & 0x3FFFFFF) as u64 == (phys_address & 0x0FFFFFFF) >> 2 - && device.memory.fast_read[(phys_address >> 16) as usize]( + if (opcode & 0x3FFFFFF) as u64 == (device.cpu.pc_phys & 0x0FFFFFFF) >> 2 + && device.memory.fast_read[(device.cpu.pc_phys >> 16) as usize]( device, - phys_address + 4, + device.cpu.pc_phys + 4, device::memory::AccessSize::Word, ) == 0 { diff --git a/src/device/memory.rs b/src/device/memory.rs index 39c0f0a..829f1f8 100644 --- a/src/device/memory.rs +++ b/src/device/memory.rs @@ -24,7 +24,6 @@ pub const MM_IS_VIEWER: usize = 0x13ff0000; pub enum AccessType { Write, Read, - Lookup, } #[derive(Copy, Clone)] diff --git a/src/device/tlb.rs b/src/device/tlb.rs index 35d8e7a..8caee88 100644 --- a/src/device/tlb.rs +++ b/src/device/tlb.rs @@ -261,9 +261,7 @@ pub fn get_physical_address( } } - if access_type != device::memory::AccessType::Lookup { - device::exceptions::tlb_miss_exception(device, address, access_type) - } + device::exceptions::tlb_miss_exception(device, address, access_type); return (0, false, true); }