diff options
author | Philippe Mathieu-Daudé | 2021-04-13 20:21:16 +0200 |
---|---|---|
committer | Philippe Mathieu-Daudé | 2021-05-02 16:49:35 +0200 |
commit | ecdbcb0a9450e9109ae3dd6cfa10c71fda753bda (patch) | |
tree | 8ec95dfa2a174e9e1e5ce10801bda9f913ecb0f3 /target/mips/tcg/sysemu/special_helper.c | |
parent | target/mips: Move Special opcodes to tcg/sysemu/special_helper.c (diff) | |
download | qemu-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.c | 33 |
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; + } +} |