19ef1f84bSDavid du ColombierBEGIN{ 29ef1f84bSDavid du Colombier oargc = 0; 39ef1f84bSDavid du Colombier for(argc = 1; argc < ARGC; argc++){ 49ef1f84bSDavid du Colombier if(ARGV[argc] !~ /^-.+/ || ARGV[argc] ~ /--/) 59ef1f84bSDavid du Colombier break; 69ef1f84bSDavid du Colombier if(ARGV[argc] != "-D") 79ef1f84bSDavid du Colombier oargv[ARGV[argc]] = oargc++; 89ef1f84bSDavid du Colombier else 99ef1f84bSDavid du Colombier DEBUG = 1; 109ef1f84bSDavid du Colombier ARGV[argc] = ""; 119ef1f84bSDavid du Colombier } 129ef1f84bSDavid du Colombier 139ef1f84bSDavid du Colombier objtype = ENVIRON["objtype"]; 149ef1f84bSDavid du Colombier 159ef1f84bSDavid du Colombier while(getline > 0){ 169ef1f84bSDavid du Colombier if(/^[ \t]*$/ || /^#/) 179ef1f84bSDavid du Colombier continue; 189ef1f84bSDavid du Colombier 199ef1f84bSDavid du Colombier if(/^[^ \t]/){ 209ef1f84bSDavid du Colombier #section[$1] = 0; 219ef1f84bSDavid du Colombier tag = $1; 229ef1f84bSDavid du Colombier } 239ef1f84bSDavid du Colombier if(!tag) 249ef1f84bSDavid du Colombier continue; 259ef1f84bSDavid du Colombier sub(/^[ \t]*/, ""); 269ef1f84bSDavid du Colombier line[tag, section[tag]++] = $0; 279ef1f84bSDavid du Colombier } 289ef1f84bSDavid du Colombier 299ef1f84bSDavid du Colombier o = ""; 309ef1f84bSDavid du Colombier if(!oargc || ("-mkdevlist" in oargv)){ 319ef1f84bSDavid du Colombier s = mkdevlist(); 329ef1f84bSDavid du Colombier if(!("-mkdevlist" in oargv) || (oargc > 1)) 339ef1f84bSDavid du Colombier s = "DEVS=" s; 349ef1f84bSDavid du Colombier o = o s "\n"; 359ef1f84bSDavid du Colombier } 369ef1f84bSDavid du Colombier if((!oargc || ("-mkmach" in oargv)) && (objtype in section)){ 379ef1f84bSDavid du Colombier s = mkmach(); 389ef1f84bSDavid du Colombier if(!("-mkmach" in oargv) || (oargc > 1)) 399ef1f84bSDavid du Colombier s = "MACH=" s; 409ef1f84bSDavid du Colombier o = o s "\n"; 419ef1f84bSDavid du Colombier } 429ef1f84bSDavid du Colombier if((!oargc || ("-mklib" in oargv)) && ("lib" in section)){ 439ef1f84bSDavid du Colombier s = mklib(); 449ef1f84bSDavid du Colombier if(!("-mklib" in oargv) || (oargc > 1)) 459ef1f84bSDavid du Colombier s = "LIB=" s; 469ef1f84bSDavid du Colombier o = o s "\n"; 479ef1f84bSDavid du Colombier } 489ef1f84bSDavid du Colombier if((!oargc || ("-mkport" in oargv)) && ("port" in section)){ 499ef1f84bSDavid du Colombier s = mkport(); 509ef1f84bSDavid du Colombier if(!("-mkport" in oargv) || (oargc > 1)) 519ef1f84bSDavid du Colombier s = "PORT=" s; 529ef1f84bSDavid du Colombier o = o s "\n"; 539ef1f84bSDavid du Colombier } 549ef1f84bSDavid du Colombier if((!oargc || ("-mklinux" in oargv)) && ("linux" in section)){ 559ef1f84bSDavid du Colombier s = mklinux(); 569ef1f84bSDavid du Colombier if(!("-mklinux" in oargv) || (oargc > 1)) 579ef1f84bSDavid du Colombier s = "LINUX=" s; 589ef1f84bSDavid du Colombier o = o s "\n"; 599ef1f84bSDavid du Colombier } 609ef1f84bSDavid du Colombier if("dbgflg" in section){ 619ef1f84bSDavid du Colombier for(i = 1; i < section["dbgflg"]; i++){ 629ef1f84bSDavid du Colombier n = split(line["dbgflg", i], a); 639ef1f84bSDavid du Colombier if(n < 2 || n > 4 || a[2] !~ /'[a-zA-Z]'/) 649ef1f84bSDavid du Colombier continue; 659ef1f84bSDavid du Colombier if(n > 2 && a[3] !~ /'[a-zA-Z]'/) 669ef1f84bSDavid du Colombier continue; 679ef1f84bSDavid du Colombier if(n == 4 && (a[4] < 1 || a[4] >= 128)) 689ef1f84bSDavid du Colombier continue; 699ef1f84bSDavid du Colombier dbgc[a[1]] = a[2]; 709ef1f84bSDavid du Colombier if(n == 4) 719ef1f84bSDavid du Colombier dbgflg[a[3]] = a[4]; 729ef1f84bSDavid du Colombier else if(n == 3) 739ef1f84bSDavid du Colombier dbgflg[a[3]] = 1; 749ef1f84bSDavid du Colombier } 759ef1f84bSDavid du Colombier } 769ef1f84bSDavid du Colombier if((!oargc || ("-mkrules" in oargv)) && ("dir" in section)){ 779ef1f84bSDavid du Colombier o = o mkrules(".", exists, a, c, "-I."); 789ef1f84bSDavid du Colombier for(i = 1; i < section["dir"]; i++){ 799ef1f84bSDavid du Colombier n = split(line["dir", i], a); 809ef1f84bSDavid du Colombier dir = "../" a[1]; 819ef1f84bSDavid du Colombier if(n == 1) 829ef1f84bSDavid du Colombier a[2] = "-I."; 839ef1f84bSDavid du Colombier s = a[2]; 849ef1f84bSDavid du Colombier o = o mkrules(dir, exists, a, c, s); 859ef1f84bSDavid du Colombier l = listolate(a, "|"); 869ef1f84bSDavid du Colombier if(l != ""){ 879ef1f84bSDavid du Colombier o = o "^(" l ")\\.$O:R: " dir "/\\1.s\n"; 889ef1f84bSDavid du Colombier o = o "\t$AS $AFLAGS " s " " dir "/$stem1.s\n"; 899ef1f84bSDavid du Colombier } 909ef1f84bSDavid du Colombier l = listolate(c, "|"); 919ef1f84bSDavid du Colombier if(l != ""){ 929ef1f84bSDavid du Colombier o = o "^(" l ")\\.$O:R: " dir "/\\1.c\n"; 939ef1f84bSDavid du Colombier o = o "\t$CC $CFLAGS " s " " dir "/$stem1.c\n"; 949ef1f84bSDavid du Colombier } 959ef1f84bSDavid du Colombier } 969ef1f84bSDavid du Colombier } 979ef1f84bSDavid du Colombier if((!oargc || ("-mkrootrules" in oargv)) && ("rootdir" in section)){ 989ef1f84bSDavid du Colombier mkrootrules(name, cname, src); 999ef1f84bSDavid du Colombier s = ARGV[argc] ".root.s:D:"; 1009ef1f84bSDavid du Colombier for(i = 1; i < section["rootdir"]; i++) 1019ef1f84bSDavid du Colombier s = s " " src[i]; 1029ef1f84bSDavid du Colombier s = s "\n\t../mk/mkrootall\\\n"; 1039ef1f84bSDavid du Colombier for(i = 1; i < section["rootdir"]; i++) 1049ef1f84bSDavid du Colombier s = s "\t\t" name[i] " " cname[i] " " src[i] "\\\n"; 1059ef1f84bSDavid du Colombier s = s "\t>$target\n"; 1069ef1f84bSDavid du Colombier if(section["rootdir"] > 1) 1079ef1f84bSDavid du Colombier o = o s; 1089ef1f84bSDavid du Colombier } 1099ef1f84bSDavid du Colombier if((!oargc || ("-mkrrrules" in oargv)) && ("rr" in section)){ 1109ef1f84bSDavid du Colombier n = split(line["rr", 0], a); 1119ef1f84bSDavid du Colombier if(n == 1) 1129ef1f84bSDavid du Colombier a[2] = ARGV[argc] ".proto"; 1139ef1f84bSDavid du Colombier s = "$CONF.rr:\t../mk/mkrr $CONF " a[2] "\n"; 1149ef1f84bSDavid du Colombier s = s "\t../mk/mkrr $CONF " a[2] "\n"; 1159ef1f84bSDavid du Colombier for(i = 1; i < section["rr"]; i++) 1169ef1f84bSDavid du Colombier s = s "$CONF.rr:\t" line["rr", i] "\n"; 1179ef1f84bSDavid du Colombier o = o s; 1189ef1f84bSDavid du Colombier } 1199ef1f84bSDavid du Colombier if("-mkdevc" in oargv) 1209ef1f84bSDavid du Colombier o = o mkdevc(); 1219ef1f84bSDavid du Colombier if("-mkerrstr" in oargv) 1229ef1f84bSDavid du Colombier o = o mkerrstr(); 1239ef1f84bSDavid du Colombier if("-mksystab" in oargv) 1249ef1f84bSDavid du Colombier o = o mksystab(); 1259ef1f84bSDavid du Colombier if("-mkbootconf" in oargv) 1269ef1f84bSDavid du Colombier o = o mkbootconf(); 1279ef1f84bSDavid du Colombier 1289ef1f84bSDavid du Colombier # 1299ef1f84bSDavid du Colombier # to do: 1309ef1f84bSDavid du Colombier # bootmkfile 1319ef1f84bSDavid du Colombier # mkrootall (can it be done at all?) 1329ef1f84bSDavid du Colombier # 1339ef1f84bSDavid du Colombier printf o; 1349ef1f84bSDavid du Colombier 1359ef1f84bSDavid du Colombier exit 0; 1369ef1f84bSDavid du Colombier} 1379ef1f84bSDavid du Colombier 1389ef1f84bSDavid du Colombierfunction mkbootconf( a, n, s, t, u, c, d, p, r){ 1399ef1f84bSDavid du Colombier s = "#include <u.h>\n"; 1409ef1f84bSDavid du Colombier s = s "#include <libc.h>\n\n"; 1419ef1f84bSDavid du Colombier s = s "#include \"../boot/boot.h\"\n\n"; 1429ef1f84bSDavid du Colombier s = s "Method method[] = {\n"; 1439ef1f84bSDavid du Colombier 1449ef1f84bSDavid du Colombier c = "0"; 1459ef1f84bSDavid du Colombier d = "#S/sdC0/"; 1469ef1f84bSDavid du Colombier p = "boot"; 1479ef1f84bSDavid du Colombier r = "/root"; 1489ef1f84bSDavid du Colombier 1499ef1f84bSDavid du Colombier for(i = 0; i < section["boot"]; i++){ # NOTE: start at 0 1509ef1f84bSDavid du Colombier n = split(line["boot", i], a); 1519ef1f84bSDavid du Colombier if(a[1] == "boot"){ 1529ef1f84bSDavid du Colombier if(a[2] == "cpu"){ 1539ef1f84bSDavid du Colombier c = "1"; 1549ef1f84bSDavid du Colombier if(n == 4 && a[3] == "boot") 1559ef1f84bSDavid du Colombier d = a[4]; 1569ef1f84bSDavid du Colombier } 1579ef1f84bSDavid du Colombier else if(a[2] == "rootdir" && n == 3) 1589ef1f84bSDavid du Colombier r = a[3]; 1599ef1f84bSDavid du Colombier else if(a[2] ~ /^(bboot|dosboot|romboot)$/){ 1609ef1f84bSDavid du Colombier c = "1"; 1619ef1f84bSDavid du Colombier p = a[2]; 1629ef1f84bSDavid du Colombier } 1639ef1f84bSDavid du Colombier else if(a[2] == "boot" && n == 3) 1649ef1f84bSDavid du Colombier d = a[3]; 1659ef1f84bSDavid du Colombier continue; 1669ef1f84bSDavid du Colombier } 1679ef1f84bSDavid du Colombier s = s "\t{ \"" a[1] "\", config" a[1] ", connect" a[1] ", "; 1689ef1f84bSDavid du Colombier t = "nil"; 1699ef1f84bSDavid du Colombier if(n > 1){ 1709ef1f84bSDavid du Colombier u = line["boot", i]; 1719ef1f84bSDavid du Colombier if(sub(/^[_A-Za-z][_A-Za-z0-9]*[ \t]*/, "", u)){ 1729ef1f84bSDavid du Colombier if(match(u, /^".*"$/)) 1739ef1f84bSDavid du Colombier u = substr(u, RSTART+1, RLENGTH-2); 1749ef1f84bSDavid du Colombier t = "\"" u "\""; 1759ef1f84bSDavid du Colombier } 1769ef1f84bSDavid du Colombier } 1779ef1f84bSDavid du Colombier s = s t ", },\n"; 1789ef1f84bSDavid du Colombier } 1799ef1f84bSDavid du Colombier s = s "\t{ nil },\n};\n\n"; 1809ef1f84bSDavid du Colombier s = s "int cpuflag = " c ";\n"; 1819ef1f84bSDavid du Colombier s = s "char* rootdir = \"" r "\";\n"; 1829ef1f84bSDavid du Colombier s = s "char* bootdisk = \"" d "\";\n"; 1839ef1f84bSDavid du Colombier s = s "extern void " p "(int, char**);\n\n"; 1849ef1f84bSDavid du Colombier s = s "void\nmain(int argc, char **argv)\n"; 1859ef1f84bSDavid du Colombier s = s "{\n\t" p "(argc, argv);\n}\n" 1869ef1f84bSDavid du Colombier 1879ef1f84bSDavid du Colombier t = "int (*cfs)(int) = 0;\n"; 1889ef1f84bSDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 1899ef1f84bSDavid du Colombier if($1 !~ /\/bin\/cfs$/) 1909ef1f84bSDavid du Colombier continue; 1919ef1f84bSDavid du Colombier t = "int (*cfs)(int) = cache;\n"; 1929ef1f84bSDavid du Colombier break; 1939ef1f84bSDavid du Colombier } 1949ef1f84bSDavid du Colombier s = s t; 1959ef1f84bSDavid du Colombier 1969ef1f84bSDavid du Colombier return s; 1979ef1f84bSDavid du Colombier} 1989ef1f84bSDavid du Colombier 1999ef1f84bSDavid du Colombierfunction mksystab( a, i, f, n, s, t){ 2009ef1f84bSDavid du Colombier s = "#include \"u.h\"\n"; 2019ef1f84bSDavid du Colombier s = s "#include \"../port/lib.h\"\n"; 2029ef1f84bSDavid du Colombier s = s "#include \"mem.h\"\n"; 2039ef1f84bSDavid du Colombier s = s "#include \"dat.h\"\n"; 2049ef1f84bSDavid du Colombier s = s "#include \"fns.h\"\n\n"; 2059ef1f84bSDavid du Colombier s = s "#include \"/sys/src/libc/9syscall/sys.h\"\n\n"; 2069ef1f84bSDavid du Colombier 2079ef1f84bSDavid du Colombier t = ""; 2089ef1f84bSDavid du Colombier while(getline < "/sys/src/libc/9syscall/sys.h"){ 2099ef1f84bSDavid du Colombier if($1 != "#define" || NF != 3) 2109ef1f84bSDavid du Colombier continue; 2119ef1f84bSDavid du Colombier 2129ef1f84bSDavid du Colombier f = "sys" tolower($2); 2139ef1f84bSDavid du Colombier if($2 == "SYSR1") 2149ef1f84bSDavid du Colombier f = "sysr1"; 2159ef1f84bSDavid du Colombier if($2 == "RENDEZVOUS") 2169ef1f84bSDavid du Colombier n = "Rendez"; 2179ef1f84bSDavid du Colombier else if($2 == "BRK_") 2189ef1f84bSDavid du Colombier n = "Brk"; 2199ef1f84bSDavid du Colombier else 2209ef1f84bSDavid du Colombier n = substr($2, 1, 1) tolower(substr($2, 2)); 2219ef1f84bSDavid du Colombier 2229ef1f84bSDavid du Colombier s = s "extern void " f "(Ar0*, va_list);\n"; 2239ef1f84bSDavid du Colombier t = t "\t[" $2 "]\t"; 2249ef1f84bSDavid du Colombier if(length($2) < 6) 2259ef1f84bSDavid du Colombier t = t "\t"; 2269ef1f84bSDavid du Colombier t = t "{ \"" n "\", " f ", "; 2279ef1f84bSDavid du Colombier # 2289ef1f84bSDavid du Colombier # The following should really be defined properly in the 2299ef1f84bSDavid du Colombier # manual and code, but changing Plan 9 now is too awkward. 2309ef1f84bSDavid du Colombier # It will matter more when sizeof(long) != sizeof(int). 2319ef1f84bSDavid du Colombier # 2329ef1f84bSDavid du Colombier # if($2 ~ "^(FVERSION|STAT|FSTAT|WSTAT|FWSTAT|AWAIT)$") 2339ef1f84bSDavid du Colombier # t = t "{ .u = 0 } },\n"; 2349ef1f84bSDavid du Colombier # 2359ef1f84bSDavid du Colombier # if($2 ~ "^(BIND|_MOUNT|MOUNT)$") 2369ef1f84bSDavid du Colombier # t = t "{ .l = -1 } },\n"; 2379ef1f84bSDavid du Colombier # 2389ef1f84bSDavid du Colombier # The "^(...)$" are to ensure only exact matches are made. 2399ef1f84bSDavid du Colombier # 2409ef1f84bSDavid du Colombier if($2 ~ "^(EXEC|SEGBRK|SEGATTACH|RENDEZVOUS)$") 2419ef1f84bSDavid du Colombier t = t "{ .v = (void*)-1 } },\n"; 2429ef1f84bSDavid du Colombier else if($2 ~ "^(ALARM|_READ|_WRITE|PREAD|PWRITE)$") 2439ef1f84bSDavid du Colombier t = t "{ .l = -1 } },\n"; 2445891e653SDavid du Colombier else if($2 ~ "(NSEC)") 2455891e653SDavid du Colombier t = t "{ .vl = -1LL } },\n"; 2469ef1f84bSDavid du Colombier else 2479ef1f84bSDavid du Colombier t = t "{ .i = -1 } },\n"; 2489ef1f84bSDavid du Colombier } 2499ef1f84bSDavid du Colombier if("syscall" in section){ 2509ef1f84bSDavid du Colombier for(i = 1; i < section["syscall"]; i++){ 2519ef1f84bSDavid du Colombier if(split(line["syscall", i], a) != 8) 2529ef1f84bSDavid du Colombier continue; 2539ef1f84bSDavid du Colombier if(line["syscall", i] !~ /#define.*{ \.[ilpuv] = .* }$/) 2549ef1f84bSDavid du Colombier continue; 2559ef1f84bSDavid du Colombier 2569ef1f84bSDavid du Colombier f = "sys" tolower(a[2]); 2579ef1f84bSDavid du Colombier n = substr(a[2], 1, 1) tolower(substr(a[2], 2)); 2589ef1f84bSDavid du Colombier 2599ef1f84bSDavid du Colombier s = s "\nSyscall " f ";\n"; 2609ef1f84bSDavid du Colombier t = t a[1] " " a[2] "\t" a[3] "\n\t[" a[2] "]\t"; 2619ef1f84bSDavid du Colombier if(length(a[2]) < 6) 2629ef1f84bSDavid du Colombier t = t "\t"; 2639ef1f84bSDavid du Colombier split(line["syscall", i], a, "{"); 2649ef1f84bSDavid du Colombier t = t "{ \"" n "\", " f ", {" a[2] " },\n"; 2659ef1f84bSDavid du Colombier } 2669ef1f84bSDavid du Colombier } 2679ef1f84bSDavid du Colombier s = s "struct {\n\tchar*\tn;\n\tvoid (*f)(Ar0*, va_list);\n\tAr0\tr;\n}"; 2689ef1f84bSDavid du Colombier s = s " systab[] = {\n" t "};\n\nint nsyscall = nelem(systab);\n"; 2699ef1f84bSDavid du Colombier 2709ef1f84bSDavid du Colombier return s; 2719ef1f84bSDavid du Colombier} 2729ef1f84bSDavid du Colombier 2739ef1f84bSDavid du Colombierfunction mkerrstr( a, s){ 2749ef1f84bSDavid du Colombier FS="[ \t;]+"; 2759ef1f84bSDavid du Colombier while(getline < "../port/error.h"){ 2769ef1f84bSDavid du Colombier split($0, a, /\/\* | \*\//); 2779ef1f84bSDavid du Colombier s = s $2 " " $3 " = \"" a[2] "\";\n"; 2789ef1f84bSDavid du Colombier } 2799ef1f84bSDavid du Colombier FS=" "; 2809ef1f84bSDavid du Colombier 2819ef1f84bSDavid du Colombier return s; 2829ef1f84bSDavid du Colombier} 2839ef1f84bSDavid du Colombier 2849ef1f84bSDavid du Colombierfunction mkdevc( a, d, i, m, n, s, t, u, name, cname){ 2859ef1f84bSDavid du Colombier s = "#include \"u.h\"\n"; 2869ef1f84bSDavid du Colombier s = s "#include \"../port/lib.h\"\n"; 2879ef1f84bSDavid du Colombier s = s "#include \"mem.h\"\n"; 2889ef1f84bSDavid du Colombier s = s "#include \"dat.h\"\n"; 2899ef1f84bSDavid du Colombier s = s "#include \"fns.h\"\n"; 2909ef1f84bSDavid du Colombier s = s "#include \"../port/error.h\"\n\n"; 2919ef1f84bSDavid du Colombier s = s "#include \"io.h\"\n\n"; 2929ef1f84bSDavid du Colombier 2939ef1f84bSDavid du Colombier t = ""; 2949ef1f84bSDavid du Colombier for(i = 1; i < section["dev"]; i++){ 2959ef1f84bSDavid du Colombier split(line["dev", i], a); 2969ef1f84bSDavid du Colombier s = s "extern Dev " a[1] "devtab;\n"; 2979ef1f84bSDavid du Colombier t = t "\t&" a[1] "devtab,\n"; 2989ef1f84bSDavid du Colombier d[a[1]]++; 2999ef1f84bSDavid du Colombier } 3009ef1f84bSDavid du Colombier s = s "Dev* devtab[] = {\n" t "\tnil,\n};\n\n"; 3019ef1f84bSDavid du Colombier 3029ef1f84bSDavid du Colombier if(!("acpi" in d)) 3039ef1f84bSDavid du Colombier s = s "int\nacpiinit(void)\n{\n\treturn -1;\n}\n\n"; 3049ef1f84bSDavid du Colombier 3059ef1f84bSDavid du Colombier mkrootrules(name, cname, m); 3069ef1f84bSDavid du Colombier t = ""; 3079ef1f84bSDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 3089ef1f84bSDavid du Colombier s = s "extern uchar " cname[i] "code[];\n"; 3099ef1f84bSDavid du Colombier s = s "extern usize " cname[i] "len;\n"; 3109ef1f84bSDavid du Colombier t = t "\taddbootfile(\"" name[i] "\", " cname[i] "code, " cname[i] "len);\n"; 3119ef1f84bSDavid du Colombier } 3129ef1f84bSDavid du Colombier for(i = 1; i < section["link"]; i++){ 3139ef1f84bSDavid du Colombier split(line["link", i], a); 3149ef1f84bSDavid du Colombier s = s "extern void " a[1] "link(void);\n"; 3159ef1f84bSDavid du Colombier t = t "\t" a[1] "link();\n"; 3169ef1f84bSDavid du Colombier } 3179ef1f84bSDavid du Colombier s = s "void\nlinks(void)\n{\n" t "}\n\n"; 3189ef1f84bSDavid du Colombier 3199ef1f84bSDavid du Colombier if("ip" in d && "ip" in section){ 3209ef1f84bSDavid du Colombier t = ""; 3219ef1f84bSDavid du Colombier s = s "#include \"../ip/ip.h\"\n"; 3229ef1f84bSDavid du Colombier for(i = 1; i < section["ip"]; i++){ 3239ef1f84bSDavid du Colombier split(line["ip", i], a); 3249ef1f84bSDavid du Colombier s = s "extern void " a[1] "init(Fs*);\n"; 3259ef1f84bSDavid du Colombier t = t "\t" a[1] "init,\n"; 3269ef1f84bSDavid du Colombier } 3279ef1f84bSDavid du Colombier s = s "void (*ipprotoinit[])(Fs*) = {\n" t "\tnil,\n};\n\n"; 3289ef1f84bSDavid du Colombier } 3299ef1f84bSDavid du Colombier 3309ef1f84bSDavid du Colombier if("sd" in d && "sd" in section){ 3319ef1f84bSDavid du Colombier t = ""; 3329ef1f84bSDavid du Colombier s = s "#include \"../port/sd.h\"\n"; 3339ef1f84bSDavid du Colombier for(i = 1; i < section["sd"]; i++){ 3349ef1f84bSDavid du Colombier split(line["sd", i], a); 3359ef1f84bSDavid du Colombier s = s "extern SDifc " a[1] "ifc;\n"; 3369ef1f84bSDavid du Colombier t = t "\t&" a[1] "ifc,\n"; 3379ef1f84bSDavid du Colombier } 3389ef1f84bSDavid du Colombier s = s "SDifc* sdifc[] = {\n" t "\tnil,\n};\n\n"; 3399ef1f84bSDavid du Colombier } 3409ef1f84bSDavid du Colombier 3419ef1f84bSDavid du Colombier if("uart" in d && "uart" in section){ 3429ef1f84bSDavid du Colombier t = ""; 3439ef1f84bSDavid du Colombier for(i = 1; i < section["uart"]; i++){ 3449ef1f84bSDavid du Colombier split(line["uart", i], a); 3459ef1f84bSDavid du Colombier a[1] = substr(a[1], 5, length(a[1])-4) "physuart"; 3469ef1f84bSDavid du Colombier s = s "extern PhysUart " a[1] ";\n"; 3479ef1f84bSDavid du Colombier t = t "\t&" a[1] ",\n"; 3489ef1f84bSDavid du Colombier } 3499ef1f84bSDavid du Colombier s = s "PhysUart* physuart[] = {\n" t "\tnil,\n};\n\n"; 3509ef1f84bSDavid du Colombier } 3519ef1f84bSDavid du Colombier 352*45e6af3bSDavid du Colombier if("vga" in d && "vga" in section){ 353*45e6af3bSDavid du Colombier s = s "#define Image IMAGE\n" 354*45e6af3bSDavid du Colombier s = s "#include <draw.h>\n" 355*45e6af3bSDavid du Colombier s = s "#include <memdraw.h>\n" 356*45e6af3bSDavid du Colombier s = s "#include <cursor.h>\n" 357*45e6af3bSDavid du Colombier s = s "#include \"screen.h\"\n" 358*45e6af3bSDavid du Colombier 359*45e6af3bSDavid du Colombier t = ""; 360*45e6af3bSDavid du Colombier for(i = 1; i < section["vga"]; i++){ 361*45e6af3bSDavid du Colombier split(line["vga", i], a); 362*45e6af3bSDavid du Colombier s = s "extern VGAdev " a[1]"dev;\n"; 363*45e6af3bSDavid du Colombier t = t "\t&" a[1] "dev,\n"; 364*45e6af3bSDavid du Colombier } 365*45e6af3bSDavid du Colombier s = s "VGAdev *vgadev[] = {\n" t "\tnil,\n};\n\n" 366*45e6af3bSDavid du Colombier 367*45e6af3bSDavid du Colombier t = " &swcursor, \n" 368*45e6af3bSDavid du Colombier s = s "extern VGAcur swcursor;\n"; 369*45e6af3bSDavid du Colombier s = s "VGAcur *vgacur[] = {\n" t "\tnil,\n};\n\n" 370*45e6af3bSDavid du Colombier 371*45e6af3bSDavid du Colombier } 372*45e6af3bSDavid du Colombier 3739ef1f84bSDavid du Colombier t = ""; 3749ef1f84bSDavid du Colombier n = 0; 3759ef1f84bSDavid du Colombier if("physseg" in section){ 3769ef1f84bSDavid du Colombier for(i = 1; i < section["physseg"]; i++){ 3779ef1f84bSDavid du Colombier u = line["physseg", i]; 3789ef1f84bSDavid du Colombier if(u ~ /^\.[_A-Za-z][_A-Za-z0-9]*/) 3799ef1f84bSDavid du Colombier t = t "\t"; 3809ef1f84bSDavid du Colombier t = t "\t" u "\n"; 3819ef1f84bSDavid du Colombier if(sub(/.*\.pgalloc.*=[^_A-Za-z]*/, "", u)){ 3829ef1f84bSDavid du Colombier if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){ 3839ef1f84bSDavid du Colombier u = substr(u, RSTART, RLENGTH); 3849ef1f84bSDavid du Colombier s = s "extern Page *(*" u ")(Segment*, uintptr);\n"; 3859ef1f84bSDavid du Colombier } 3869ef1f84bSDavid du Colombier } 3879ef1f84bSDavid du Colombier else if(sub(/.*\.pgfree.*=[^_A-Za-z]*/, "", u)){ 3889ef1f84bSDavid du Colombier if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){ 3899ef1f84bSDavid du Colombier u = substr(u, RSTART, RLENGTH); 3909ef1f84bSDavid du Colombier s = s "extern void (*" u ")(Page*);\n"; 3919ef1f84bSDavid du Colombier } 3929ef1f84bSDavid du Colombier } 3939ef1f84bSDavid du Colombier if(match(u, /}/)) 3949ef1f84bSDavid du Colombier n++; 3959ef1f84bSDavid du Colombier } 3969ef1f84bSDavid du Colombier } 3979ef1f84bSDavid du Colombier s = s "Physseg physseg[" n+8 "] = {\n"; 3989ef1f84bSDavid du Colombier s = s "\t{\t.attr\t= SG_SHARED,\n"; 3999ef1f84bSDavid du Colombier s = s "\t\t.name\t= \"shared\",\n"; 4009ef1f84bSDavid du Colombier s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n"; 4019ef1f84bSDavid du Colombier s = s "\t{\t.attr\t= SG_BSS,\n"; 4029ef1f84bSDavid du Colombier s = s "\t\t.name\t= \"memory\",\n"; 4039ef1f84bSDavid du Colombier s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n"; 4049ef1f84bSDavid du Colombier s = s t "};\nint nphysseg = " n+8 ";\n\n"; 4059ef1f84bSDavid du Colombier 4069ef1f84bSDavid du Colombier s = s "char dbgflg[256]"; 4079ef1f84bSDavid du Colombier t = ""; 4089ef1f84bSDavid du Colombier for(u in dbgflg) 4099ef1f84bSDavid du Colombier t = t "\t[" u "]\t" dbgflg[u] ",\n"; 4109ef1f84bSDavid du Colombier if(t != "") 4119ef1f84bSDavid du Colombier s = s " = {\n" t "}"; 4129ef1f84bSDavid du Colombier s = s ";\n\n"; 4139ef1f84bSDavid du Colombier 4149ef1f84bSDavid du Colombier for(i in m) 4159ef1f84bSDavid du Colombier delete m[i]; 4169ef1f84bSDavid du Colombier 4179ef1f84bSDavid du Colombier for(i = 1; i < section["misc"]; i++){ 4189ef1f84bSDavid du Colombier split(line["misc", i], a); 4199ef1f84bSDavid du Colombier m[a[1]] = line["misc", i]; 4209ef1f84bSDavid du Colombier } 4219ef1f84bSDavid du Colombier if(!("rdb" in m)){ 4229ef1f84bSDavid du Colombier s = s "void\n"; 4239ef1f84bSDavid du Colombier s = s "rdb(void)\n"; 4249ef1f84bSDavid du Colombier s = s "{\n"; 4259ef1f84bSDavid du Colombier s = s "\tsplhi();\n"; 4269ef1f84bSDavid du Colombier s = s "\tiprint(\"rdb...not installed\\n\");\n"; 4279ef1f84bSDavid du Colombier s = s "\tfor(;;);\n"; 4289ef1f84bSDavid du Colombier s = s "}\n\n"; 4299ef1f84bSDavid du Colombier } 4309ef1f84bSDavid du Colombier if(objtype == "power"){ 4319ef1f84bSDavid du Colombier for(i = 1; i < section[objtype]; i++){ 4329ef1f84bSDavid du Colombier split(line[objtype, i], a); 4339ef1f84bSDavid du Colombier m[a[1]] = line[objtype, i]; 4349ef1f84bSDavid du Colombier } 4359ef1f84bSDavid du Colombier if(!("cnksyscall" in m)){ 4369ef1f84bSDavid du Colombier s = s "void\n"; 4379ef1f84bSDavid du Colombier s = s "cnksyscall(Ureg*)\n"; 4389ef1f84bSDavid du Colombier s = s "{\n"; 4399ef1f84bSDavid du Colombier s = s "\tpanic(\"cnkemu...not installed\\n\");\n"; 4409ef1f84bSDavid du Colombier s = s "\tfor(;;);\n"; 4419ef1f84bSDavid du Colombier s = s "}\n\n"; 4429ef1f84bSDavid du Colombier s = s "void*\n"; 4439ef1f84bSDavid du Colombier s = s "cnksysexecregs(uintptr, ulong, ulong)\n"; 4449ef1f84bSDavid du Colombier s = s "{\n"; 4459ef1f84bSDavid du Colombier s = s "\tpanic(\"cnkemu...not installed\\n\");\n"; 4469ef1f84bSDavid du Colombier s = s "\tfor(;;);\n"; 4479ef1f84bSDavid du Colombier s = s "}\n\n"; 4489ef1f84bSDavid du Colombier } 4499ef1f84bSDavid du Colombier } 4509ef1f84bSDavid du Colombier if("conf" in section){ 4519ef1f84bSDavid du Colombier for(i = 1; i < section["conf"]; i++) 4529ef1f84bSDavid du Colombier s = s line["conf", i] "\n"; 4539ef1f84bSDavid du Colombier s = s "\n"; 4549ef1f84bSDavid du Colombier } 4559ef1f84bSDavid du Colombier t = "."; 4569ef1f84bSDavid du Colombier while("pwd" | getline > 0){ 4579ef1f84bSDavid du Colombier if($0 ~ /^\//) 4589ef1f84bSDavid du Colombier t = $0; 4599ef1f84bSDavid du Colombier } 4609ef1f84bSDavid du Colombier s = s "char* conffile = \"" t "/" ARGV[argc] "\";\n"; 4619ef1f84bSDavid du Colombier s = s "ulong kerndate = KERNDATE;\n"; 4629ef1f84bSDavid du Colombier 4639ef1f84bSDavid du Colombier return s; 4649ef1f84bSDavid du Colombier} 4659ef1f84bSDavid du Colombier 4669ef1f84bSDavid du Colombierfunction mkrootrules(name, cname, src, a, i, n){ 4679ef1f84bSDavid du Colombier for(i = 1; i < section["rootdir"]; i++){ 4689ef1f84bSDavid du Colombier n = split(line["rootdir", i], a); 4699ef1f84bSDavid du Colombier if(n >= 2) 4709ef1f84bSDavid du Colombier name[i] = a[2]; 4719ef1f84bSDavid du Colombier else 4729ef1f84bSDavid du Colombier name[i] = a[1]; 4739ef1f84bSDavid du Colombier sub(/.*\//, "", name[i]); 4749ef1f84bSDavid du Colombier cname[i] = a[1]; 4759ef1f84bSDavid du Colombier gsub(/[^a-zA-Z0-9_]/, "_", cname[i]); 4769ef1f84bSDavid du Colombier src[i] = a[1]; 4779ef1f84bSDavid du Colombier } 4789ef1f84bSDavid du Colombier} 4799ef1f84bSDavid du Colombier 4809ef1f84bSDavid du Colombierfunction mkrules(dir, exists, ameta, cmeta, flags, f, i, s, t){ 4819ef1f84bSDavid du Colombier for(i in ameta) 4829ef1f84bSDavid du Colombier delete ameta[i]; 4839ef1f84bSDavid du Colombier for(i in cmeta) 4849ef1f84bSDavid du Colombier delete cmeta[i]; 4859ef1f84bSDavid du Colombier 4869ef1f84bSDavid du Colombier s = ""; 4879ef1f84bSDavid du Colombier while("cd " dir "; /bin/ls *.[cs]" | getline > 0){ 4889ef1f84bSDavid du Colombier if($0 !~ /^[A-Za-z0-9]*\.[cs]$/) 4899ef1f84bSDavid du Colombier continue; 4909ef1f84bSDavid du Colombier f = $0; 4919ef1f84bSDavid du Colombier if(!sub(/\.[cs]$/, "")) 4929ef1f84bSDavid du Colombier continue; 4939ef1f84bSDavid du Colombier if($0 in exists) 4949ef1f84bSDavid du Colombier continue; 4959ef1f84bSDavid du Colombier exists[$0] = dir; 4969ef1f84bSDavid du Colombier if(f ~ /\.c$/){ 4979ef1f84bSDavid du Colombier if(!($0 in dbgc)){ 49857ff190cSDavid du Colombier cmeta[cmeta["k"]++] = $0 4999ef1f84bSDavid du Colombier continue; 5009ef1f84bSDavid du Colombier } 5019ef1f84bSDavid du Colombier t = "$CC $CFLAGS " flags; 5029ef1f84bSDavid du Colombier } 5039ef1f84bSDavid du Colombier else{ 5049ef1f84bSDavid du Colombier if(!($0 in dbgc)){ 50557ff190cSDavid du Colombier ameta[ameta["k"]++] = $0 5069ef1f84bSDavid du Colombier continue; 5079ef1f84bSDavid du Colombier } 5089ef1f84bSDavid du Colombier t = "$AS $AFLAGS " flags; 5099ef1f84bSDavid du Colombier } 5109ef1f84bSDavid du Colombier s = s $0 ".$O:\t" dir "/" f "\n"; 5119ef1f84bSDavid du Colombier s = s "\t" t " -D'_DBGC_='" dbgc[$0] "'' " dir "/" f "\n"; 5129ef1f84bSDavid du Colombier } 5139ef1f84bSDavid du Colombier return s; 5149ef1f84bSDavid du Colombier} 5159ef1f84bSDavid du Colombier 5169ef1f84bSDavid du Colombierfunction mklinux( array){ 5179ef1f84bSDavid du Colombier arrayify(array, "linux", "", ".$O", 1); 5189ef1f84bSDavid du Colombier 5199ef1f84bSDavid du Colombier return listolate(array, " "); 5209ef1f84bSDavid du Colombier} 5219ef1f84bSDavid du Colombier 5229ef1f84bSDavid du Colombierfunction mkport( array){ 5239ef1f84bSDavid du Colombier arrayify(array, "port", "", ".$O", 1); 5249ef1f84bSDavid du Colombier 5259ef1f84bSDavid du Colombier return listolate(array, " "); 5269ef1f84bSDavid du Colombier} 5279ef1f84bSDavid du Colombier 5289ef1f84bSDavid du Colombierfunction mklib( array){ 5299ef1f84bSDavid du Colombier arrayify(array, "lib", "/$objtype/lib/", ".a", 1); 5309ef1f84bSDavid du Colombier 5319ef1f84bSDavid du Colombier return listolate(array," "); 5329ef1f84bSDavid du Colombier} 5339ef1f84bSDavid du Colombier 5349ef1f84bSDavid du Colombierfunction mkmach( a, i, s){ 5359ef1f84bSDavid du Colombier s = ""; 5369ef1f84bSDavid du Colombier for(i = 1; i < section[objtype]; i++){ 5379ef1f84bSDavid du Colombier if(!split(line[objtype, i], a)) 5389ef1f84bSDavid du Colombier continue; 5399ef1f84bSDavid du Colombier if(s == "") 5409ef1f84bSDavid du Colombier s = a[1] ".$O"; 5419ef1f84bSDavid du Colombier else 5429ef1f84bSDavid du Colombier s = s " " a[1] ".$O"; 5439ef1f84bSDavid du Colombier } 5449ef1f84bSDavid du Colombier 5459ef1f84bSDavid du Colombier return s; 5469ef1f84bSDavid du Colombier} 5479ef1f84bSDavid du Colombier 5489ef1f84bSDavid du Colombierfunction mkdevlist( a, array, i, j, n, s){ 5499ef1f84bSDavid du Colombier for(s in section){ 5509ef1f84bSDavid du Colombier if(line[s, 0] !~ /[ \t]\+dev[^_A-Za-z0-9]*/) 5519ef1f84bSDavid du Colombier continue; 5529ef1f84bSDavid du Colombier if(s == "dev") 5539ef1f84bSDavid du Colombier arrayify(array, s, "dev", ".$O", 1); 5549ef1f84bSDavid du Colombier else if(s == objtype) 5559ef1f84bSDavid du Colombier arrayify(array, s, "", ".$O", 0); 5569ef1f84bSDavid du Colombier else 5579ef1f84bSDavid du Colombier arrayify(array, s, "", ".$O", 1); 5589ef1f84bSDavid du Colombier } 5599ef1f84bSDavid du Colombier 5609ef1f84bSDavid du Colombier return listolate(array, " "); 5619ef1f84bSDavid du Colombier} 5629ef1f84bSDavid du Colombier 56357ff190cSDavid du Colombierfunction listolate(array, sep, i, n, a, s){ 56457ff190cSDavid du Colombier n = array["k"] 56557ff190cSDavid du Colombier if(n == 0) 56657ff190cSDavid du Colombier return "" 56757ff190cSDavid du Colombier s = array[0] 56857ff190cSDavid du Colombier for(i = 1; i < n; i++) 56957ff190cSDavid du Colombier s = s sep array[i] 5709ef1f84bSDavid du Colombier return s; 5719ef1f84bSDavid du Colombier} 5729ef1f84bSDavid du Colombier 57357ff190cSDavid du Colombierfunction unique(array, n, s, i){ 57457ff190cSDavid du Colombier for(i = 0; i < n; i++) 57557ff190cSDavid du Colombier if(array[i] == s) 57657ff190cSDavid du Colombier return 0 57757ff190cSDavid du Colombier return 1 57857ff190cSDavid du Colombier} 57957ff190cSDavid du Colombier 58057ff190cSDavid du Colombierfunction arrayify(array, tag, prefix, suffix, one, a, i, j, k, n){ 58157ff190cSDavid du Colombier k = 0; 58257ff190cSDavid du Colombier if(array["k"] > k) 58357ff190cSDavid du Colombier k = array["k"] 5849ef1f84bSDavid du Colombier for(i = 1; i < section[tag]; i++){ 5859ef1f84bSDavid du Colombier n = split(line[tag, i], a); 5869ef1f84bSDavid du Colombier if(one) 58757ff190cSDavid du Colombier array[k++] = prefix a[1] suffix 5889ef1f84bSDavid du Colombier for(j = 2; j <= n; j++){ 5899ef1f84bSDavid du Colombier if(a[$j] ~ /[+=-].*/) 5909ef1f84bSDavid du Colombier continue; 59157ff190cSDavid du Colombier if(unique(array, k, a[j] suffix)) 59257ff190cSDavid du Colombier array[k++] = a[j] suffix 5939ef1f84bSDavid du Colombier } 5949ef1f84bSDavid du Colombier } 59557ff190cSDavid du Colombier array["k"] = k 5969ef1f84bSDavid du Colombier} 597