diff options
Diffstat (limited to 'c/src/lib/libbsp/hppa1.1/simhppa/start/start.s')
-rw-r--r-- | c/src/lib/libbsp/hppa1.1/simhppa/start/start.s | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s b/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s new file mode 100644 index 0000000000..92fda897d9 --- /dev/null +++ b/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s @@ -0,0 +1,169 @@ +/* + * crt0.S -- startup file for hppa on RTEMS + * + * $Id$ + */ + + .COPYRIGHT "crt0.S for hppa" + + .DATA + +_progname .STRINGZ "simhppa" +_crt0_argv .WORD _progname, 0 + +/* + * Set up the standard spaces (sections) These definitions come + * from /lib/pcc_prefix.s. + */ + .TEXT + +/* + * stuff we need that is defined elsewhere. + */ + .IMPORT main, CODE + .IMPORT _bss_start, DATA + .IMPORT _bss_end, DATA + .IMPORT environ, DATA + +/* + * start -- set things up so the application will run. + * + */ + .PROC + .CALLINFO SAVE_SP, FRAME=48 + .EXPORT $START$,ENTRY + .EXPORT start,ENTRY +$START$ +start: + +/* + * Get a stack + */ + + ldil L%crt_stack+48,%r30 + ldo R%crt_stack+48(%r30),%r30 + +/* + * we need to set %r27 (global data pointer) here + */ + + ldil L%$global$,%r27 + ldo R%$global$(%r27),%r27 + +/* + * zerobss -- zero out the bss section + * XXX We don't do this since simulator and boot rom will do this for us. + */ +#if 0 + ; load the start of bss + ldil L%_bss_start,%r4 + ldo R%_bss_start(%r4),%r4 + + ; load the end of bss + ldil L%_bss_end,%r5 + ldo R%_bss_end(%r5),%r5 + + +bssloop + addi -1,%r5,%r5 ; decrement _bss_end + stb %r0,0(0,%r5) ; we do this by bytes for now even + ; though it is slower, it is safer + combf,= %r4,%r5, bssloop + nop +#endif + + ldi 1,%ret0 + +/* + * Call the "main" routine from the application to get it going. + * We call it as main(1, argv, 0) + */ + + copy %r0, %r24 + + ldil L%_crt0_argv,%r25 + ldo R%_crt0_argv(%r25),%r25 + + bl main,%r2 + ldo 1(%r0), %r26 + + .PROCEND +/* + * _exit -- Exit from the application. Normally we cause a user trap + * to return to the ROM monitor for another run, but with + * this monitor we can not. Still, "C" wants this symbol, it + * should be here. Jumping to 0xF0000004 jumps back into the + * firmware, while writing a 5 to 0xFFFE0030 causes a reset. + */ +_exit_fallthru + .PROC + .CALLINFO + .ENTRY + + ;; This just causes a breakpoint exception + break 0x0,0x0 + bv,n (%rp) + nop + .EXIT + .PROCEND + +/* + * _sr4export -- support for called functions. (mostly for GDB) + */ + .EXPORT _sr4export, ENTRY +_sr4export: + .PROC + .CALLINFO + .ENTRY + + ble 0(%sr4,%r22) + copy %r31,%rp + ldw -18(%sr0,%sp),%rp + ldsid (%sr0,%rp),%r1 + mtsp %r1,%sr0 + be,n 0(%sr0,%rp) + nop + .EXIT + .PROCEND + + + .subspa $UNWIND_START$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=56 + .export $UNWIND_START +$UNWIND_START + .subspa $UNWIND$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=64 + .subspa $UNWIND_END$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=72 + .export $UNWIND_END +$UNWIND_END + .subspa $RECOVER_START$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=73 + .export $RECOVER_START +$RECOVER_START + .subspa $RECOVER$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=80 + .subspa $RECOVER_END$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=88 + .export $RECOVER_END +$RECOVER_END + +/* + * Here we set up the standard date sub spaces. + * + * Set up some room for a stack. We just grab a chunk of memory. + * We also setup some space for the global variable space, which + * must be done using the reserved name "$global$" so "C" code + * can find it. The stack grows towards the higher addresses. + */ + + .subspa $DATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16 + .subspa $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24 + .subspa $GLOBAL$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40 + .export $global$ +$global$ + .subspa $SHORTBSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=80,ZERO + .subspa $BSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=82,ZERO + + .subspa $STACK$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=88,ZERO + + .export crt_stack +crt_stack + .comm 0x1000 + + .end + |