2022-05-19 23:15:40 +02:00
|
|
|
; FXF relocation routines
|
|
|
|
|
|
|
|
; relocate a FXF binary
|
|
|
|
; inputs:
|
|
|
|
; r0: pointer to memory buffer containing a FXF binary
|
|
|
|
; outputs:
|
|
|
|
; r0: relocation address
|
|
|
|
fxf_reloc:
|
|
|
|
push r1
|
|
|
|
push r2
|
|
|
|
push r3
|
|
|
|
push r4
|
|
|
|
push r5
|
|
|
|
|
|
|
|
; calculate relocation address
|
|
|
|
mov r5, r0
|
|
|
|
add r5, FXF_CODE_PTR
|
|
|
|
mov r5, [r5]
|
|
|
|
add r5, r0
|
|
|
|
|
|
|
|
; get the number of entries in the reloc table
|
|
|
|
mov r1, r0
|
|
|
|
add r1, FXF_RELOC_SIZE
|
|
|
|
mov r1, [r1]
|
|
|
|
div r1, 4
|
|
|
|
mov r31, r1
|
2023-01-21 03:25:15 +01:00
|
|
|
cmp r31, 0
|
|
|
|
ifz mov r0, r5
|
|
|
|
ifz pop r5
|
|
|
|
ifz pop r4
|
|
|
|
ifz pop r3
|
|
|
|
ifz pop r2
|
|
|
|
ifz pop r1
|
|
|
|
ifz ret
|
2022-05-19 23:15:40 +02:00
|
|
|
|
|
|
|
; get the pointer to the table
|
|
|
|
mov r1, r0
|
|
|
|
add r1, FXF_RELOC_PTR
|
|
|
|
mov r1, [r1]
|
|
|
|
add r1, r0
|
|
|
|
|
|
|
|
; get the pointer to the code
|
|
|
|
mov r2, r0
|
|
|
|
add r2, FXF_CODE_PTR
|
|
|
|
mov r2, [r2]
|
|
|
|
add r2, r0
|
|
|
|
|
|
|
|
; loop over the reloc table entries and relocate the code
|
|
|
|
fxf_reloc_loop:
|
|
|
|
; get the reloc table entry
|
|
|
|
mov r3, [r1]
|
|
|
|
|
|
|
|
; point to the location in the code
|
|
|
|
mov r4, r2
|
|
|
|
add r4, r3
|
|
|
|
|
|
|
|
; relocate
|
|
|
|
add [r4], r5
|
|
|
|
|
|
|
|
; increment the reloc table pointer
|
|
|
|
add r1, 4
|
|
|
|
loop fxf_reloc_loop
|
|
|
|
|
|
|
|
; return relocation address
|
|
|
|
mov r0, r5
|
|
|
|
|
|
|
|
pop r5
|
|
|
|
pop r4
|
|
|
|
pop r3
|
|
|
|
pop r2
|
|
|
|
pop r1
|
|
|
|
ret
|