Commit | Line | Data |
---|---|---|
2a48bcf5 | 1 | #ifndef lint |
5f9171ac | 2 | static char sccsid[] = "@(#)langpats.c 1.4 (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 | ||
6a1722ed MK |
74 | { "_splhigh\n", |
75 | " mfpr $18,r0\n\ | |
76 | mtpr $0x1f,$18\n" }, | |
77 | ||
3845fbd6 | 78 | { "_splx\n", |
2a48bcf5 SL |
79 | " mfpr $18,r0\n\ |
80 | mtpr (sp)+,$18\n" }, | |
81 | ||
3845fbd6 | 82 | { "_mfpr\n", |
2a48bcf5 SL |
83 | " mfpr (sp)+,r0\n" }, |
84 | ||
3845fbd6 | 85 | { "_mtpr\n", |
2a48bcf5 SL |
86 | " mtpr 4(sp),(sp)\n\ |
87 | addl2 $8,sp\n" }, | |
88 | ||
3845fbd6 | 89 | { "_setsoftclock\n", |
2a48bcf5 SL |
90 | " mtpr $0x8,$0x14\n" }, |
91 | ||
3845fbd6 | 92 | { "_resume\n", |
2a48bcf5 SL |
93 | " ashl $9,(sp)+,r0 \n\ |
94 | movpsl -(sp) \n\ | |
95 | jsb _Resume\n" }, | |
96 | ||
3845fbd6 | 97 | { "_bcopy\n", |
2a48bcf5 SL |
98 | " movc3 8(sp),*(sp),*4(sp)\n\ |
99 | addl2 $12,sp\n" }, | |
100 | ||
3845fbd6 | 101 | { "_ovbcopy\n", |
2a48bcf5 SL |
102 | " movc3 8(sp),*(sp),*4(sp)\n\ |
103 | addl2 $12,sp\n" }, | |
104 | ||
3845fbd6 | 105 | { "_bzero\n", |
2a48bcf5 SL |
106 | " movc5 $0,(r0),$0,4(sp),*(sp)\n\ |
107 | addl2 $8,sp\n" }, | |
108 | ||
3845fbd6 | 109 | { "_bcmp\n", |
2a48bcf5 SL |
110 | " popr $0x7\n\ |
111 | cmpc3 r2,(r0),(r1)\n" }, | |
112 | ||
3845fbd6 | 113 | { "_strncmp\n", |
2a48bcf5 SL |
114 | " cmpc3 8(sp),*(sp),*4(sp)\n\ |
115 | addl2 $12,sp\n" }, | |
116 | ||
3845fbd6 | 117 | { "_blkclr\n", |
2a48bcf5 SL |
118 | " movl (sp)+,r3\n\ |
119 | jbr 2f\n\ | |
120 | 1:\n\ | |
121 | subl2 r0,(sp)\n\ | |
122 | movc5 $0,(r3),$0,r0,(r3)\n\ | |
123 | 2:\n\ | |
124 | movzwl $65535,r0\n\ | |
125 | cmpl (sp),r0\n\ | |
126 | jgtr 1b\n\ | |
127 | movl (sp)+,r0\n\ | |
128 | movc5 $0,(r3),$0,r0,(r3)\n" }, | |
129 | ||
3845fbd6 | 130 | { "_strlen\n", |
2a48bcf5 SL |
131 | " movl (sp),r1\n\ |
132 | 1:\n\ | |
133 | locc $0,$65535,(r1)\n\ | |
134 | jeql 1b\n\ | |
135 | subl3 (sp)+,r1,r0\n" }, | |
136 | ||
3845fbd6 | 137 | { "_scanc\n", |
2a48bcf5 SL |
138 | " popr $0xf\n\ |
139 | scanc r0,(r1),(r2),r3\n" }, | |
140 | ||
5f9171ac KM |
141 | { "_skpc\n", |
142 | " popr $0x7\n\ | |
143 | skpc r0,r1,(r2)\n" }, | |
144 | ||
3845fbd6 | 145 | { "_copyin\n", |
2a48bcf5 SL |
146 | " jsb _Copyin\n\ |
147 | addl2 $12,sp\n" }, | |
148 | ||
3845fbd6 | 149 | { "_copyout\n", |
2a48bcf5 SL |
150 | " jsb _Copyout\n\ |
151 | addl2 $12,sp\n" }, | |
152 | ||
3845fbd6 | 153 | { "_fubyte\n", |
2a48bcf5 SL |
154 | " movl (sp)+,r0\n\ |
155 | jsb _Fubyte\n" }, | |
156 | ||
3845fbd6 | 157 | { "_fuibyte\n", |
2a48bcf5 SL |
158 | " movl (sp)+,r0\n\ |
159 | jsb _Fubyte\n" }, | |
160 | ||
3845fbd6 | 161 | { "_fuword\n", |
2a48bcf5 SL |
162 | " movl (sp)+,r0\n\ |
163 | jsb _Fuword\n" }, | |
164 | ||
3845fbd6 | 165 | { "_fuiword\n", |
2a48bcf5 SL |
166 | " movl (sp)+,r0\n\ |
167 | jsb _Fuword\n" }, | |
168 | ||
3845fbd6 | 169 | { "_subyte\n", |
2a48bcf5 SL |
170 | " movl (sp)+,r0\n\ |
171 | movl (sp)+,r1\n\ | |
172 | jsb _Subyte\n" }, | |
173 | ||
3845fbd6 | 174 | { "_suibyte\n", |
2a48bcf5 SL |
175 | " movl (sp)+,r0\n\ |
176 | movl (sp)+,r1\n\ | |
177 | jsb _Subyte\n" }, | |
178 | ||
3845fbd6 | 179 | { "_suword\n", |
2a48bcf5 SL |
180 | " movl (sp)+,r0\n\ |
181 | movl (sp)+,r1\n\ | |
182 | jsb _Suword\n" }, | |
183 | ||
3845fbd6 | 184 | { "_suiword\n", |
2a48bcf5 SL |
185 | " movl (sp)+,r0\n\ |
186 | movl (sp)+,r1\n\ | |
187 | jsb _Suword\n" }, | |
188 | ||
3845fbd6 | 189 | { "_setrq\n", |
2a48bcf5 SL |
190 | " movl (sp)+,r0 \n\ |
191 | jsb _Setrq\n" }, | |
192 | ||
3845fbd6 | 193 | { "_remrq\n", |
2a48bcf5 SL |
194 | " movl (sp)+,r0 \n\ |
195 | jsb _Remrq\n" }, | |
196 | ||
3845fbd6 | 197 | { "_swtch\n", |
2a48bcf5 SL |
198 | " movpsl -(sp)\n\ |
199 | jsb _Swtch\n" }, | |
200 | ||
3845fbd6 | 201 | { "_setjmp\n", |
2a48bcf5 SL |
202 | " movl (sp)+,r0 \n\ |
203 | jsb _Setjmp\n" }, | |
204 | ||
3845fbd6 | 205 | { "_longjmp\n", |
2a48bcf5 SL |
206 | " movl (sp)+,r0 \n\ |
207 | jsb _Longjmp\n" }, | |
208 | ||
3845fbd6 | 209 | { "_ffs\n", |
2a48bcf5 SL |
210 | " movl (sp)+,r1\n\ |
211 | ffs $0,$32,r1,r0 \n\ | |
212 | bneq 1f \n\ | |
213 | mnegl $1,r0 \n\ | |
214 | 1: \n\ | |
215 | incl r0\n" }, | |
216 | ||
3845fbd6 | 217 | { "_htons\n", |
2a48bcf5 SL |
218 | " rotl $8,(sp),r0\n\ |
219 | movb 1(sp),r0\n\ | |
220 | movzwl r0,r0\n\ | |
221 | addl2 $4,sp\n" }, | |
222 | ||
3845fbd6 | 223 | { "_ntohs\n", |
2a48bcf5 SL |
224 | " rotl $8,(sp),r0\n\ |
225 | movb 1(sp),r0\n\ | |
226 | movzwl r0,r0\n\ | |
227 | addl2 $4,sp\n" }, | |
228 | ||
3845fbd6 | 229 | { "_htonl\n", |
2a48bcf5 SL |
230 | " rotl $-8,(sp),r0\n\ |
231 | insv r0,$16,$8,r0\n\ | |
232 | movb 3(sp),r0\n\ | |
233 | addl2 $4,sp\n" }, | |
234 | ||
3845fbd6 | 235 | { "_ntohl\n", |
2a48bcf5 SL |
236 | " rotl $-8,(sp),r0\n\ |
237 | insv r0,$16,$8,r0\n\ | |
238 | movb 3(sp),r0\n\ | |
239 | addl2 $4,sp\n" }, | |
240 | ||
3845fbd6 | 241 | { "__insque\n", |
2a48bcf5 SL |
242 | " insque *(sp)+,*(sp)+\n" }, |
243 | ||
3845fbd6 | 244 | { "__remque\n", |
2a48bcf5 SL |
245 | " remque *(sp)+,r0\n" }, |
246 | ||
3845fbd6 | 247 | { "__queue\n", |
2a48bcf5 SL |
248 | " movl (sp)+,r0\n\ |
249 | movl (sp)+,r1\n\ | |
250 | insque r1,*4(r0)\n" }, | |
251 | ||
3845fbd6 | 252 | { "__dequeue\n", |
2a48bcf5 SL |
253 | " movl (sp)+,r0\n\ |
254 | remque *(r0),r0\n" }, | |
255 | }; | |
256 | struct pats *htbl[HSHSIZ]; | |
257 | ||
258 | #define HASH(cp, hp) {\ | |
259 | hash = 0; rehash = 1; ccp = cp; \ | |
260 | do { \ | |
261 | hash *= (int)*ccp++; \ | |
262 | } while (*ccp && *ccp != '\n'); \ | |
263 | hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \ | |
264 | } | |
265 | ||
266 | #define REHASH(hp) {\ | |
267 | hp += rehash; rehash += 2; \ | |
268 | if (hp >= &htbl[HSHSIZ]) \ | |
269 | hp -= HSHSIZ; \ | |
270 | } | |
271 | ||
272 | main(argc, argv) | |
273 | char *argv[]; | |
274 | { | |
275 | register struct pats *pp, **hp; | |
276 | register char *cp, *ccp, *lp; | |
277 | register int hash, rehash, size; | |
278 | char line[BUFSIZ]; | |
279 | extern char *index(); | |
280 | ||
281 | if (argc > 1) | |
282 | freopen(argv[1], "r", stdin); | |
283 | if (argc > 2) | |
284 | freopen(argv[2], "w", stdout); | |
285 | /* | |
286 | * Set up the hash table. | |
287 | */ | |
288 | for (pp = ptab; pp < &ptab[sizeof (ptab)/sizeof (ptab[0])]; pp++) { | |
289 | HASH(pp->name, hp); | |
290 | while (*hp) | |
291 | REHASH(hp); | |
292 | *hp = pp; | |
293 | } | |
294 | /* | |
295 | * Check each line and replace as appropriate. | |
296 | */ | |
297 | while (fgets(line, BUFSIZ, stdin)) { | |
298 | lp = index(line, ':'); | |
299 | for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; ) | |
300 | cp++; | |
301 | #define CALLS "calls\t" | |
302 | if (strncmp(cp, CALLS, sizeof (CALLS) - 1) != 0) { | |
303 | fputs(line, stdout); | |
304 | continue; | |
305 | } | |
3845fbd6 SL |
306 | for (cp += sizeof (CALLS) - 1; *cp && *cp != ','; cp++) |
307 | ; | |
308 | if (*cp != ',') { | |
309 | fputs(line, stdout); | |
310 | continue; | |
311 | } | |
312 | cp++; | |
2a48bcf5 SL |
313 | HASH(cp, hp); |
314 | while (*hp) { | |
315 | if (strncmp((*hp)->name, cp, size) == NULL) { | |
316 | if (lp != NULL) { | |
317 | *lp++ = '\n'; | |
318 | *lp = '\0'; | |
319 | fputs(line, stdout); | |
320 | } | |
321 | fputs((*hp)->replace, stdout); | |
322 | goto nextline; | |
323 | } | |
324 | REHASH(hp); | |
325 | } | |
326 | fputs(line, stdout); | |
327 | nextline: | |
328 | ; | |
329 | } | |
330 | exit(0); | |
331 | } |