summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s
diff options
context:
space:
mode:
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.s169
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
+