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