Running GCC compiled code on custom machine. cant find sp initialization in assembly

116 Views Asked by At

I was going through .lst while while trying to run gcc compiled code on my custom rv32I machine. I cant find initial vallues of sp


Disassembly of section .text:

00010074 <register_fini>:
register_fini():
   10074:   00000793            li  a5,0
   10078:   00078863            beqz    a5,10088 <register_fini+0x14>
   1007c:   00010537            lui a0,0x10
   10080:   51050513            addi    a0,a0,1296 # 10510 <__libc_fini_array>
   10084:   4e80006f            j   1056c <atexit>
   10088:   00008067            ret

0001008c <_start>:
_start():
   1008c:   00002197            auipc   gp,0x2
   10090:   e1c18193            addi    gp,gp,-484 # 11ea8 <__global_pointer$>
   10094:   c3018513            addi    a0,gp,-976 # 11ad8 <completed.1>
   10098:   c4c18613            addi    a2,gp,-948 # 11af4 <__BSS_END__>
   1009c:   40a60633            sub a2,a2,a0
   100a0:   00000593            li  a1,0
   100a4:   270000ef            jal ra,10314 <memset>
   100a8:   00000517            auipc   a0,0x0
   100ac:   4c450513            addi    a0,a0,1220 # 1056c <atexit>
   100b0:   00050863            beqz    a0,100c0 <_start+0x34>
   100b4:   00000517            auipc   a0,0x0
   100b8:   45c50513            addi    a0,a0,1116 # 10510 <__libc_fini_array>
   100bc:   4b0000ef            jal ra,1056c <atexit>
   100c0:   1b8000ef            jal ra,10278 <__libc_init_array>
   100c4:   00012503            lw  a0,0(sp)
   100c8:   00410593            addi    a1,sp,4
1

There are 1 best solutions below

0
On

If you are rolling your own, bare metal or not, you need to solve the stack pointer, .data and .bss initialization at a minimum. If you are booting a processor with this code you need to solve the vector/exception/boot solution for that processor as well. If you are not booting the processor then you can choose to roll the stack and data/bss init into the loader of your application, or you can put it in the application. You would then need essentially a file format as an operating system uses, to tell the loader where everything is/goes as well as the instructions/data itself.

Generally if doing bare-metal you have your own bootstrap and linker script (they are a married couple) to start up the code for the specific target (not just isa, but chip/loader/whatever, system/environment). If you want to use a C library then you have a lot more work on top of that to do since a C library is heavily dependent on a system so you have to create or fake an operating system to handle all the system calls (or just don't support a C library and make life much happier).

For starters though make something super simple, blink an led or if this is a sim just make a loop with an incrementing register and look at the core in the sim to see that it booted and made it to the loop (long before you need a stack pointer). If on a system with a loader, then perhaps the uart is initialized but the loader doesn't handle sp and bss/data, then you can loop code to poke at the uart tx buffer and see that the code booted and get your tools in order before you try something more complicated.