#include <sysdep.h>
+/* XXX Must this be __PIC__ ? --drepper */
#ifdef PIC
.option pic2
#endif
ENTRY (_setjmp)
+ .set noreorder
#ifdef PIC
.cpload t9
+ la t9, C_SYMBOL_NAME (__sigsetjmp)
+ jr t9
+#else
+ j C_SYMBOL_NAME (__sigsetjmp)
#endif
- la t9, C_SYMBOL_NAME (__sigsetjmp)
- nop
- jr t9
- li a1, 0 /* Pass a second argument of zero. */
+ move a1,zero /* Pass a second argument of zero. */
+ .set reorder
+ .end _setjmp
#include <sysdep.h>
+/* XXX Must this be __PIC__ ? --drepper */
#ifdef PIC
.option pic2
#endif
ENTRY (setjmp)
+ .set noreorder
#ifdef PIC
.cpload t9
+ la t9, C_SYMBOL_NAME (__sigsetjmp)
+ jr t9
+#else
+ j C_SYMBOL_NAME (__sigsetjmp)
#endif
- la t9, C_SYMBOL_NAME (__sigsetjmp)
- nop
- jr t9
- li a1, 1 /* Pass a second argument of one. */
+ li a1, 1 /* Pass a second argument of one. */
+ .set reorder
+ .end setjmp
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <entry.h>
+
+#ifndef ENTRY_POINT
+#error ENTRY_POINT needs to be defined for start.S on MIPS/ELF.
+#endif
+
/* This is the canonical entry point, usually the first thing in the text
segment. The SVR4/Mips ABI (pages 3-31, 3-32) says that when the entry
point runs, most registers' values are unspecified, except for:
#endif
.text
- .globl _start
-_start:
+ .globl ENTRY_POINT
+ENTRY_POINT:
#ifdef PIC
SET_GP
#endif
the prologue of __libc_init_first, we preload them to
prevent clobbering the stack tops. In Hurd case, stack pointer
($29) may be VM_MAX_ADDRESS here. If so, we must modify it. */
-#if (__mips64)
- dli $4, 0x10000000000
- bne $29, $4, 1f
- dsubu $29, 32
- sd $0, 0($29)
- sd $0, 8($29)
- sd $0, 16($29)
- sd $0, 24($29)
-1:
- ld $4, 0($29)
- ld $5, 8($29)
- ld $6, 16($29)
- ld $7, 24($29)
-#else /* __mips64 */
+#if 0
+ jal mach_host_self
+#endif
li $4, 0x80000000
bne $29, $4, 1f
subu $29, 16
lw $5, 4($29)
lw $6, 8($29)
lw $7, 12($29)
-#endif /* __mips64 */
-
jal __libc_init_first
#ifdef PIC
SET_GP
#endif
-#if (__mips64)
- ld $4, 0($29)
- ld $5, 8($29)
- ld $6, 16($29)
- ld $7, 24($29)
-#else /* __mips64 */
lw $4, 0($29)
lw $5, 4($29)
lw $6, 8($29)
lw $7, 12($29)
-#endif /* __mips64 */
/* Call `_init', which is the entry point to our own `.init'
section; and register with `atexit' to have `exit' call
/* Extract the arguments and environment as encoded on the stack
and set up the arguments for `main': argc, argv, envp. */
-#if (__mips64)
- ld $4, 0($29) /* argc */
- daddu $5, $29, 8 /* argv */
- dsll $6, $4, 3
- daddu $6, $6, 8
- daddu $6, $5, $6 /* envp = &argv[argc + 1] */
-#else /* __mips64 */
lw $4, 0($29) /* argc */
addu $5, $29, 4 /* argv */
sll $6, $4, 2
addu $6, $6, 4
addu $6, $5, $6 /* envp = &argv[argc + 1] */
-#endif /* __mips64 */
/* Call the user's main function, and exit with its value. */
jal main
.data
.globl __data_start
__data_start:
-#if (__mips64)
- .dword 0
-#else /* __mips64 */
- .word 0
-#endif /* __mips64 */
+ .long 0
.weak data_start
data_start = __data_start
+
+ .comm errno, 4, 4
+#ifdef __ELF__
+ .type errno, @object
+#endif
#endif
ENTRY (__sigsetjmp)
#ifdef PIC
- .cpload t9
+ .set noreorder
+ .cpload t9
+ .set reorder
#endif
- move a2, sp
- move a3, fp
- la t9, __sigsetjmp_aux
- nop
- jr t9
+ move a2, sp
+#ifdef fp
+ move a3, fp
+#else
+ move a3, $fp
+#endif
+#ifdef PIC
+ la t9, __sigsetjmp_aux
+ jr t9
+#else
+ j __sigsetjmp_aux
+#endif
+ .end __sigsetjmp
#endif
#ifndef HAVE_GNU_LD
-#define __end end
+#define _end end
#endif
-.data
-.sdata
+ .data
ENTRY(__curbrk)
- .word __end
+ .word 0
.end __curbrk
-.text
-.set noreorder
-.set noat
-ENTRY(__brk)
- /* Minimum is one page. */
- lui v0, 4096
- lw v0, __end
- nop
-
- /* If they ask for less than a page, givvem the whole
- thing anyway. */
- sltu AT, a0, v0
- beq AT, zero, down1
- nop
- move a0, v0
-down1:
- li v0, SYS_brk
- syscall
- bne a3, zero, error
-
- /* Update __curbrk and exit cleanly. */
- lui AT, 4096
+ .text
+SYSCALL__(brk, 1)
+ .set reorder
+ /* Handle the query case. */
+ bnez a0, 1f
+ move a0,v0
+1: /* Update __curbrk and exit cleanly. */
sw a0, __curbrk
- j ra
move v0, zero
-
- /* What a horrible way to die. */
-error: j syscall_error
- nop
- nop
- nop
+ jr ra
.end __brk
weak_alias (__brk, brk)
#define _ERRNO_H
#include <bits/errno.h>
-/* .globl errno */
-.set noreorder
+ .comm errno, 4
+#ifdef __ELF__
+ .type errno, @object
+#endif
+
+ .set noreorder
-ENTRY(syscall_error)
+ENTRY(__syscall_error)
+#ifdef __PIC__
+ .set noat
+ move $1, $31
+ bltzal $0, 0f
+ nop
+0: .cpload $31
+ move $31, $1
+ .set at
+#endif
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
/* We translate the system's EWOULDBLOCK error into EAGAIN.
The GNU C library always defines EWOULDBLOCK==EAGAIN.
/* And just kick back a -1. */
j ra
li v0, -1
- .end syscall_error
+ END(__syscall_error)
+
+/* We provide this alias for compatilility with other Unices
+ like IRIX 5 */
+weak_alias (__syscall_error, syscall_error)
/* Note that while it's better structurally, going back to call syscall_error
can make things confusing if you're debugging---it looks like it's jumping
backwards into the previous fn. */
+#ifdef __PIC__
+ #define PSEUDO(name, syscall_name, args) \
+ .align 2; \
+ 99: la t9,syscall_error; \
+ jr t9; \
+ ENTRY(name) \
+ .set noreorder; \
+ .cpload t9; \
+ li v0, SYS_##syscall_name; \
+ syscall; \
+ .set reorder; \
+ bne a3, zero, 99b; \
+syse1:
+#else
#define PSEUDO(name, syscall_name, args) \
.set noreorder; \
.align 2; \
99: j syscall_error; \
- nop; \
ENTRY(name) \
+ .set noreorder; \
li v0, SYS_##syscall_name; \
syscall; \
+ .set reorder; \
bne a3, zero, 99b; \
- nop; \
syse1:
+#endif
+
+#undef PSEUDO_END
+#define PSEUDO_END(sym) .end sym
#define ret j ra ; nop
+
+#undef END
+#define END(sym) .end sym
+
#define r0 v0
#define r1 v1
/* The mips move insn is d,s. */
li v0, SYS_wait
syscall
- beq a3, zero, noerror
+ beqz a3, noerror
nop
- j syscall_error
+ j __syscall_error
nop
noerror:
/* If the arg is not NULL, store v1 there. */
- beq a0, zero, noarg
+ beqz a0, noarg
nop
sw v1, 0(a0)
nop