Annotation of researchv10no/sys/md/cometupdump.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * code to take a crash dump
                      3:  * on a disk attached to an SMD disk controller
                      4:  * assumes UP at standard address
                      5:  * (but so does the boot code)
                      6:  * calls up.c (unfortunately) to figure out disk geometry
                      7:  */
                      8: 
                      9: #include "sys/param.h"
                     10: #include "sys/up.h"
                     11: 
                     12: /*
                     13:  * hardware parameters
                     14:  */
                     15: 
                     16: #define        PHYS(x) ((long)(x)&~KSTART)
                     17: #define        UBMAP   ((long *)0xf30800)      /* unibus map */
                     18: #define        UBREG   0xfc0000                /* addr 0 in unibus space */
                     19: #define        UP      ((struct device *)(0776700+UBREG))
                     20: 
                     21: #define        MRV     0x80000000              /* map register valid bit */
                     22: 
                     23: #define        CHUNK   8                       /* write this many sectors at once */
                     24: #define        SECSIZE 512                     /* size of a sector */
                     25: 
                     26: /*
                     27:  * hardware registers
                     28:  */
                     29: 
                     30: struct device
                     31: {
                     32:        u_short upcs1;          /* control and status register 1 */
                     33:        short   upwc;           /* word count register */
                     34:        u_short upba;           /* UNIBUS address register */
                     35:        u_short upda;           /* desired address register */
                     36:        u_short upcs2;          /* control and status register 2 */
                     37:        u_short upds;           /* drive status */
                     38:        u_short uper1;          /* error register 1 */
                     39:        u_short upas;           /* attention summary */
                     40:        u_short upla;           /* look ahead */
                     41:        u_short updb;           /* data buffer */
                     42:        u_short upmr;           /* maintenance */ 
                     43:        u_short updt;           /* drive type */
                     44:        u_short upsn;           /* serial number */
                     45:        u_short upof;           /* offset register */
                     46:        u_short updc;           /* desired cylinder address register */
                     47:        u_short uphr;           /* holding register */
                     48:        u_short upmr2;          /* maintenance register 2 */
                     49:        u_short uper2;          /* error register 2 */
                     50:        u_short upec1;          /* burst error bit position */
                     51:        u_short upec2;          /* burst error bit pattern */
                     52: };
                     53: 
                     54: /*
                     55:  * upcs1
                     56:  */
                     57: 
                     58: #define        UP_SC   0100000         /* special condition */
                     59: #define        UP_TRE  0040000         /* transfer error */
                     60: #define        UP_RDY  0000200         /* controller ready */
                     61: #define        UP_GO   0000001
                     62: 
                     63: #define        UP_DCLR         010             /* drive clear */
                     64: #define        UP_PRESET       020             /* read-in preset */
                     65: #define        UP_WCOM         060             /* write */
                     66: 
                     67: /*
                     68:  * upcs2
                     69:  */
                     70: #define        UPCS2_CLR       0000040         /* controller clear */
                     71: 
                     72: /*
                     73:  * upof
                     74:  */
                     75: #define        UPOF_FMT22      0010000         /* 16 bit format */
                     76: 
                     77: static upxtype;
                     78: extern struct upst upst[];
                     79: 
                     80: static upxwrite(), upxinit();
                     81: 
                     82: updump(unit, low, size)
                     83: int unit;
                     84: daddr_t low, size;
                     85: {
                     86:        register long p;
                     87:        register int i;
                     88:        extern int physmem;
                     89: 
                     90:        if (size > physmem)
                     91:                size = physmem;
                     92:        size -= CHUNK-1;
                     93:        if (upxinit(UP, unit))
                     94:                return (1);
                     95:        for (p = 0; p < size; p += CHUNK) {
                     96:                for (i = 0; i < CHUNK; i++)
                     97:                        UBMAP[i] = MRV|(p+i);
                     98:                if (upxwrite(UP, unit, low+p))
                     99:                        return (1);
                    100:        }
                    101:        return (0);
                    102: }
                    103: 
                    104: /*
                    105:  * clear the controller and reset it
                    106:  * hereafter, upcs2 has the unit number we want (we assume)
                    107:  */
                    108: static
                    109: upxinit(rp, unit)
                    110: register struct device *rp;
                    111: int unit;
                    112: {
                    113: 
                    114:        rp->upcs2 = UPCS2_CLR;
                    115:        if ((upxtype = uputype(rp, unit)) < 0) {
                    116:                printf("updump: can't init\n");
                    117:                return (1);
                    118:        }
                    119:        rp->upcs1 = UP_PRESET|UP_GO;
                    120:        rp->upof = UPOF_FMT22;
                    121:        return (0);
                    122: }
                    123: 
                    124: static
                    125: upxwrite(rp, unit, bno)
                    126: register struct device *rp;
                    127: int unit;
                    128: register long bno;
                    129: {
                    130:        register struct upst *sp;
                    131:        register int ts;                /* track and sector */
                    132: 
                    133:        sp = &upst[upxtype];
                    134:        ts = bno % sp->nsect;
                    135:        bno /= sp->nsect;
                    136:        ts |= (bno%sp->ntrak)<<8;
                    137:        bno /= sp->ntrak;
                    138:        rp->updc = bno;
                    139:        rp->upda = ts;
                    140:        rp->upwc = -(CHUNK*SECSIZE)/2;
                    141:        rp->upba = 0;
                    142:        rp->upcs1 = UP_WCOM|UP_GO;
                    143:        while ((rp->upcs1 & UP_RDY) == 0)
                    144:                ;
                    145:        if (rp->upcs1 & (UP_TRE|UP_SC))
                    146:                return (1);
                    147:        return (0);
                    148: }

unix.superglobalmegacorp.com

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