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