powerpc: Fix sys_call_table declaration to enable syscall tracing
authorRomeo Cane <romeo.cane.ext@coriant.com>
Thu, 2 Oct 2014 14:41:39 +0000 (15:41 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 10 Oct 2014 06:03:36 +0000 (17:03 +1100)
commit1028ccf560b97adbf272381a61a67e17d44d1054
treec9008a51ce04cddb9df35b85af80797f773ae99b
parentd53ba6b3bba33432cc37b7101a86f8f3392c46e7
powerpc: Fix sys_call_table declaration to enable syscall tracing

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: Romeo Cane <romeo.cane.ext@coriant.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/syscall.h