1sizeof_1_ = 8; 2aggr _1_ 3{ 4 'U' 0 lo; 5 'U' 4 hi; 6}; 7 8defn 9_1_(addr) { 10 complex _1_ addr; 11 print(" lo ", addr.lo, "\n"); 12 print(" hi ", addr.hi, "\n"); 13}; 14 15sizeofFPdbleword = 8; 16aggr FPdbleword 17{ 18 'F' 0 x; 19 { 20 'U' 0 lo; 21 'U' 4 hi; 22 }; 23}; 24 25defn 26FPdbleword(addr) { 27 complex FPdbleword addr; 28 print(" x ", addr.x, "\n"); 29 print("_1_ {\n"); 30 _1_(addr+0); 31 print("}\n"); 32}; 33 34UTFmax = 4; 35Runesync = 128; 36Runeself = 128; 37Runeerror = 65533; 38Runemax = 1114111; 39Runemask = 2097151; 40sizeofFmt = 48; 41aggr Fmt 42{ 43 'b' 0 runes; 44 'X' 4 start; 45 'X' 8 to; 46 'X' 12 stop; 47 'X' 16 flush; 48 'X' 20 farg; 49 'D' 24 nfmt; 50 'X' 28 args; 51 'D' 32 r; 52 'D' 36 width; 53 'D' 40 prec; 54 'U' 44 flags; 55}; 56 57defn 58Fmt(addr) { 59 complex Fmt addr; 60 print(" runes ", addr.runes, "\n"); 61 print(" start ", addr.start\X, "\n"); 62 print(" to ", addr.to\X, "\n"); 63 print(" stop ", addr.stop\X, "\n"); 64 print(" flush ", addr.flush\X, "\n"); 65 print(" farg ", addr.farg\X, "\n"); 66 print(" nfmt ", addr.nfmt, "\n"); 67 print(" args ", addr.args\X, "\n"); 68 print(" r ", addr.r, "\n"); 69 print(" width ", addr.width, "\n"); 70 print(" prec ", addr.prec, "\n"); 71 print(" flags ", addr.flags, "\n"); 72}; 73 74FmtWidth = 1; 75FmtLeft = 2; 76FmtPrec = 4; 77FmtSharp = 8; 78FmtSpace = 16; 79FmtSign = 32; 80FmtZero = 64; 81FmtUnsigned = 128; 82FmtShort = 256; 83FmtLong = 512; 84FmtVLong = 1024; 85FmtComma = 2048; 86FmtByte = 4096; 87FmtFlag = 8192; 88sizeofTm = 40; 89aggr Tm 90{ 91 'D' 0 sec; 92 'D' 4 min; 93 'D' 8 hour; 94 'D' 12 mday; 95 'D' 16 mon; 96 'D' 20 year; 97 'D' 24 wday; 98 'D' 28 yday; 99 'a' 32 zone; 100 'D' 36 tzoff; 101}; 102 103defn 104Tm(addr) { 105 complex Tm addr; 106 print(" sec ", addr.sec, "\n"); 107 print(" min ", addr.min, "\n"); 108 print(" hour ", addr.hour, "\n"); 109 print(" mday ", addr.mday, "\n"); 110 print(" mon ", addr.mon, "\n"); 111 print(" year ", addr.year, "\n"); 112 print(" wday ", addr.wday, "\n"); 113 print(" yday ", addr.yday, "\n"); 114 print(" zone ", addr.zone, "\n"); 115 print(" tzoff ", addr.tzoff, "\n"); 116}; 117 118PNPROC = 1; 119PNGROUP = 2; 120Profoff = 0; 121Profuser = 1; 122Profkernel = 2; 123Proftime = 3; 124Profsample = 4; 125sizeofLock = 8; 126aggr Lock 127{ 128 'D' 0 key; 129 'D' 4 sem; 130}; 131 132defn 133Lock(addr) { 134 complex Lock addr; 135 print(" key ", addr.key, "\n"); 136 print(" sem ", addr.sem, "\n"); 137}; 138 139sizeofQLp = 12; 140aggr QLp 141{ 142 'D' 0 inuse; 143 'A' QLp 4 next; 144 'C' 8 state; 145}; 146 147defn 148QLp(addr) { 149 complex QLp addr; 150 print(" inuse ", addr.inuse, "\n"); 151 print(" next ", addr.next\X, "\n"); 152 print(" state ", addr.state, "\n"); 153}; 154 155sizeofQLock = 20; 156aggr QLock 157{ 158 Lock 0 lock; 159 'D' 8 locked; 160 'A' QLp 12 $head; 161 'A' QLp 16 $tail; 162}; 163 164defn 165QLock(addr) { 166 complex QLock addr; 167 print("Lock lock {\n"); 168 Lock(addr.lock); 169 print("}\n"); 170 print(" locked ", addr.locked, "\n"); 171 print(" $head ", addr.$head\X, "\n"); 172 print(" $tail ", addr.$tail\X, "\n"); 173}; 174 175sizeofRWLock = 24; 176aggr RWLock 177{ 178 Lock 0 lock; 179 'D' 8 readers; 180 'D' 12 writer; 181 'A' QLp 16 $head; 182 'A' QLp 20 $tail; 183}; 184 185defn 186RWLock(addr) { 187 complex RWLock addr; 188 print("Lock lock {\n"); 189 Lock(addr.lock); 190 print("}\n"); 191 print(" readers ", addr.readers, "\n"); 192 print(" writer ", addr.writer, "\n"); 193 print(" $head ", addr.$head\X, "\n"); 194 print(" $tail ", addr.$tail\X, "\n"); 195}; 196 197sizeofRendez = 12; 198aggr Rendez 199{ 200 'A' QLock 0 l; 201 'A' QLp 4 $head; 202 'A' QLp 8 $tail; 203}; 204 205defn 206Rendez(addr) { 207 complex Rendez addr; 208 print(" l ", addr.l\X, "\n"); 209 print(" $head ", addr.$head\X, "\n"); 210 print(" $tail ", addr.$tail\X, "\n"); 211}; 212 213sizeofNetConnInfo = 36; 214aggr NetConnInfo 215{ 216 'X' 0 dir; 217 'X' 4 root; 218 'X' 8 spec; 219 'X' 12 lsys; 220 'X' 16 lserv; 221 'X' 20 rsys; 222 'X' 24 rserv; 223 'X' 28 laddr; 224 'X' 32 raddr; 225}; 226 227defn 228NetConnInfo(addr) { 229 complex NetConnInfo addr; 230 print(" dir ", addr.dir\X, "\n"); 231 print(" root ", addr.root\X, "\n"); 232 print(" spec ", addr.spec\X, "\n"); 233 print(" lsys ", addr.lsys\X, "\n"); 234 print(" lserv ", addr.lserv\X, "\n"); 235 print(" rsys ", addr.rsys\X, "\n"); 236 print(" rserv ", addr.rserv\X, "\n"); 237 print(" laddr ", addr.laddr\X, "\n"); 238 print(" raddr ", addr.raddr\X, "\n"); 239}; 240 241RFNAMEG = 1; 242RFENVG = 2; 243RFFDG = 4; 244RFNOTEG = 8; 245RFPROC = 16; 246RFMEM = 32; 247RFNOWAIT = 64; 248RFCNAMEG = 1024; 249RFCENVG = 2048; 250RFCFDG = 4096; 251RFREND = 8192; 252RFNOMNT = 16384; 253sizeofQid = 16; 254aggr Qid 255{ 256 'W' 0 path; 257 'U' 8 vers; 258 'b' 12 type; 259}; 260 261defn 262Qid(addr) { 263 complex Qid addr; 264 print(" path ", addr.path, "\n"); 265 print(" vers ", addr.vers, "\n"); 266 print(" type ", addr.type, "\n"); 267}; 268 269sizeofDir = 60; 270aggr Dir 271{ 272 'u' 0 type; 273 'U' 4 dev; 274 Qid 8 qid; 275 'U' 24 mode; 276 'U' 28 atime; 277 'U' 32 mtime; 278 'V' 36 length; 279 'X' 44 name; 280 'X' 48 uid; 281 'X' 52 gid; 282 'X' 56 muid; 283}; 284 285defn 286Dir(addr) { 287 complex Dir addr; 288 print(" type ", addr.type, "\n"); 289 print(" dev ", addr.dev, "\n"); 290 print("Qid qid {\n"); 291 Qid(addr.qid); 292 print("}\n"); 293 print(" mode ", addr.mode, "\n"); 294 print(" atime ", addr.atime, "\n"); 295 print(" mtime ", addr.mtime, "\n"); 296 print(" length ", addr.length, "\n"); 297 print(" name ", addr.name\X, "\n"); 298 print(" uid ", addr.uid\X, "\n"); 299 print(" gid ", addr.gid\X, "\n"); 300 print(" muid ", addr.muid\X, "\n"); 301}; 302 303sizeofWaitmsg = 20; 304aggr Waitmsg 305{ 306 'D' 0 pid; 307 'a' 4 time; 308 'X' 16 msg; 309}; 310 311defn 312Waitmsg(addr) { 313 complex Waitmsg addr; 314 print(" pid ", addr.pid, "\n"); 315 print(" time ", addr.time, "\n"); 316 print(" msg ", addr.msg\X, "\n"); 317}; 318 319sizeofIOchunk = 8; 320aggr IOchunk 321{ 322 'X' 0 addr; 323 'U' 4 len; 324}; 325 326defn 327IOchunk(addr) { 328 complex IOchunk addr; 329 print(" addr ", addr.addr\X, "\n"); 330 print(" len ", addr.len, "\n"); 331}; 332 333Nqwds = 2; 334Nqshift = 5; 335Nqmask = -1; 336Nqbits = 64; 337sizeofChannel = 36; 338aggr Channel 339{ 340 'D' 0 s; 341 'U' 4 f; 342 'U' 8 n; 343 'D' 12 e; 344 'D' 16 freed; 345 'X' 20 qentry; 346 'D' 24 nentry; 347 'D' 28 closed; 348 'a' 32 v; 349}; 350 351defn 352Channel(addr) { 353 complex Channel addr; 354 print(" s ", addr.s, "\n"); 355 print(" f ", addr.f, "\n"); 356 print(" n ", addr.n, "\n"); 357 print(" e ", addr.e, "\n"); 358 print(" freed ", addr.freed, "\n"); 359 print(" qentry ", addr.qentry\X, "\n"); 360 print(" nentry ", addr.nentry, "\n"); 361 print(" closed ", addr.closed, "\n"); 362 print(" v ", addr.v, "\n"); 363}; 364 365CHANEND = 0; 366CHANSND = 1; 367CHANRCV = 2; 368CHANNOP = 3; 369CHANNOBLK = 4; 370sizeofAlt = 24; 371aggr Alt 372{ 373 'A' Channel 0 c; 374 'X' 4 v; 375 'D' 8 op; 376 'X' 12 err; 377 'A' Channel 16 tag; 378 'D' 20 entryno; 379}; 380 381defn 382Alt(addr) { 383 complex Alt addr; 384 print(" c ", addr.c\X, "\n"); 385 print(" v ", addr.v\X, "\n"); 386 print(" op ", addr.op, "\n"); 387 print(" err ", addr.err\X, "\n"); 388 print(" tag ", addr.tag\X, "\n"); 389 print(" entryno ", addr.entryno, "\n"); 390}; 391 392sizeofRef = 4; 393aggr Ref 394{ 395 'D' 0 ref; 396}; 397 398defn 399Ref(addr) { 400 complex Ref addr; 401 print(" ref ", addr.ref, "\n"); 402}; 403 404Dead = 0; 405Running = 1; 406Ready = 2; 407Rendezvous = 3; 408Channone = 0; 409Chanalt = 1; 410Chansend = 2; 411Chanrecv = 3; 412RENDHASH = 13; 413Printsize = 2048; 414NPRIV = 8; 415sizeofRgrp = 60; 416aggr Rgrp 417{ 418 Lock 0 lock; 419 'a' 8 hash; 420}; 421 422defn 423Rgrp(addr) { 424 complex Rgrp addr; 425 print("Lock lock {\n"); 426 Lock(addr.lock); 427 print("}\n"); 428 print(" hash ", addr.hash, "\n"); 429}; 430 431sizeofTqueue = 12; 432aggr Tqueue 433{ 434 'D' 0 asleep; 435 'X' 4 $head; 436 'X' 8 $tail; 437}; 438 439defn 440Tqueue(addr) { 441 complex Tqueue addr; 442 print(" asleep ", addr.asleep, "\n"); 443 print(" $head ", addr.$head\X, "\n"); 444 print(" $tail ", addr.$tail\X, "\n"); 445}; 446 447sizeofThread = 124; 448aggr Thread 449{ 450 Lock 0 lock; 451 'a' 8 sched; 452 'D' 16 id; 453 'D' 20 grp; 454 'D' 24 moribund; 455 'D' 28 state; 456 'D' 32 nextstate; 457 'X' 36 stk; 458 'U' 40 stksize; 459 'A' Thread 44 next; 460 'X' 48 proc; 461 'A' Thread 52 nextt; 462 'D' 56 ret; 463 'X' 60 cmdname; 464 'D' 64 inrendez; 465 'A' Thread 68 rendhash; 466 'X' 72 rendtag; 467 'X' 76 rendval; 468 'D' 80 rendbreak; 469 'D' 84 chan; 470 'A' Alt 88 alt; 471 'a' 92 udata; 472}; 473 474defn 475Thread(addr) { 476 complex Thread addr; 477 print("Lock lock {\n"); 478 Lock(addr.lock); 479 print("}\n"); 480 print(" sched ", addr.sched, "\n"); 481 print(" id ", addr.id, "\n"); 482 print(" grp ", addr.grp, "\n"); 483 print(" moribund ", addr.moribund, "\n"); 484 print(" state ", addr.state, "\n"); 485 print(" nextstate ", addr.nextstate, "\n"); 486 print(" stk ", addr.stk\X, "\n"); 487 print(" stksize ", addr.stksize, "\n"); 488 print(" next ", addr.next\X, "\n"); 489 print(" proc ", addr.proc\X, "\n"); 490 print(" nextt ", addr.nextt\X, "\n"); 491 print(" ret ", addr.ret, "\n"); 492 print(" cmdname ", addr.cmdname\X, "\n"); 493 print(" inrendez ", addr.inrendez, "\n"); 494 print(" rendhash ", addr.rendhash\X, "\n"); 495 print(" rendtag ", addr.rendtag\X, "\n"); 496 print(" rendval ", addr.rendval\X, "\n"); 497 print(" rendbreak ", addr.rendbreak, "\n"); 498 print(" chan ", addr.chan, "\n"); 499 print(" alt ", addr.alt\X, "\n"); 500 print(" udata ", addr.udata, "\n"); 501}; 502 503sizeofExecargs = 16; 504aggr Execargs 505{ 506 'X' 0 prog; 507 'X' 4 args; 508 'a' 8 fd; 509}; 510 511defn 512Execargs(addr) { 513 complex Execargs addr; 514 print(" prog ", addr.prog\X, "\n"); 515 print(" args ", addr.args\X, "\n"); 516 print(" fd ", addr.fd, "\n"); 517}; 518 519sizeofProc = 2432; 520aggr Proc 521{ 522 Lock 0 lock; 523 'a' 8 sched; 524 'D' 16 pid; 525 'D' 20 splhi; 526 'A' Thread 24 thread; 527 'D' 28 needexec; 528 Execargs 32 exec; 529 'A' Proc 48 newproc; 530 'a' 52 exitstr; 531 'D' 180 rforkflag; 532 'D' 184 nthreads; 533 Tqueue 188 threads; 534 Tqueue 200 ready; 535 Lock 212 readylock; 536 'a' 220 printbuf; 537 'D' 2268 blocked; 538 'D' 2272 pending; 539 'D' 2276 nonotes; 540 'U' 2280 nextID; 541 'A' Proc 2284 next; 542 'X' 2288 arg; 543 'a' 2292 str; 544 'X' 2420 wdata; 545 'X' 2424 udata; 546 'C' 2428 threadint; 547}; 548 549defn 550Proc(addr) { 551 complex Proc addr; 552 print("Lock lock {\n"); 553 Lock(addr.lock); 554 print("}\n"); 555 print(" sched ", addr.sched, "\n"); 556 print(" pid ", addr.pid, "\n"); 557 print(" splhi ", addr.splhi, "\n"); 558 print(" thread ", addr.thread\X, "\n"); 559 print(" needexec ", addr.needexec, "\n"); 560 print("Execargs exec {\n"); 561 Execargs(addr.exec); 562 print("}\n"); 563 print(" newproc ", addr.newproc\X, "\n"); 564 print(" exitstr ", addr.exitstr, "\n"); 565 print(" rforkflag ", addr.rforkflag, "\n"); 566 print(" nthreads ", addr.nthreads, "\n"); 567 print("Tqueue threads {\n"); 568 Tqueue(addr.threads); 569 print("}\n"); 570 print("Tqueue ready {\n"); 571 Tqueue(addr.ready); 572 print("}\n"); 573 print("Lock readylock {\n"); 574 Lock(addr.readylock); 575 print("}\n"); 576 print(" printbuf ", addr.printbuf, "\n"); 577 print(" blocked ", addr.blocked, "\n"); 578 print(" pending ", addr.pending, "\n"); 579 print(" nonotes ", addr.nonotes, "\n"); 580 print(" nextID ", addr.nextID, "\n"); 581 print(" next ", addr.next\X, "\n"); 582 print(" arg ", addr.arg\X, "\n"); 583 print(" str ", addr.str, "\n"); 584 print(" wdata ", addr.wdata\X, "\n"); 585 print(" udata ", addr.udata\X, "\n"); 586 print(" threadint ", addr.threadint, "\n"); 587}; 588 589sizeofPqueue = 16; 590aggr Pqueue 591{ 592 Lock 0 lock; 593 'A' Proc 8 $head; 594 'A' Proc 12 $tail; 595}; 596 597defn 598Pqueue(addr) { 599 complex Pqueue addr; 600 print("Lock lock {\n"); 601 Lock(addr.lock); 602 print("}\n"); 603 print(" $head ", addr.$head\X, "\n"); 604 print(" $tail ", addr.$tail\X, "\n"); 605}; 606 607sizeofIoproc = 160; 608aggr Ioproc 609{ 610 'D' 0 tid; 611 'A' Channel 4 c; 612 'A' Channel 8 creply; 613 'D' 12 inuse; 614 'X' 16 op; 615 'X' 20 arg; 616 'D' 24 ret; 617 'a' 28 err; 618 'A' Ioproc 156 next; 619}; 620 621defn 622Ioproc(addr) { 623 complex Ioproc addr; 624 print(" tid ", addr.tid, "\n"); 625 print(" c ", addr.c\X, "\n"); 626 print(" creply ", addr.creply\X, "\n"); 627 print(" inuse ", addr.inuse, "\n"); 628 print(" op ", addr.op\X, "\n"); 629 print(" arg ", addr.arg\X, "\n"); 630 print(" ret ", addr.ret, "\n"); 631 print(" err ", addr.err, "\n"); 632 print(" next ", addr.next\X, "\n"); 633}; 634 635complex Pqueue _threadpq; 636complex Channel _threadwaitchan; 637complex Rgrp _threadrgrp; 638sizeof_2_ = 24; 639aggr _2_ 640{ 641 'X' 0 pp; 642 'X' 4 next; 643 'X' 8 last; 644 'X' 12 first; 645 'U' 16 pid; 646 'U' 20 what; 647}; 648 649defn 650_2_(addr) { 651 complex _2_ addr; 652 print(" pp ", addr.pp\X, "\n"); 653 print(" next ", addr.next\X, "\n"); 654 print(" last ", addr.last\X, "\n"); 655 print(" first ", addr.first\X, "\n"); 656 print(" pid ", addr.pid, "\n"); 657 print(" what ", addr.what, "\n"); 658}; 659 660sizeofTos = 72; 661aggr Tos 662{ 663 _2_ 0 prof; 664 'W' 24 cyclefreq; 665 'V' 32 kcycles; 666 'V' 40 pcycles; 667 'U' 48 pid; 668 'U' 52 clock; 669 'a' 56 kscr; 670}; 671 672defn 673Tos(addr) { 674 complex Tos addr; 675 print("_2_ prof {\n"); 676 _2_(addr.prof); 677 print("}\n"); 678 print(" cyclefreq ", addr.cyclefreq, "\n"); 679 print(" kcycles ", addr.kcycles, "\n"); 680 print(" pcycles ", addr.pcycles, "\n"); 681 print(" pid ", addr.pid, "\n"); 682 print(" clock ", addr.clock, "\n"); 683 print(" kscr ", addr.kscr, "\n"); 684}; 685 686complex Tos _tos; 687complex Proc _schedinit:p; 688complex Thread _schedinit:t; 689complex Thread _schedinit:l; 690complex Proc needstack:p; 691complex Thread needstack:t; 692complex Proc _sched:p; 693complex Thread _sched:t; 694complex Proc runthread:p; 695complex Thread runthread:t; 696complex Tqueue runthread:q; 697complex Thread _threadready:t; 698complex Tqueue _threadready:q; 699