Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/pa/crt0.S')
-rw-r--r--libgloss/pa/crt0.S128
1 files changed, 128 insertions, 0 deletions
diff --git a/libgloss/pa/crt0.S b/libgloss/pa/crt0.S
new file mode 100644
index 000000000..e9ea525a8
--- /dev/null
+++ b/libgloss/pa/crt0.S
@@ -0,0 +1,128 @@
+/* crt0.S -- startup file for hppa.
+ *
+ * Copyright (c) 1995 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+ .VERSION "1.0"
+ .COPYRIGHT "crt0.o for the PA"
+
+ .DATA
+
+/*
+ * Set up the standard spaces (sections) These definitions come
+ * from /lib/pcc_prefix.s.
+ */
+ .TEXT
+
+/*
+ * stuff we need that's defined elsewhere.
+ */
+ .IMPORT main, CODE
+ .IMPORT exit, CODE
+ .IMPORT _bss_start, DATA
+ .IMPORT _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,%r30
+ ldo R%_stack(%r30),%r30
+
+ ;; 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%_end,%r5
+ ldo R%_end(%r5),%r5
+
+
+L$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, L$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.
+ */
+
+ ldil L%main,%r22
+ ble R%main(%sr4,%r22)
+ copy %r31,%r2
+/*
+ * Call exit() from the C library with the return value from main()
+ */
+ copy %r28,%r26
+ ldil L%exit,%r22
+ ble R%exit(%sr4,%r22)
+ copy %r31,%r2
+
+ .PROCEND
+/*
+ * _exit -- Exit from the application. Normally we cause a user trap
+ * to return to the ROM monitor for another run.
+ */
+ .EXPORT _exit, ENTRY
+_exit
+ .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 -24(%sr0,%sp),%rp
+ ldsid (%sr0,%rp),%r1
+ mtsp %r1,%sr0
+ be,n 0(%sr0,%rp)
+ nop
+ .EXIT
+ .PROCEND
+
+