lkml.org 
[lkml]   [2019]   [Dec]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 115/161] s390/disassembler: dont hide instruction addresses
    Date
    From: Ilya Leoshkevich <iii@linux.ibm.com>

    [ Upstream commit 544f1d62e3e6c6e6d17a5e56f6139208acb5ff46 ]

    Due to kptr_restrict, JITted BPF code is now displayed like this:

    000000000b6ed1b2: ebdff0800024 stmg %r13,%r15,128(%r15)
    000000004cde2ba0: 41d0f040 la %r13,64(%r15)
    00000000fbad41b0: a7fbffa0 aghi %r15,-96

    Leaking kernel addresses to dmesg is not a concern in this case, because
    this happens only when JIT debugging is explicitly activated, which only
    root can do.

    Use %px in this particular instance, and also to print an instruction
    address in show_code and PCREL (e.g. brasl) arguments in print_insn.
    While at present functionally equivalent to %016lx, %px is recommended
    by Documentation/core-api/printk-formats.rst for such cases.

    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/s390/kernel/dis.c | 13 +++++++------
    1 file changed, 7 insertions(+), 6 deletions(-)

    diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c
    index 2394557653d5..6d154069c962 100644
    --- a/arch/s390/kernel/dis.c
    +++ b/arch/s390/kernel/dis.c
    @@ -1930,10 +1930,11 @@ static int print_insn(char *buffer, unsigned char *code, unsigned long addr)
    ptr += sprintf(ptr, "%%c%i", value);
    else if (operand->flags & OPERAND_VR)
    ptr += sprintf(ptr, "%%v%i", value);
    - else if (operand->flags & OPERAND_PCREL)
    - ptr += sprintf(ptr, "%lx", (signed int) value
    - + addr);
    - else if (operand->flags & OPERAND_SIGNED)
    + else if (operand->flags & OPERAND_PCREL) {
    + void *pcrel = (void *)((int)value + addr);
    +
    + ptr += sprintf(ptr, "%px", pcrel);
    + } else if (operand->flags & OPERAND_SIGNED)
    ptr += sprintf(ptr, "%i", value);
    else
    ptr += sprintf(ptr, "%u", value);
    @@ -2005,7 +2006,7 @@ void show_code(struct pt_regs *regs)
    else
    *ptr++ = ' ';
    addr = regs->psw.addr + start - 32;
    - ptr += sprintf(ptr, "%016lx: ", addr);
    + ptr += sprintf(ptr, "%px: ", (void *)addr);
    if (start + opsize >= end)
    break;
    for (i = 0; i < opsize; i++)
    @@ -2033,7 +2034,7 @@ void print_fn_code(unsigned char *code, unsigned long len)
    opsize = insn_length(*code);
    if (opsize > len)
    break;
    - ptr += sprintf(ptr, "%p: ", code);
    + ptr += sprintf(ptr, "%px: ", code);
    for (i = 0; i < opsize; i++)
    ptr += sprintf(ptr, "%02x", code[i]);
    *ptr++ = '\t';
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-29 19:16    [W:4.134 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site