From 62676859202cd971e3ef2806925448d68cdc5798 Mon Sep 17 00:00:00 2001 From: joevt Date: Wed, 21 Feb 2024 23:10:14 -0800 Subject: [PATCH] ppcexec: Make EXEF_TIMER separate variable. --- cpu/ppc/ppcemu.h | 5 ---- cpu/ppc/ppcexceptions.cpp | 6 ++-- cpu/ppc/ppcexec.cpp | 58 +++++++-------------------------------- 3 files changed, 13 insertions(+), 56 deletions(-) diff --git a/cpu/ppc/ppcemu.h b/cpu/ppc/ppcemu.h index f25bbee..aeb76c0 100644 --- a/cpu/ppc/ppcemu.h +++ b/cpu/ppc/ppcemu.h @@ -184,7 +184,6 @@ enum { EXEF_BRANCH = 1 << 0, EXEF_EXCEPTION = 1 << 1, EXEF_RFI = 1 << 2, - EXEF_TIMER = 1 << 7 }; enum CR_select : int32_t { @@ -299,11 +298,7 @@ enum Exc_Cause : uint32_t { TRAP = 1 << (31 - 14), }; -#ifdef EXEC_FLAGS_ATOMIC -extern std::atomic exec_flags; -#else extern unsigned exec_flags; -#endif extern jmp_buf exc_env; diff --git a/cpu/ppc/ppcexceptions.cpp b/cpu/ppc/ppcexceptions.cpp index b5c5e3f..960ed54 100644 --- a/cpu/ppc/ppcexceptions.cpp +++ b/cpu/ppc/ppcexceptions.cpp @@ -56,7 +56,7 @@ void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) { break; case Except_Type::EXC_ISI: - if (exec_flags & ~EXEF_TIMER) { + if (exec_flags) { ppc_state.spr[SPR::SRR0] = ppc_next_instruction_address; } else { ppc_state.spr[SPR::SRR0] = ppc_state.pc & 0xFFFFFFFCUL; @@ -65,7 +65,7 @@ void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) { break; case Except_Type::EXC_EXT_INT: - if (exec_flags & ~EXEF_TIMER) { + if (exec_flags) { ppc_state.spr[SPR::SRR0] = ppc_next_instruction_address; } else { ppc_state.spr[SPR::SRR0] = (ppc_state.pc & 0xFFFFFFFCUL) + 4; @@ -89,7 +89,7 @@ void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) { break; case Except_Type::EXC_DECR: - if (exec_flags & ~EXEF_TIMER) { + if (exec_flags) { ppc_state.spr[SPR::SRR0] = ppc_next_instruction_address; } else { ppc_state.spr[SPR::SRR0] = (ppc_state.pc & 0xFFFFFFFCUL) + 4; diff --git a/cpu/ppc/ppcexec.cpp b/cpu/ppc/ppcexec.cpp index 74b1433..b2fe674 100644 --- a/cpu/ppc/ppcexec.cpp +++ b/cpu/ppc/ppcexec.cpp @@ -52,13 +52,10 @@ uint32_t ppc_cur_instruction; // Current instruction for the PPC uint32_t ppc_effective_address; uint32_t ppc_next_instruction_address; // Used for branching, setting up the NIA -#ifdef EXEC_FLAGS_ATOMIC -std::atomic exec_flags{0}; // execution control flags -#else -// FIXME: read by main thread ppc_main_opcode; +unsigned exec_flags; // execution control flags +// FIXME: exec_timer is read by main thread ppc_main_opcode; // written by audio dbdma DMAChannel::update_irq .. add_immediate_timer -unsigned exec_flags; -#endif +volatile bool exec_timer; bool int_pin = false; // interrupt request pin state: true - asserted bool dec_exception_pending = false; @@ -296,6 +293,7 @@ uint64_t get_virt_time_ns() uint64_t process_events() { + exec_timer = false; uint64_t slice_ns = TimerManager::get_instance()->process_timers(); if (slice_ns == 0) { // execute 10.000 cycles @@ -308,7 +306,7 @@ uint64_t process_events() void force_cycle_counter_reload() { // tell the interpreter loop to reload cycle counter - exec_flags |= EXEF_TIMER; + exec_timer = true; } /** Execute PPC code as long as power is on. */ @@ -334,22 +332,11 @@ static void ppc_exec_inner() // interpret execution block while (power_on && ppc_state.pc < eb_end) { ppc_main_opcode(); - if (g_icycles++ >= max_cycles) { + if (g_icycles++ >= max_cycles || exec_timer) { max_cycles = process_events(); } if (exec_flags) { - // reload cycle counter if requested - if (exec_flags & EXEF_TIMER) { - max_cycles = process_events(); - if (!(exec_flags & ~EXEF_TIMER)) { - ppc_state.pc += 4; - pc_real += 4; - ppc_set_cur_instruction(pc_real); - exec_flags = 0; - continue; - } - } // define next execution block eb_start = ppc_next_instruction_address; if (!(exec_flags & EXEF_RFI) && (eb_start & PAGE_MASK) == page_start) { @@ -402,11 +389,7 @@ void ppc_exec_single() process_events(); if (exec_flags) { - if (!(exec_flags & ~EXEF_TIMER)) { - ppc_state.pc += 4; - } else { - ppc_state.pc = ppc_next_instruction_address; - } + ppc_state.pc = ppc_next_instruction_address; exec_flags = 0; } else { ppc_state.pc += 4; @@ -437,22 +420,11 @@ static void ppc_exec_until_inner(const uint32_t goal_addr) // interpret execution block while (power_on && ppc_state.pc < eb_end) { ppc_main_opcode(); - if (g_icycles++ >= max_cycles) { + if (g_icycles++ >= max_cycles || exec_timer) { max_cycles = process_events(); } if (exec_flags) { - // reload cycle counter if requested - if (exec_flags & EXEF_TIMER) { - max_cycles = process_events(); - if (!(exec_flags & ~EXEF_TIMER)) { - ppc_state.pc += 4; - pc_real += 4; - ppc_set_cur_instruction(pc_real); - exec_flags = 0; - continue; - } - } // define next execution block eb_start = ppc_next_instruction_address; if (!(exec_flags & EXEF_RFI) && (eb_start & PAGE_MASK) == page_start) { @@ -516,22 +488,11 @@ static void ppc_exec_dbg_inner(const uint32_t start_addr, const uint32_t size) while (power_on && (ppc_state.pc < start_addr || ppc_state.pc >= start_addr + size) && (ppc_state.pc < eb_end)) { ppc_main_opcode(); - if (g_icycles++ >= max_cycles) { + if (g_icycles++ >= max_cycles || exec_timer) { max_cycles = process_events(); } if (exec_flags) { - // reload cycle counter if requested - if (exec_flags & EXEF_TIMER) { - max_cycles = process_events(); - if (!(exec_flags & ~EXEF_TIMER)) { - ppc_state.pc += 4; - pc_real += 4; - ppc_set_cur_instruction(pc_real); - exec_flags = 0; - continue; - } - } // define next execution block eb_start = ppc_next_instruction_address; if (!(exec_flags & EXEF_RFI) && (eb_start & PAGE_MASK) == page_start) { @@ -892,6 +853,7 @@ void ppc_cpu_init(MemCtrlBase* mem_ctrl, uint32_t cpu_version, uint64_t tb_freq) tbr_period_ns = ((uint64_t)NS_PER_SEC << 32) / tb_freq; exec_flags = 0; + exec_timer = false; timebase_counter = 0; dec_wr_value = 0;