• Vineet Gupta's avatar
    ARC: gdbserver breakage in Big-Endian configuration #1 · 9b2c750d
    Vineet Gupta authored
    [Based on mainline commit 502a0c77: "ARC: pt_regs update #5"]
    
    gdbserver needs @stop_pc, served by ptrace, but fetched from pt_regs
    differently, based on in_brkpt_traps(), which in turn relies on
    additional machine state in pt_regs->event bitfield.
    
            unsigned long orig_r8:16, event:16;
    
    For big endian config, this macro was returning false, despite being in
    breakpoint Trap exception, causing wrong @stop_pc to be returned to gdb.
    
    Issue #1: In BE, @event above is at offset 2 in word, while a STW insn
              at offset 0 was used to update it. Resort to using ST insn
    	  which updates the half-word at right location.
    
    Issue #2: The union involving bitfields causes all the members to be
    	  laid out at offset 0. So with fix #1 above, ASM was now
    	  updating at offset 2, "C" code was still referencing at
    	  offset 0. Fixed by wrapping bitfield in a struct.
    Reported-by: default avatarNoam Camus <noamc@ezchip.com>
    Tested-by: default avatarAnton Kolesov <akolesov@synopsys.com>
    Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9b2c750d
ptrace.h 3 KB