95 lines
2.4 KiB
ArmAsm
95 lines
2.4 KiB
ArmAsm
|
# Assembler initialization code for actual execution test.
|
||
|
|
||
|
# This code becomes the start of the execution test program. It is
|
||
|
# responsible for initializing the static data, invoking the C code,
|
||
|
# and returning the result. It is called as though it were a C
|
||
|
# function with an argument of the address of the data segment.
|
||
|
|
||
|
# We need to know the value of _ftext and _fdata at link time, but we
|
||
|
# have no way to actually get that at runtime. This is because when
|
||
|
# this code is compiled with -membedded-pic, the la instruction will
|
||
|
# be turned into an addiu $gp instruction. We work around this by
|
||
|
# storing the information in words in the .data section. We then load
|
||
|
# the values of these words *before* doing the runtime relocation.
|
||
|
.sdata
|
||
|
text_start:
|
||
|
.word _ftext
|
||
|
data_start:
|
||
|
.word _fdata
|
||
|
|
||
|
.globl start
|
||
|
.text
|
||
|
start:
|
||
|
# Grab some space on the stack, just as though we were a real
|
||
|
# function.
|
||
|
addiu $sp,$sp,-8
|
||
|
sw $31,0($sp)
|
||
|
|
||
|
# Save the $gp register, and set it up for our data section.
|
||
|
sw $gp,4($sp)
|
||
|
|
||
|
addu $gp,$4,0x8000 # macro
|
||
|
|
||
|
# The start of the data segment is in $4.
|
||
|
|
||
|
# Get the address of start into $5 in a position independent
|
||
|
# fashion.
|
||
|
.set noreorder
|
||
|
$LF1 = . + 8
|
||
|
bal $LF1
|
||
|
la $5,start-$LF1 # macro
|
||
|
.set reorder
|
||
|
addu $5,$5,$31
|
||
|
|
||
|
# Now get the address of _ftext into $6.
|
||
|
la $6,_ftext-start # macro
|
||
|
addu $6,$6,$5
|
||
|
|
||
|
# Get the value of _ftext used to link into $7.
|
||
|
lw $7,text_start # macro
|
||
|
|
||
|
# Get the value of _fdata used to link into $8.
|
||
|
lw $8,data_start # macro
|
||
|
|
||
|
# Get the address of __runtime_reloc_start into $9.
|
||
|
la $9,__runtime_reloc_start-start # macro
|
||
|
addu $9,$9,$5
|
||
|
|
||
|
# Get the address of __runtime_reloc_stop into $10.
|
||
|
la $10,__runtime_reloc_stop-start # macro
|
||
|
addu $10,$10,$5
|
||
|
|
||
|
# The words between $9 and $10 are the runtime initialization
|
||
|
# instructions. Step through and relocate them. First set
|
||
|
# $11 and $12 to the values to add to text and data sections,
|
||
|
# respectively.
|
||
|
subu $11,$6,$7
|
||
|
subu $12,$4,$8
|
||
|
|
||
|
1:
|
||
|
bge $9,$10,3f # macro
|
||
|
lw $13,0($9)
|
||
|
and $14,$13,0xfffffffe # macro
|
||
|
move $15,$11
|
||
|
beq $13,$14,2f
|
||
|
move $15,$12
|
||
|
2:
|
||
|
addu $14,$14,$4
|
||
|
lw $24,0($14)
|
||
|
addu $24,$24,$15
|
||
|
sw $24,0($14)
|
||
|
addiu $9,$9,4
|
||
|
b 1b
|
||
|
3:
|
||
|
|
||
|
# Now the statically initialized data has been relocated
|
||
|
# correctly, and we can call the C code which does the actual
|
||
|
# testing.
|
||
|
bal foo
|
||
|
|
||
|
# We return the value returned by the C code.
|
||
|
lw $31,0($sp)
|
||
|
lw $gp,4($sp)
|
||
|
addu $sp,$sp,8
|
||
|
j $31
|