• Matt Redfearn's avatar
    MIPS: Handle non word sized instructions when examining frame · 11887ed1
    Matt Redfearn authored
    Commit 34c2f668 ("MIPS: microMIPS: Add unaligned access support.")
    added fairly broken support for handling 16bit microMIPS instructions in
    get_frame_info(). It adjusts the instruction pointer by 16bits in the
    case of a 16bit sp move instruction, but not any other 16bit
    instruction.
    
    Commit b6c7a324 ("MIPS: Fix get_frame_info() handling of microMIPS
    function size") goes some way to fixing get_frame_info() to iterate over
    microMIPS instuctions, but the instruction pointer is still manipulated
    using a postincrement, and is of union mips_instruction type. Since the
    union is sized to the largest member (a word), but microMIPS
    instructions are a mix of halfword and word sizes, the function does not
    always iterate correctly, ending up misaligned with the instruction
    stream and interpreting it incorrectly.
    
    Since the instruction modifying the stack pointer is usually the first
    in the function, that one is usually handled correctly. But the
    instruction which saves the return address to the sp is some variable
    number of instructions into the frame and is frequently missed due to
    not being on a word boundary, leading to incomplete walking of the
    stack.
    
    Fix this by incrementing the instruction pointer based on the size of
    the previously decoded instruction (& remove the hack introduced by
    commit 34c2f668 ("MIPS: microMIPS: Add unaligned access support.")
    which adjusts the instruction pointer in the case of a 16bit sp move
    instruction, but not any other).
    
    Fixes: 34c2f668 ("MIPS: microMIPS: Add unaligned access support.")
    Signed-off-by: default avatarMatt Redfearn <matt.redfearn@imgtec.com>
    Cc: Marcin Nowakowski <marcin.nowakowski@imgtec.com>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/16953/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    11887ed1
process.c 19.4 KB