diff --git a/sys/arch/sparc/include/asm.h b/sys/arch/sparc/include/asm.h index a219efbd27f6..b622bd8cf12c 100644 --- a/sys/arch/sparc/include/asm.h +++ b/sys/arch/sparc/include/asm.h @@ -1,4 +1,4 @@ -/* $NetBSD: asm.h,v 1.13 2002/06/24 01:13:34 thorpej Exp $ */ +/* $NetBSD: asm.h,v 1.14 2002/07/20 08:37:30 mrg Exp $ */ /* * Copyright (c) 1994 Allen Briggs @@ -44,6 +44,12 @@ #ifndef _ASM_H_ #define _ASM_H_ +/* Pull in CCFSZ, CC64FSZ, and BIAS from frame.h */ +#ifndef _LOCORE +#define _LOCORE +#endif +#include + #ifdef __ELF__ #define _C_LABEL(name) name #else @@ -59,23 +65,45 @@ /* * PIC_PROLOGUE() is akin to the compiler generated function prologue for * PIC code. It leaves the address of the Global Offset Table in DEST, - * clobbering register TMP in the process. Using the temporary enables us - * to work without a stack frame (doing so requires saving %o7) . + * clobbering register TMP in the process. + * + * We can use two code sequences. We can read the %pc or use the call + * instruction that saves the pc in %o7. Call requires the branch unit and + * IEU1, and clobbers %o7 which needs to be restored. This instruction + * sequence takes about 4 cycles due to instruction interdependence. Reading + * the pc takes 4 cycles to dispatch and is always dispatched alone. That + * sequence takes 7 cycles. */ +#ifdef __arch64__ +#define PIC_PROLOGUE(dest,tmp) \ + mov %o7, tmp; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-4),dest; \ + call 0f; \ + or dest,%lo(_GLOBAL_OFFSET_TABLE_+4),dest; \ +0: \ + add dest,%o7,dest; \ + mov tmp, %o7 +#else #define PIC_PROLOGUE(dest,tmp) \ mov %o7,tmp; 3: call 4f; nop; 4: \ sethi %hi(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \ or dest,%lo(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \ add dest,%o7,dest; mov tmp,%o7 +#endif /* * PICCY_SET() does the equivalent of a `set var, %dest' instruction in * a PIC-like way, but without involving the Global Offset Table. This * only works for VARs defined in the same file *and* in the text segment. */ +#ifdef __arch64__ +#define PICCY_SET(var,dest,tmp) \ + 3: rd %pc, tmp; add tmp,(var-3b),dest +#else #define PICCY_SET(var,dest,tmp) \ mov %o7,tmp; 3: call 4f; nop; 4: \ add %o7,(var-3b),dest; mov tmp,%o7 +#endif #else #define PIC_PROLOGUE(dest,tmp) #define PICCY_OFFSET(var,dest,tmp) @@ -90,16 +118,30 @@ #ifdef GPROF /* see _MCOUNT_ENTRY in profile.h */ #ifdef __ELF__ +#ifdef __arch64__ +#define _PROF_PROLOGUE \ + .data; .align 8; 1: .uaword 0; .uaword 0; \ + .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call _mcount; \ + or %o0,%lo(1b),%o0; restore +#else #define _PROF_PROLOGUE \ .data; .align 4; 1: .long 0; \ .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call _mcount; \ or %o0,%lo(1b),%o0; restore +#endif +#else +#ifdef __arch64__ +#define _PROF_PROLOGUE \ + .data; .align 8; 1: .uaword 0; .uaword 0; \ + .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call mcount; \ + or %o0,%lo(1b),%o0; restore #else #define _PROF_PROLOGUE \ .data; .align 4; 1: .long 0; \ .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call mcount; \ or %o0,%lo(1b),%o0; restore #endif +#endif #else #define _PROF_PROLOGUE #endif @@ -122,6 +164,18 @@ alias = sym #endif +/* + * WARN_REFERENCES: create a warning if the specified symbol is referenced. + */ +#ifdef __ELF__ +#ifdef __STDC__ +#define WARN_REFERENCES(_sym,_msg) \ + .section .gnu.warning. ## _sym ; .ascii _msg ; .text +#else +#define WARN_REFERENCES(_sym,_msg) \ + .section .gnu.warning./**/_sym ; .ascii _msg ; .text +#endif /* __STDC__ */ +#else #ifdef __STDC__ #define __STRING(x) #x #define WARN_REFERENCES(sym,msg) \ @@ -133,5 +187,6 @@ .stabs msg,30,0,0,0 ; \ .stabs __STRING(_/**/sym),1,0,0,0 #endif /* __STDC__ */ +#endif /* __ELF__ */ #endif /* _ASM_H_ */ diff --git a/sys/arch/sparc/include/eeprom.h b/sys/arch/sparc/include/eeprom.h index 45db4b2709f2..863878b98c11 100644 --- a/sys/arch/sparc/include/eeprom.h +++ b/sys/arch/sparc/include/eeprom.h @@ -1,4 +1,4 @@ -/* $NetBSD: eeprom.h,v 1.3 2002/03/03 03:11:06 jmc Exp $ */ +/* $NetBSD: eeprom.h,v 1.4 2002/07/20 08:37:30 mrg Exp $ */ /* * Copyright (c) 1994 Gordon W. Ross @@ -50,7 +50,7 @@ struct eeprom { u_char eeTestArea[4]; /* Factory Defined */ u_short eeWriteCount[4]; /* || || */ u_char eeChecksum[4]; /* || || */ - time_t eeLastHwUpdate; /* || || */ + u_int32_t eeLastHwUpdate; /* || || */ /* 0x14 */ u_char eeInstalledMem; /* Megabytes */ diff --git a/sys/arch/sparc/include/loadfile_machdep.h b/sys/arch/sparc/include/loadfile_machdep.h index 46266643a970..0d9f442eb382 100644 --- a/sys/arch/sparc/include/loadfile_machdep.h +++ b/sys/arch/sparc/include/loadfile_machdep.h @@ -1,4 +1,4 @@ -/* $NetBSD: loadfile_machdep.h,v 1.5 2001/12/04 18:54:34 thorpej Exp $ */ +/* $NetBSD: loadfile_machdep.h,v 1.6 2002/07/20 08:37:30 mrg Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -40,7 +40,7 @@ #define COUNT_KERNEL COUNT_ALL #ifdef _STANDALONE -#define LOADADDR(a) (((u_long)(a) & 0x0fffffff) + offset) +#define LOADADDR(a) (((u_long)(a) & 0x0fffffff) + (u_long)offset) #define ALIGNENTRY(a) ((u_long)(a)) #define READ(f, b, c) read((f), (void *)LOADADDR(b), (c)) #define BCOPY(s, d, c) memcpy((void *)LOADADDR(d), (void *)(s), (c)) @@ -53,7 +53,7 @@ #define FREE(a, b) free(a, b) #define OKMAGIC(a) ((a) == OMAGIC) #else -#define LOADADDR(a) (((u_long)(a)) + offset) +#define LOADADDR(a) (((u_long)(a)) + (u_long)offset) #define ALIGNENTRY(a) ((u_long)(a)) #define READ(f, b, c) read((f), (void *)LOADADDR(b), (c)) #define BCOPY(s, d, c) memcpy((void *)LOADADDR(d), (void *)(s), (c)) diff --git a/sys/arch/sparc/include/openpromio.h b/sys/arch/sparc/include/openpromio.h index 748f0fa3cd20..809ae6059c37 100644 --- a/sys/arch/sparc/include/openpromio.h +++ b/sys/arch/sparc/include/openpromio.h @@ -1,4 +1,4 @@ -/* $NetBSD: openpromio.h,v 1.2 1994/11/20 20:53:17 deraadt Exp $ */ +/* $NetBSD: openpromio.h,v 1.3 2002/07/20 08:37:30 mrg Exp $ */ /* * Copyright (c) 1992, 1993 @@ -58,3 +58,4 @@ struct opiocdesc { #define OPIOCGETOPTNODE _IOR('O', 4, int) /* get openprom field */ #define OPIOCGETNEXT _IOWR('O', 5, int) /* get next node of node */ #define OPIOCGETCHILD _IOWR('O', 6, int) /* get first child of node */ +#define OPIOCFINDDEVICE _IOWR('O', 7, struct opiocdesc) /* find a specific device */ diff --git a/sys/arch/sparc/include/profile.h b/sys/arch/sparc/include/profile.h index c4544fdf5bbc..3c5f1de13a04 100644 --- a/sys/arch/sparc/include/profile.h +++ b/sys/arch/sparc/include/profile.h @@ -1,4 +1,4 @@ -/* $NetBSD: profile.h,v 1.11 2001/11/03 20:24:42 thorpej Exp $ */ +/* $NetBSD: profile.h,v 1.12 2002/07/20 08:37:30 mrg Exp $ */ /* * Copyright (c) 1992, 1993 @@ -54,6 +54,17 @@ #ifdef PIC /* Inline expansion of PICCY_SET() (see ). */ +#ifdef __arch64__ +#define MCOUNT \ + __asm__(".global " _MCOUNT_ENTRY);\ + __asm__(_MCOUNT_ENTRY ":");\ + __asm__("add %o7, 8, %o1");\ + __asm__("1: rd %pc, %o2");\ + __asm__("add %o2," _MCOUNT_SYM "-1b, %o2");\ + __asm__("ld [%o2], %o2");\ + __asm__("jmpl %o2, %g0");\ + __asm__("add %i7, 8, %o0"); +#else #define MCOUNT \ __asm__(".global " _MCOUNT_ENTRY);\ __asm__(_MCOUNT_ENTRY ":");\ @@ -63,6 +74,7 @@ __asm__("ld [%o2], %o2");\ __asm__("jmpl %o2, %g0");\ __asm__("add %i7, 8, %o0"); +#endif #else #define MCOUNT \ __asm__(".global " _MCOUNT_ENTRY);\ diff --git a/sys/arch/sparc/include/setjmp.h b/sys/arch/sparc/include/setjmp.h index 1fd7fcd6dd2e..96f1bbc20f27 100644 --- a/sys/arch/sparc/include/setjmp.h +++ b/sys/arch/sparc/include/setjmp.h @@ -1,7 +1,8 @@ -/* $NetBSD: setjmp.h,v 1.2 1998/10/01 03:28:11 thorpej Exp $ */ +/* $NetBSD: setjmp.h,v 1.3 2002/07/20 08:37:30 mrg Exp $ */ /* * machine/setjmp.h: machine dependent setjmp-related information. */ #define _JBLEN 14 /* size, in longs, of a jmp_buf */ + /* A sigcontext is 10 longs */ diff --git a/sys/arch/sparc/include/stdarg.h b/sys/arch/sparc/include/stdarg.h index 15d5068b457b..c1270a65541f 100644 --- a/sys/arch/sparc/include/stdarg.h +++ b/sys/arch/sparc/include/stdarg.h @@ -1,4 +1,4 @@ -/* $NetBSD: stdarg.h,v 1.17 2000/10/13 03:53:26 christos Exp $ */ +/* $NetBSD: stdarg.h,v 1.18 2002/07/20 08:37:30 mrg Exp $ */ /* * Copyright (c) 1992, 1993 @@ -56,14 +56,52 @@ typedef _BSD_VA_LIST_ va_list; #define __builtin_saveregs() (0) #define __builtin_classify_type(t) (0) #define __builtin_next_arg(t) ((t) ? 0 : 0) +#define __alignof__(t) (0) #endif -#define __va_size(type) \ - (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long)) - #define va_start(ap, last) \ (void)(__builtin_next_arg(last), (ap) = (va_list)__builtin_saveregs()) +#if !defined(_ANSI_SOURCE) && \ + (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) || \ + defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L) +# define va_copy(dest, src) \ + ((dest) = (src)) +#endif + +#define va_end(ap) + +#ifdef __arch64__ +/* + * For sparcv9 code. + */ +#define __va_arg8(ap, type) \ + (*(type *)(void *)((ap) += 8, (ap) - 8)) +#define __va_arg16(ap, type) \ + (*(type *)(void *)((ap) = (va_list)(((unsigned long)(ap) + 31) & -16),\ + (ap) - 16)) +#define __va_int(ap, type) \ + (*(type *)(void *)((ap) += 8, (ap) - sizeof(type))) + +#define __REAL_TYPE_CLASS 8 +#define __RECORD_TYPE_CLASS 12 +#define va_arg(ap, type) \ + (__builtin_classify_type(*(type *)0) == __REAL_TYPE_CLASS ? \ + (__alignof__(type) == 16 ? __va_arg16(ap, type) : \ + __va_arg8(ap, type)) : \ + (__builtin_classify_type(*(type *)0) < __RECORD_TYPE_CLASS ? \ + __va_int(ap, type) : \ + (sizeof(type) <= 8 ? __va_arg8(ap, type) : \ + (sizeof(type) <= 16 ? __va_arg16(ap, type) : \ + *__va_arg8(ap, type *))))) + +#else /* __arch64__ */ +/* + * For sparcv8 code. + */ +#define __va_size(type) \ + (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long)) + /* * va_arg picks up the next argument of type `type'. Appending an * asterisk to `type' must produce a pointer to `type' (i.e., `type' @@ -84,7 +122,7 @@ typedef _BSD_VA_LIST_ va_list; # define va_arg(ap, type) (*(type *)(void *)(ap)) #else /* !__lint__ */ # if __GNUC__ < 2 -# define __extension__ +# define __extension__ /* delete __extension__ if non-gcc or gcc1 */ # endif # define __va_8byte(ap, type) \ __extension__ ({ \ @@ -107,13 +145,6 @@ typedef _BSD_VA_LIST_ va_list; __va_8byte(ap, type) : __va_arg(ap, type)) #endif /* __lint__ */ -#if !defined(_ANSI_SOURCE) && \ - (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) || \ - defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L) -# define va_copy(dest, src) \ - ((dest) = (src)) -#endif - -#define va_end(ap) +#endif /* __arch64__ */ #endif /* !_SPARC_STDARG_H_ */