Commit 3874a377 authored by Julius Baxter's avatar Julius Baxter Committed by Wolfgang Denk
Browse files

openrisc: Work around potential relocation issues



When reset code is in flash, the jump instructions emitted by the
compiler are relative instead of absolute jumps.

A fix to the reset code to make correct jumps to the beginning of
code relocated to RAM have also been added.
Signed-off-by: default avatarJulius Baxter <juliusbaxter@gmail.com>
parent eb0b43f2
......@@ -151,7 +151,11 @@ extern void __reset(void);
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
disable_interrupts();
__reset();
/* Code the jump to __reset here as the compiler is prone to
emitting a bad jump instruction if the function is in flash */
__asm__("l.movhi r1,hi(__reset); \
l.ori r1,r1,lo(__reset); \
l.jr r1");
/* not reached, __reset does not return */
return 0;
}
......@@ -26,8 +26,11 @@
#define HANDLE_EXCEPTION \
l.addi r1, r1, -EXCEPTION_STACK_SIZE ;\
l.sw 0x00(r1), r2 ;\
l.sw 0x1c(r1), r9 ;\
l.jal _exception_handler ;\
l.movhi r2,hi(_exception_handler) ;\
l.ori r2,r2,lo(_exception_handler) ;\
l.jalr r2 ;\
l.nop ;\
l.lwz r9, 0x1c(r1) ;\
l.addi r1, r1, EXCEPTION_STACK_SIZE ;\
......@@ -79,8 +82,9 @@ __reset:
l.bnf .L_relocvectors
l.addi r4,r4, 4
#endif
l.j _start
l.movhi r4,hi(_start)
l.ori r4,r4,lo(_start)
l.jr r4
l.nop
/* bus error */
......@@ -262,8 +266,7 @@ _start:
.type _exception_handler,@function
_exception_handler:
/* Store state (r9 already saved)*/
l.sw 0x00(r1), r2
/* Store state (r2 and r9 already saved)*/
l.sw 0x04(r1), r3
l.sw 0x08(r1), r4
l.sw 0x0c(r1), r5
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment