On Tue, Aug 25, 2026 at 02:29:11PM +0200, Paolo Bonzini wrote:
> Date: Tue, 25 Aug 2026 14:29:11 +0200
> From: Paolo Bonzini <[email protected]>
> Subject: [PATCH 10/20] target/i386/tcg: implement JMPABS instruction
> X-Mailer: git-send-email 2.55.0
> 
> This is the same as an indirect jump, just with immediate operand.
> The requirement of W=0 and 0x67 are already available in the decoder.
> 
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
>  target/i386/tcg/decode-new.h     | 3 +++
>  target/i386/tcg/decode-new.c.inc | 4 ++++
>  2 files changed, 7 insertions(+)
> 
> diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h
> index c974ca9d7c5..4998712e86d 100644
> --- a/target/i386/tcg/decode-new.h
> +++ b/target/i386/tcg/decode-new.h
> @@ -184,6 +184,9 @@ typedef enum X86InsnCheck {
>  
>      /* No REX2 prefix allowed */
>      X86_CHECK_no_rex2 = 8192,
> +
> +    /* No 0x67 prefix allowed */
> +    X86_CHECK_no_adr = 16384,
>  } X86InsnCheck;
>  
>  typedef enum X86InsnSpecial {
> diff --git a/target/i386/tcg/decode-new.c.inc 
> b/target/i386/tcg/decode-new.c.inc
> index 1f59fd665f7..d215d28cec5 100644
> --- a/target/i386/tcg/decode-new.c.inc
> +++ b/target/i386/tcg/decode-new.c.inc
> @@ -1991,6 +1991,7 @@ static const X86OpEntry opcodes_root[256] = {
>  
>  #ifdef TARGET_X86_64
>  static const X86OpEntry opcodes_rex2_map0_A0toAF[16] = {
> +    [1] = X86_OP_ENTRY1(JMP_m,   I,q, p_00 chk2(W0, no_adr)),
>  };

Maybe it should use X86_OP_ENTRYr? since JMPABS doesn't need to write
back.

Just a simple test:

#include <stdio.h>

int main(void)
{
    __asm__ volatile (
        /* JMPABS: REX2(M0=0,W=0) = D5 00, opcode A1, then imm64 target */
        ".byte 0xd5, 0x00, 0xa1\n\t"
        ".quad  1f\n\t"
        "ud2\n\t"          /* this should be skipped */
        "1:\n\t");
    puts("JMPABS -- OK");
    return 0;
}

And this hits an abort():

$ ./build/qemu-x86_64 /tmp/jmpabs
**
ERROR:../target/i386/tcg/emit.c.inc:380:gen_writeback: code should not be 
reached
Bail out! ERROR:../target/i386/tcg/emit.c.inc:380:gen_writeback: code should 
not be reached
Aborted (core dumped)

more GDB backtrace:

Thread 1 "qemu-x86_64" received signal SIGABRT, Aborted.
__pthread_kill_implementation (no_tid=0, signo=6, threadid=140737352460800) at 
./nptl/pthread_kill.c:44
44      ./nptl/pthread_kill.c: No such file or directory.
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737352460800) 
at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140737352460800) at 
./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140737352460800, signo=signo@entry=6) at 
./nptl/pthread_kill.c:89
#3  0x00007ffff7242476 in __GI_raise (sig=sig@entry=6) at 
../sysdeps/posix/raise.c:26
#4  0x00007ffff72287f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff76e3b57 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#6  0x00007ffff773d70f in g_assertion_message_expr () from 
/lib/x86_64-linux-gnu/libglib-2.0.so.0
#7  0x0000555555664f37 in gen_writeback (s=s@entry=0x7fffffffd240, 
decode=decode@entry=0x7fffffffd0b0, opn=opn@entry=0, v=<optimized out>) at 
../target/i386/tcg/emit.c.inc:380
#8  0x0000555555677778 in disas_insn (cpu=0x55555593e780, s=0x7fffffffd240) at 
../target/i386/tcg/decode-new.c.inc:3682
#9  i386_tr_translate_insn (dcbase=0x7fffffffd240, cpu=0x55555593e780) at 
../target/i386/tcg/translate.c:3608
#10 0x00005555555d7962 in translator_loop (cpu=0x55555593e780, 
tb=0x7fffe80d0700 <code_gen_buffer+853715>, max_insns=0x7fffffffd4cc, 
pc=<optimized out>, host_pc=<optimized out>, ops=ops@entry=0x5555557dc5a0 
<i386_tr_ops>, db=0x7fffffffd240, addr_type=TCG_TYPE_I64) at 
../accel/tcg/translator.c:178
#11 0x000055555567b212 in x86_translate_code (cpu=<optimized out>, 
tb=<optimized out>, max_insns=<optimized out>, pc=<optimized out>, 
host_pc=<optimized out>) at ../target/i386/tcg/translate.c:3699
#12 0x00005555555d6644 in setjmp_gen_code (env=env@entry=0x5555559427f0, 
tb=tb@entry=0x7fffe80d0700 <code_gen_buffer+853715>, pc=pc@entry=4198710, 
host_pc=0x401136, max_insns=max_insns@entry=0x7fffffffd4cc, ti=<optimized out>) 
at ../accel/tcg/translate-all.c:251
#13 0x00005555555d6b0e in tb_gen_code (cpu=cpu@entry=0x55555593e780, s=...) at 
../accel/tcg/translate-all.c:324
#14 0x00005555555cec1a in cpu_exec_loop (cpu=cpu@entry=0x55555593e780, 
sc=<optimized out>) at ../accel/tcg/cpu-exec.c:973
#15 0x00005555555ced99 in cpu_exec_setjmp (cpu=cpu@entry=0x55555593e780, 
sc=<optimized out>) at ../accel/tcg/cpu-exec.c:1019
#16 0x00005555555cf381 in cpu_exec (cpu=cpu@entry=0x55555593e780) at 
../accel/tcg/cpu-exec.c:1045
#17 0x0000555555622c80 in cpu_loop (env=env@entry=0x5555559427f0) at 
../linux-user/x86_64/../i386/cpu_loop.c:217
#18 0x00005555555a1d17 in main (argc=<optimized out>, argv=<optimized out>, 
envp=<optimized out>) at ../linux-user/main.c:1010

Regards,
Zhao


Reply via email to