| # 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 |