aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--target-sparc/exec.h1
-rw-r--r--target-sparc/op.c4
-rw-r--r--target-sparc/translate.c9
3 files changed, 13 insertions, 1 deletions
diff --git a/target-sparc/exec.h b/target-sparc/exec.h
index 72e4588f69..6b49ca79af 100644
--- a/target-sparc/exec.h
+++ b/target-sparc/exec.h
@@ -13,4 +13,5 @@ register uint32_t T2 asm(AREG3);
void cpu_lock(void);
void cpu_unlock(void);
void cpu_loop_exit(void);
+void helper_flush(target_ulong addr);
#endif
diff --git a/target-sparc/op.c b/target-sparc/op.c
index 1ce3f95094..946c11ec4c 100644
--- a/target-sparc/op.c
+++ b/target-sparc/op.c
@@ -683,3 +683,7 @@ void OPPROTO op_generic_branch(void)
FORCE_RET();
}
+void OPPROTO op_flush_T0(void)
+{
+ helper_flush(T0);
+}
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 41decb18ff..bcc810b208 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -650,7 +650,8 @@ static void disas_sparc_insn(DisasContext * dc)
}
goto jmp_insn;
case 0x3b: /* flush */
- /* nothing to do */
+ gen_op_add_T1_T0();
+ gen_op_flush_T0();
break;
case 0x3c: /* save */
save_state(dc);
@@ -878,3 +879,9 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
{
return addr;
}
+
+void helper_flush(target_ulong addr)
+{
+ addr &= ~7;
+ tb_invalidate_page_range(addr, addr + 8);
+}