62 lines
2.2 KiB
Diff
62 lines
2.2 KiB
Diff
|
|
From 0338db7f0f42f68b709ad6bbd79e471292b32baf Mon Sep 17 00:00:00 2001
|
||
|
|
From: Liu Jing <liujing_yewu@cmss.chinamobile.com>
|
||
|
|
Date: Mon, 21 Oct 2024 19:32:15 +0800
|
||
|
|
Subject: [PATCH] target/m68k: always call gen_exit_tb() after writes to SR
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
Any write to SR can change the security state so always call gen_exit_tb() when
|
||
|
|
this occurs. In particular MacOS makes use of andiw/oriw in a few places to
|
||
|
|
handle the switch between user and supervisor mode.
|
||
|
|
|
||
|
|
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||
|
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||
|
|
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||
|
|
Message-Id: <20220917112515.83905-5-mark.cave-ayland@ilande.co.uk>
|
||
|
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||
|
|
Signed-off-by: Liu Jing <liujing_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
target/m68k/translate.c | 4 ++++
|
||
|
|
1 file changed, 4 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
|
||
|
|
index 6cc4321921..9e465272ea 100644
|
||
|
|
--- a/target/m68k/translate.c
|
||
|
|
+++ b/target/m68k/translate.c
|
||
|
|
@@ -2359,6 +2359,7 @@ DISAS_INSN(arith_im)
|
||
|
|
tcg_gen_or_i32(dest, src1, im);
|
||
|
|
if (with_SR) {
|
||
|
|
gen_set_sr(s, dest, opsize == OS_BYTE);
|
||
|
|
+ gen_exit_tb(s);
|
||
|
|
} else {
|
||
|
|
DEST_EA(env, insn, opsize, dest, &addr);
|
||
|
|
gen_logic_cc(s, dest, opsize);
|
||
|
|
@@ -2368,6 +2369,7 @@ DISAS_INSN(arith_im)
|
||
|
|
tcg_gen_and_i32(dest, src1, im);
|
||
|
|
if (with_SR) {
|
||
|
|
gen_set_sr(s, dest, opsize == OS_BYTE);
|
||
|
|
+ gen_exit_tb(s);
|
||
|
|
} else {
|
||
|
|
DEST_EA(env, insn, opsize, dest, &addr);
|
||
|
|
gen_logic_cc(s, dest, opsize);
|
||
|
|
@@ -2391,6 +2393,7 @@ DISAS_INSN(arith_im)
|
||
|
|
tcg_gen_xor_i32(dest, src1, im);
|
||
|
|
if (with_SR) {
|
||
|
|
gen_set_sr(s, dest, opsize == OS_BYTE);
|
||
|
|
+ gen_exit_tb(s);
|
||
|
|
} else {
|
||
|
|
DEST_EA(env, insn, opsize, dest, &addr);
|
||
|
|
gen_logic_cc(s, dest, opsize);
|
||
|
|
@@ -4594,6 +4597,7 @@ DISAS_INSN(strldsr)
|
||
|
|
}
|
||
|
|
gen_push(s, gen_get_sr(s));
|
||
|
|
gen_set_sr_im(s, ext, 0);
|
||
|
|
+ gen_exit_tb(s);
|
||
|
|
}
|
||
|
|
|
||
|
|
DISAS_INSN(move_from_sr)
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|