Annotation of 43BSDReno/sys/tahoestand/vdformat/vdfmt.h, revision 1.1

1.1     ! root        1: /*     vdfmt.h 1.8     90/06/24        */
        !             2: 
        !             3: /*
        !             4:  * VERSAbus disk controller (vd) disk formatter.
        !             5:  */
        !             6: #include <setjmp.h>
        !             7: #include "tahoe/mtpr.h"
        !             8: #include "param.h"
        !             9: #include "buf.h"
        !            10: #include "disklabel.h" 
        !            11: #include "time.h"
        !            12: #include "vnode.h"
        !            13: #include "ufs/inode.h" 
        !            14: #include "ufs/fs.h"
        !            15: #include "tahoevba/vbaparam.h"
        !            16: #include "tahoevba/vdreg.h"
        !            17: 
        !            18: #include "tahoe/cp.h"
        !            19: extern struct cpdcb_i cpin;            /* found in cons.c */
        !            20: 
        !            21: /*
        !            22:  * Poll console and return 1 if input is present.
        !            23:  */
        !            24: #define        input() \
        !            25:     (uncache(&cpin.cp_hdr.cp_unit), (cpin.cp_hdr.cp_unit&CPDONE))
        !            26: 
        !            27: /*
        !            28:  * Configuration parameters
        !            29:  */
        !            30: #define        MAXCTLR         8               /* Maximum # of controllers */
        !            31: #define        MAXDRIVE        16              /* Max drives per controller */
        !            32: 
        !            33: #define NUMMAP         1               /* # Cyls in bad sector map */
        !            34: #define        NUMMNT          1               /* # cyls for diagnostics */
        !            35: #define        NUMREL          3               /* # Cyls in relocation area */
        !            36: #define        NUMSYS  (NUMREL+NUMMNT+NUMMAP)  /* Total cyls used by system */
        !            37: 
        !            38: #define        MAXTRKS         32
        !            39: #define        MAXSECS_PER_TRK 72              /* at 512 bytes/sector */
        !            40: #define        MAXERR          1000
        !            41: #define        MAXTRKSIZ       ((512/sizeof(long)) * MAXSECS_PER_TRK)
        !            42: #define bytes_trk      (lab->d_nsectors * lab->d_secsize)
        !            43: 
        !            44: #define        HARD_ERROR \
        !            45:     (DCBS_NRDY|DCBS_IVA|DCBS_NEM|DCBS_DPE|DCBS_OAB|DCBS_WPT|DCBS_SKI|DCBS_OCYL)
        !            46: #define DATA_ERROR \
        !            47:     (DCBS_UDE|DCBS_DCE|DCBS_DSE|DCBS_DSL|DCBS_TOP|DCBS_TOM|DCBS_CCD|\
        !            48:      DCBS_HARD|DCBS_SOFT)
        !            49: #define HEADER_ERROR   (DCBS_HCRC|DCBS_HCE)
        !            50: #define        NRM             (short)0
        !            51: #define        BAD             (short)VDUF
        !            52: #define WPT            (short)(NRM | VDWPT)
        !            53: #define RELOC_SECTOR   (short)(VDALT)
        !            54: #define        ALT_SECTOR      (short)(VDALT)
        !            55: 
        !            56: typedef enum { false, true } boolean;
        !            57: typedef enum { u_false, u_true, u_unknown } uncertain;
        !            58: 
        !            59: /*
        !            60:  * Free bad block allocation bit map
        !            61:  */
        !            62: typedef struct {
        !            63:        enum { ALLOCATED, NOTALLOCATED } free_status;
        !            64: } fmt_free;
        !            65: 
        !            66: typedef enum { SINGLE_SECTOR, FULL_TRACK } rel_type;   /* relocation type */
        !            67: 
        !            68: /*
        !            69:  * Error table format
        !            70:  */
        !            71: typedef struct {
        !            72:        dskadr  err_adr;
        !            73:        long    err_stat;
        !            74: } fmt_err;
        !            75: 
        !            76: /* utilities */
        !            77: int    to_sector();
        !            78: int    to_track();
        !            79: int    data_ok();
        !            80: boolean        get_yes_no();
        !            81: boolean        is_in_map();
        !            82: boolean        is_formatted();
        !            83: boolean        read_bad_sector_map();
        !            84: dskadr *from_sector();
        !            85: dskadr *from_track();
        !            86: dskadr *from_unix();
        !            87: dskadr is_relocated();
        !            88: dskadr *new_location();
        !            89: 
        !            90: /*
        !            91:  * Operation table
        !            92:  */
        !            93: typedef struct {
        !            94:        int     (*routine)();
        !            95:        char    *op_name;
        !            96:        char    *op_action;
        !            97: } op_tbl;
        !            98: 
        !            99: #define        NUMOPS  7
        !           100: op_tbl operations[NUMOPS];
        !           101: 
        !           102: /*
        !           103:  * Operation bit mask values (must match order in operations table)
        !           104:  */
        !           105: #define        FORMAT_OP       0x01    /* Format operation bit */
        !           106: #define        VERIFY_OP       0x02    /* Verify operation bit */
        !           107: #define        RELOCATE_OP     0x04    /* Relocate operation bit */
        !           108: #define        INFO_OP         0x08    /* Info operation bit */
        !           109: #define        CORRECT_OP      0x10    /* Correct operation bit */
        !           110: #define        PROFILE_OP      0x20    /* Profile operation bit */
        !           111: #define        EXERCISE_OP     0x40    /* Exercise operation bit */
        !           112: 
        !           113: extern int format(), verify(), relocate(), info();
        !           114: extern int correct(), profile(), exercise();
        !           115: 
        !           116: 
        !           117: /*
        !           118:  * Operation table type and definitions
        !           119:  */
        !           120: typedef struct {
        !           121:        int     op;
        !           122:        int     numpat;
        !           123: } op_spec;
        !           124: op_spec        ops_to_do[MAXCTLR][MAXDRIVE];
        !           125: 
        !           126: /*
        !           127:  * Contains all the current parameters
        !           128:  */
        !           129: typedef enum {
        !           130:        formatted,
        !           131:        half_formatted,
        !           132:        unformatted,
        !           133:        unknown
        !           134: } drv_stat;
        !           135: typedef enum {
        !           136:        fmt,
        !           137:        vfy,
        !           138:        rel,
        !           139:        cor,
        !           140:        inf,
        !           141:        cmd,
        !           142:        exec,
        !           143:        prof,
        !           144:        setup
        !           145: } state;
        !           146: typedef enum {
        !           147:        sub_chk,
        !           148:        sub_rcvr,
        !           149:        sub_stat,
        !           150:        sub_rel,
        !           151:        sub_vfy,
        !           152:        sub_fmt,
        !           153:        sub_sk,
        !           154:        sub_wmap
        !           155: } substate;
        !           156: 
        !           157: /*
        !           158:  * Different environments for setjumps
        !           159:  */
        !           160: jmp_buf        reset_environ;  /* Use when reset is issued */
        !           161: jmp_buf        quit_environ;   /* Use when you want to quit what your doing */
        !           162: jmp_buf        abort_environ;  /* Use when nothing can be done to recover */
        !           163: 
        !           164: /*
        !           165:  * Flaw map definitions and storage
        !           166:  */
        !           167: typedef struct {
        !           168:        short   bs_cyl;                 /* Cylinder position of flaw */
        !           169:        short   bs_trk;                 /* Track position of flaw */
        !           170:        long    bs_offset;              /* (byte) Position of flaw on track */
        !           171:        long    bs_length;              /* Length (in bits) of flaw */
        !           172:        dskadr  bs_alt;                 /* Addr of alt sector (all 0 if none) */
        !           173:        enum { flaw_map, scanning, operator } bs_how; /* How it was found */
        !           174: } bs_entry ;
        !           175: 
        !           176: struct {
        !           177:        int             controller;
        !           178:        int             drive;
        !           179:        state           state;
        !           180:        substate        substate;
        !           181:        int             error;
        !           182:        dskadr          daddr;
        !           183: } cur;
        !           184: 
        !           185: /*
        !           186:  * Controller specific information
        !           187:  */
        !           188: typedef struct {
        !           189:        uncertain       alive;
        !           190:        struct  vddevice *addr;
        !           191:        char            *name;
        !           192:        int             type;
        !           193:        fmt_err         *(*decode_pos)();
        !           194:        bs_entry        *(*code_pos)();
        !           195: } ctlr_info;
        !           196: 
        !           197: ctlr_info      c_info[MAXCTLR];
        !           198: ctlr_info      *C_INFO;
        !           199: 
        !           200: /*
        !           201:  * Drive specific information
        !           202:  */
        !           203: typedef struct {
        !           204:        uncertain       alive;
        !           205:        int             id;
        !           206:        struct          disklabel label;
        !           207:        drv_stat        condition;
        !           208: } drive_info;
        !           209: #define        d_traksize      d_drivedata[1]
        !           210: #define        d_pat           d_drivedata[2]
        !           211: 
        !           212: drive_info     d_info[MAXCTLR][MAXDRIVE];
        !           213: drive_info     *D_INFO;
        !           214: struct disklabel *lab;
        !           215: 
        !           216: struct disklabel vdproto[];
        !           217: int    ndrives;
        !           218: int    smddrives;
        !           219: 
        !           220: /*
        !           221:  * Structure of the bad-sector map on the disk.
        !           222:  * The original bs_map did not have the magic number or "checksum,"
        !           223:  * thus the fudges below.
        !           224:  */
        !           225: typedef struct {
        !           226:        unsigned int    bs_magic;       /* magic (0x12344321) */
        !           227:        unsigned int    bs_cksum;       /* checksum (0) */
        !           228:        unsigned int    bs_id;          /* Pack id */
        !           229:        unsigned int    bs_count;       /* number of known bad sectors */
        !           230:        unsigned int    bs_max;         /* Maximum allowable bad sectors */
        !           231:        bs_entry        list[1];
        !           232: } bs_map;
        !           233: 
        !           234: #define MAX_FLAWMAP(x) (((x) - sizeof(bs_map)) / sizeof(bs_entry))
        !           235: #define MAX_FLAWS      MAX_FLAWMAP(MAXTRKSIZ*sizeof(long))
        !           236: #define BSMAGIC                0x12344321
        !           237: 
        !           238: union {
        !           239:        bs_map  Offset_bad_map;                 /* offset by bs_magic+cksum */
        !           240: #define offset_bad_map bs_map_space.Offset_bad_map
        !           241:        struct {
        !           242:                unsigned int    bs_magic;
        !           243:                unsigned int    bs_cksum;
        !           244:                bs_map          bs_map;         /* aligned with track buffer */
        !           245:        } Norm_bad_map;
        !           246: #define norm_bad_map   bs_map_space.Norm_bad_map.bs_map
        !           247:        struct {
        !           248:                unsigned int    bs_magic;
        !           249:                unsigned int    bs_cksum;
        !           250:                long    track[MAXTRKSIZ];       /* disk track is read here */
        !           251:        } space;
        !           252: #define map_space      bs_map_space.space.track
        !           253: } bs_map_space;
        !           254: 
        !           255: bs_map *bad_map;
        !           256: 
        !           257: boolean        kill_processes;
        !           258: int    num_controllers;
        !           259: extern int vdtimeout;
        !           260: 
        !           261: /*
        !           262:  * Pattern buffers and the sort
        !           263:  */
        !           264: fmt_free       free_tbl[NUMREL*MAXTRKS][MAXSECS_PER_TRK];
        !           265: struct mdcb    mdcb;           /* Master device control block */
        !           266: struct dcb     dcb;            /* Device control blocks */
        !           267: 
        !           268: long   pattern_0[MAXTRKSIZ],  pattern_1[MAXTRKSIZ];
        !           269: long   pattern_2[MAXTRKSIZ],  pattern_3[MAXTRKSIZ];
        !           270: long   pattern_4[MAXTRKSIZ],  pattern_5[MAXTRKSIZ];
        !           271: long   pattern_6[MAXTRKSIZ],  pattern_7[MAXTRKSIZ];
        !           272: long   pattern_8[MAXTRKSIZ],  pattern_9[MAXTRKSIZ];
        !           273: long   pattern_10[MAXTRKSIZ], pattern_11[MAXTRKSIZ];
        !           274: long   pattern_12[MAXTRKSIZ], pattern_13[MAXTRKSIZ];
        !           275: long   pattern_14[MAXTRKSIZ], pattern_15[MAXTRKSIZ];
        !           276: 
        !           277: long   *pattern_address[16];   /* pointers to pattern_* */
        !           278: 
        !           279: /*
        !           280:  * Double buffer for scanning existing
        !           281:  * file systems and general scratch
        !           282:  */
        !           283: long   scratch[MAXTRKSIZ];
        !           284: long   save[MAXTRKSIZ];
        !           285: 
        !           286: /* XXX */
        !           287: /*
        !           288:  * Flaw map stuff 
        !           289:  */
        !           290: typedef struct {
        !           291:        long    flaw_sync;
        !           292:        short   flaw_cyl;
        !           293:        char    flaw_trk;
        !           294:        char    flaw_sec;
        !           295:        struct {
        !           296:                short   flaw_offset;
        !           297:                short   flaw_length;
        !           298:        } flaw_pos[4];
        !           299:        char    flaw_status;
        !           300:        char    flaw_junk[1024]; /* Fill up 518 byte block */
        !           301: } flaw;
        !           302: 
        !           303: typedef struct {
        !           304:        long            smde_sync;
        !           305:        unsigned        adr_cyl  : 12;
        !           306:        unsigned        adr_trk  : 8;
        !           307:        unsigned        adr_sec  : 8;
        !           308:        unsigned        sec_flgs : 4;
        !           309:        unsigned        alt_cyl  : 12;
        !           310:        unsigned        alt_trk  : 8;
        !           311:        unsigned        alt_sec  : 8;
        !           312:        char            smde_junk[1024];
        !           313: } smde_hdr;
        !           314: 
        !           315: /* for MAXTOR */
        !           316: 
        !           317: typedef struct {
        !           318:        unsigned long   esdi_flaw_sync;
        !           319:        unsigned short  esdi_flaw_cyl;
        !           320:        unsigned char   esdi_flaw_trk;
        !           321:        unsigned char   esdi_flaw_sec;
        !           322:        unsigned char   esdi_flags;
        !           323:        unsigned char   esdi_ecc_1[2];
        !           324:        unsigned char   esdi_pad_1[2];
        !           325:        unsigned char   esdi_plo_sync[26];
        !           326: } esdi_flaw_header;
        !           327: 
        !           328: typedef struct {
        !           329:        unsigned long   esdi_data_sync;
        !           330:        unsigned char   esdi_month;
        !           331:        unsigned char   esdi_day;
        !           332:        unsigned char   esdi_year;
        !           333:        unsigned char   esdi_head;
        !           334:        unsigned char   esdi_pad_2[2];
        !           335:        unsigned char   esdi_flaws[50][5];  /* see esdi_flaw_entry */
        !           336:        unsigned char   esdi_ecc_2[2];
        !           337:        unsigned char   esdi_pad_3[2];
        !           338:        char            esdi_flaw_junk[1024]; /* Fill up block */
        !           339: } esdi_flaw_data;
        !           340: 
        !           341: 
        !           342: 
        !           343: typedef struct {
        !           344:        esdi_flaw_header        esdi_header;
        !           345:        esdi_flaw_data          esdi_data;
        !           346: } esdi_flaw;
        !           347: 
        !           348: 
        !           349: 
        !           350: /*
        !           351: **  since each flaw entry is 5 bytes and this forces alignment problems we
        !           352: ** define a structure here so that the entries can be BCOPYed into a
        !           353: ** reasonable work area before access.
        !           354: */
        !           355: 
        !           356: typedef struct {
        !           357:        unsigned short  esdi_flaw_cyl;
        !           358:        unsigned short  esdi_flaw_offset;
        !           359:        unsigned char   esdi_flaw_length;
        !           360: } esdi_flaw_entry;
        !           361: 
        !           362: #define        CDCSYNC         0x1919
        !           363: #define        SMDSYNC         0x0019
        !           364: #define        SMDESYNC        0x0009
        !           365: #define        SMDE1SYNC       0x000d
        !           366: #define        ESDISYNC        0x00fe
        !           367: #define        ESDI1SYNC       0x00fe /* 0x00f8 */
        !           368: 
        !           369: /* XXX */
        !           370: 
        !           371: /*
        !           372:  * Flaw testing patterns.
        !           373:  */
        !           374: struct flawpat {
        !           375:        u_int   fp_pat[16];
        !           376: };

unix.superglobalmegacorp.com

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