Home | History | Annotate | Line # | Download | only in include
locore.h revision 1.5.8.1
      1  1.5.8.1      yamt /*	$NetBSD: locore.h,v 1.5.8.1 2014/05/22 11:40:09 yamt Exp $	*/
      2      1.1       mrg 
      3      1.1       mrg /*
      4      1.1       mrg  * Copyright (c) 1996-2002 Eduardo Horvath
      5      1.1       mrg  * All rights reserved.
      6      1.1       mrg  *
      7      1.1       mrg  * Redistribution and use in source and binary forms, with or without
      8      1.1       mrg  * modification, are permitted provided that the following conditions
      9      1.1       mrg  * are met:
     10      1.1       mrg  * 1. Redistributions of source code must retain the above copyright
     11      1.1       mrg  *    notice, this list of conditions and the following disclaimer.
     12      1.1       mrg  *
     13      1.1       mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
     14      1.1       mrg  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15      1.1       mrg  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     16      1.1       mrg  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
     17      1.1       mrg  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     18      1.1       mrg  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     19      1.1       mrg  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     20      1.1       mrg  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     21      1.1       mrg  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     22      1.1       mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     23      1.1       mrg  * SUCH DAMAGE.
     24      1.1       mrg  *
     25      1.1       mrg  */
     26      1.1       mrg 
     27      1.1       mrg #undef	CURLWP
     28      1.1       mrg #undef	CPCB
     29      1.1       mrg #undef	FPLWP
     30      1.1       mrg 
     31      1.1       mrg #define	CURLWP	(CPUINFO_VA + CI_CURLWP)
     32      1.1       mrg #define	CPCB	(CPUINFO_VA + CI_CPCB)
     33      1.1       mrg #define	FPLWP	(CPUINFO_VA + CI_FPLWP)
     34      1.1       mrg 
     35      1.4    martin /* A few convenient abbreviations for trapframe fields. */
     36      1.4    martin #define	TF_G	TF_GLOBAL
     37      1.4    martin #define	TF_O	TF_OUT
     38      1.4    martin #define	TF_L	TF_LOCAL
     39      1.4    martin #define	TF_I	TF_IN
     40      1.4    martin 
     41      1.4    martin /* Let us use same syntax as C code */
     42      1.4    martin #define Debugger()	ta	1; nop
     43      1.4    martin 
     44      1.4    martin 
     45      1.4    martin /*
     46      1.4    martin  * This macro will clear out a cache line before an explicit
     47      1.4    martin  * access to that location.  It's mostly used to make certain
     48      1.4    martin  * loads bypassing the D$ do not get stale D$ data.
     49      1.4    martin  *
     50      1.4    martin  * It uses a register with the address to clear and a temporary
     51      1.4    martin  * which is destroyed.
     52      1.4    martin  */
     53      1.4    martin #ifdef DCACHE_BUG
     54      1.4    martin #define DLFLUSH(a,t) \
     55      1.4    martin 	andn	a, 0x3f, t; \
     56      1.4    martin 	stxa	%g0, [ t ] ASI_DCACHE_TAG; \
     57      1.4    martin 	membar	#Sync
     58      1.4    martin /* The following can be used if the pointer is 32-byte aligned */
     59      1.4    martin #define DLFLUSH2(t) \
     60      1.4    martin 	stxa	%g0, [ t ] ASI_DCACHE_TAG; \
     61      1.4    martin 	membar	#Sync
     62      1.4    martin #else
     63      1.4    martin #define DLFLUSH(a,t)
     64      1.4    martin #define DLFLUSH2(t)
     65      1.4    martin #endif
     66      1.4    martin 
     67      1.4    martin 
     68      1.4    martin /*
     69      1.4    martin  * Combine 2 regs -- used to convert 64-bit ILP32
     70      1.4    martin  * values to LP64.
     71      1.4    martin  */
     72      1.4    martin #define	COMBINE(r1, r2, d)	\
     73      1.5  nakayama 	clruw	r2;		\
     74      1.4    martin 	sllx	r1, 32, d;	\
     75      1.4    martin 	or	d, r2, d
     76      1.4    martin 
     77      1.4    martin /*
     78      1.4    martin  * Split 64-bit value in 1 reg into high and low halves.
     79      1.4    martin  * Used for ILP32 return values.
     80      1.4    martin  */
     81      1.4    martin #define	SPLIT(r0, r1)		\
     82      1.4    martin 	srl	r0, 0, r1;	\
     83      1.4    martin 	srlx	r0, 32, r0
     84      1.4    martin 
     85      1.4    martin 
     86      1.4    martin /*
     87      1.4    martin  * A handy macro for maintaining instrumentation counters.
     88      1.4    martin  * Note that this clobbers %o0, %o1 and %o2.  Normal usage is
     89      1.4    martin  * something like:
     90      1.4    martin  *	foointr:
     91      1.4    martin  *		TRAP_SETUP(...)		! makes %o registers safe
     92      1.4    martin  *		INCR(_C_LABEL(cnt)+V_FOO)	! count a foo
     93      1.4    martin  */
     94      1.4    martin #define INCR(what) \
     95      1.4    martin 	sethi	%hi(what), %o0; \
     96      1.4    martin 	or	%o0, %lo(what), %o0; \
     97      1.4    martin 99:	\
     98      1.4    martin 	lduw	[%o0], %o1; \
     99      1.4    martin 	add	%o1, 1, %o2; \
    100      1.4    martin 	casa	[%o0] ASI_P, %o1, %o2; \
    101      1.4    martin 	cmp	%o1, %o2; \
    102      1.4    martin 	bne,pn	%icc, 99b; \
    103      1.4    martin 	 nop
    104      1.4    martin 
    105      1.4    martin /*
    106      1.4    martin  * A couple of handy macros to save and restore globals to/from
    107      1.4    martin  * locals.  Since udivrem uses several globals, and it's called
    108      1.4    martin  * from vsprintf, we need to do this before and after doing a printf.
    109      1.4    martin  */
    110      1.4    martin #define GLOBTOLOC \
    111      1.4    martin 	mov	%g1, %l1; \
    112      1.4    martin 	mov	%g2, %l2; \
    113      1.4    martin 	mov	%g3, %l3; \
    114      1.4    martin 	mov	%g4, %l4; \
    115      1.4    martin 	mov	%g5, %l5; \
    116      1.4    martin 	mov	%g6, %l6; \
    117      1.4    martin 	mov	%g7, %l7
    118      1.4    martin 
    119      1.4    martin #define LOCTOGLOB \
    120      1.4    martin 	mov	%l1, %g1; \
    121      1.4    martin 	mov	%l2, %g2; \
    122      1.4    martin 	mov	%l3, %g3; \
    123      1.4    martin 	mov	%l4, %g4; \
    124      1.4    martin 	mov	%l5, %g5; \
    125      1.4    martin 	mov	%l6, %g6; \
    126      1.4    martin 	mov	%l7, %g7
    127      1.4    martin 
    128      1.4    martin /* Load strings address into register; NOTE: hidden local label 99 */
    129      1.4    martin #define LOAD_ASCIZ(reg, s)	\
    130      1.4    martin 	set	99f, reg ;	\
    131      1.4    martin 	.data ;			\
    132      1.4    martin 99:	.asciz	s ;		\
    133      1.4    martin 	_ALIGN ;		\
    134      1.4    martin 	.text
    135      1.4    martin 
    136      1.4    martin /*
    137      1.4    martin  * Handy stack conversion macros.
    138      1.4    martin  * They correctly switch to requested stack type
    139      1.4    martin  * regardless of the current stack.
    140      1.4    martin  */
    141      1.4    martin 
    142      1.4    martin #define TO_STACK64(size)					\
    143      1.4    martin 	save	%sp, size, %sp;					\
    144      1.4    martin 	add	%sp, -BIAS, %o0; /* Convert to 64-bits */	\
    145      1.4    martin 	andcc	%sp, 1, %g0; /* 64-bit stack? */		\
    146      1.4    martin 	movz	%icc, %o0, %sp
    147      1.4    martin 
    148      1.4    martin #define TO_STACK32(size)					\
    149      1.4    martin 	save	%sp, size, %sp;					\
    150      1.4    martin 	add	%sp, +BIAS, %o0; /* Convert to 32-bits */	\
    151      1.4    martin 	andcc	%sp, 1, %g0; /* 64-bit stack? */		\
    152      1.4    martin 	movnz	%icc, %o0, %sp
    153      1.4    martin 
    154      1.4    martin #ifdef _LP64
    155      1.4    martin #define	STACKFRAME(size)	TO_STACK64(size)
    156      1.4    martin #else
    157      1.4    martin #define	STACKFRAME(size)	TO_STACK32(size)
    158      1.4    martin #endif
    159      1.4    martin 
    160      1.4    martin /*
    161      1.4    martin  * Primitives
    162      1.4    martin  */
    163      1.4    martin #ifdef ENTRY
    164      1.4    martin #undef ENTRY
    165      1.4    martin #endif
    166      1.4    martin 
    167      1.4    martin #ifdef GPROF
    168      1.4    martin 	.globl	_mcount
    169      1.4    martin #define	ENTRY(x) \
    170      1.4    martin 	.globl _C_LABEL(x); .proc 1; .type _C_LABEL(x),@function; \
    171      1.4    martin _C_LABEL(x): ; \
    172      1.4    martin 	.data; \
    173      1.4    martin 	.align 8; \
    174      1.4    martin 0:	.uaword 0; .uaword 0; \
    175      1.4    martin 	.text;	\
    176      1.4    martin 	save	%sp, -CC64FSZ, %sp; \
    177      1.4    martin 	sethi	%hi(0b), %o0; \
    178      1.4    martin 	call	_mcount; \
    179      1.4    martin 	or	%o0, %lo(0b), %o0; \
    180      1.4    martin 	restore
    181      1.4    martin #else
    182      1.4    martin #define	ENTRY(x)	.globl _C_LABEL(x); .proc 1; \
    183      1.4    martin 	.type _C_LABEL(x),@function; _C_LABEL(x):
    184      1.4    martin #endif
    185      1.4    martin #define	ALTENTRY(x)	.globl _C_LABEL(x); _C_LABEL(x):
    186      1.4    martin 
    187      1.4    martin 
    188