• James Hogan's avatar
    metag: Fix KSTK_EIP() and KSTK_ESP() macros · c2996cb2
    James Hogan authored
    The KSTK_EIP() and KSTK_ESP() macros should return the user program
    counter (PC) and stack pointer (A0StP) of the given task. These are used
    to determine which VMA corresponds to the user stack in
    /proc/<pid>/maps, and for the user PC & A0StP in /proc/<pid>/stat.
    
    However for Meta the PC & A0StP from the task's kernel context are used,
    resulting in broken output. For example in following /proc/<pid>/maps
    output, the 3afff000-3b021000 VMA should be described as the stack:
    
      # cat /proc/self/maps
      ...
      100b0000-100b1000 rwxp 00000000 00:00 0          [heap]
      3afff000-3b021000 rwxp 00000000 00:00 0
    
    And in the following /proc/<pid>/stat output, the PC is in kernel code
    (1074234964 = 0x40078654) and the A0StP is in the kernel heap
    (1335981392 = 0x4fa17550):
    
      # cat /proc/self/stat
      51 (cat) R ... 1335981392 1074234964 ...
    
    Fix the definitions of KSTK_EIP() and KSTK_ESP() to use
    task_pt_regs(tsk)->ctx rather than (tsk)->thread.kernel_context. This
    gets the registers from the user context stored after the thread info at
    the base of the kernel stack, which is from the last entry into the
    kernel from userland, regardless of where in the kernel the task may
    have been interrupted, which results in the following more correct
    /proc/<pid>/maps output:
    
      # cat /proc/self/maps
      ...
      0800b000-08070000 r-xp 00000000 00:02 207        /lib/libuClibc-0.9.34-git.so
      ...
      100b0000-100b1000 rwxp 00000000 00:00 0          [heap]
      3afff000-3b021000 rwxp 00000000 00:00 0          [stack]
    
    And /proc/<pid>/stat now correctly reports the PC in libuClibc
    (134320308 = 0x80190b4) and the A0StP in the [stack] region (989864576 =
    0x3b002280):
    
      # cat /proc/self/stat
      51 (cat) R ... 989864576 134320308 ...
    Reported-by: default avatarAlexey Brodkin <Alexey.Brodkin@synopsys.com>
    Reported-by: default avatarVineet Gupta <Vineet.Gupta1@synopsys.com>
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: linux-metag@vger.kernel.org
    Cc: <stable@vger.kernel.org> # v3.9+
    c2996cb2
processor.h 5.1 KB