diff --git a/lisp/mips-arch.c b/lisp/mips-arch.c index e401be5a22879e23ab9f553c725c9206615e4fcf..b1a91e8fceb556db88d17fe7dc4b04b7ee535650 100644 --- a/lisp/mips-arch.c +++ b/lisp/mips-arch.c @@ -60,12 +60,17 @@ unsigned long arch_install_breakpoint(void *pc) unsigned long *ptr = (unsigned long *)pc; unsigned long result = *ptr; *ptr = (trap_Breakpoint << 16) | 0xd; + + os_flush_icache((os_vm_address_t)ptr, sizeof(unsigned long)); + return result; } void arch_remove_breakpoint(void *pc, unsigned long orig_inst) { *(unsigned long *)pc = orig_inst; + + os_flush_icache((os_vm_address_t)pc, sizeof(unsigned long)); } static unsigned long *skipped_break_addr, displaced_after_inst; @@ -95,6 +100,7 @@ void arch_do_displaced_inst(struct sigcontext *scp, /* Put the original instruction back. */ *break_pc = orig_inst; + os_flush_icache((os_vm_address_t)break_pc, sizeof(unsigned long)); skipped_break_addr = break_pc; /* Figure out where it goes. */ @@ -109,6 +115,7 @@ void arch_do_displaced_inst(struct sigcontext *scp, displaced_after_inst = *next_pc; *next_pc = (trap_AfterBreakpoint << 16) | 0xd; + os_flush_icache((os_vm_address_t)next_pc, sizeof(unsigned long)); sigreturn(scp); } @@ -143,8 +150,11 @@ static void sigtrap_handler(int signal, int code, struct sigcontext *scp) case trap_AfterBreakpoint: *skipped_break_addr = (trap_Breakpoint << 16) | 0xd; + os_flush_icache((os_vm_address_t)skipped_break_addr, + sizeof(unsigned long)); skipped_break_addr = NULL; *(unsigned long *)scp->sc_pc = displaced_after_inst; + os_flush_icache((os_vm_address_t)scp->sc_pc, sizeof(unsigned long)); scp->sc_mask = orig_sigmask; break;