Module Name:    src
Committed By:   matt
Date:           Mon Dec 14 01:04:02 UTC 2009

Modified Files:
        src/lib/csu/common_elf: common.h
        src/lib/csu/mips: crt0.c dot_init.h

Log Message:
Merge from matt-nb5-mips64


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/lib/csu/common_elf/common.h
cvs rdiff -u -r1.19 -r1.20 src/lib/csu/mips/crt0.c
cvs rdiff -u -r1.9 -r1.10 src/lib/csu/mips/dot_init.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/csu/common_elf/common.h
diff -u src/lib/csu/common_elf/common.h:1.12 src/lib/csu/common_elf/common.h:1.13
--- src/lib/csu/common_elf/common.h:1.12	Thu May 18 17:54:19 2006
+++ src/lib/csu/common_elf/common.h	Mon Dec 14 01:04:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: common.h,v 1.12 2006/05/18 17:54:19 christos Exp $ */
+/* $NetBSD: common.h,v 1.13 2009/12/14 01:04:02 matt Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -53,7 +53,7 @@
 typedef void Obj_Entry;
 #endif
 
-extern int	__syscall(quad_t, ...);
+extern quad_t	__syscall(quad_t, ...);
 #define	_exit(v)	__syscall(SYS_exit, (v))
 #define	write(fd, s, n)	__syscall(SYS_write, (fd), (s), (n))
 

Index: src/lib/csu/mips/crt0.c
diff -u src/lib/csu/mips/crt0.c:1.19 src/lib/csu/mips/crt0.c:1.20
--- src/lib/csu/mips/crt0.c:1.19	Sat Dec 24 22:02:10 2005
+++ src/lib/csu/mips/crt0.c	Mon Dec 14 01:04:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.19 2005/12/24 22:02:10 perry Exp $ */
+/* $NetBSD: crt0.c,v 1.20 2009/12/14 01:04:02 matt Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -86,10 +86,15 @@
 	 */
 
 #ifndef DYNAMIC
+#ifdef _LP64
+	__asm volatile("dla $28,_gp");
+#else
 	__asm volatile("la $28,_gp");
 #endif
+#endif
 
 	ksp = (char**)sp;
+#if defined(__mips_n32) || defined(__mips_n64)
 	if (ksp == 0) {
 		/*
 		 * Uh, oh. We're running on a old kernel that passed
@@ -110,6 +115,7 @@
 		__asm volatile("	addiu	%0,$29,64" : "=r" (ksp));
 #endif
 	}
+#endif
 
 
 	argc = *(int *)ksp;
@@ -157,7 +163,7 @@
  *  is the entrypoint. (Only needed for old toolchains).
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.19 2005/12/24 22:02:10 perry Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.20 2009/12/14 01:04:02 matt Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/mips/dot_init.h
diff -u src/lib/csu/mips/dot_init.h:1.9 src/lib/csu/mips/dot_init.h:1.10
--- src/lib/csu/mips/dot_init.h:1.9	Sat May 10 15:31:04 2008
+++ src/lib/csu/mips/dot_init.h	Mon Dec 14 01:04:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: dot_init.h,v 1.9 2008/05/10 15:31:04 martin Exp $ */
+/* $NetBSD: dot_init.h,v 1.10 2009/12/14 01:04:02 matt Exp $ */
 
 /*-
  * Copyright (c) 2001 Ross Harvey
@@ -36,48 +36,98 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-#define	ra	"$31"
+#define	t9	"$25"
 
 /*
- * Allocate 32 bytes for the stack frame.  Store GP at SP+16 (since
- * this is where code generated by the compiler for fallthru processing
- * expects it to be), and the RA at SP+28.
+ * For O32/O64, allocate 8 "slots" for the stack frame.  Store GP in the 4th
+ * (zero-based) slot (since this is where compiler generated code for fallthru
+ * processing expects it to be), and the RA in seventh (highest address).
  *
- * This will need adjustment for 64-bit ABIs.
+ * For N32/N64, allocate 4 8-byte "slots" for the stack frame.  Store GP in the
+ * 2nd (zero-based) slot (since ...) and the RA in third (highest address).
  */
+
+#ifdef __mips_o32
+#define	sPTR_ADDU		"addu"
+#define	sREG_L			"lw"
+#define	sREG_S			"sw"
+#define sRAOFF			"28"
+#define sFRAMESZ		"32"
+#define	MD_GPRESTORE		/* nothing */
+#else
+#define	sPTR_ADDU		"daddu"
+#define	sREG_L			"ld"
+#define	sREG_S			"sd"
+#if defined(__mips_n32) || defined(__mips_n64)
+#define	MD_GPRESTORE		"ld	$gp,8($sp)"		"\n\t"
+#define sRAOFF			"24"
+#define sFRAMESZ		"32"
+#elif defined(__mips_o64)
+#define sRAOFF			"56"
+#define sFRAMESZ		"64"
+#define	MD_GPRESTORE		/* nothing */
+#endif
+#endif
+
 #ifdef __ABICALLS__
-#define	MD_FUNCTION_PROLOGUE				\
-		".set	noreorder			\n"\
-		".cpload $25				\n"\
-		".set	reorder				\n"\
-		"	subu	$sp,$sp,32		\n"\
-		".cprestore 16				\n"\
-		"	sw	"ra",28($sp)		\n"
+#if defined(__mips_o32) || defined(__mips_o64)
+#define	MD_FUNCTION_PROLOGUE(entry_pt)					\
+		".set	noreorder"				"\n\t"	\
+		".cpload "t9					"\n\t"	\
+		".set	reorder"				"\n\t"	\
+		sPTR_ADDU"	$sp,$sp,-"sFRAMESZ		"\n\t"	\
+		".cprestore 16"					"\n\t"	\
+		sREG_S"	$ra,"sRAOFF"($sp)"			"\n\t"
+
+#elif defined(__mips_n32) || defined(__mips_n64)
+#define	MD_FUNCTION_PROLOGUE(entry_pt)					\
+		".set	noreorder"				"\n\t"	\
+		"daddu	$sp,$sp,-32"				"\n\t"	\
+		".cpsetup "t9", 8, "#entry_pt			"\n\t"	\
+		"sd	$ra,24($sp)"				"\n\t"	\
+		".set	reorder"				"\n\t"
+#else
+#error ABI not supported (__ABICALLS)
+#endif
+#else
+#if defined(__mips_o32) || defined(__mips_o64)
+#define	MD_FUNCTION_PROLOGUE(entry_pt)					\
+		sPTR_ADDU"	$sp,$sp,-"sFRAMESZ		"\n\t"	\
+		sREG_S"	$ra,"sRAOFF"($sp)"			"\n\t"
+
+#elif defined(__mips_n32) || defined(__mips_n64)
+/*
+ * On N32/N64, GP is callee-saved.
+ */
+#define	MD_FUNCTION_PROLOGUE(entry_pt)					\
+		"daddu	$sp,$sp,-32"				"\n\t"	\
+		"sd	$gp,8($sp)"				"\n\t"	\
+		"sd	$ra,24($sp)"				"\n\t"
 #else
-#define	MD_FUNCTION_PROLOGUE				\
-		"	subu	$sp,$sp,32		\n"\
-		"	sw	"ra",28($sp)		\n"
+#error ABI not supported (!__ABICALLS)
 #endif
+#endif /* __ABICALLS */
 
 
-#define	MD_SECTION_PROLOGUE(sect, entry_pt)		\
-		__asm (					\
-		".section "#sect",\"ax\",@progbits	\n"\
-		".align 2				\n"\
-		".globl "#entry_pt"			\n"\
-		#entry_pt":				\n"\
-		MD_FUNCTION_PROLOGUE			   \
-		"	/* fall thru */			\n"\
+#define	MD_SECTION_PROLOGUE(sect, entry_pt)				\
+		__asm (							\
+		".section "#sect",\"ax\",@progbits"		"\n\t"	\
+		".align 2"					"\n\t"	\
+		".globl "#entry_pt				"\n\t"	\
+		#entry_pt":"					"\n\t"	\
+		MD_FUNCTION_PROLOGUE(entry_pt)				\
+		"	/* fall thru */"			"\n\t"	\
 		".previous")
 
-#define	MD_SECTION_EPILOGUE(sect)			\
-		__asm (					\
-		".section "#sect",\"ax\",@progbits	\n"\
-		"	lw	"ra",28($sp)		\n"\
-		"	.set	noreorder		\n"\
-		"	j	"ra"			\n"\
-		"	addu	$sp,$sp,32		\n"\
-		"	.set	reorder			\n"\
+#define	MD_SECTION_EPILOGUE(sect)					\
+		__asm (							\
+		".section "#sect",\"ax\",@progbits"		"\n\t"	\
+		sREG_L"	$ra,"sRAOFF"($sp)"			"\n\t"	\
+		MD_GPRESTORE						\
+		".set	noreorder"				"\n\t"	\
+		"j	$ra"					"\n\t"	\
+		sPTR_ADDU"	$sp,$sp,"sFRAMESZ		"\n\t"	\
+		".set	reorder"				"\n\t"	\
 		".previous")
 
 #define	MD_INIT_SECTION_PROLOGUE MD_SECTION_PROLOGUE(.init, _init)

Reply via email to