1 #ifndef lint 2 static char sccsid[] = "@(#)langpats.c 1.3 (Berkeley) 07/27/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 { "_copyin\n", 142 " jsb _Copyin\n\ 143 addl2 $12,sp\n" }, 144 145 { "_copyout\n", 146 " jsb _Copyout\n\ 147 addl2 $12,sp\n" }, 148 149 { "_fubyte\n", 150 " movl (sp)+,r0\n\ 151 jsb _Fubyte\n" }, 152 153 { "_fuibyte\n", 154 " movl (sp)+,r0\n\ 155 jsb _Fubyte\n" }, 156 157 { "_fuword\n", 158 " movl (sp)+,r0\n\ 159 jsb _Fuword\n" }, 160 161 { "_fuiword\n", 162 " movl (sp)+,r0\n\ 163 jsb _Fuword\n" }, 164 165 { "_subyte\n", 166 " movl (sp)+,r0\n\ 167 movl (sp)+,r1\n\ 168 jsb _Subyte\n" }, 169 170 { "_suibyte\n", 171 " movl (sp)+,r0\n\ 172 movl (sp)+,r1\n\ 173 jsb _Subyte\n" }, 174 175 { "_suword\n", 176 " movl (sp)+,r0\n\ 177 movl (sp)+,r1\n\ 178 jsb _Suword\n" }, 179 180 { "_suiword\n", 181 " movl (sp)+,r0\n\ 182 movl (sp)+,r1\n\ 183 jsb _Suword\n" }, 184 185 { "_setrq\n", 186 " movl (sp)+,r0 \n\ 187 jsb _Setrq\n" }, 188 189 { "_remrq\n", 190 " movl (sp)+,r0 \n\ 191 jsb _Remrq\n" }, 192 193 { "_swtch\n", 194 " movpsl -(sp)\n\ 195 jsb _Swtch\n" }, 196 197 { "_setjmp\n", 198 " movl (sp)+,r0 \n\ 199 jsb _Setjmp\n" }, 200 201 { "_longjmp\n", 202 " movl (sp)+,r0 \n\ 203 jsb _Longjmp\n" }, 204 205 { "_ffs\n", 206 " movl (sp)+,r1\n\ 207 ffs $0,$32,r1,r0 \n\ 208 bneq 1f \n\ 209 mnegl $1,r0 \n\ 210 1: \n\ 211 incl r0\n" }, 212 213 { "_htons\n", 214 " rotl $8,(sp),r0\n\ 215 movb 1(sp),r0\n\ 216 movzwl r0,r0\n\ 217 addl2 $4,sp\n" }, 218 219 { "_ntohs\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 { "_htonl\n", 226 " rotl $-8,(sp),r0\n\ 227 insv r0,$16,$8,r0\n\ 228 movb 3(sp),r0\n\ 229 addl2 $4,sp\n" }, 230 231 { "_ntohl\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 { "__insque\n", 238 " insque *(sp)+,*(sp)+\n" }, 239 240 { "__remque\n", 241 " remque *(sp)+,r0\n" }, 242 243 { "__queue\n", 244 " movl (sp)+,r0\n\ 245 movl (sp)+,r1\n\ 246 insque r1,*4(r0)\n" }, 247 248 { "__dequeue\n", 249 " movl (sp)+,r0\n\ 250 remque *(r0),r0\n" }, 251 }; 252 struct pats *htbl[HSHSIZ]; 253 254 #define HASH(cp, hp) {\ 255 hash = 0; rehash = 1; ccp = cp; \ 256 do { \ 257 hash *= (int)*ccp++; \ 258 } while (*ccp && *ccp != '\n'); \ 259 hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \ 260 } 261 262 #define REHASH(hp) {\ 263 hp += rehash; rehash += 2; \ 264 if (hp >= &htbl[HSHSIZ]) \ 265 hp -= HSHSIZ; \ 266 } 267 268 main(argc, argv) 269 char *argv[]; 270 { 271 register struct pats *pp, **hp; 272 register char *cp, *ccp, *lp; 273 register int hash, rehash, size; 274 char line[BUFSIZ]; 275 extern char *index(); 276 277 if (argc > 1) 278 freopen(argv[1], "r", stdin); 279 if (argc > 2) 280 freopen(argv[2], "w", stdout); 281 /* 282 * Set up the hash table. 283 */ 284 for (pp = ptab; pp < &ptab[sizeof (ptab)/sizeof (ptab[0])]; pp++) { 285 HASH(pp->name, hp); 286 while (*hp) 287 REHASH(hp); 288 *hp = pp; 289 } 290 /* 291 * Check each line and replace as appropriate. 292 */ 293 while (fgets(line, BUFSIZ, stdin)) { 294 lp = index(line, ':'); 295 for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; ) 296 cp++; 297 #define CALLS "calls\t" 298 if (strncmp(cp, CALLS, sizeof (CALLS) - 1) != 0) { 299 fputs(line, stdout); 300 continue; 301 } 302 for (cp += sizeof (CALLS) - 1; *cp && *cp != ','; cp++) 303 ; 304 if (*cp != ',') { 305 fputs(line, stdout); 306 continue; 307 } 308 cp++; 309 HASH(cp, hp); 310 while (*hp) { 311 if (strncmp((*hp)->name, cp, size) == NULL) { 312 if (lp != NULL) { 313 *lp++ = '\n'; 314 *lp = '\0'; 315 fputs(line, stdout); 316 } 317 fputs((*hp)->replace, stdout); 318 goto nextline; 319 } 320 REHASH(hp); 321 } 322 fputs(line, stdout); 323 nextline: 324 ; 325 } 326 exit(0); 327 } 328