diff options
| -rw-r--r-- | libc/sysdeps/linux/mips/clone.S | 32 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/crt1.S | 26 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/crti.S | 108 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/crtn.S | 100 | 
4 files changed, 255 insertions, 11 deletions
| diff --git a/libc/sysdeps/linux/mips/clone.S b/libc/sysdeps/linux/mips/clone.S index 7e3838a35..716cd993f 100644 --- a/libc/sysdeps/linux/mips/clone.S +++ b/libc/sysdeps/linux/mips/clone.S @@ -38,11 +38,16 @@  clone:  	.frame	    sp, 4*SZREG, sp  #ifdef __PIC__ +#if _MIPS_SIM == _MIPS_SIM_ABI32  	.set		noreorder  	.cpload		$25  	.set		reorder  	subu		sp,32  	.cprestore	16 +#else	/* N32 */ +	PTR_SUBU	sp,32	/* fn, arg, gp, pad */ +	.cpsetup	$25, 16, clone +#endif	/* N32 */  #else  	subu		sp,32  #endif @@ -53,9 +58,12 @@ clone:  	beqz		a0,error	/* No NULL function pointers.  */  	beqz		a1,error	/* No NULL stack pointers.  */ -	subu		a1,32		/* Reserve argument save space.  */ -	sw		a0,0(a1)	/* Save function pointer.  */ -	sw		a3,4(a1)	/* Save argument pointer.  */ +#if _MIPS_SIM != _MIPS_SIM_ABI32 +	and		a1,~(16-1)	/* force alignment */ +#endif +	PTR_SUBU	a1,32		/* Reserve argument save space.  */ +	PTR_S		a0,0(a1)	/* Save function pointer.  */ +	PTR_S		a3,PTRSIZE(a1)	/* Save argument pointer.  */  	/* Do the system call */ @@ -67,19 +75,25 @@ clone:  	beqz		v0,__thread_start  	/* Successful return from the parent */ -	addiu		sp,32 +#if _MIPS_SIM != _MIPS_SIM_ABI32 +	.cpreturn +#endif +	PTR_ADDU	sp,32  	j $31  ; nop  	/* Something bad happened -- no child created */  error: -	addiu		sp,32 +#if _MIPS_SIM != _MIPS_SIM_ABI32 +	.cpreturn +#endif +	PTR_ADDU	sp,32  	/* uClibc change -- start */  	move		a0,v0		/* Pass return val to C function. */  	/* uClibc change -- stop */  #ifdef __PIC__ -	la		t9,__syscall_error +	PTR_LA		t9,__syscall_error  	jr		t9  #else  	j		__syscall_error @@ -95,12 +109,14 @@ error:  	.ent  __thread_start, 0;  __thread_start: +#if _MIPS_SIM == _MIPS_SIM_ABI32  	/* cp is already loaded.  */  	.cprestore	16 +#endif  	/* The stackframe has been created on entry of clone().  */  	/* Restore the arg for user's function.  */ -	lw		t9,0(sp)	/* Function pointer.  */ -	lw		a0,4(sp)	/* Argument pointer.  */ +	PTR_L		t9,0(sp)	/* Function pointer.  */ +	PTR_L		a0,PTRSIZE(sp)	/* Argument pointer.  */  	/* Call the user's function.  */  	jal		t9 diff --git a/libc/sysdeps/linux/mips/crt1.S b/libc/sysdeps/linux/mips/crt1.S index 35dc8c42e..2e38cf07c 100644 --- a/libc/sysdeps/linux/mips/crt1.S +++ b/libc/sysdeps/linux/mips/crt1.S @@ -37,6 +37,7 @@  #include <sys/regdef.h> +#include <sys/asm.h>  #include <features.h> @@ -83,6 +84,7 @@  __start:  #ifdef __PIC__ +#if _MIPS_SIM == _MIPS_SIM_ABI32          .set noreorder  	move $0, $31		/* Save old ra.  */  	bal 10f			/* Find addr of cpload.  */ @@ -92,18 +94,29 @@ __start:  	move $31, $0  	.set reorder  #else +	move $0, $31; /* Save old ra.  */ +	.set noreorder +	bal 10f /* Find addr of .cpsetup.  */ +	nop +10: +	.set reorder +	.cpsetup $31, $25, 10b +	move $31, $0 +#endif +#else  	la $28, _gp             /* Setup GP correctly if we're non-PIC.  */  	move $31, $0  #endif -	la $4, main		/* main */ -	lw $5, 0($29)		/* argc */ -	addiu $6, $29, 4	/* argv  */ +	PTR_LA $4, main		/* main */ +	PTR_L $5, 0($29)		/* argc */ +	PTR_ADDIU $6, $29, PTRSIZE	/* argv  */  	/* Allocate space on the stack for seven arguments and  	 * make sure the stack is aligned to double words (8 bytes) */ +#if _MIPS_SIM == _MIPS_SIM_ABI32  	and $29, -2 * 4  	subu $29, 32  	la $7, _init		/* init */ @@ -111,6 +124,13 @@ __start:  	sw $8, 16($29)		/* fini */  	sw $2, 20($29)		/* rtld_fini */  	sw $29, 24($29)		/* stack_end */ +#else +	and $29, -2 * PTRSIZE +	PTR_LA $7, _init		/* init */ +	PTR_LA $8, _fini		/* fini */ +	move $9, $2		/* rtld_fini */ +	move $10, $29		/* stack_end */ +#endif  	jal __uClibc_main  hlt:  	/* Crash if somehow `__uClibc_main' returns anyway.  */ diff --git a/libc/sysdeps/linux/mips/crti.S b/libc/sysdeps/linux/mips/crti.S index b0d523b2f..9311a735f 100644 --- a/libc/sysdeps/linux/mips/crti.S +++ b/libc/sysdeps/linux/mips/crti.S @@ -1,3 +1,5 @@ +#include "sgidefs.h" +#if _MIPS_SIM == _MIPS_SIM_ABI32  	.file	1 "initfini.c"  	.section .mdebug.abi32  	.previous @@ -48,3 +50,109 @@ _fini:  	.end _fini  	.ident	"GCC: (GNU) 3.3.2" +#elif _MIPS_SIM == _MIPS_SIM_NABI32 +	.file	1 "initfini.c" +	.section .mdebug.abiN32 +	.previous +	.abicalls +#APP +	 +	.section .init +#NO_APP +	.align	2 +	.align	3 +	.globl	_init +	.ent	_init +	.type	_init, @function +_init: +	.frame	$sp,16,$31		# vars= 0, regs= 2/0, args= 0, gp= 0 +	.mask	0x90000000,-8 +	.fmask	0x00000000,0 +	addiu	$sp,$sp,-16 +	sd	$28,0($sp) +	lui	$28,%hi(%neg(%gp_rel(_init))) +	addu	$28,$28,$25 +	addiu	$28,$28,%lo(%neg(%gp_rel(_init))) +	sd	$31,8($sp) +#APP +	 +	.align 3 +	.end _init + +	.section .fini +#NO_APP +	.align	2 +	.align	3 +	.globl	_fini +	.ent	_fini +	.type	_fini, @function +_fini: +	.frame	$sp,16,$31		# vars= 0, regs= 2/0, args= 0, gp= 0 +	.mask	0x90000000,-8 +	.fmask	0x00000000,0 +	addiu	$sp,$sp,-16 +	sd	$28,0($sp) +	lui	$28,%hi(%neg(%gp_rel(_fini))) +	addu	$28,$28,$25 +	addiu	$28,$28,%lo(%neg(%gp_rel(_fini))) +	sd	$31,8($sp) +#APP +	.align 3 +	.end _fini +	 +	.ident	"GCC: (GNU) 3.4.3" +#else	/* N64 */ +	.file	1 "initfini.c" +	.section .mdebug.abi64 +	.previous +	.abicalls +#APP +	 +	 +	.section .init +#NO_APP +	.align	2 +	.globl	_init +	.ent	_init +	.type	_init, @function +_init: +	.frame	$sp,32,$31		# vars= 0, regs= 2/0, args= 0, extra= 16 +	.mask	0x90000000,-8 +	.fmask	0x00000000,0 +	dsubu	$sp,$sp,32 +	sd	$31,24($sp) +	sd	$28,16($sp) +	.set	noat +	lui	$1,%hi(%neg(%gp_rel(_init))) +	addiu	$1,$1,%lo(%neg(%gp_rel(_init))) +	daddu	$gp,$1,$25 +	.set	at +#APP +	 +	.align 2 +	.end _init +	 +	.section .fini +#NO_APP +	.align	2 +	.globl	_fini +	.ent	_fini +	.type	_fini, @function +_fini: +	.frame	$sp,32,$31		# vars= 0, regs= 2/0, args= 0, extra= 16 +	.mask	0x90000000,-8 +	.fmask	0x00000000,0 +	dsubu	$sp,$sp,32 +	sd	$31,24($sp) +	sd	$28,16($sp) +	.set	noat +	lui	$1,%hi(%neg(%gp_rel(_fini))) +	addiu	$1,$1,%lo(%neg(%gp_rel(_fini))) +	daddu	$gp,$1,$25 +	.set	at +#APP +	.align 2 +	.end _fini +	 +	.ident	"GCC: (GNU) 3.3.2" +#endif	/* N64 */ diff --git a/libc/sysdeps/linux/mips/crtn.S b/libc/sysdeps/linux/mips/crtn.S index 7a5e4db6e..cedd593f0 100644 --- a/libc/sysdeps/linux/mips/crtn.S +++ b/libc/sysdeps/linux/mips/crtn.S @@ -1,3 +1,5 @@ +#include "sgidefs.h" +#if _MIPS_SIM == _MIPS_SIM_ABI32  	.file	1 "initfini.c"  	.section .mdebug.abi32  	.previous @@ -43,3 +45,101 @@  #APP  	.ident	"GCC: (GNU) 3.3.2" +#elif _MIPS_SIM == _MIPS_SIM_NABI32 +	.file	1 "initfini.c" +	.section .mdebug.abiN32 +	.previous +	.abicalls +#APP +	 +	.section .init +#NO_APP +	.align	2 +	.align	3 +	.globl	_init +	.ent	_init +	.type	_init, @function +#NO_APP +	ld	$31,8($sp) +	ld	$28,0($sp) +	.set	noreorder +	.set	nomacro +	j	$31 +	addiu	$sp,$sp,16 +	.set	macro +	.set	reorder + +	.end	_init +#APP +	 +	.section .fini +#NO_APP +	.align	2 +	.align	3 +	.globl	_fini +	.ent	_fini +	.type	_fini, @function +#NO_APP +	ld	$31,8($sp) +	ld	$28,0($sp) +	.set	noreorder +	.set	nomacro +	j	$31 +	addiu	$sp,$sp,16 +	.set	macro +	.set	reorder + +	.end	_fini +#APP +	 +	.ident	"GCC: (GNU) 3.4.3" +#else /* N64 */ +	.file	1 "initfini.c" +	.section .mdebug.abi64 +	.previous +	.abicalls +#APP +	 +	 +	.section .init +#NO_APP +	.align	2 +	.globl	_init +	.ent	_init +	.type	_init, @function +#NO_APP +	ld	$31,24($sp) +	ld	$28,16($sp) +	#nop +	.set	noreorder +	.set	nomacro +	j	$31 +	daddu	$sp,$sp,32 +	.set	macro +	.set	reorder + +	.end	_init +#APP +	 +	.section .fini +#NO_APP +	.align	2 +	.globl	_fini +	.ent	_fini +	.type	_fini, @function +#NO_APP +	ld	$31,24($sp) +	ld	$28,16($sp) +	#nop +	.set	noreorder +	.set	nomacro +	j	$31 +	daddu	$sp,$sp,32 +	.set	macro +	.set	reorder + +	.end	_fini +#APP +	 +	.ident	"GCC: (GNU) 3.3.2" +#endif	/* N64 */ | 
