Annotation of lucent/sys/src/9/pc/dat.h, revision 1.1

1.1     ! root        1: typedef struct Conf    Conf;
        !             2: typedef        struct FController      FController;
        !             3: typedef        struct FDrive           FDrive;
        !             4: typedef struct FPsave  FPsave;
        !             5: typedef struct FType           FType;
        !             6: typedef struct ISAConf ISAConf;
        !             7: typedef struct Label   Label;
        !             8: typedef struct Lock    Lock;
        !             9: typedef struct MMU     MMU;
        !            10: typedef struct Mach    Mach;
        !            11: typedef struct PCArch  PCArch;
        !            12: typedef struct PCMmap  PCMmap;
        !            13: typedef struct Page    Page;
        !            14: typedef struct PMMU    PMMU;
        !            15: typedef struct Segdesc Segdesc;
        !            16: typedef struct Ureg    Ureg;
        !            17: typedef struct User    User;
        !            18: 
        !            19: #define        MACHP(n)        (n==0? &mach0 : *(Mach**)0)
        !            20: 
        !            21: extern Mach    mach0;
        !            22: extern  void   (*kprofp)(ulong);
        !            23: 
        !            24: /*
        !            25:  *  parameters for sysproc.c
        !            26:  */
        !            27: #define AOUT_MAGIC     I_MAGIC
        !            28: 
        !            29: struct Lock
        !            30: {
        !            31:        ulong   key;
        !            32:        ulong   pc;
        !            33:        ulong   sr;
        !            34: };
        !            35: 
        !            36: struct Label
        !            37: {
        !            38:        ulong   sp;
        !            39:        ulong   pc;
        !            40: };
        !            41: 
        !            42: 
        !            43: /*
        !            44:  * FPsave.status
        !            45:  */
        !            46: enum
        !            47: {
        !            48:        FPinit,
        !            49:        FPactive,
        !            50:        FPinactive,
        !            51: };
        !            52: 
        !            53: struct FPsave
        !            54: {
        !            55:        ushort  control;
        !            56:        ushort  r1;
        !            57:        ushort  status;
        !            58:        ushort  r2;
        !            59:        ushort  tag;
        !            60:        ushort  r3;
        !            61:        ulong   pc;
        !            62:        ushort  selector;
        !            63:        ushort  r4;
        !            64:        ulong   operand;
        !            65:        ushort  oselector;
        !            66:        ushort  r5;
        !            67:        uchar   regs[80];       /* floating point registers */
        !            68: };
        !            69: 
        !            70: struct Conf
        !            71: {
        !            72:        ulong   nmach;          /* processors */
        !            73:        ulong   nproc;          /* processes */
        !            74:        ulong   monitor;        /* has monitor? */
        !            75:        ulong   npage0;         /* total physical pages of memory */
        !            76:        ulong   npage1;         /* total physical pages of memory */
        !            77:        ulong   topofmem;       /* highest physical address + 1 */
        !            78:        ulong   npage;          /* total physical pages of memory */
        !            79:        ulong   upages;         /* user page pool */
        !            80:        ulong   nimage;         /* number of page cache image headers */
        !            81:        ulong   nswap;          /* number of swap pages */
        !            82:        ulong   base0;          /* base of bank 0 */
        !            83:        ulong   base1;          /* base of bank 1 */
        !            84:        ulong   copymode;       /* 0 is copy on write, 1 is copy on reference */
        !            85:        ulong   nfloppy;        /* number of floppy drives */
        !            86:        ulong   nhard;          /* number of hard drives */
        !            87:        ulong   ldepth;         /* screen depth */
        !            88:        ulong   maxx;           /* screen width */
        !            89:        ulong   maxy;           /* screen length */
        !            90: };
        !            91: 
        !            92: /*
        !            93:  *  MMU stuff in proc
        !            94:  */
        !            95: #define MAXMMU 4
        !            96: #define MAXSMMU        1
        !            97: struct PMMU
        !            98: {
        !            99:        Page    *mmutop;        /* 1st level table */
        !           100:        Page    *mmufree;       /* unused page table pages */
        !           101:        Page    *mmuused;       /* used page table pages */
        !           102: };
        !           103: 
        !           104: #include "../port/portdat.h"
        !           105: 
        !           106: /*
        !           107:  *  machine dependent definitions not used by ../port/dat.h
        !           108:  */
        !           109: 
        !           110: /*
        !           111:  *  task state segment.  Plan 9 ignores all the task switching goo and just
        !           112:  *  uses the tss for esp0 and ss0 on gate's into the kernel, interrupts,
        !           113:  *  and exceptions.  The rest is completely ignored.
        !           114:  *
        !           115:  *  We use one tss per CPU because we'll need to in Brazil.
        !           116:  *  
        !           117:  */
        !           118: typedef struct Tss     Tss;
        !           119: struct Tss
        !           120: {
        !           121:        ulong   backlink;       /* unused */
        !           122:        ulong   sp0;            /* pl0 stack pointer */
        !           123:        ulong   ss0;            /* pl0 stack selector */
        !           124:        ulong   sp1;            /* pl1 stack pointer */
        !           125:        ulong   ss1;            /* pl1 stack selector */
        !           126:        ulong   sp2;            /* pl2 stack pointer */
        !           127:        ulong   ss2;            /* pl2 stack selector */
        !           128:        ulong   cr3;            /* page table descriptor */
        !           129:        ulong   eip;            /* instruction pointer */
        !           130:        ulong   eflags;         /* processor flags */
        !           131:        ulong   eax;            /* general (hah?) registers */
        !           132:        ulong   ecx;
        !           133:        ulong   edx;
        !           134:        ulong   ebx;
        !           135:        ulong   esp;
        !           136:        ulong   ebp;
        !           137:        ulong   esi;
        !           138:        ulong   edi;
        !           139:        ulong   es;             /* segment selectors */
        !           140:        ulong   cs;
        !           141:        ulong   ss;
        !           142:        ulong   ds;
        !           143:        ulong   fs;
        !           144:        ulong   gs;
        !           145:        ulong   ldt;            /* local descriptor table */
        !           146:        ulong   iomap;          /* io map base */
        !           147: };
        !           148: 
        !           149: /*
        !           150:  *  segment descriptor/gate
        !           151:  */
        !           152: struct Segdesc
        !           153: {
        !           154:        ulong   d0;
        !           155:        ulong   d1;
        !           156: };
        !           157: 
        !           158: struct Mach
        !           159: {
        !           160:        /* OFFSETS OF THE FOLLOWING KNOWN BY l.s */
        !           161:        int     machno;                 /* physical id of processor */
        !           162:        ulong   splpc;                  /* pc of last caller to splhi */
        !           163: 
        !           164:        /* ordering from here on irrelevant */
        !           165:        int     mmask;                  /* 1<<m->machno */
        !           166:        ulong   ticks;                  /* of the clock since boot time */
        !           167:        Proc    *proc;                  /* current process on this processor */
        !           168:        Label   sched;                  /* scheduler wakeup */
        !           169:        Lock    alarmlock;              /* access to alarm list */
        !           170:        void    *alarm;                 /* alarms bound to this clock */
        !           171: 
        !           172:        int     tlbfault;
        !           173:        int     tlbpurge;
        !           174:        int     pfault;
        !           175:        int     cs;
        !           176:        int     syscall;
        !           177:        int     load;
        !           178:        int     intr;
        !           179: 
        !           180:        Tss     tss;
        !           181:        Segdesc gdt[N386SEG];
        !           182: 
        !           183:        int     stack[1];
        !           184: };
        !           185: 
        !           186: /*
        !           187:  * Fake kmap
        !           188:  */
        !           189: typedef void           KMap;
        !           190: #define        VA(k)           ((ulong)(k))
        !           191: #define        kmap(p)         (KMap*)((p)->pa|KZERO)
        !           192: #define        kunmap(k)
        !           193: 
        !           194: #define        NERR    15
        !           195: #define        NNOTE   5
        !           196: struct User
        !           197: {
        !           198:        Proc    *p;
        !           199:        FPsave  fpsave;                 /* address of this is known by vdb */
        !           200:        int     scallnr;                /* sys call number - known by db */
        !           201:        Sargs   s;                      /* address of this is known by db */
        !           202:        int     nerrlab;
        !           203:        Label   errlab[NERR];
        !           204:        char    error[ERRLEN];
        !           205:        char    elem[NAMELEN];          /* last name element from namec */
        !           206:        Chan    *slash;
        !           207:        Chan    *dot;
        !           208:        /*
        !           209:         * Rest of structure controlled by devproc.c and friends.
        !           210:         * lock(&p->debug) to modify.
        !           211:         */
        !           212:        Note    note[NNOTE];
        !           213:        short   nnote;
        !           214:        short   notified;               /* sysnoted is due */
        !           215:        Note    lastnote;
        !           216:        int     (*notify)(void*, char*);
        !           217:        void    *ureg;
        !           218:        void    *dbgreg;                /* User registers for debugging in proc */
        !           219:        ulong   svcs;           /* cs before a notify */
        !           220:        ulong   svss;           /* ss before a notify */
        !           221:        ulong   svflags;                /* flags before a notify */
        !           222: };
        !           223: 
        !           224: struct
        !           225: {
        !           226:        Lock;
        !           227:        short   machs;
        !           228:        short   exiting;
        !           229: }active;
        !           230: 
        !           231: /*
        !           232:  *  routines for things outside the PC model, like power management
        !           233:  */
        !           234: struct PCArch
        !           235: {
        !           236:        char    *id;
        !           237:        void    (*reset)(void);         /* this should be in the model */
        !           238:        int     (*cpuspeed)(int);       /* 0 = low, 1 = high */
        !           239:        void    (*buzz)(int, int);      /* make a noise */
        !           240:        void    (*lights)(int);         /* turn lights or icons on/off */
        !           241:        int     (*serialpower)(int);    /* 1 == on, 0 == off */
        !           242:        int     (*modempower)(int);     /* 1 == on, 0 == off */
        !           243:        int     (*extvga)(int);         /* 1 == external, 0 == internal */
        !           244:        int     (*snooze)(ulong, int);
        !           245: };
        !           246: 
        !           247: extern Mach    *m;
        !           248: extern User    *u;
        !           249: 
        !           250: ulong boottime;
        !           251: 
        !           252: extern int     flipD[];        /* for flipping bitblt destination polarity */
        !           253: 
        !           254: #define BOOTLINE ((char *)0x80000100) /*  bootline passed by boot program */
        !           255: 
        !           256: extern PCArch *arch;                   /* PC architecture */
        !           257: 
        !           258: struct ISAConf {
        !           259:        char    type[NAMELEN];
        !           260:        ulong   port;
        !           261:        ulong   irq;
        !           262:        int     dma;
        !           263:        ulong   mem;
        !           264:        ulong   size;
        !           265:        uchar   ea[6];
        !           266:        uchar   bus;
        !           267: };
        !           268: 
        !           269: /*
        !           270:  *  maps between ISA memory space and PCMCIA card memory space
        !           271:  */
        !           272: struct PCMmap
        !           273: {
        !           274:        ulong   ca;             /* card address */
        !           275:        ulong   cea;            /* card end address */
        !           276:        ulong   isa;            /* ISA address */
        !           277:        int     len;            /* length of the ISA area */
        !           278:        int     attr;           /* attribute memory */
        !           279:        int     ref;
        !           280: };
        !           281: 
        !           282: /*
        !           283:  *  a floppy drive
        !           284:  */
        !           285: struct FDrive
        !           286: {
        !           287:        FType   *t;             /* floppy type */
        !           288:        int     dt;             /* drive type */
        !           289:        int     dev;
        !           290: 
        !           291:        ulong   lasttouched;    /* time last touched */
        !           292:        int     cyl;            /* current arm position */
        !           293:        int     confused;       /* needs to be recalibrated */
        !           294:        int     vers;
        !           295: 
        !           296:        int     tcyl;           /* target cylinder */
        !           297:        int     thead;          /* target head */
        !           298:        int     tsec;           /* target sector */
        !           299:        long    len;            /* size of xfer */
        !           300: 
        !           301:        uchar   *cache; /* track cache */
        !           302:        int     ccyl;
        !           303:        int     chead;
        !           304: 
        !           305:        Rendez  r;              /* waiting here for motor to spin up */
        !           306: };
        !           307: 
        !           308: /*
        !           309:  *  controller for 4 floppys
        !           310:  */
        !           311: struct FController
        !           312: {
        !           313:        QLock;                  /* exclusive access to the contoller */
        !           314: 
        !           315:        FDrive  *d;             /* the floppy drives */
        !           316:        FDrive  *selected;
        !           317:        int     rate;           /* current rate selected */
        !           318:        uchar   cmd[14];        /* command */
        !           319:        int     ncmd;             /* # command bytes */
        !           320:        uchar   stat[14];       /* command status */
        !           321:        int     nstat;            /* # status bytes */
        !           322:        int     confused;       /* controler needs to be reset */
        !           323:        Rendez  r;              /* wait here for command termination */
        !           324:        int     motor;          /* bit mask of spinning disks */
        !           325:        Rendez  kr;             /* for motor watcher */
        !           326: };
        !           327: 
        !           328: /*
        !           329:  *  floppy types (all MFM encoding)
        !           330:  */
        !           331: struct FType
        !           332: {
        !           333:        char    *name;
        !           334:        int     dt;             /* compatible drive type */
        !           335:        int     bytes;          /* bytes/sector */
        !           336:        int     sectors;        /* sectors/track */
        !           337:        int     heads;          /* number of heads */
        !           338:        int     steps;          /* steps per cylinder */
        !           339:        int     tracks;         /* tracks/disk */
        !           340:        int     gpl;            /* intersector gap length for read/write */     
        !           341:        int     fgpl;           /* intersector gap length for format */
        !           342:        int     rate;           /* rate code */
        !           343: 
        !           344:        /*
        !           345:         *  these depend on previous entries and are set filled in
        !           346:         *  by floppyinit
        !           347:         */
        !           348:        int     bcode;          /* coded version of bytes for the controller */
        !           349:        long    cap;            /* drive capacity in bytes */
        !           350:        long    tsize;          /* track size in bytes */
        !           351: };
        !           352: /* bits in the registers */
        !           353: enum
        !           354: {
        !           355:        /* status registers a & b */
        !           356:        Psra=           0x3f0,
        !           357:        Psrb=           0x3f1,
        !           358: 
        !           359:        /* digital output register */
        !           360:        Pdor=           0x3f2,
        !           361:        Fintena=        0x8,    /* enable floppy interrupt */
        !           362:        Fena=           0x4,    /* 0 == reset controller */
        !           363: 
        !           364:        /* main status register */
        !           365:        Pmsr=           0x3f4,
        !           366:        Fready=         0x80,   /* ready to be touched */
        !           367:        Ffrom=          0x40,   /* data from controller */
        !           368:        Ffloppybusy=    0x10,   /* operation not over */
        !           369: 
        !           370:        /* data register */
        !           371:        Pfdata=         0x3f5,
        !           372:        Frecal=         0x07,   /* recalibrate cmd */
        !           373:        Fseek=          0x0f,   /* seek cmd */
        !           374:        Fsense=         0x08,   /* sense cmd */
        !           375:        Fread=          0x66,   /* read cmd */
        !           376:        Freadid=        0x4a,   /* read track id */
        !           377:        Fspec=          0x03,   /* set hold times */
        !           378:        Fwrite=         0x45,   /* write cmd */
        !           379:        Fformat=        0x4d,   /* format cmd */
        !           380:        Fmulti=         0x80,   /* or'd with Fread or Fwrite for multi-head */
        !           381:        Fdumpreg=       0x0e,   /* dump internal registers */
        !           382: 
        !           383:        /* digital input register */
        !           384:        Pdir=           0x3F7,  /* disk changed port (read only) */
        !           385:        Pdsr=           0x3F7,  /* data rate select port (write only) */
        !           386:        Fchange=        0x80,   /* disk has changed */
        !           387: 
        !           388:        /* status 0 byte */
        !           389:        Drivemask=      3<<0,
        !           390:        Seekend=        1<<5,
        !           391:        Codemask=       (3<<6)|(3<<3),
        !           392: };
        !           393: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.