mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
target/s390x: fake instruction loading when handling 'ex'
The s390x EXecute instruction is a bit weird as we synthesis the executed instruction from what we have stored in memory. This missed the plugin instrumentation. Work around this with a special helper to inform the rest of the translator about the instruction so things stay consistent. Reviewed-by: David Hildenbrand <david@redhat.com> Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Cc: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20221027183637.2772968-26-alex.bennee@linaro.org>
This commit is contained in:
parent
621aab6c7d
commit
9fa97e04ae
2 changed files with 23 additions and 0 deletions
|
@ -6317,12 +6317,18 @@ static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s)
|
|||
if (unlikely(s->ex_value)) {
|
||||
/* Drop the EX data now, so that it's clear on exception paths. */
|
||||
TCGv_i64 zero = tcg_const_i64(0);
|
||||
int i;
|
||||
tcg_gen_st_i64(zero, cpu_env, offsetof(CPUS390XState, ex_value));
|
||||
tcg_temp_free_i64(zero);
|
||||
|
||||
/* Extract the values saved by EXECUTE. */
|
||||
insn = s->ex_value & 0xffffffffffff0000ull;
|
||||
ilen = s->ex_value & 0xf;
|
||||
/* register insn bytes with translator so plugins work */
|
||||
for (i = 0; i < ilen; i++) {
|
||||
uint8_t byte = extract64(insn, 56 - (i * 8), 8);
|
||||
translator_fake_ldb(byte, pc + i);
|
||||
}
|
||||
op = insn >> 56;
|
||||
} else {
|
||||
insn = ld_code2(env, s, pc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue