USI frvbf_read_imem_USI (SIM_CPU *current_cpu, PCADDR vpc) { USI hsr0; vpc = check_insn_read_address (current_cpu, vpc, 3); hsr0 = GET_HSR0 (); if (GET_HSR0_ICE (hsr0)) { FRV_CACHE *cache; USI value; /* We don't want this to show up in the cache statistics. That read is done in frvbf_simulate_insn_prefetch. So read the cache or memory passively here. */ cache = CPU_INSN_CACHE (current_cpu); if (frv_cache_read_passive_SI (cache, vpc, &value)) return value; } return sim_core_read_unaligned_4 (current_cpu, vpc, read_map, vpc); }
/* Check to see the if the RSTR.HR or RSTR.SR bits have been set. If so, handle the appropriate reset interrupt. */ static int check_reset (SIM_CPU *current_cpu, IADDR pc) { int hsr0; int hr; int sr; SI rstr; FRV_CACHE *cache = CPU_DATA_CACHE (current_cpu); IADDR address = RSTR_ADDRESS; /* We don't want this to show up in the cache statistics, so read the cache passively. */ if (! frv_cache_read_passive_SI (cache, address, & rstr)) rstr = sim_core_read_unaligned_4 (current_cpu, pc, read_map, address); hr = GET_RSTR_HR (rstr); sr = GET_RSTR_SR (rstr); if (! hr && ! sr) return 0; /* no reset. */ /* Reinitialize the machine state. */ if (hr) frv_hardware_reset (current_cpu); else frv_software_reset (current_cpu); /* Branch to the reset address. */ hsr0 = GET_HSR0 (); if (GET_HSR0_SA (hsr0)) SET_H_PC (0xff000000); else SET_H_PC (0); return 1; /* reset */ }