diff options
author | Sven Schnelle <svens@stackframe.org> | 2024-03-19 17:19:19 +0100 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2024-03-19 14:08:02 -1000 |
commit | ad1fdacd1b936557514dd72c2079a80be0c2dfb4 (patch) | |
tree | 85d49dd81462c8aaaf6900ea779f11297c4bfb30 | |
parent | ae157fc25053917830c3b581bc282f906e6d95d3 (diff) | |
download | qemu-ad1fdacd1b936557514dd72c2079a80be0c2dfb4.zip qemu-ad1fdacd1b936557514dd72c2079a80be0c2dfb4.tar.gz qemu-ad1fdacd1b936557514dd72c2079a80be0c2dfb4.tar.bz2 |
target/hppa: exit tb on flush cache instructions
When the guest modifies the tb it is currently executing from,
it executes a fic instruction. Exit the tb on such instruction,
otherwise we might execute stale code.
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Message-Id: <20240319161921.487080-5-svens@stackframe.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r-- | target/hppa/insns.decode | 6 | ||||
-rw-r--r-- | target/hppa/translate.c | 7 |
2 files changed, 10 insertions, 3 deletions
diff --git a/target/hppa/insns.decode b/target/hppa/insns.decode index 5412ff9..f58455d 100644 --- a/target/hppa/insns.decode +++ b/target/hppa/insns.decode @@ -144,9 +144,9 @@ getshadowregs 1111 1111 1111 1101 1110 1010 1101 0010 nop 000001 ----- ----- -- 11001010 0 ----- # fdc, disp nop_addrx 000001 ..... ..... -- 01001010 . ----- @addrx # fdc, index nop_addrx 000001 ..... ..... -- 01001011 . ----- @addrx # fdce -nop_addrx 000001 ..... ..... --- 0001010 . ----- @addrx # fic 0x0a -nop_addrx 000001 ..... ..... -- 01001111 . 00000 @addrx # fic 0x4f -nop_addrx 000001 ..... ..... --- 0001011 . ----- @addrx # fice +fic 000001 ..... ..... --- 0001010 . ----- @addrx # fic 0x0a +fic 000001 ..... ..... -- 01001111 . 00000 @addrx # fic 0x4f +fic 000001 ..... ..... --- 0001011 . ----- @addrx # fice nop_addrx 000001 ..... ..... -- 01001110 . 00000 @addrx # pdc probe 000001 b:5 ri:5 sp:2 imm:1 100011 write:1 0 t:5 diff --git a/target/hppa/translate.c b/target/hppa/translate.c index 29ef061..107d7f1 100644 --- a/target/hppa/translate.c +++ b/target/hppa/translate.c @@ -2343,6 +2343,13 @@ static bool trans_nop_addrx(DisasContext *ctx, arg_ldst *a) return true; } +static bool trans_fic(DisasContext *ctx, arg_ldst *a) +{ + /* End TB for flush instruction cache, so we pick up new insns. */ + ctx->base.is_jmp = DISAS_IAQ_N_STALE; + return trans_nop_addrx(ctx, a); +} + static bool trans_probe(DisasContext *ctx, arg_probe *a) { TCGv_i64 dest, ofs; |