newlib/libgloss/hp74x/crt0.s

178 lines
4.5 KiB
ArmAsm

/*
* crt0.S -- startup file for hppa.
* rob@cygnus.com (Rob Savoye)
*/
.VERSION "0.2"
.COPYRIGHT "crt0.S for hppa"
;sp .equ %r30 ; stack pointer
;dp .equ %r27 ; global data pointer
;arg0 .equ %r26 ; argument
;arg1 .equ %r25 ; argument or high part of double argument
;arg2 .equ %r24 ; argument
;arg3 .equ %r23 ; argument or high part of double argument
#define IMM(a,b) ldil L%a,b ! ldo R%a(b),b
#define imm(i,t) ldil LS%i,t ! addi RS%i,t,t
.DATA
/****
* FIXME: these are just a gross hack so this will assemble
****/
_bss_start .WORD
_bss_end .WORD
_foobar
.STRINGZ "Foo Bar...\r\n"
;;_SYSTEM_ID .WORD
;; .EXPORT _SYSTEM_ID ; FIXME this is only so it'll
; link
/*
* Set up the standard spaces (sections) These definitions come
* from /lib/pcc_prefix.s.
*/
.space $TEXT$,0
.SUBSPA $BOOT$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=4
.IMPORT _start
/*
* stuff we need that's 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
$START$
/* FIXME: this writes to page zero */
;; setup the %30 (stack pointer) with some memory
ldil L%_stack+48,%r30
ldo R%_stack+48(%r30),%r30 ; should be %r30 (sp) but then
; we'd kill our test program :-)
;; we need to set %r27 (global data pointer) here too
ldil L%$global$,%r27
ldo R%$global$(%r27),%r27 ; same problem as above
/*
* zerobss -- zero out the bss section
*/
; 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's slower, it's safer
combf,= %r4,%r5, bssloop
nop
ldi 1,%ret0
/*
* Call the main routine from the application to get it going.
* main (argc, argv, environ)
* We pass argv as a pointer to NULL.
*/
bl main,%r2
nop
.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't. 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.
*/
.EXPORT _exit, ENTRY
_exit
.PROC
.CALLINFO
.ENTRY
;; ldil L%0xf0000004,%r1
;; bl %r1, %r2
ldil L'4026531844,%r19
ldo R'4026531844(%r19),%r19
blr %r19, %r2
nop
;; This just causes a breakpoint exception
;; break 0x0e,0xa5a
;; bv,n (%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
; The following declarations are, by default in the data space ($PRIVATE$)
;; .space $PRIVATE$,1
/*
* Here we set up the standard date sub spaces.
* _dp is for the WinBond board.
*
* 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$
.export _dp
$global$
_dp
.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 _stack
_stack
.BLOCK 0x2000
/*
* The heap follows the stack. To use dynamic memory routines in an
* application, some space MUST be assigned to the stack.
*/
.subspa $HEAP$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=96,ZERO
.export _heap
_heap
.end