Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / diag / assembly / include / macros.m4
CommitLineData
86530b38
AT
1dnl $Id: macros.m4,v 1.2 2007/07/26 22:15:36 drp Exp $
2
3#ifndef __MACROS_M4__
4#define __MACROS_M4__
5dnl start_threads
6dnl rdth_id // returns thread id in %o1
7dnl rdth_id_p // returns thread id in %o1
8dnl wrth_attr(%reg)
9dnl wrth_attr_p(%reg)
10dnl th_join(instance, shared-counter-asddress, %reg1, %reg2, time-out)
11dnl th_sync(instance, shared_counter, timmer)
12dnl th_fork(label)
13dnl
14dnl th_wr_pcontext_p(val13,%reg0,%reg1)
15dnl th_wr_scontext_p(val13,%reg0,%reg1)
16dnl th_wr_pcontext(val13,%reg0,%reg1)
17dnl th_wr_scontext(val13,%reg0,%reg1)
18dnl
19dnl th_setx(val64,%reg0,%reg1,stride)
20dnl
21dnl k_svc[1,2,3,4](func_num, arg1, ...) ! args in %o0, %o1 etc.
22
23#ifndef THREAD_START_X
24#define THREAD_START_X 1
25#endif
26
27#ifndef THREAD_START_Y
28#define THREAD_START_Y 1
29#endif
30
31
32changequote([, ])dnl
33
34define([M4_thread_idx], eval(THREAD_COUNT-1))dnl
35
36define([M4_thread_mask], THREAD_MASK)dnl
37#ifdef PORTABLE_CORE
38define([M4_thread_mask_porta], THREAD_MASK & 0xff)dnl
39#else
40define([M4_thread_mask_porta], THREAD_MASK )dnl
41#endif
42define([M4_thread_mask64], format([0x%08x%08x],mpeval(THREAD_MASK>>32+0),mpeval(THREAD_MASK&0xffffffff+0)))dnl
43
44define([M4_thread_mask_minus_lsb],[ifelse( [0x]mpeval(THREAD_MASK & 0x00000001,16), 0x1, [0x]mpeval(THREAD_MASK ^ 0x00000001,16),
45 [0x]mpeval(THREAD_MASK & 0x00000002,16), 0x2, [0x]mpeval(THREAD_MASK ^ 0x00000002,16),
46 [0x]mpeval(THREAD_MASK & 0x00000004,16), 0x4, [0x]mpeval(THREAD_MASK ^ 0x00000004,16),
47 [0x]mpeval(THREAD_MASK & 0x00000008,16), 0x8, [0x]mpeval(THREAD_MASK ^ 0x00000008,16),
48 [0x]mpeval(THREAD_MASK & 0x00000010,16), 0x10, [0x]mpeval(THREAD_MASK ^ 0x00000010,16),
49 [0x]mpeval(THREAD_MASK & 0x00000020,16), 0x20, [0x]mpeval(THREAD_MASK ^ 0x00000020,16),
50 [0x]mpeval(THREAD_MASK & 0x00000040,16), 0x40, [0x]mpeval(THREAD_MASK ^ 0x00000040,16),
51 [0x]mpeval(THREAD_MASK & 0x00000080,16), 0x80, [0x]mpeval(THREAD_MASK ^ 0x00000080,16),
52 [0x]mpeval(THREAD_MASK & 0x00000100,16), 0x100, [0x]mpeval(THREAD_MASK ^ 0x00000100,16),
53 [0x]mpeval(THREAD_MASK & 0x00000200,16), 0x200, [0x]mpeval(THREAD_MASK ^ 0x00000200,16),
54 [0x]mpeval(THREAD_MASK & 0x00000400,16), 0x400, [0x]mpeval(THREAD_MASK ^ 0x00000400,16),
55 [0x]mpeval(THREAD_MASK & 0x00000800,16), 0x800, [0x]mpeval(THREAD_MASK ^ 0x00000800,16),
56 [0x]mpeval(THREAD_MASK & 0x00001000,16), 0x1000, [0x]mpeval(THREAD_MASK ^ 0x00001000,16),
57 [0x]mpeval(THREAD_MASK & 0x00002000,16), 0x2000, [0x]mpeval(THREAD_MASK ^ 0x00002000,16),
58 [0x]mpeval(THREAD_MASK & 0x00004000,16), 0x4000, [0x]mpeval(THREAD_MASK ^ 0x00004000,16),
59 [0x]mpeval(THREAD_MASK & 0x00008000,16), 0x8000, [0x]mpeval(THREAD_MASK ^ 0x00008000,16),
60 [0x]mpeval(THREAD_MASK & 0x00010000,16), 0x10000, [0x]mpeval(THREAD_MASK ^ 0x00010000,16),
61 [0x]mpeval(THREAD_MASK & 0x00020000,16), 0x20000, [0x]mpeval(THREAD_MASK ^ 0x00020000,16),
62 [0x]mpeval(THREAD_MASK & 0x00040000,16), 0x40000, [0x]mpeval(THREAD_MASK ^ 0x00040000,16),
63 [0x]mpeval(THREAD_MASK & 0x00080000,16), 0x80000, [0x]mpeval(THREAD_MASK ^ 0x00080000,16),
64 [0x]mpeval(THREAD_MASK & 0x00100000,16), 0x100000, [0x]mpeval(THREAD_MASK ^ 0x00100000,16),
65 [0x]mpeval(THREAD_MASK & 0x00200000,16), 0x200000, [0x]mpeval(THREAD_MASK ^ 0x00200000,16),
66 [0x]mpeval(THREAD_MASK & 0x00400000,16), 0x400000, [0x]mpeval(THREAD_MASK ^ 0x00400000,16),
67 [0x]mpeval(THREAD_MASK & 0x00800000,16), 0x800000, [0x]mpeval(THREAD_MASK ^ 0x00800000,16),
68 [0x]mpeval(THREAD_MASK & 0x01000000,16), 0x1000000, [0x]mpeval(THREAD_MASK ^ 0x01000000,16),
69 [0x]mpeval(THREAD_MASK & 0x02000000,16), 0x2000000, [0x]mpeval(THREAD_MASK ^ 0x02000000,16),
70 [0x]mpeval(THREAD_MASK & 0x04000000,16), 0x4000000, [0x]mpeval(THREAD_MASK ^ 0x04000000,16),
71 [0x]mpeval(THREAD_MASK & 0x08000000,16), 0x8000000, [0x]mpeval(THREAD_MASK ^ 0x08000000,16),
72 [0x]mpeval(THREAD_MASK & 0x10000000,16), 0x10000000, [0x]mpeval(THREAD_MASK ^ 0x10000000,16),
73 [0x]mpeval(THREAD_MASK & 0x20000000,16), 0x20000000, [0x]mpeval(THREAD_MASK ^ 0x20000000,16),
74 [0x]mpeval(THREAD_MASK & 0x40000000,16), 0x40000000, [0x]mpeval(THREAD_MASK ^ 0x40000000,16),
75 [0x]mpeval(THREAD_MASK & 0x80000000,16), 0x80000000, [0x]mpeval(THREAD_MASK ^ 0x80000000,16),
76 [0x]mpeval(THREAD_MASK & 0x100000000,16), 0x100000000, [0x]mpeval(THREAD_MASK ^ 0x100000000,16),
77 [0x]mpeval(THREAD_MASK & 0x200000000,16), 0x200000000, [0x]mpeval(THREAD_MASK ^ 0x200000000,16),
78 [0x]mpeval(THREAD_MASK & 0x400000000,16), 0x400000000, [0x]mpeval(THREAD_MASK ^ 0x400000000,16),
79 [0x]mpeval(THREAD_MASK & 0x800000000,16), 0x800000000, [0x]mpeval(THREAD_MASK ^ 0x800000000,16),
80 [0x]mpeval(THREAD_MASK & 0x1000000000,16), 0x1000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000,16),
81 [0x]mpeval(THREAD_MASK & 0x2000000000,16), 0x2000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000,16),
82 [0x]mpeval(THREAD_MASK & 0x4000000000,16), 0x4000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000,16),
83 [0x]mpeval(THREAD_MASK & 0x8000000000,16), 0x8000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000,16),
84 [0x]mpeval(THREAD_MASK & 0x10000000000,16), 0x10000000000, [0x]mpeval(THREAD_MASK ^ 0x10000000000,16),
85 [0x]mpeval(THREAD_MASK & 0x20000000000,16), 0x20000000000, [0x]mpeval(THREAD_MASK ^ 0x20000000000,16),
86 [0x]mpeval(THREAD_MASK & 0x40000000000,16), 0x40000000000, [0x]mpeval(THREAD_MASK ^ 0x40000000000,16),
87 [0x]mpeval(THREAD_MASK & 0x80000000000,16), 0x80000000000, [0x]mpeval(THREAD_MASK ^ 0x80000000000,16),
88 [0x]mpeval(THREAD_MASK & 0x100000000000,16), 0x100000000000, [0x]mpeval(THREAD_MASK ^ 0x100000000000,16),
89 [0x]mpeval(THREAD_MASK & 0x200000000000,16), 0x200000000000, [0x]mpeval(THREAD_MASK ^ 0x200000000000,16),
90 [0x]mpeval(THREAD_MASK & 0x400000000000,16), 0x400000000000, [0x]mpeval(THREAD_MASK ^ 0x400000000000,16),
91 [0x]mpeval(THREAD_MASK & 0x800000000000,16), 0x800000000000, [0x]mpeval(THREAD_MASK ^ 0x800000000000,16),
92 [0x]mpeval(THREAD_MASK & 0x1000000000000,16), 0x1000000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000000,16),
93 [0x]mpeval(THREAD_MASK & 0x2000000000000,16), 0x2000000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000000,16),
94 [0x]mpeval(THREAD_MASK & 0x4000000000000,16), 0x4000000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000000,16),
95 [0x]mpeval(THREAD_MASK & 0x8000000000000,16), 0x8000000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000000,16),
96 [0x]mpeval(THREAD_MASK & 0x10000000000000,16), 0x10000000000000, [0x]mpeval(THREAD_MASK ^ 0x10000000000000,16),
97 [0x]mpeval(THREAD_MASK & 0x20000000000000,16), 0x20000000000000, [0x]mpeval(THREAD_MASK ^ 0x20000000000000,16),
98 [0x]mpeval(THREAD_MASK & 0x40000000000000,16), 0x40000000000000, [0x]mpeval(THREAD_MASK ^ 0x40000000000000,16),
99 [0x]mpeval(THREAD_MASK & 0x80000000000000,16), 0x80000000000000, [0x]mpeval(THREAD_MASK ^ 0x80000000000000,16),
100 [0x]mpeval(THREAD_MASK & 0x100000000000000,16), 0x100000000000000, [0x]mpeval(THREAD_MASK ^ 0x100000000000000,16),
101 [0x]mpeval(THREAD_MASK & 0x200000000000000,16), 0x200000000000000, [0x]mpeval(THREAD_MASK ^ 0x200000000000000,16),
102 [0x]mpeval(THREAD_MASK & 0x400000000000000,16), 0x400000000000000, [0x]mpeval(THREAD_MASK ^ 0x400000000000000,16),
103 [0x]mpeval(THREAD_MASK & 0x800000000000000,16), 0x800000000000000, [0x]mpeval(THREAD_MASK ^ 0x800000000000000,16),
104 [0x]mpeval(THREAD_MASK & 0x1000000000000000,16), 0x1000000000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000000000,16),
105 [0x]mpeval(THREAD_MASK & 0x2000000000000000,16), 0x2000000000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000000000,16),
106 [0x]mpeval(THREAD_MASK & 0x4000000000000000,16), 0x4000000000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000000000,16),
107 [0x]mpeval(THREAD_MASK & 0x8000000000000000,16), 0x8000000000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000000000,16))])
108
109define([M4_lsb_thread],[ifelse( [0x]mpeval(THREAD_MASK & 0x00000001,16), 0x1, 0x1,
110 [0x]mpeval(THREAD_MASK & 0x00000002,16), 0x2, 0x2,
111 [0x]mpeval(THREAD_MASK & 0x00000004,16), 0x4, 0x4,
112 [0x]mpeval(THREAD_MASK & 0x00000008,16), 0x8, 0x8,
113 [0x]mpeval(THREAD_MASK & 0x00000010,16), 0x10, 0x10,
114 [0x]mpeval(THREAD_MASK & 0x00000020,16), 0x20, 0x20,
115 [0x]mpeval(THREAD_MASK & 0x00000040,16), 0x40, 0x40,
116 [0x]mpeval(THREAD_MASK & 0x00000080,16), 0x80, 0x80,
117 [0x]mpeval(THREAD_MASK & 0x00000100,16), 0x100, 0x100,
118 [0x]mpeval(THREAD_MASK & 0x00000200,16), 0x200, 0x200,
119 [0x]mpeval(THREAD_MASK & 0x00000400,16), 0x400, 0x400,
120 [0x]mpeval(THREAD_MASK & 0x00000800,16), 0x800, 0x800,
121 [0x]mpeval(THREAD_MASK & 0x00001000,16), 0x1000, 0x1000,
122 [0x]mpeval(THREAD_MASK & 0x00002000,16), 0x2000, 0x2000,
123 [0x]mpeval(THREAD_MASK & 0x00004000,16), 0x4000, 0x4000,
124 [0x]mpeval(THREAD_MASK & 0x00008000,16), 0x8000, 0x8000,
125 [0x]mpeval(THREAD_MASK & 0x00010000,16), 0x10000, 0x10000,
126 [0x]mpeval(THREAD_MASK & 0x00020000,16), 0x20000, 0x20000,
127 [0x]mpeval(THREAD_MASK & 0x00040000,16), 0x40000, 0x40000,
128 [0x]mpeval(THREAD_MASK & 0x00080000,16), 0x80000, 0x80000,
129 [0x]mpeval(THREAD_MASK & 0x00100000,16), 0x100000, 0x100000,
130 [0x]mpeval(THREAD_MASK & 0x00200000,16), 0x200000, 0x200000,
131 [0x]mpeval(THREAD_MASK & 0x00400000,16), 0x400000, 0x400000,
132 [0x]mpeval(THREAD_MASK & 0x00800000,16), 0x800000, 0x800000,
133 [0x]mpeval(THREAD_MASK & 0x01000000,16), 0x1000000, 0x1000000,
134 [0x]mpeval(THREAD_MASK & 0x02000000,16), 0x2000000, 0x2000000,
135 [0x]mpeval(THREAD_MASK & 0x04000000,16), 0x4000000, 0x4000000,
136 [0x]mpeval(THREAD_MASK & 0x08000000,16), 0x8000000, 0x8000000,
137 [0x]mpeval(THREAD_MASK & 0x10000000,16), 0x10000000, 0x10000000,
138 [0x]mpeval(THREAD_MASK & 0x20000000,16), 0x20000000, 0x20000000,
139 [0x]mpeval(THREAD_MASK & 0x40000000,16), 0x40000000, 0x40000000,
140 [0x]mpeval(THREAD_MASK & 0x80000000,16), 0x80000000, 0x80000000,
141 [0x]mpeval(THREAD_MASK & 0x100000000,16), 0x100000000, 0x100000000,
142 [0x]mpeval(THREAD_MASK & 0x200000000,16), 0x200000000, 0x200000000,
143 [0x]mpeval(THREAD_MASK & 0x400000000,16), 0x400000000, 0x400000000,
144 [0x]mpeval(THREAD_MASK & 0x800000000,16), 0x800000000, 0x800000000,
145 [0x]mpeval(THREAD_MASK & 0x1000000000,16), 0x1000000000, 0x1000000000,
146 [0x]mpeval(THREAD_MASK & 0x2000000000,16), 0x2000000000, 0x2000000000,
147 [0x]mpeval(THREAD_MASK & 0x4000000000,16), 0x4000000000, 0x4000000000,
148 [0x]mpeval(THREAD_MASK & 0x8000000000,16), 0x8000000000, 0x8000000000,
149 [0x]mpeval(THREAD_MASK & 0x10000000000,16), 0x10000000000, 0x10000000000,
150 [0x]mpeval(THREAD_MASK & 0x20000000000,16), 0x20000000000, 0x20000000000,
151 [0x]mpeval(THREAD_MASK & 0x40000000000,16), 0x40000000000, 0x40000000000,
152 [0x]mpeval(THREAD_MASK & 0x80000000000,16), 0x80000000000, 0x80000000000,
153 [0x]mpeval(THREAD_MASK & 0x100000000000,16), 0x100000000000, 0x100000000000,
154 [0x]mpeval(THREAD_MASK & 0x200000000000,16), 0x200000000000, 0x200000000000,
155 [0x]mpeval(THREAD_MASK & 0x400000000000,16), 0x400000000000, 0x400000000000,
156 [0x]mpeval(THREAD_MASK & 0x800000000000,16), 0x800000000000, 0x800000000000,
157 [0x]mpeval(THREAD_MASK & 0x1000000000000,16), 0x1000000000000, 0x1000000000000,
158 [0x]mpeval(THREAD_MASK & 0x2000000000000,16), 0x2000000000000, 0x2000000000000,
159 [0x]mpeval(THREAD_MASK & 0x4000000000000,16), 0x4000000000000, 0x4000000000000,
160 [0x]mpeval(THREAD_MASK & 0x8000000000000,16), 0x8000000000000, 0x8000000000000,
161 [0x]mpeval(THREAD_MASK & 0x10000000000000,16), 0x10000000000000, 0x10000000000000,
162 [0x]mpeval(THREAD_MASK & 0x20000000000000,16), 0x20000000000000, 0x20000000000000,
163 [0x]mpeval(THREAD_MASK & 0x40000000000000,16), 0x40000000000000, 0x40000000000000,
164 [0x]mpeval(THREAD_MASK & 0x80000000000000,16), 0x80000000000000, 0x80000000000000,
165 [0x]mpeval(THREAD_MASK & 0x100000000000000,16), 0x100000000000000, 0x100000000000000,
166 [0x]mpeval(THREAD_MASK & 0x200000000000000,16), 0x200000000000000, 0x200000000000000,
167 [0x]mpeval(THREAD_MASK & 0x400000000000000,16), 0x400000000000000, 0x400000000000000,
168 [0x]mpeval(THREAD_MASK & 0x800000000000000,16), 0x800000000000000, 0x800000000000000,
169 [0x]mpeval(THREAD_MASK & 0x1000000000000000,16), 0x1000000000000000, 0x1000000000000000,
170 [0x]mpeval(THREAD_MASK & 0x2000000000000000,16), 0x2000000000000000, 0x2000000000000000,
171 [0x]mpeval(THREAD_MASK & 0x4000000000000000,16), 0x4000000000000000, 0x4000000000000000,
172 [0x]mpeval(THREAD_MASK & 0x8000000000000000,16), 0x8000000000000000, 0x8000000000000000)])
173
174
175define([M4_core_lsb_thread],[ifelse(
176 [0x]mpeval(0x[$1] & 0x01,16), 0x1, 0x01,
177 [0x]mpeval(0x[$1] & 0x2,16), 0x2, 0x02,
178 [0x]mpeval(0x[$1] & 0x4,16), 0x4, 0x04,
179 [0x]mpeval(0x[$1] & 0x8,16), 0x8, 0x08,
180 [0x]mpeval(0x[$1] & 0x10,16), 0x10, 0x10,
181 [0x]mpeval(0x[$1] & 0x20,16), 0x20, 0x20,
182 [0x]mpeval(0x[$1] & 0x40,16), 0x40, 0x40,
183 [0x]mpeval(0x[$1] & 0x80,16), 0x80, 0x80,0x00)])
184
185define([M4_core_lsb_mask],
186 [[0x]mpeval((M4_core_lsb_thread(substr(M4_thread_mask64,2,2))<<56)|
187 (M4_core_lsb_thread(substr(M4_thread_mask64,4,2))<<48)|
188 (M4_core_lsb_thread(substr(M4_thread_mask64,6,2))<<40)|
189 (M4_core_lsb_thread(substr(M4_thread_mask64,8,2))<<32)|
190 (M4_core_lsb_thread(substr(M4_thread_mask64,10,2))<<24)|
191 (M4_core_lsb_thread(substr(M4_thread_mask64,12,2))<<16)|
192 (M4_core_lsb_thread(substr(M4_thread_mask64,14,2))<<8)|
193 (M4_core_lsb_thread(substr(M4_thread_mask64,16,2))),16)])
194#ifdef PORTABLE_CORE
195#if (THREAD_COUNT > 8)
196#define MT_THREAD_COUNT 8
197#else
198#define MT_THREAD_COUNT THREAD_COUNT
199#endif
200#define MT_THREAD_MASK THREAD_MASK & 0xff
201#else
202#define MT_THREAD_COUNT THREAD_COUNT
203#define MT_THREAD_MASK THREAD_MASK
204#endif
205
206#ifdef USER_TEXT_MT_MAP
207define([M4_user_text_idx], eval(MT_THREAD_COUNT-1))dnl
208define([M4_user_text_mask], MT_THREAD_MASK)dnl
209#else
210define([M4_user_text_idx], 0)dnl
211define([M4_user_text_mask], 0x00000001)dnl
212#endif
213
214#ifdef USER_DATA_MT_MAP
215define([M4_user_data_idx], eval(MT_THREAD_COUNT-1))dnl
216define([M4_user_data_mask], MT_THREAD_MASK)dnl
217#else
218define([M4_user_data_idx], 0)dnl
219define([M4_user_data_mask], 0x00000001)dnl
220#endif
221
222define([forloop],
223 [pushdef([$1], [$2])_forloop([$1], [$2], [$3], [$4])popdef([$1])])dnl
224define([_forloop],
225 [$4[]ifelse($1, [$3], ,
226 [define([$1], incr($1))_forloop([$1], [$2], [$3], [$4])])])dnl
227
228dnl This macro enumerates from zero to the mask width. It only expands the user's
229dnl expression if the corresponding bit in the mask is set to one.
230dnl i = index, counts from 0 to mask_width
231dnl Usage : foreachbit([i], mask_width, hex_mask, [your code with i as index])
232dnl Example: foreachbit([i], 32, 0x88facef6, [[my_label]i ])
233
234define([foreachbit],
235 [pushdef([$1], 0)_foreachbit([$1], [$2], [$3], [$4])popdef([$1])])dnl
236
237define([_foreachbit],
238 [ifelse(mpeval(($3 >> $1) & 0x1, 16), 1, [$4])[]ifelse($1, [$2], ,
239 [define([$1], incr($1))_foreachbit([$1], [$2], [$3], [$4])])])dnl
240
241foreachbit([i], 64, M4_lsb_thread, [
242 define([M4_master_tid],i)
243])
244
245
246! M4 Mask values
247! thread_mask_minus_lsb M4_thread_mask_minus_lsb
248! THREAD MASK THREAD_MASK
249! thread_mask M4_thread_mask
250! thread_mask_pc M4_thread_mask_porta
251! user_text_mask M4_user_text_mask
252! user_data_mask M4_user_data_mask
253! thread_mask64 M4_thread_mask64
254! core lsb mask M4_core_lsb_mask
255! master thread M4_lsb_thread
256! master TID M4_master_tid
257! THREAD COUNT THREAD_COUNT
258
259!! TODO: - Fix this macro for N2 & CMP ?
260
261#if THREAD_COUNT-1
262define([start_th_expand],
263#ifdef CIOP
264 ! THIS NEEDS TO BE FIXED FO N2 ??
265 ! WHAT IS THE USAGE ??
266 ! determine if current thread is the bootstrap thread (thread 0)
267 ! if not; skip over all start_th code
268! setx 0x9800000830, %g1, %g2
269! ld
270 rd %asr26[[`,']] %l1
271 set 0x1f00[[`,']] %g1
272 and %l1[[`,']] %g1[[`,']] %l1
273 srlx %l1[[`,']] 8[[`,']] %l1 ! %l1 has thread ID
274 brnz %l1[[`,']] skip_start_th
275 ! set up constants for start_th
276 setx 0x0000010001[[`,']] %g1[[`,']] %g2 ! type=reset traptype=POR
277 setx 0x9800000800[[`,']] %g1[[`,']] %g3 ! PA of INT_VEC_DIS
278#endif
279foreachbit([i], 64, M4_thread_mask_minus_lsb, [
280[[$1_]]eval(i):
281#ifndef CIOP
282 nop ! $EV trig_pc_d(1,expr(@VA(.RED_EXT_SEC.[[$1_]]eval(i)) + (4*((THREAD_START_X * i) % THREAD_START_Y)), 16, 16)) -> intp(eval(i,16), 1, 1)
283 nop
284 nop
285#else
286 mov i*THREAD_STRIDE[[`,']] %g1
287 sllx %g1[[`,']] 8[[`,']] %g1
288 or %g1[[`,']] %g2[[`,']] %g1 ! %g1 contains the command for INT_VEC_DIS
289 stx %g1[[`,']] [[[%g3]]] ! write to INT_VEC_DIS
290#endif
291])
292skip_start_th:
293)dnl
294
295define([th_expand], start_th_expand(`$1'))dnl
296
297dnl ****************************************
298#endif
299
300define([start_fork_expand],
301foreachbit([i], 64, M4_thread_mask_porta, [
302 cmp [[%o1, ]]eval(i)
303 be [[$1_]]eval(i)
304 nop
305])
306)dnl
307
308define([start_fork_expand_jmp],
309foreachbit([i], 64, M4_thread_mask_porta, [
310 cmp [[%o1, ]]eval(i)
311 setx [[$1_]]eval(i)[[, %g2, %g3]]
312 [[be,a .+8]]
313 jmp %g3
314 nop
315])
316)dnl
317
318define([fork_expand], start_fork_expand(`$1'))dnl
319define([fork_expand_jmp], start_fork_expand_jmp(`$1'))dnl
320
321changequote(`,')dnl
322
323dnl ***********************************************************************
324dnl These are the non-changequote versions of foreachbit ..
325define(foreachbit2,
326 `pushdef(`$1', 0)_foreachbit2(`$1', `$2', `$3', `$4')popdef(`$1')')dnl
327
328define(_foreachbit2,
329 `ifelse(mpeval(($3 >> $1) & 0x1, 16), 1, `$4')`'ifelse($1, `$2', ,
330 `define(`$1', incr($1))_foreachbit2(`$1', `$2', `$3', `$4')')')dnl
331
332define(while,
333 `ifelse(eval($1),1,$2`while(`$1',`$2')')')
334
335dnl ***********************************************************************
336dnl This Macro will use either setx, set or mov based on the value of
337dnl the first argument. Useful when loading a register with a define, so
338dnl as to optimize the # of instructions used.. (Jan 2005)
339define(best_set_reg2,`ifelse(mpeval(($1 > 0xffffffff),2),1,
340 [setx $1, $2, $3],
341 mpeval(($1 > 0xfff),2),1,
342 [set $1, $3], [mov $1, $3]) ')
343
344define(best_set_reg,` ifelse(mpeval(($1 > 0xffffffff),2),1,
345 `setx $1, $2, $3',
346 mpeval(($1 > 0xfff),2),1,
347 `set $1, $3', `mov $1, $3') ')
348dnl ***********************************************************************
349dnl These macros will replace a hexadecimal mask with thread IDs
350dnl mask2tid,mask2lstid : of lowest thread set
351dnl mask2mstid : of highest thread set
352
353define(mask2tid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl
354mpeval(i-1)'dnl
355)
356define(mask2lstid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl
357mpeval(i-1)'dnl
358)
359define(mask2mstid, `define(`i',63)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',decr(i))')dnl
360mpeval(i+1)'dnl
361)
362
363#if THREAD_COUNT-1
364define(`start_threads', th_expand(start_th))dnl
365#else
366define(`start_threads', `! single thread')dnl
367#endif
368
369#if THREAD_COUNT-1
370define(`sync_threads', `
371 setx sync_thr_counter, %l1, %l0
372sync_thr_wait_for_inc:
373 ldstub [%l0], %l1
374 cmp %l1, 0xff
375 be sync_thr_wait_for_inc
376 nop
377 inc %l1
378 stub %l1, [%l0]
379
380sync_thr_wait_for_all:
381 ldub [%l0], %l1
382 cmp %l1, THREAD_COUNT
383 bne sync_thr_wait_for_all
384 nop
385')dnl
386define(`cmp_sync_threads', `
387 setx sync_thr_counter, %l1, %l0
388 mov 1, %l3
389 ldxa [%g0] 0x63, %l4
390 sllx %l3, %l4, %l3
391 mov 0x68, %l2
392
393 stx %l3, [%l0]
394 stxa %l3, [%l2] 0x41
395
396 ldx [%l0], %l1
397 brz %l1, 2f
398 mov 0x58, %l2
399 ldxa [%l2] 0x41, %l1
4001:
401 cmp %l3, %l1
402 bne,a 1b
403 ldxa [%l2] 0x41, %l1
404 sub %l2, 8, %l2
405 best_set_reg(M4_thread_mask, %l1, %l3)
406#if (!defined SIXGUNS && defined PORTABLE_CORE)
407 andn %l4, 0x7, %l4
408 sllx %l3, %l4, %l3
409#endif
410 stx %g0, [%l0]
411 stxa %l3, [%l2] 0x41
4122:
413')dnl
414#else
415define(`sync_threads', `! single thread')dnl
416define(`cmp_sync_threads', `! single thread')dnl
417#endif
418
419
420#if THREAD_COUNT-1
421define(`exit_sync_threads', `
422 setx exit_sync_thr_counter, %l1, %l0
423exit_sync_thr_wait_for_inc:
424 ldstub [%l0], %l1
425 cmp %l1, 0xff
426 be exit_sync_thr_wait_for_inc
427 nop
428 inc %l1
429 stub %l1, [%l0]
430exit_sync_thr_wait_for_all:
431 ldub [%l0], %l1
432 cmp %l1, THREAD_COUNT
433 bne exit_sync_thr_wait_for_all
434 nop
435')dnl
436#else
437define(`exit_sync_threads', `
438 nop
439')dnl
440#endif
441
442
443
444dnl: thread-to-get-intp (in hex without 0x), section, label, offset
445define(start_thread_1, `
446 ! $EV trig_pc_d(1,expr(@VA(.$2.$3) + $4, 16, 16)) -> intp($1, 1, 1)
447')dnl
448
449dnl setx [[$1]]+i [[, %g1, %g2]]
450dnl be +8
451
452dnl read-thread-id from user mode 0..31
453define(rdth_id,`
454 ta T_RD_THID
455')dnl
456
457dnl read-thread-id from priv mode 0..31
458define(rdth_id_p,`
459 ta T_RD_THID
460')dnl
461
462
463dnl read-thread-id from user mode 0..31
464define(wrth_attr,`
465 ta T_CHANGE_HPRIV
466 wr %g0, $1, %asr26
467 ta T_CHANGE_NONHPRIV
468')dnl
469
470
471dnl tid2vtid translation for partial cores..
472dnl uses g1,g2 temp vars. returns vtid in same reg
473dnl as specified in macro
474define(tid2vtid,`
475 ldxa [%g0]ASI_CMP_CORE, %g2
476 not %g0, %g1
477 sllx %g1, $1, %g1
478 not %g1
479 andn %g1,%g2,%g2
480 popc %g2, %g1
481 sub $1, %g1, $1
482')dnl
483
484
485dnl read-thread-id from priv mode 0..31
486define(wrth_attr_p,`
487 wr %g0, $1, %asr26
488')dnl
489
490define(th_join, `
491 ta T_MUTEX_LOCK
492 setx $2, $3, $4
493 ldsb [$4], $3
494 add 1, $3, $3
495 stub $3, [$4]
496 ta T_MUTEX_UNLOCK
497 set $5, %i0
498 subcc %i0, 1, %i0
499 te T_BAD_TRAP
500 cmp $3, THREAD_COUNT
501 bl .-12
502 ldsb [$4], $3
503')dnl
504
505define(th_sync_old, `
506 ! sync_macro
507 nop
508 ta T_SYNC
509 mov $1, %o1
510 ta T_MUTEX_LOCK
511 ldsb [%g4+$2], %g3
512 add 1, %g3, %g3
513 stub %g3, [%g4+$2]
514 ta T_MUTEX_UNLOCK
515 sethi %hi($3), %g1
516 or %lo($3), %g0, %g1
517 subcc %g1, 1, %g1
518 te T_BAD_TRAP
519 cmp %g3, THREAD_COUNT
520 bl,a .-12
521 ldsb [%g4+$2], %g3
522 done
523 nop
524')dnl
525
526define(th_sync, `
527 ! sync_macro
528 nop
529 ta T_SYNC ! GL = 2
530 mov $1, %g7
531 mov $2, %g6
532 sethi %hi($3), %g5
533 or %lo($3), %g0, %g5
534 ta T_MUTEX_LOCK ! GL = 2
535 nop
536 nop
537 ta T_MUTEX_UNLOCK ! GL = 2
538 nop
539 ta T_SYNC
540 nop
541')dnl
542
543
544dnl rd %asr26, %g1
545dnl set 0x1f00, $2
546dnl and %g1, $2, %g1
547dnl srlx %g1, 8, %g1
548
549define(th_fork, `
550 rdth_id
551 fork_expand($1)
552 ta T_BAD_TRAP
553')dnl
554
555define(th_fork_jmp, `
556 rdth_id
557 fork_expand_jmp($1)
558 ta T_BAD_TRAP
559')dnl
560
561define(th_fork_jmp_p, `
562 rdth_id_p
563 fork_expand_jmp($1)
564 ta T_BAD_TRAP
565')dnl
566
567define(th_setx, `
568 setx $1, $2, $3
569 rdth_id(`$1',`$2')dnl
570 smul $2, $4, $2
571 add $2, %g0, $3
572')dnl
573
574define(th_wr_pcontext, `
575 ta T_CHANGE_PRIV
576 set $1, $2
577 mov 8, $3
578 stxa $2, [$3] ASI_PRIMARY_CONTEXT_REG
579 ta T_CHANGE_NONPRIV
580')dnl
581
582define(th_wr_scontext, `
583 ta T_CHANGE_PRIV
584 set $1, $2
585 mov 16, $3
586 stxa $2, [$3] ASI_SECONDARY_CONTEXT_REG
587 ta T_CHANGE_NONPRIV
588')dnl
589
590define(th_wr_pcontext_p, `
591 set $1, $2
592 mov 8, $3
593 stxa $2, [$3] ASI_PRIMARY_CONTEXT_REG
594')dnl
595
596define(th_wr_scontext_p, `
597 set $1, $2
598 mov 16, $3
599 stxa $2, [$3] ASI_SECONDARY_CONTEXT_REG
600')dnl
601
602
603
604define(k_svc, `
605 mov $1, %i0
606 ta T_FUNCTION
607')dnl
608
609define(k_svc1, `
610 setx $2, $1, %i1
611 mov $1, %i0
612 ta T_FUNCTION
613')dnl
614
615define(k_svc2, `
616 setx $3, $1, %i2
617 setx $2, $1, %i1
618 mov $1, %i0
619 ta T_FUNCTION
620')dnl
621
622define(k_svc3, `
623 setx $4, $1, %i3
624 setx $3, $1, %i2
625 setx $2, $1, %i1
626 mov $1, %i0
627 ta T_FUNCTION
628')dnl
629
630define(k_svc4, `
631 setx $5, $1, %i4
632 setx $4, $1, %i3
633 setx $3, $1, %i2
634 setx $2, $1, %i1
635 mov $1, %i0
636 ta T_FUNCTION
637')dnl
638
639define(make_reg, `%$1')dnl
640
641
642define(itlb_demap_ctx_forever, `
643 rdth_id_p
644
645 cmp %o1, $1
646 bne %xcc, .itlb_demap_ctx_end
647 nop
648
649 setx $2, %g1, %g4
650 or %g4, 0x10, %g4
651 ! if thread-id == $1; i-tlb-demap; loop
652
653.itlb_demap_ctx_loop0:
654 ! i-dmap ctx
655 stxa %g0, [%g4] 0x57
656 mov $3, %g3
657.itlb_demap_ctx_loop1:
658 cmp %g3, 0
659 bne %xcc, .itlb_demap_ctx_loop1
660 subcc %g3, 1, %g3
661 ba .itlb_demap_ctx_loop0
662 nop
663.itlb_demap_ctx_end:
664')dnl
665
666define(dtlb_demap_ctx_forever, `
667 rdth_id_p
668
669 cmp %o1, $1
670 be %xcc, .dtlb_demap_ctx_end
671 nop
672
673 setx $2, %g1, %g4
674 or %g4, 0x10, %g4
675 ! if thread-id == $1; i-tlb-demap; loop
676
677.dtlb_demap_ctx_loop0:
678 ! i-dmap ctx
679 stxa %g0, [%g4] 0x5f
680 mov $3, %g3
681.dtlb_demap_ctx_loop1:
682 cmp %g3, 0
683 bne %xcc, .dtlb_demap_ctx_loop1
684 subcc %g3, 1, %g3
685 ba .dtlb_demap_ctx_loop0
686 nop
687.dtlb_demap_ctx_end:
688')dnl
689
690define(th_set_barrier, `
691 ! set_barrier_macro
692 mov 1, %r1
693 stub %r1, [$2+$1]
694')dnl
695
696
697define(th_clear_barrier, `
698 ! clear_barrier_macro
699 stub %r0, [$2+$1]
700')dnl
701
702define(th_wait_for_barrier_clear, `
703 ! wait_for_barrier_clear_macro
704 ldub [$2+$1], %r1
705 brnz %r1, .-4
706 nop
707')dnl
708
709
710define(init_mem,
711 `define( `init_val', $1)
712 define( `data_size', mpeval($3))
713 define( `blk_len', mpeval($2))
714 define( `it_count', 1)
715 define( `sec_val', $5)
716 define( `opr1', $4)
717 define( `opr2', $6)
718 define( `opnd3', $7)
719 ifelse(data_size,8,`gen_value',
720 data_size,4,`gen_value',
721 data_size,2,`gen_value',
722 data_size,1,`gen_value',
723 `errprint(ERROR: "init_mem" data size=data_size is illegal)')')
724
725define(gen_value,
726 `ifelse(data_size,8,.xword `0x'mpeval(init_val opr1 sec_val,16,16),
727 data_size,4,.word `0x'mpeval(init_val opr1 sec_val,16,8),
728 data_size,2,.half `0x'mpeval(init_val opr1 sec_val,16,4),
729 data_size,1,.byte `0x'mpeval(init_val opr1 sec_val,16,2)) dnl
730 ifelse(mpeval(len(opr1)>0),1,`define(`sec_val',`0x'mpeval(sec_val opr2 opnd3,16,16))') dnl
731 define(`it_count', incr(it_count))
732 ifelse(mpeval(it_count>blk_len),1,,`gen_value')')
733
734
735
736! Compare the strand ID with first parameter and jumps to label if equal.
737! Provided for use by CSRDiag tool.
738!
739! Usage: JUMP_ 2_THREAD ( strand id, label )
740! Example: JUMP_ 2_THREAD( 2, main_thread2 )
741!
742! Note: uses the registers %o1, %o2, %o3
743
744define(JUMP_2_THREAD,`
745 ta T_RD_THID
746 cmp %o1, $1
747 bne 1f
748 nop
749 setx $2, %o2, %o3
750 jmp %o3
7511:
752 nop
753 ')
754#endif