summaryrefslogtreecommitdiffstats
path: root/target/mips/tcg/sysemu/special_helper.c
diff options
context:
space:
mode:
authorPhilippe Mathieu-Daudé2021-04-13 20:21:16 +0200
committerPhilippe Mathieu-Daudé2021-05-02 16:49:35 +0200
commitecdbcb0a9450e9109ae3dd6cfa10c71fda753bda (patch)
tree8ec95dfa2a174e9e1e5ce10801bda9f913ecb0f3 /target/mips/tcg/sysemu/special_helper.c
parenttarget/mips: Move Special opcodes to tcg/sysemu/special_helper.c (diff)
downloadqemu-ecdbcb0a9450e9109ae3dd6cfa10c71fda753bda.tar.gz
qemu-ecdbcb0a9450e9109ae3dd6cfa10c71fda753bda.tar.xz
qemu-ecdbcb0a9450e9109ae3dd6cfa10c71fda753bda.zip
target/mips: Move helper_cache() to tcg/sysemu/special_helper.c
Move helper_cache() to tcg/sysemu/special_helper.c. The CACHE opcode is privileged and is not accessible in user emulation. However we get a link failure when restricting the symbol to sysemu. For now, add a stub helper to satisfy linking, which abort if ever called. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210428170410.479308-25-f4bug@amsat.org>
Diffstat (limited to 'target/mips/tcg/sysemu/special_helper.c')
-rw-r--r--target/mips/tcg/sysemu/special_helper.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/target/mips/tcg/sysemu/special_helper.c b/target/mips/tcg/sysemu/special_helper.c
index 971883fa38..2a2afb49e8 100644
--- a/target/mips/tcg/sysemu/special_helper.c
+++ b/target/mips/tcg/sysemu/special_helper.c
@@ -138,3 +138,36 @@ void helper_deret(CPUMIPSState *env)
debug_post_eret(env);
}
+
+void helper_cache(CPUMIPSState *env, target_ulong addr, uint32_t op)
+{
+ static const char *const type_name[] = {
+ "Primary Instruction",
+ "Primary Data or Unified Primary",
+ "Tertiary",
+ "Secondary"
+ };
+ uint32_t cache_type = extract32(op, 0, 2);
+ uint32_t cache_operation = extract32(op, 2, 3);
+ target_ulong index = addr & 0x1fffffff;
+
+ switch (cache_operation) {
+ case 0b010: /* Index Store Tag */
+ memory_region_dispatch_write(env->itc_tag, index, env->CP0_TagLo,
+ MO_64, MEMTXATTRS_UNSPECIFIED);
+ break;
+ case 0b001: /* Index Load Tag */
+ memory_region_dispatch_read(env->itc_tag, index, &env->CP0_TagLo,
+ MO_64, MEMTXATTRS_UNSPECIFIED);
+ break;
+ case 0b000: /* Index Invalidate */
+ case 0b100: /* Hit Invalidate */
+ case 0b110: /* Hit Writeback */
+ /* no-op */
+ break;
+ default:
+ qemu_log_mask(LOG_UNIMP, "cache operation:%u (type: %s cache)\n",
+ cache_operation, type_name[cache_type]);
+ break;
+ }
+}