Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | dnl $Id: macros.m4,v 1.2 2007/07/26 22:15:36 drp Exp $ |
2 | ||
3 | #ifndef __MACROS_M4__ | |
4 | #define __MACROS_M4__ | |
5 | dnl start_threads | |
6 | dnl rdth_id // returns thread id in %o1 | |
7 | dnl rdth_id_p // returns thread id in %o1 | |
8 | dnl wrth_attr(%reg) | |
9 | dnl wrth_attr_p(%reg) | |
10 | dnl th_join(instance, shared-counter-asddress, %reg1, %reg2, time-out) | |
11 | dnl th_sync(instance, shared_counter, timmer) | |
12 | dnl th_fork(label) | |
13 | dnl | |
14 | dnl th_wr_pcontext_p(val13,%reg0,%reg1) | |
15 | dnl th_wr_scontext_p(val13,%reg0,%reg1) | |
16 | dnl th_wr_pcontext(val13,%reg0,%reg1) | |
17 | dnl th_wr_scontext(val13,%reg0,%reg1) | |
18 | dnl | |
19 | dnl th_setx(val64,%reg0,%reg1,stride) | |
20 | dnl | |
21 | dnl 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 | ||
32 | changequote([, ])dnl | |
33 | ||
34 | define([M4_thread_idx], eval(THREAD_COUNT-1))dnl | |
35 | ||
36 | define([M4_thread_mask], THREAD_MASK)dnl | |
37 | #ifdef PORTABLE_CORE | |
38 | define([M4_thread_mask_porta], THREAD_MASK & 0xff)dnl | |
39 | #else | |
40 | define([M4_thread_mask_porta], THREAD_MASK )dnl | |
41 | #endif | |
42 | define([M4_thread_mask64], format([0x%08x%08x],mpeval(THREAD_MASK>>32+0),mpeval(THREAD_MASK&0xffffffff+0)))dnl | |
43 | ||
44 | define([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 | ||
109 | define([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 | ||
175 | define([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 | ||
185 | define([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 | |
207 | define([M4_user_text_idx], eval(MT_THREAD_COUNT-1))dnl | |
208 | define([M4_user_text_mask], MT_THREAD_MASK)dnl | |
209 | #else | |
210 | define([M4_user_text_idx], 0)dnl | |
211 | define([M4_user_text_mask], 0x00000001)dnl | |
212 | #endif | |
213 | ||
214 | #ifdef USER_DATA_MT_MAP | |
215 | define([M4_user_data_idx], eval(MT_THREAD_COUNT-1))dnl | |
216 | define([M4_user_data_mask], MT_THREAD_MASK)dnl | |
217 | #else | |
218 | define([M4_user_data_idx], 0)dnl | |
219 | define([M4_user_data_mask], 0x00000001)dnl | |
220 | #endif | |
221 | ||
222 | define([forloop], | |
223 | [pushdef([$1], [$2])_forloop([$1], [$2], [$3], [$4])popdef([$1])])dnl | |
224 | define([_forloop], | |
225 | [$4[]ifelse($1, [$3], , | |
226 | [define([$1], incr($1))_forloop([$1], [$2], [$3], [$4])])])dnl | |
227 | ||
228 | dnl This macro enumerates from zero to the mask width. It only expands the user's | |
229 | dnl expression if the corresponding bit in the mask is set to one. | |
230 | dnl i = index, counts from 0 to mask_width | |
231 | dnl Usage : foreachbit([i], mask_width, hex_mask, [your code with i as index]) | |
232 | dnl Example: foreachbit([i], 32, 0x88facef6, [[my_label]i ]) | |
233 | ||
234 | define([foreachbit], | |
235 | [pushdef([$1], 0)_foreachbit([$1], [$2], [$3], [$4])popdef([$1])])dnl | |
236 | ||
237 | define([_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 | ||
241 | foreachbit([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 | |
262 | define([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 | |
279 | foreachbit([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 | ]) | |
292 | skip_start_th: | |
293 | )dnl | |
294 | ||
295 | define([th_expand], start_th_expand(`$1'))dnl | |
296 | ||
297 | dnl **************************************** | |
298 | #endif | |
299 | ||
300 | define([start_fork_expand], | |
301 | foreachbit([i], 64, M4_thread_mask_porta, [ | |
302 | cmp [[%o1, ]]eval(i) | |
303 | be [[$1_]]eval(i) | |
304 | nop | |
305 | ]) | |
306 | )dnl | |
307 | ||
308 | define([start_fork_expand_jmp], | |
309 | foreachbit([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 | ||
318 | define([fork_expand], start_fork_expand(`$1'))dnl | |
319 | define([fork_expand_jmp], start_fork_expand_jmp(`$1'))dnl | |
320 | ||
321 | changequote(`,')dnl | |
322 | ||
323 | dnl *********************************************************************** | |
324 | dnl These are the non-changequote versions of foreachbit .. | |
325 | define(foreachbit2, | |
326 | `pushdef(`$1', 0)_foreachbit2(`$1', `$2', `$3', `$4')popdef(`$1')')dnl | |
327 | ||
328 | define(_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 | ||
332 | define(while, | |
333 | `ifelse(eval($1),1,$2`while(`$1',`$2')')') | |
334 | ||
335 | dnl *********************************************************************** | |
336 | dnl This Macro will use either setx, set or mov based on the value of | |
337 | dnl the first argument. Useful when loading a register with a define, so | |
338 | dnl as to optimize the # of instructions used.. (Jan 2005) | |
339 | define(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 | ||
344 | define(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') ') | |
348 | dnl *********************************************************************** | |
349 | dnl These macros will replace a hexadecimal mask with thread IDs | |
350 | dnl mask2tid,mask2lstid : of lowest thread set | |
351 | dnl mask2mstid : of highest thread set | |
352 | ||
353 | define(mask2tid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl | |
354 | mpeval(i-1)'dnl | |
355 | ) | |
356 | define(mask2lstid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl | |
357 | mpeval(i-1)'dnl | |
358 | ) | |
359 | define(mask2mstid, `define(`i',63)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',decr(i))')dnl | |
360 | mpeval(i+1)'dnl | |
361 | ) | |
362 | ||
363 | #if THREAD_COUNT-1 | |
364 | define(`start_threads', th_expand(start_th))dnl | |
365 | #else | |
366 | define(`start_threads', `! single thread')dnl | |
367 | #endif | |
368 | ||
369 | #if THREAD_COUNT-1 | |
370 | define(`sync_threads', ` | |
371 | setx sync_thr_counter, %l1, %l0 | |
372 | sync_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 | ||
380 | sync_thr_wait_for_all: | |
381 | ldub [%l0], %l1 | |
382 | cmp %l1, THREAD_COUNT | |
383 | bne sync_thr_wait_for_all | |
384 | nop | |
385 | ')dnl | |
386 | define(`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 | |
400 | 1: | |
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 | |
412 | 2: | |
413 | ')dnl | |
414 | #else | |
415 | define(`sync_threads', `! single thread')dnl | |
416 | define(`cmp_sync_threads', `! single thread')dnl | |
417 | #endif | |
418 | ||
419 | ||
420 | #if THREAD_COUNT-1 | |
421 | define(`exit_sync_threads', ` | |
422 | setx exit_sync_thr_counter, %l1, %l0 | |
423 | exit_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] | |
430 | exit_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 | |
437 | define(`exit_sync_threads', ` | |
438 | nop | |
439 | ')dnl | |
440 | #endif | |
441 | ||
442 | ||
443 | ||
444 | dnl: thread-to-get-intp (in hex without 0x), section, label, offset | |
445 | define(start_thread_1, ` | |
446 | ! $EV trig_pc_d(1,expr(@VA(.$2.$3) + $4, 16, 16)) -> intp($1, 1, 1) | |
447 | ')dnl | |
448 | ||
449 | dnl setx [[$1]]+i [[, %g1, %g2]] | |
450 | dnl be +8 | |
451 | ||
452 | dnl read-thread-id from user mode 0..31 | |
453 | define(rdth_id,` | |
454 | ta T_RD_THID | |
455 | ')dnl | |
456 | ||
457 | dnl read-thread-id from priv mode 0..31 | |
458 | define(rdth_id_p,` | |
459 | ta T_RD_THID | |
460 | ')dnl | |
461 | ||
462 | ||
463 | dnl read-thread-id from user mode 0..31 | |
464 | define(wrth_attr,` | |
465 | ta T_CHANGE_HPRIV | |
466 | wr %g0, $1, %asr26 | |
467 | ta T_CHANGE_NONHPRIV | |
468 | ')dnl | |
469 | ||
470 | ||
471 | dnl tid2vtid translation for partial cores.. | |
472 | dnl uses g1,g2 temp vars. returns vtid in same reg | |
473 | dnl as specified in macro | |
474 | define(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 | ||
485 | dnl read-thread-id from priv mode 0..31 | |
486 | define(wrth_attr_p,` | |
487 | wr %g0, $1, %asr26 | |
488 | ')dnl | |
489 | ||
490 | define(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 | ||
505 | define(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 | ||
526 | define(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 | ||
544 | dnl rd %asr26, %g1 | |
545 | dnl set 0x1f00, $2 | |
546 | dnl and %g1, $2, %g1 | |
547 | dnl srlx %g1, 8, %g1 | |
548 | ||
549 | define(th_fork, ` | |
550 | rdth_id | |
551 | fork_expand($1) | |
552 | ta T_BAD_TRAP | |
553 | ')dnl | |
554 | ||
555 | define(th_fork_jmp, ` | |
556 | rdth_id | |
557 | fork_expand_jmp($1) | |
558 | ta T_BAD_TRAP | |
559 | ')dnl | |
560 | ||
561 | define(th_fork_jmp_p, ` | |
562 | rdth_id_p | |
563 | fork_expand_jmp($1) | |
564 | ta T_BAD_TRAP | |
565 | ')dnl | |
566 | ||
567 | define(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 | ||
574 | define(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 | ||
582 | define(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 | ||
590 | define(th_wr_pcontext_p, ` | |
591 | set $1, $2 | |
592 | mov 8, $3 | |
593 | stxa $2, [$3] ASI_PRIMARY_CONTEXT_REG | |
594 | ')dnl | |
595 | ||
596 | define(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 | ||
604 | define(k_svc, ` | |
605 | mov $1, %i0 | |
606 | ta T_FUNCTION | |
607 | ')dnl | |
608 | ||
609 | define(k_svc1, ` | |
610 | setx $2, $1, %i1 | |
611 | mov $1, %i0 | |
612 | ta T_FUNCTION | |
613 | ')dnl | |
614 | ||
615 | define(k_svc2, ` | |
616 | setx $3, $1, %i2 | |
617 | setx $2, $1, %i1 | |
618 | mov $1, %i0 | |
619 | ta T_FUNCTION | |
620 | ')dnl | |
621 | ||
622 | define(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 | ||
630 | define(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 | ||
639 | define(make_reg, `%$1')dnl | |
640 | ||
641 | ||
642 | define(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 | ||
666 | define(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 | ||
690 | define(th_set_barrier, ` | |
691 | ! set_barrier_macro | |
692 | mov 1, %r1 | |
693 | stub %r1, [$2+$1] | |
694 | ')dnl | |
695 | ||
696 | ||
697 | define(th_clear_barrier, ` | |
698 | ! clear_barrier_macro | |
699 | stub %r0, [$2+$1] | |
700 | ')dnl | |
701 | ||
702 | define(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 | ||
710 | define(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 | ||
725 | define(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 | ||
744 | define(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 | |
751 | 1: | |
752 | nop | |
753 | ') | |
754 | #endif |