Skip to content

Commit

Permalink
unwind: repair register restoration for OR1K
Browse files Browse the repository at this point in the history
Currently, OR1K architecture put the program counter at offset 0x128 of
the current `or1k_thread_state_t`. However, the PC is restored after
updating the thread pointer in `r3`, which causes the PC to be fetched
incorrectly.

This patch swaps the order of restoration of `r9` and `r3`, such that
the PC is restored to `r9` using the current thread state.

Patch by Oi Chee Cheung!

Reviewed By: whitequark, compnerd

Differential Revision: https://reviews.llvm.org/D107042
  • Loading branch information
compnerd committed Aug 2, 2021
1 parent 9e02f58 commit d6d0b65
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions libunwind/src/UnwindRegistersRestore.S
Original file line number Diff line number Diff line change
Expand Up @@ -800,11 +800,12 @@ DEFINE_LIBUNWIND_FUNCTION(_ZN9libunwind14Registers_or1k6jumptoEv)
l.lwz r30,120(r3)
l.lwz r31,124(r3)

# load new pc into ra
l.lwz r9, 128(r3)

# at last, restore r3
l.lwz r3, 12(r3)

# load new pc into ra
l.lwz r9, 128(r3)
# jump to pc
l.jr r9
l.nop
Expand Down

0 comments on commit d6d0b65

Please sign in to comment.