| 574 | } |
| 575 | |
| 576 | void write_indirect_jumps(std::ofstream& output_file, const BranchTargets& branch_targets, const std::string& output_function_name) { |
| 577 | fmt::print(output_file, |
| 578 | "do_indirect_jump:\n" |
| 579 | " switch ((jump_target | 0x1000) & {:#X}) {{ \n", rsp_mem_mask); |
| 580 | for (uint32_t branch_target: branch_targets.indirect_targets) { |
| 581 | fmt::print(output_file, " case 0x{0:04X}: goto L_{0:04X};\n", branch_target); |
| 582 | } |
| 583 | fmt::print(output_file, |
| 584 | " }}\n" |
| 585 | " printf(\"Unhandled jump target 0x%04X in microcode {}, coming from [%s:%d]\\n\", jump_target, debug_file, debug_line);\n" |
| 586 | " printf(\"Register dump: r0 = %08X r1 = %08X r2 = %08X r3 = %08X r4 = %08X r5 = %08X r6 = %08X r7 = %08X\\n\"\n" |
| 587 | " \" r8 = %08X r9 = %08X r10 = %08X r11 = %08X r12 = %08X r13 = %08X r14 = %08X r15 = %08X\\n\"\n" |
| 588 | " \" r16 = %08X r17 = %08X r18 = %08X r19 = %08X r20 = %08X r21 = %08X r22 = %08X r23 = %08X\\n\"\n" |
| 589 | " \" r24 = %08X r25 = %08X r26 = %08X r27 = %08X r28 = %08X r29 = %08X r30 = %08X r31 = %08X\\n\",\n" |
| 590 | " 0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16,\n" |
| 591 | " r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31);\n" |
| 592 | " return RspExitReason::UnhandledJumpTarget;\n", output_function_name); |
| 593 | } |
| 594 | |
| 595 | void write_overlay_swap_return(std::ofstream& output_file) { |
| 596 | fmt::print(output_file, |