target/tricore: Honour privilege changes on PSW write
the CPU can change the privilege level by writing the corresponding bits in PSW. If this happens all instructions after this 'mtcr' in the TB are translated with the wrong privilege level. So we have to exit to the cpu_loop() and start translating again with the new privilege level. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Message-Id: <20230621142302.1648383-8-kbastian@mail.uni-paderborn.de>
This commit is contained in:
parent
57b9c589b6
commit
19a18edd88
@ -334,7 +334,6 @@ static void gen_swapmsk(DisasContext *ctx, int reg, TCGv ea)
|
|||||||
tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
|
tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* We generate loads and store to core special function register (csfr) through
|
/* We generate loads and store to core special function register (csfr) through
|
||||||
the function gen_mfcr and gen_mtcr. To handle access permissions, we use 3
|
the function gen_mfcr and gen_mtcr. To handle access permissions, we use 3
|
||||||
makros R, A and E, which allow read-only, all and endinit protected access.
|
makros R, A and E, which allow read-only, all and endinit protected access.
|
||||||
@ -382,6 +381,7 @@ static inline void gen_mtcr(DisasContext *ctx, TCGv r1,
|
|||||||
/* since we're caching PSW make this a special case */
|
/* since we're caching PSW make this a special case */
|
||||||
if (offset == 0xfe04) {
|
if (offset == 0xfe04) {
|
||||||
gen_helper_psw_write(cpu_env, r1);
|
gen_helper_psw_write(cpu_env, r1);
|
||||||
|
ctx->base.is_jmp = DISAS_EXIT_UPDATE;
|
||||||
} else {
|
} else {
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
#include "csfr.h.inc"
|
#include "csfr.h.inc"
|
||||||
|
Loading…
Reference in New Issue
Block a user