Index | Thread | Search

From:
Philip Guenther <guenther@gmail.com>
Subject:
Re: ddb disassembler call
To:
Alexander Bluhm <bluhm@openbsd.org>
Cc:
tech@openbsd.org
Date:
Wed, 5 Jun 2024 12:00:27 -0700

Download raw body.

Thread
On Wed, Jun 5, 2024 at 8:37 AM Alexander Bluhm <bluhm@openbsd.org> wrote:
> Disassembling the amd64 call instruction in ddb creates wrong output.
> The operand of e8 is only 4 bytes long, not 8.
>
> objdump -Wl -d obj/explicit_bzero.o
> /home/bluhm/openbsd/cvs/src/sys/lib/libkern/explicit_bzero.c:19
>   44:   31 f6                   xor    %esi,%esi
>   46:   4c 89 f2                mov    %r14,%rdx
>   49:   e8 00 00 00 00          callq  4e <explicit_bzero+0x1e>
> /home/bluhm/openbsd/cvs/src/sys/lib/libkern/explicit_bzero.c:20
>   4e:   4c 89 ff                mov    %r15,%rdi
>   51:   4c 89 f6                mov    %r14,%rsi
>   54:   41 5e                   pop    %r14
>   56:   41 5f                   pop    %r15
>   58:   c9                      leaveq
>
> buggy ddb
> ddb> x/i explicit_bzero+0x14,7
> explicit_bzero+0x14:    xorl    %esi,%esi
> explicit_bzero+0x16:    movq    %r14,%rdx
> explicit_bzero+0x19:    callq   memset+0x4
> explicit_bzero+0x22:    movl    %esi,%esi
> explicit_bzero+0x24:    popq    %r14
> explicit_bzero+0x26:    popq    %r15
> explicit_bzero+0x28:    leave
>
> ddb with fix below
> ddb> x/i explicit_bzero+0x14,8
> explicit_bzero+0x14:    xorl    %esi,%esi
> explicit_bzero+0x16:    movq    %r14,%rdx
> explicit_bzero+0x19:    calll   memset
> explicit_bzero+0x1e:    movq    %r15,%rdi
> explicit_bzero+0x21:    movq    %r14,%rsi
> explicit_bzero+0x24:    popq    %r14
> explicit_bzero+0x26:    popq    %r15
> explicit_bzero+0x28:    leave
>
> ok?
>
> bluhm
>
> Index: arch/amd64/amd64/db_disasm.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/db_disasm.c,v
> diff -u -p -r1.24 db_disasm.c
> --- arch/amd64/amd64/db_disasm.c        22 Apr 2023 18:26:17 -0000      1.24
> +++ arch/amd64/amd64/db_disasm.c        5 Jun 2024 15:31:05 -0000
> @@ -793,7 +793,7 @@ struct inst db_inst_table[256] = {
>  /*e6*/ { "out",   0, BYTE,  op2(A, Ib),  0 },
>  /*e7*/ { "out",   0, LONG,  op2(A, Ib) , 0 },
>
> -/*e8*/ { "call",  0, QUAD,  op1(Dl),     0 },
> +/*e8*/ { "call",  0, LONG,  op1(Dl),     0 },
>  /*e9*/ { "jmp",   0, NONE,  op1(Dl),     0 },

Shouldn't it be NONE like jmp?  Or maybe
   "callq", 0, NONE
to look better...