- os_context_t *context = arch_os_get_context(&void_context);
- sigset_t *mask;
- unsigned int code;
- sigset_t ss;
-
- /* Don't disallow recursive breakpoint traps. Otherwise, we can't
- use debugger breakpoints anywhere in here. */
- mask = os_context_sigmask_addr(context);
- sigprocmask(SIG_SETMASK, mask, NULL);
- code = ((*(int *) (*os_context_pc_addr(context))) >> 16) & 0x1f;
-
- switch (code) {
- case trap_Halt:
- fake_foreign_function_call(context);
- lose("%%primitive halt called; the party is over.\n");
-
- case trap_PendingInterrupt:
- arch_skip_instruction(context);
- sigemptyset(&ss);
- sigaddset(&ss,SIGTRAP);
- sigprocmask(SIG_UNBLOCK,&ss,0);
- interrupt_handle_pending(context);
- break;
-
- case trap_Error:
- case trap_Cerror:
- interrupt_internal_error(signal, info, context, code==trap_Cerror);
- break;
-
- case trap_Breakpoint:
- handle_breakpoint(signal, info, context);
- break;
-
- case trap_FunEndBreakpoint:
- *os_context_pc_addr(context) = (int)handle_fun_end_breakpoint(signal, info, context);
- os_flush_icache((os_vm_address_t)*os_context_pc_addr(context), sizeof(unsigned int));
- break;
-
- case trap_AfterBreakpoint:
- arch_remove_breakpoint(os_context_pc_addr(context), displaced_after_inst);
- displaced_after_inst = arch_install_breakpoint(skipped_break_addr);
- *os_context_sigmask_addr(context) = orig_sigmask;
- break;
+ unsigned int code = *((u32 *)(os_context_pc(context)));
+ int register_offset = code >> 11 & 0x1f;
+ handle_single_step_trap(context, trap, register_offset);
+ arch_skip_instruction(context);
+}