sync these with the sparc64 versions.

This commit is contained in:
mrg 2002-07-20 08:37:30 +00:00
parent 6742cb1812
commit 44a3eec3a0
7 changed files with 124 additions and 24 deletions

View File

@ -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 <machine/frame.h>
#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_ */

View File

@ -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 */

View File

@ -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))

View File

@ -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 */

View File

@ -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 <machine/asm.h>). */
#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);\

View File

@ -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 */

View File

@ -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_ */