Commit | Line | Data |
---|---|---|
2a48bcf5 | 1 | #ifndef lint |
3845fbd6 | 2 | static char sccsid[] = "@(#)langpats.c 1.2 (Berkeley) %G%"; |
2a48bcf5 SL |
3 | #endif |
4 | ||
5 | /* | |
6 | * In-line assembly code expander for | |
3845fbd6 | 7 | * the kernel. This code is based on |
2a48bcf5 SL |
8 | * pc2 and the old asm.sed script. |
9 | */ | |
10 | #include <stdio.h> | |
11 | #include <ctype.h> | |
12 | ||
13 | /* | |
14 | * The hash table must be at least twice as big as the number | |
15 | * of patterns, preferably bigger. It must also be a prime number | |
16 | */ | |
17 | #define HSHSIZ 139 | |
18 | ||
19 | /* | |
20 | * Pattern table. | |
21 | */ | |
22 | struct pats { | |
23 | char *name; | |
24 | char *replace; | |
25 | } ptab[] = { | |
3845fbd6 | 26 | { "_spl0\n", |
2a48bcf5 SL |
27 | " mfpr $18,r0\n\ |
28 | mtpr $0,$18\n" }, | |
29 | ||
3845fbd6 | 30 | { "_spl1\n", |
2a48bcf5 SL |
31 | " mfpr $18,r0\n\ |
32 | mtpr $1,$18\n" }, | |
33 | ||
3845fbd6 | 34 | { "_splsoftclock\n", |
2a48bcf5 SL |
35 | " mfpr $18,r0\n\ |
36 | mtpr $0x8,$18\n" }, | |
37 | ||
3845fbd6 | 38 | { "_splnet\n", |
2a48bcf5 SL |
39 | " mfpr $18,r0\n\ |
40 | mtpr $0xc,$18\n" }, | |
41 | ||
3845fbd6 | 42 | { "_splimp\n", |
2a48bcf5 SL |
43 | " mfpr $18,r0\n\ |
44 | mtpr $0x16,$18\n" }, | |
45 | ||
3845fbd6 | 46 | { "_spl4\n", |
2a48bcf5 SL |
47 | " mfpr $18,r0\n\ |
48 | mtpr $0x14,$18\n" }, | |
49 | ||
3845fbd6 | 50 | { "_splbio\n", |
2a48bcf5 SL |
51 | " mfpr $18,r0\n\ |
52 | mtpr $0x15,$18\n" }, | |
53 | ||
3845fbd6 | 54 | { "_spltty\n", |
2a48bcf5 SL |
55 | " mfpr $18,r0\n\ |
56 | mtpr $0x15,$18\n" }, | |
2a48bcf5 | 57 | |
3845fbd6 | 58 | { "_spl5\n", |
2a48bcf5 SL |
59 | " mfpr $18,r0\n\ |
60 | mtpr $0x15,$18\n" }, | |
61 | ||
3845fbd6 | 62 | { "_splclock\n", |
2a48bcf5 SL |
63 | " mfpr $18,r0\n\ |
64 | mtpr $0x18,$18\n" }, | |
65 | ||
3845fbd6 | 66 | { "_spl6\n", |
2a48bcf5 SL |
67 | " mfpr $18,r0\n\ |
68 | mtpr $0x18,$18\n" }, | |
69 | ||
3845fbd6 | 70 | { "_spl7\n", |
2a48bcf5 SL |
71 | " mfpr $18,r0\n\ |
72 | mtpr $0x1f,$18\n" }, | |
73 | ||
3845fbd6 | 74 | { "_splx\n", |
2a48bcf5 SL |
75 | " mfpr $18,r0\n\ |
76 | mtpr (sp)+,$18\n" }, | |
77 | ||
3845fbd6 | 78 | { "_mfpr\n", |
2a48bcf5 SL |
79 | " mfpr (sp)+,r0\n" }, |
80 | ||
3845fbd6 | 81 | { "_mtpr\n", |
2a48bcf5 SL |
82 | " mtpr 4(sp),(sp)\n\ |
83 | addl2 $8,sp\n" }, | |
84 | ||
3845fbd6 | 85 | { "_setsoftclock\n", |
2a48bcf5 SL |
86 | " mtpr $0x8,$0x14\n" }, |
87 | ||
3845fbd6 | 88 | { "_resume\n", |
2a48bcf5 SL |
89 | " ashl $9,(sp)+,r0 \n\ |
90 | movpsl -(sp) \n\ | |
91 | jsb _Resume\n" }, | |
92 | ||
3845fbd6 | 93 | { "_bcopy\n", |
2a48bcf5 SL |
94 | " movc3 8(sp),*(sp),*4(sp)\n\ |
95 | addl2 $12,sp\n" }, | |
96 | ||
3845fbd6 | 97 | { "_ovbcopy\n", |
2a48bcf5 SL |
98 | " movc3 8(sp),*(sp),*4(sp)\n\ |
99 | addl2 $12,sp\n" }, | |
100 | ||
3845fbd6 | 101 | { "_bzero\n", |
2a48bcf5 SL |
102 | " movc5 $0,(r0),$0,4(sp),*(sp)\n\ |
103 | addl2 $8,sp\n" }, | |
104 | ||
3845fbd6 | 105 | { "_bcmp\n", |
2a48bcf5 SL |
106 | " popr $0x7\n\ |
107 | cmpc3 r2,(r0),(r1)\n" }, | |
108 | ||
3845fbd6 | 109 | { "_strncmp\n", |
2a48bcf5 SL |
110 | " cmpc3 8(sp),*(sp),*4(sp)\n\ |
111 | addl2 $12,sp\n" }, | |
112 | ||
3845fbd6 | 113 | { "_blkclr\n", |
2a48bcf5 SL |
114 | " movl (sp)+,r3\n\ |
115 | jbr 2f\n\ | |
116 | 1:\n\ | |
117 | subl2 r0,(sp)\n\ | |
118 | movc5 $0,(r3),$0,r0,(r3)\n\ | |
119 | 2:\n\ | |
120 | movzwl $65535,r0\n\ | |
121 | cmpl (sp),r0\n\ | |
122 | jgtr 1b\n\ | |
123 | movl (sp)+,r0\n\ | |
124 | movc5 $0,(r3),$0,r0,(r3)\n" }, | |
125 | ||
3845fbd6 | 126 | { "_strlen\n", |
2a48bcf5 SL |
127 | " movl (sp),r1\n\ |
128 | 1:\n\ | |
129 | locc $0,$65535,(r1)\n\ | |
130 | jeql 1b\n\ | |
131 | subl3 (sp)+,r1,r0\n" }, | |
132 | ||
3845fbd6 | 133 | { "_scanc\n", |
2a48bcf5 SL |
134 | " popr $0xf\n\ |
135 | scanc r0,(r1),(r2),r3\n" }, | |
136 | ||
3845fbd6 | 137 | { "_copyin\n", |
2a48bcf5 SL |
138 | " jsb _Copyin\n\ |
139 | addl2 $12,sp\n" }, | |
140 | ||
3845fbd6 | 141 | { "_copyout\n", |
2a48bcf5 SL |
142 | " jsb _Copyout\n\ |
143 | addl2 $12,sp\n" }, | |
144 | ||
3845fbd6 | 145 | { "_fubyte\n", |
2a48bcf5 SL |
146 | " movl (sp)+,r0\n\ |
147 | jsb _Fubyte\n" }, | |
148 | ||
3845fbd6 | 149 | { "_fuibyte\n", |
2a48bcf5 SL |
150 | " movl (sp)+,r0\n\ |
151 | jsb _Fubyte\n" }, | |
152 | ||
3845fbd6 | 153 | { "_fuword\n", |
2a48bcf5 SL |
154 | " movl (sp)+,r0\n\ |
155 | jsb _Fuword\n" }, | |
156 | ||
3845fbd6 | 157 | { "_fuiword\n", |
2a48bcf5 SL |
158 | " movl (sp)+,r0\n\ |
159 | jsb _Fuword\n" }, | |
160 | ||
3845fbd6 | 161 | { "_subyte\n", |
2a48bcf5 SL |
162 | " movl (sp)+,r0\n\ |
163 | movl (sp)+,r1\n\ | |
164 | jsb _Subyte\n" }, | |
165 | ||
3845fbd6 | 166 | { "_suibyte\n", |
2a48bcf5 SL |
167 | " movl (sp)+,r0\n\ |
168 | movl (sp)+,r1\n\ | |
169 | jsb _Subyte\n" }, | |
170 | ||
3845fbd6 | 171 | { "_suword\n", |
2a48bcf5 SL |
172 | " movl (sp)+,r0\n\ |
173 | movl (sp)+,r1\n\ | |
174 | jsb _Suword\n" }, | |
175 | ||
3845fbd6 | 176 | { "_suiword\n", |
2a48bcf5 SL |
177 | " movl (sp)+,r0\n\ |
178 | movl (sp)+,r1\n\ | |
179 | jsb _Suword\n" }, | |
180 | ||
3845fbd6 | 181 | { "_setrq\n", |
2a48bcf5 SL |
182 | " movl (sp)+,r0 \n\ |
183 | jsb _Setrq\n" }, | |
184 | ||
3845fbd6 | 185 | { "_remrq\n", |
2a48bcf5 SL |
186 | " movl (sp)+,r0 \n\ |
187 | jsb _Remrq\n" }, | |
188 | ||
3845fbd6 | 189 | { "_swtch\n", |
2a48bcf5 SL |
190 | " movpsl -(sp)\n\ |
191 | jsb _Swtch\n" }, | |
192 | ||
3845fbd6 | 193 | { "_setjmp\n", |
2a48bcf5 SL |
194 | " movl (sp)+,r0 \n\ |
195 | jsb _Setjmp\n" }, | |
196 | ||
3845fbd6 | 197 | { "_longjmp\n", |
2a48bcf5 SL |
198 | " movl (sp)+,r0 \n\ |
199 | jsb _Longjmp\n" }, | |
200 | ||
3845fbd6 | 201 | { "_ffs\n", |
2a48bcf5 SL |
202 | " movl (sp)+,r1\n\ |
203 | ffs $0,$32,r1,r0 \n\ | |
204 | bneq 1f \n\ | |
205 | mnegl $1,r0 \n\ | |
206 | 1: \n\ | |
207 | incl r0\n" }, | |
208 | ||
3845fbd6 | 209 | { "_htons\n", |
2a48bcf5 SL |
210 | " rotl $8,(sp),r0\n\ |
211 | movb 1(sp),r0\n\ | |
212 | movzwl r0,r0\n\ | |
213 | addl2 $4,sp\n" }, | |
214 | ||
3845fbd6 | 215 | { "_ntohs\n", |
2a48bcf5 SL |
216 | " rotl $8,(sp),r0\n\ |
217 | movb 1(sp),r0\n\ | |
218 | movzwl r0,r0\n\ | |
219 | addl2 $4,sp\n" }, | |
220 | ||
3845fbd6 | 221 | { "_htonl\n", |
2a48bcf5 SL |
222 | " rotl $-8,(sp),r0\n\ |
223 | insv r0,$16,$8,r0\n\ | |
224 | movb 3(sp),r0\n\ | |
225 | addl2 $4,sp\n" }, | |
226 | ||
3845fbd6 | 227 | { "_ntohl\n", |
2a48bcf5 SL |
228 | " rotl $-8,(sp),r0\n\ |
229 | insv r0,$16,$8,r0\n\ | |
230 | movb 3(sp),r0\n\ | |
231 | addl2 $4,sp\n" }, | |
232 | ||
3845fbd6 | 233 | { "__insque\n", |
2a48bcf5 SL |
234 | " insque *(sp)+,*(sp)+\n" }, |
235 | ||
3845fbd6 | 236 | { "__remque\n", |
2a48bcf5 SL |
237 | " remque *(sp)+,r0\n" }, |
238 | ||
3845fbd6 | 239 | { "__queue\n", |
2a48bcf5 SL |
240 | " movl (sp)+,r0\n\ |
241 | movl (sp)+,r1\n\ | |
242 | insque r1,*4(r0)\n" }, | |
243 | ||
3845fbd6 | 244 | { "__dequeue\n", |
2a48bcf5 SL |
245 | " movl (sp)+,r0\n\ |
246 | remque *(r0),r0\n" }, | |
247 | }; | |
248 | struct pats *htbl[HSHSIZ]; | |
249 | ||
250 | #define HASH(cp, hp) {\ | |
251 | hash = 0; rehash = 1; ccp = cp; \ | |
252 | do { \ | |
253 | hash *= (int)*ccp++; \ | |
254 | } while (*ccp && *ccp != '\n'); \ | |
255 | hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \ | |
256 | } | |
257 | ||
258 | #define REHASH(hp) {\ | |
259 | hp += rehash; rehash += 2; \ | |
260 | if (hp >= &htbl[HSHSIZ]) \ | |
261 | hp -= HSHSIZ; \ | |
262 | } | |
263 | ||
264 | main(argc, argv) | |
265 | char *argv[]; | |
266 | { | |
267 | register struct pats *pp, **hp; | |
268 | register char *cp, *ccp, *lp; | |
269 | register int hash, rehash, size; | |
270 | char line[BUFSIZ]; | |
271 | extern char *index(); | |
272 | ||
273 | if (argc > 1) | |
274 | freopen(argv[1], "r", stdin); | |
275 | if (argc > 2) | |
276 | freopen(argv[2], "w", stdout); | |
277 | /* | |
278 | * Set up the hash table. | |
279 | */ | |
280 | for (pp = ptab; pp < &ptab[sizeof (ptab)/sizeof (ptab[0])]; pp++) { | |
281 | HASH(pp->name, hp); | |
282 | while (*hp) | |
283 | REHASH(hp); | |
284 | *hp = pp; | |
285 | } | |
286 | /* | |
287 | * Check each line and replace as appropriate. | |
288 | */ | |
289 | while (fgets(line, BUFSIZ, stdin)) { | |
290 | lp = index(line, ':'); | |
291 | for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; ) | |
292 | cp++; | |
293 | #define CALLS "calls\t" | |
294 | if (strncmp(cp, CALLS, sizeof (CALLS) - 1) != 0) { | |
295 | fputs(line, stdout); | |
296 | continue; | |
297 | } | |
3845fbd6 SL |
298 | for (cp += sizeof (CALLS) - 1; *cp && *cp != ','; cp++) |
299 | ; | |
300 | if (*cp != ',') { | |
301 | fputs(line, stdout); | |
302 | continue; | |
303 | } | |
304 | cp++; | |
2a48bcf5 SL |
305 | HASH(cp, hp); |
306 | while (*hp) { | |
307 | if (strncmp((*hp)->name, cp, size) == NULL) { | |
308 | if (lp != NULL) { | |
309 | *lp++ = '\n'; | |
310 | *lp = '\0'; | |
311 | fputs(line, stdout); | |
312 | } | |
313 | fputs((*hp)->replace, stdout); | |
314 | goto nextline; | |
315 | } | |
316 | REHASH(hp); | |
317 | } | |
318 | fputs(line, stdout); | |
319 | nextline: | |
320 | ; | |
321 | } | |
322 | exit(0); | |
323 | } |