• Mikulas Patocka's avatar
    parisc: Fix backtrace on PA-RISC · be24a897
    Mikulas Patocka authored
    
    
    This patch fixes backtrace on PA-RISC
    
    There were several problems:
    
    1) The code that decodes instructions handles instructions that subtract
    from the stack pointer incorrectly. If the instruction subtracts the
    number X from the stack pointer the code increases the frame size by
    (0x100000000-X).  This results in invalid accesses to memory and
    recursive page faults.
    
    2) Because gcc reorders blocks, handling instructions that subtract from
    the frame pointer is incorrect. For example, this function
    	int f(int a)
    	{
    		if (__builtin_expect(a, 1))
    			return a;
    		g();
    		return a;
    	}
    is compiled in such a way, that the code that decreases the stack
    pointer for the first "return a" is placed before the code for "g" call.
    If we recognize this decrement, we mistakenly believe that the frame
    size for the "g" call is zero.
    
    To fix problems 1) and 2), the patch doesn't recognize instructions that
    decrease the stack pointer at all. To further safeguard the unwind code
    against nonsense values, we don't allow frame size larger than
    Total_frame_size.
    
    3) The backtrace is not locked. If stack dump races with module unload,
    invalid table can be accessed.
    
    This patch adds a spinlock when processing module tables.
    
    Note, that for correct backtrace, you need recent binutils.
    Binutils 2.18 from Debian 5 produce garbage unwind tables.
    Binutils 2.21 work better (it sometimes forgets function frames, but at
    least it doesn't generate garbage).
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    be24a897