• Sven Schnelle's avatar
    s390: fix __EMIT_BUG() macro · 17248ea0
    Sven Schnelle authored
    Setting a kprobe on getname_flags() failed:
    
    $ echo 'p:tmr1 getname_flags +0(%r2):ustring' > kprobe_events
    -bash: echo: write error: Invalid argument
    
    Debugging the kprobes code showed that the address of
    getname_flags() is contained in the __bug_table. Kprobes
    doesn't allow to set probes at BUG() locations.
    
    $ objdump -j  __bug_table -x build/fs/namei.o
    [..]
    0000000000000108 R_390_PC32        .text+0x00000000000075a8
    000000000000010c R_390_PC32        .L223+0x0000000000000004
    
    I was expecting getname_flags() to start with a BUG(), but:
    
    7598:       e3 20 10 00 00 04       lg      %r2,0(%r1)
    759e:       c0 f4 00 00 00 00       jg      759e <putname+0x7e>
    75a0: R_390_PLT32DBL    kmem_cache_free+0x2
    75a4:       a7 f4 00 01             j       75a6 <putname+0x86>
    
    00000000000075a8 <getname_flags>:
    75a8:       c0 04 00 00 00 00       brcl    0,75a8 <getname_flags>
    75ae:       eb 6f f0 48 00 24       stmg    %r6,%r15,72(%r15)
    75b4:       b9 04 00 ef             lgr     %r14,%r15
    75b8:       e3 f0 ff a8 ff 71       lay     %r15,-88(%r15)
    
    So the BUG() is actually the last opcode of the previous function.
    Fix this by switching to using the MONITOR CALL (MC) instruction,
    and set the entry in __bug_table to the beginning of that MC.
    Reviewed-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    17248ea0
bug.h 1.51 KB