• Romeo Cane's avatar
    powerpc: Fix sys_call_table declaration to enable syscall tracing · 45a252f5
    Romeo Cane authored
    commit 1028ccf5 upstream.
    
    Declaring sys_call_table as a pointer causes the compiler to generate
    the wrong lookup code in arch_syscall_addr().
    
         <arch_syscall_addr>:
            lis     r9,-16384
            rlwinm  r3,r3,2,0,29
      -     lwz     r11,30640(r9)
      -     lwzx    r3,r11,r3
      +     addi    r9,r9,30640
      +     lwzx    r3,r9,r3
            blr
    
    The actual sys_call_table symbol, declared in assembler, is an
    array. If we lie about that to the compiler we get the wrong code
    generated, as above.
    
    This definition seems only to be used by the syscall tracing code in
    kernel/trace/trace_syscalls.c. With this patch I can successfully use
    the syscall tracepoints:
    
      bash-3815  [002] ....   333.239082: sys_write -> 0x2
      bash-3815  [002] ....   333.239087: sys_dup2(oldfd: a, newfd: 1)
      bash-3815  [002] ....   333.239088: sys_dup2 -> 0x1
      bash-3815  [002] ....   333.239092: sys_fcntl(fd: a, cmd: 1, arg: 0)
      bash-3815  [002] ....   333.239093: sys_fcntl -> 0x1
      bash-3815  [002] ....   333.239094: sys_close(fd: a)
      bash-3815  [002] ....   333.239094: sys_close -> 0x0
    Signed-off-by: default avatarRomeo Cane <romeo.cane.ext@coriant.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    45a252f5
syscall.h 2.18 KB