target/m68k: always call gen_exit_tb() after writes to SR
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>
This commit is contained in:
parent
aece90d85d
commit
c7546abfaa
@ -2375,6 +2375,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);
|
||||
@ -2384,6 +2385,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);
|
||||
@ -2407,6 +2409,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);
|
||||
@ -4614,6 +4617,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)
|
||||
|
Loading…
Reference in New Issue
Block a user