]> xenbits.xensource.com Git - people/aperard/qemu-dm.git/commitdiff
target/tricore: Honour privilege changes on PSW write
authorBastian Koppelmann <kbastian@mail.uni-paderborn.de>
Wed, 21 Jun 2023 14:23:01 +0000 (16:23 +0200)
committerBastian Koppelmann <kbastian@mail.uni-paderborn.de>
Wed, 21 Jun 2023 16:09:54 +0000 (18:09 +0200)
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>

target/tricore/translate.c

index 82b61e912e96579ffa55bc27feee5e0995036b8e..9e408f44ecae8288469831fc489dfaeaa96b1aaa 100644 (file)
@@ -334,7 +334,6 @@ static void gen_swapmsk(DisasContext *ctx, int reg, TCGv ea)
     tcg_gen_mov_tl(cpu_gpr_d[reg], temp);
 }
 
-
 /* 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
    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 */
         if (offset == 0xfe04) {
             gen_helper_psw_write(cpu_env, r1);
+            ctx->base.is_jmp = DISAS_EXIT_UPDATE;
         } else {
             switch (offset) {
 #include "csfr.h.inc"