locore.h revision 1.5 1 /* $NetBSD: locore.h,v 1.5 2010/07/10 10:10:36 nakayama Exp $ */
2
3 /*
4 * Copyright (c) 1996-2002 Eduardo Horvath
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 */
26
27 #undef CURLWP
28 #undef CPCB
29 #undef FPLWP
30
31 #define CURLWP (CPUINFO_VA + CI_CURLWP)
32 #define CPCB (CPUINFO_VA + CI_CPCB)
33 #define FPLWP (CPUINFO_VA + CI_FPLWP)
34
35 /*
36 * Here are some defines to try to maintain consistency but still
37 * support 32-and 64-bit compilers.
38 */
39 #ifdef _LP64
40 /* reg that points to base of data/text segment */
41 #define BASEREG %g4
42 /* first constants for storage allocation */
43 #define LNGSZ 8
44 #define LNGSHFT 3
45 #define PTRSZ 8
46 #define PTRSHFT 3
47 #define POINTER .xword
48 #define ULONG .xword
49 /* Now instructions to load/store pointers & long ints */
50 #define LDLNG ldx
51 #define LDULNG ldx
52 #define STLNG stx
53 #define STULNG stx
54 #define LDPTR ldx
55 #define LDPTRA ldxa
56 #define STPTR stx
57 #define STPTRA stxa
58 #define CASPTR casxa
59 /* Now something to calculate the stack bias */
60 #define STKB BIAS
61 #define CCCR %xcc
62 #else
63 #define BASEREG %g0
64 #define LNGSZ 4
65 #define LNGSHFT 2
66 #define PTRSZ 4
67 #define PTRSHFT 2
68 #define POINTER .word
69 #define ULONG .word
70 /* Instructions to load/store pointers & long ints */
71 #define LDLNG ldsw
72 #define LDULNG lduw
73 #define STLNG stw
74 #define STULNG stw
75 #define LDPTR lduw
76 #define LDPTRA lduwa
77 #define STPTR stw
78 #define STPTRA stwa
79 #define CASPTR casa
80 #define STKB 0
81 #define CCCR %icc
82 #endif
83
84 /* Give this real authority: reset the machine */
85 #define NOTREACHED sir
86
87 /* if < 32, copy by bytes, memcpy, kcopy, ... */
88 #define BCOPY_SMALL 32
89
90 /* use as needed to align things on longword boundaries */
91 #define _ALIGN .align 8
92 #define ICACHE_ALIGN .align 32
93
94 /* A few convenient abbreviations for trapframe fields. */
95 #define TF_G TF_GLOBAL
96 #define TF_O TF_OUT
97 #define TF_L TF_LOCAL
98 #define TF_I TF_IN
99
100 /* Let us use same syntax as C code */
101 #define Debugger() ta 1; nop
102
103
104 /*
105 * This macro will clear out a cache line before an explicit
106 * access to that location. It's mostly used to make certain
107 * loads bypassing the D$ do not get stale D$ data.
108 *
109 * It uses a register with the address to clear and a temporary
110 * which is destroyed.
111 */
112 #ifdef DCACHE_BUG
113 #define DLFLUSH(a,t) \
114 andn a, 0x3f, t; \
115 stxa %g0, [ t ] ASI_DCACHE_TAG; \
116 membar #Sync
117 /* The following can be used if the pointer is 32-byte aligned */
118 #define DLFLUSH2(t) \
119 stxa %g0, [ t ] ASI_DCACHE_TAG; \
120 membar #Sync
121 #else
122 #define DLFLUSH(a,t)
123 #define DLFLUSH2(t)
124 #endif
125
126
127 /*
128 * Combine 2 regs -- used to convert 64-bit ILP32
129 * values to LP64.
130 */
131 #define COMBINE(r1, r2, d) \
132 clruw r2; \
133 sllx r1, 32, d; \
134 or d, r2, d
135
136 /*
137 * Split 64-bit value in 1 reg into high and low halves.
138 * Used for ILP32 return values.
139 */
140 #define SPLIT(r0, r1) \
141 srl r0, 0, r1; \
142 srlx r0, 32, r0
143
144
145 /*
146 * A handy macro for maintaining instrumentation counters.
147 * Note that this clobbers %o0, %o1 and %o2. Normal usage is
148 * something like:
149 * foointr:
150 * TRAP_SETUP(...) ! makes %o registers safe
151 * INCR(_C_LABEL(cnt)+V_FOO) ! count a foo
152 */
153 #define INCR(what) \
154 sethi %hi(what), %o0; \
155 or %o0, %lo(what), %o0; \
156 99: \
157 lduw [%o0], %o1; \
158 add %o1, 1, %o2; \
159 casa [%o0] ASI_P, %o1, %o2; \
160 cmp %o1, %o2; \
161 bne,pn %icc, 99b; \
162 nop
163
164 /*
165 * A couple of handy macros to save and restore globals to/from
166 * locals. Since udivrem uses several globals, and it's called
167 * from vsprintf, we need to do this before and after doing a printf.
168 */
169 #define GLOBTOLOC \
170 mov %g1, %l1; \
171 mov %g2, %l2; \
172 mov %g3, %l3; \
173 mov %g4, %l4; \
174 mov %g5, %l5; \
175 mov %g6, %l6; \
176 mov %g7, %l7
177
178 #define LOCTOGLOB \
179 mov %l1, %g1; \
180 mov %l2, %g2; \
181 mov %l3, %g3; \
182 mov %l4, %g4; \
183 mov %l5, %g5; \
184 mov %l6, %g6; \
185 mov %l7, %g7
186
187 /* Load strings address into register; NOTE: hidden local label 99 */
188 #define LOAD_ASCIZ(reg, s) \
189 set 99f, reg ; \
190 .data ; \
191 99: .asciz s ; \
192 _ALIGN ; \
193 .text
194
195 /*
196 * Handy stack conversion macros.
197 * They correctly switch to requested stack type
198 * regardless of the current stack.
199 */
200
201 #define TO_STACK64(size) \
202 save %sp, size, %sp; \
203 add %sp, -BIAS, %o0; /* Convert to 64-bits */ \
204 andcc %sp, 1, %g0; /* 64-bit stack? */ \
205 movz %icc, %o0, %sp
206
207 #define TO_STACK32(size) \
208 save %sp, size, %sp; \
209 add %sp, +BIAS, %o0; /* Convert to 32-bits */ \
210 andcc %sp, 1, %g0; /* 64-bit stack? */ \
211 movnz %icc, %o0, %sp
212
213 #ifdef _LP64
214 #define STACKFRAME(size) TO_STACK64(size)
215 #else
216 #define STACKFRAME(size) TO_STACK32(size)
217 #endif
218
219 /*
220 * Primitives
221 */
222 #ifdef ENTRY
223 #undef ENTRY
224 #endif
225
226 #ifdef GPROF
227 .globl _mcount
228 #define ENTRY(x) \
229 .globl _C_LABEL(x); .proc 1; .type _C_LABEL(x),@function; \
230 _C_LABEL(x): ; \
231 .data; \
232 .align 8; \
233 0: .uaword 0; .uaword 0; \
234 .text; \
235 save %sp, -CC64FSZ, %sp; \
236 sethi %hi(0b), %o0; \
237 call _mcount; \
238 or %o0, %lo(0b), %o0; \
239 restore
240 #else
241 #define ENTRY(x) .globl _C_LABEL(x); .proc 1; \
242 .type _C_LABEL(x),@function; _C_LABEL(x):
243 #endif
244 #define ALTENTRY(x) .globl _C_LABEL(x); _C_LABEL(x):
245
246
247