diff --git a/benchmark/bench1.cpp b/benchmark/bench1.cpp index a083ade..9d2c572 100644 --- a/benchmark/bench1.cpp +++ b/benchmark/bench1.cpp @@ -28,9 +28,10 @@ along with this program. If not, see . #include #if defined(PPC_BENCHMARKS) -uint32_t ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) { +uint32_t ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags) { power_on = false; power_off_reason = po_benchmark_exception; + return 0; } #endif @@ -105,7 +106,7 @@ int main(int argc, char** argv) { ppc_state.gpr[3] = 0x1000; // buf ppc_state.gpr[4] = test_size; // len ppc_state.gpr[5] = 0; // sum - enter_debugger(); + DppcDebugger::get_instance()->enter_debugger(); #endif ppc_state.pc = 0; diff --git a/cpu/ppc/ppcemu.h b/cpu/ppc/ppcemu.h index f30b83e..2731bbb 100644 --- a/cpu/ppc/ppcemu.h +++ b/cpu/ppc/ppcemu.h @@ -406,7 +406,7 @@ constexpr uint32_t NO_OPCODE = 0; extern void ppc_cpu_init(MemCtrlBase* mem_ctrl, uint32_t cpu_version, bool include_601, uint64_t tb_freq); extern void ppc_mmu_init(); -void ppc_illegalop(uint32_t opcode); +uint32_t ppc_illegalop(uint32_t opcode); void ppc_assert_int(); void ppc_release_int(); @@ -417,7 +417,8 @@ void set_host_rounding_mode(uint8_t mode); void update_fpscr(uint32_t new_fpscr); /* Exception handlers. */ -uint32_t ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags); +uint32_t ppc_exception_handler( + Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags = 0); [[noreturn]] uint32_t dbg_exception_handler( Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags); void ppc_floating_point_exception(uint32_t opcode); diff --git a/cpu/ppc/ppcexceptions.cpp b/cpu/ppc/ppcexceptions.cpp index bd4be55..1f7cebe 100644 --- a/cpu/ppc/ppcexceptions.cpp +++ b/cpu/ppc/ppcexceptions.cpp @@ -32,7 +32,7 @@ along with this program. If not, see . jmp_buf exc_env; /* Global exception environment. */ #if !defined(PPC_TESTS) && !defined(PPC_BENCHMARKS) -uint32_t ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags = 0) { +uint32_t ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags) { #ifdef CPU_PROFILING exceptions_processed++; #endif diff --git a/cpu/ppc/ppcexec.cpp b/cpu/ppc/ppcexec.cpp index 44db071..8f01565 100644 --- a/cpu/ppc/ppcexec.cpp +++ b/cpu/ppc/ppcexec.cpp @@ -185,8 +185,8 @@ static PPCOpcode OpcodeGrabber[64 * 2048]; /** Exception helpers. */ -void ppc_illegalop(uint32_t opcode) { - ppc_exception_handler(Except_Type::EXC_PROGRAM, Exc_Cause::ILLEGAL_OP, 0); +uint32_t ppc_illegalop(uint32_t opcode) { + return ppc_exception_handler(Except_Type::EXC_PROGRAM, Exc_Cause::ILLEGAL_OP, 0); } void ppc_assert_int() { @@ -280,7 +280,6 @@ static void ppc_exec_inner(uint32_t start_addr, uint32_t size) eb_start = ppc_state.pc; page_start = eb_start & PPC_PAGE_MASK; eb_end = page_start + PPC_PAGE_SIZE - 1; - exec_flags = 0; pc_real = mmu_translate_imem(eb_start); } @@ -300,7 +299,6 @@ static void ppc_exec_inner(uint32_t start_addr, uint32_t size) pc_real = mmu_translate_imem(eb_start); } ppc_state.pc = eb_start; - exec_flags = 0; } else { [[likely]] ppc_state.pc += 4; pc_real += 4; @@ -351,7 +349,6 @@ void ppc_exec_single() if (exec_flags) { ppc_state.pc = ppc_next_instruction_address; - exec_flags = 0; } else { ppc_state.pc += 4; } diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index e31688f..518582e 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -102,6 +102,7 @@ uint32_t dppc_interpreter::ppc_addi(uint32_t opcode) { ppc_state.gpr[reg_d] = (reg_a == 0) ? (simm << 16) : (ppc_result_a + (simm << 16)); else ppc_state.gpr[reg_d] = (reg_a == 0) ? simm : (ppc_result_a + simm); + return 0; } template uint32_t dppc_interpreter::ppc_addi(uint32_t opcode); @@ -115,6 +116,7 @@ uint32_t dppc_interpreter::ppc_addic(uint32_t opcode) { if (rec) ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_addic(uint32_t opcode); @@ -132,6 +134,7 @@ uint32_t dppc_interpreter::ppc_add(uint32_t opcode) { if (rec) ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_add(uint32_t opcode); @@ -161,6 +164,7 @@ uint32_t dppc_interpreter::ppc_adde(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_adde(uint32_t opcode); @@ -186,6 +190,7 @@ uint32_t dppc_interpreter::ppc_addme(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_addme(uint32_t opcode); @@ -211,6 +216,7 @@ uint32_t dppc_interpreter::ppc_addze(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_addze(uint32_t opcode); @@ -226,6 +232,7 @@ uint32_t dppc_interpreter::ppc_subfic(uint32_t opcode) { else ppc_carry(~ppc_result_a, ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template @@ -241,6 +248,7 @@ uint32_t dppc_interpreter::ppc_subf(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_subf(uint32_t opcode); @@ -268,6 +276,7 @@ uint32_t dppc_interpreter::ppc_subfe(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_subfe(uint32_t opcode); @@ -297,6 +306,7 @@ uint32_t dppc_interpreter::ppc_subfme(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_subfme(uint32_t opcode); @@ -326,6 +336,7 @@ uint32_t dppc_interpreter::ppc_subfze(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_subfze(uint32_t opcode); @@ -339,6 +350,7 @@ uint32_t dppc_interpreter::ppc_andirc(uint32_t opcode) { ppc_result_a = shift ? (ppc_result_d & (uimm << 16)) : (ppc_result_d & uimm); ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_andirc(uint32_t opcode); @@ -349,6 +361,7 @@ uint32_t dppc_interpreter::ppc_ori(uint32_t opcode) { ppc_grab_regssauimm(opcode); ppc_result_a = shift ? (ppc_result_d | (uimm << 16)) : (ppc_result_d | uimm); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_ori(uint32_t opcode); @@ -359,6 +372,7 @@ uint32_t dppc_interpreter::ppc_xori(uint32_t opcode) { ppc_grab_regssauimm(opcode); ppc_result_a = shift ? (ppc_result_d ^ (uimm << 16)) : (ppc_result_d ^ uimm); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_xori(uint32_t opcode); @@ -388,6 +402,7 @@ uint32_t dppc_interpreter::ppc_logical(uint32_t opcode) { ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_logical(uint32_t opcode); @@ -423,6 +438,7 @@ uint32_t dppc_interpreter::ppc_neg(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_neg(uint32_t opcode); @@ -455,6 +471,7 @@ uint32_t dppc_interpreter::ppc_cntlzw(uint32_t opcode) { } ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_cntlzw(uint32_t opcode); @@ -470,6 +487,7 @@ uint32_t dppc_interpreter::ppc_mulhwu(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_mulhwu(uint32_t opcode); @@ -485,6 +503,7 @@ uint32_t dppc_interpreter::ppc_mulhw(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_mulhw(uint32_t opcode); @@ -509,6 +528,7 @@ uint32_t dppc_interpreter::ppc_mullw(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_mullw(uint32_t opcode); @@ -521,6 +541,7 @@ uint32_t dppc_interpreter::ppc_mulli(uint32_t opcode) { int64_t product = int64_t(int32_t(ppc_result_a)) * int64_t(int32_t(simm)); uint32_t ppc_result_d = uint32_t(product); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template @@ -558,6 +579,7 @@ uint32_t dppc_interpreter::ppc_divw(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_divw(uint32_t opcode); @@ -592,6 +614,7 @@ uint32_t dppc_interpreter::ppc_divwu(uint32_t opcode) { ppc_changecrf0(ppc_result_d); ppc_store_iresult_reg(reg_d, ppc_result_d); + return 0; } template uint32_t dppc_interpreter::ppc_divwu(uint32_t opcode); @@ -616,6 +639,7 @@ uint32_t dppc_interpreter::ppc_shift(uint32_t opcode) { ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_shift(uint32_t opcode); @@ -646,6 +670,7 @@ uint32_t dppc_interpreter::ppc_sraw(uint32_t opcode) { ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_sraw(uint32_t opcode); @@ -667,6 +692,7 @@ uint32_t dppc_interpreter::ppc_srawi(uint32_t opcode) { ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_srawi(uint32_t opcode); @@ -691,6 +717,7 @@ uint32_t dppc_interpreter::ppc_rlwimi(uint32_t opcode) { ppc_changecrf0(ppc_result_a); } ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } uint32_t dppc_interpreter::ppc_rlwinm(uint32_t opcode) { @@ -705,6 +732,7 @@ uint32_t dppc_interpreter::ppc_rlwinm(uint32_t opcode) { ppc_changecrf0(ppc_result_a); } ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } uint32_t dppc_interpreter::ppc_rlwnm(uint32_t opcode) { @@ -721,11 +749,13 @@ uint32_t dppc_interpreter::ppc_rlwnm(uint32_t opcode) { ppc_changecrf0(ppc_result_a); } ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } uint32_t dppc_interpreter::ppc_mfcr(uint32_t opcode) { int reg_d = (opcode >> 21) & 0x1F; ppc_state.gpr[reg_d] = ppc_state.cr; + return 0; } uint32_t dppc_interpreter::ppc_mtsr(uint32_t opcode) { @@ -741,6 +771,7 @@ uint32_t dppc_interpreter::ppc_mtsr(uint32_t opcode) { ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s]; mmu_pat_ctx_changed(); } + return 0; } uint32_t dppc_interpreter::ppc_mtsrin(uint32_t opcode) { @@ -756,6 +787,7 @@ uint32_t dppc_interpreter::ppc_mtsrin(uint32_t opcode) { ppc_state.sr[grab_sr] = ppc_result_d; mmu_pat_ctx_changed(); } + return 0; } uint32_t dppc_interpreter::ppc_mfsr(uint32_t opcode) { @@ -768,6 +800,7 @@ uint32_t dppc_interpreter::ppc_mfsr(uint32_t opcode) { int reg_d = (opcode >> 21) & 0x1F; uint32_t grab_sr = (opcode >> 16) & 0x0F; ppc_state.gpr[reg_d] = ppc_state.sr[grab_sr]; + return 0; } uint32_t dppc_interpreter::ppc_mfsrin(uint32_t opcode) { @@ -780,6 +813,7 @@ uint32_t dppc_interpreter::ppc_mfsrin(uint32_t opcode) { ppc_grab_regsdb(opcode); uint32_t grab_sr = ppc_result_b >> 28; ppc_state.gpr[reg_d] = ppc_state.sr[grab_sr]; + return 0; } uint32_t dppc_interpreter::ppc_mfmsr(uint32_t opcode) { @@ -791,6 +825,7 @@ uint32_t dppc_interpreter::ppc_mfmsr(uint32_t opcode) { } uint32_t reg_d = (opcode >> 21) & 0x1F; ppc_state.gpr[reg_d] = ppc_state.msr; + return 0; } uint32_t dppc_interpreter::ppc_mtmsr(uint32_t opcode) { @@ -815,6 +850,7 @@ uint32_t dppc_interpreter::ppc_mtmsr(uint32_t opcode) { } else { mmu_change_mode(); } + return 0; } static inline void calc_rtcl_value() @@ -947,6 +983,7 @@ uint32_t dppc_interpreter::ppc_mfspr(uint32_t opcode) { // FIXME: Unknown SPR should be noop or illegal instruction. ppc_state.gpr[reg_d] = ppc_state.spr[ref_spr]; } + return 0; } uint32_t dppc_interpreter::ppc_mtspr(uint32_t opcode) { @@ -1038,6 +1075,7 @@ uint32_t dppc_interpreter::ppc_mtspr(uint32_t opcode) { // FIXME: Unknown SPR should be noop or illegal instruction. ppc_state.spr[ref_spr] = val; } + return 0; } uint32_t dppc_interpreter::ppc_mftb(uint32_t opcode) { @@ -1059,7 +1097,8 @@ uint32_t dppc_interpreter::ppc_mftb(uint32_t opcode) { break; default: ppc_exception_handler(Except_Type::EXC_PROGRAM, Exc_Cause::ILLEGAL_OP, 0); - } + } + return 0; } uint32_t dppc_interpreter::ppc_mtcrf(uint32_t opcode) { @@ -1081,6 +1120,7 @@ uint32_t dppc_interpreter::ppc_mtcrf(uint32_t opcode) { if (crm & 0x01) cr_mask |= 0x0000000FUL; } ppc_state.cr = (ppc_state.cr & ~cr_mask) | (ppc_result_d & cr_mask); + return 0; } uint32_t dppc_interpreter::ppc_mcrxr(uint32_t opcode) { @@ -1088,6 +1128,7 @@ uint32_t dppc_interpreter::ppc_mcrxr(uint32_t opcode) { ppc_state.cr = (ppc_state.cr & ~(0xF0000000UL >> crf_d)) | ((ppc_state.spr[SPR::XER] & 0xF0000000UL) >> crf_d); ppc_state.spr[SPR::XER] &= 0x0FFFFFFF; + return 0; } template @@ -1099,6 +1140,7 @@ uint32_t dppc_interpreter::ppc_exts(uint32_t opcode) { ppc_changecrf0(ppc_result_a); ppc_store_iresult_reg(reg_a, ppc_result_a); + return 0; } template uint32_t dppc_interpreter::ppc_exts(uint32_t opcode); diff --git a/cpu/ppc/test/ppctests.cpp b/cpu/ppc/test/ppctests.cpp index 7a1d489..33e401c 100644 --- a/cpu/ppc/test/ppctests.cpp +++ b/cpu/ppc/test/ppctests.cpp @@ -37,7 +37,7 @@ int ntested; // number of tested instructions int nfailed; // number of failed instructions #if defined(PPC_TESTS) -void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) { +void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits, uint32_t exec_flags) { power_on = false; } #endif