locore.h revision 1.7 1 1.7 joerg /* $NetBSD: locore.h,v 1.7 2015/08/23 10:53:28 joerg 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.7 joerg 0: .word 0; .word 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