[BACK]Return to bpb.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / fs / msdosfs

Annotation of src/sys/fs/msdosfs/bpb.h, Revision 1.3

1.3     ! christos    1: /*     $NetBSD: bpb.h,v 1.2 2003/10/08 04:11:43 lukem Exp $    */
1.1       jdolecek    2:
                      3: /*
                      4:  * Written by Paul Popelka (paulp@uts.amdahl.com)
                      5:  *
                      6:  * You can do anything you want with this software, just don't say you wrote
                      7:  * it, and don't remove this notice.
                      8:  *
                      9:  * This software is provided "as is".
                     10:  *
                     11:  * The author supplies this software to be publicly redistributed on the
                     12:  * understanding that the author is not responsible for the correct
                     13:  * functioning of this software in any circumstances and is not liable for
                     14:  * any damages caused by this software.
                     15:  *
                     16:  * October 1992
                     17:  */
                     18:
                     19: /*
                     20:  * BIOS Parameter Block (BPB) for DOS 3.3
                     21:  */
                     22: struct bpb33 {
                     23:        u_int16_t       bpbBytesPerSec; /* bytes per sector */
                     24:        u_int8_t        bpbSecPerClust; /* sectors per cluster */
                     25:        u_int16_t       bpbResSectors;  /* number of reserved sectors */
                     26:        u_int8_t        bpbFATs;        /* number of FATs */
                     27:        u_int16_t       bpbRootDirEnts; /* number of root directory entries */
                     28:        u_int16_t       bpbSectors;     /* total number of sectors */
                     29:        u_int8_t        bpbMedia;       /* media descriptor */
                     30:        u_int16_t       bpbFATsecs;     /* number of sectors per FAT */
                     31:        u_int16_t       bpbSecPerTrack; /* sectors per track */
                     32:        u_int16_t       bpbHeads;       /* number of heads */
                     33:        u_int16_t       bpbHiddenSecs;  /* number of hidden sectors */
                     34: };
                     35:
                     36: /*
                     37:  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
                     38:  * and bpbHugeSectors is not in the 3.3 bpb.
                     39:  */
                     40: struct bpb50 {
                     41:        u_int16_t       bpbBytesPerSec; /* bytes per sector */
                     42:        u_int8_t        bpbSecPerClust; /* sectors per cluster */
                     43:        u_int16_t       bpbResSectors;  /* number of reserved sectors */
                     44:        u_int8_t        bpbFATs;        /* number of FATs */
                     45:        u_int16_t       bpbRootDirEnts; /* number of root directory entries */
                     46:        u_int16_t       bpbSectors;     /* total number of sectors */
                     47:        u_int8_t        bpbMedia;       /* media descriptor */
                     48:        u_int16_t       bpbFATsecs;     /* number of sectors per FAT */
                     49:        u_int16_t       bpbSecPerTrack; /* sectors per track */
                     50:        u_int16_t       bpbHeads;       /* number of heads */
                     51:        u_int32_t       bpbHiddenSecs;  /* # of hidden sectors */
                     52:        u_int32_t       bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
                     53: };
                     54:
                     55: /*
                     56:  * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
                     57:  */
                     58: struct bpb710 {
                     59:        u_int16_t       bpbBytesPerSec; /* bytes per sector */
                     60:        u_int8_t        bpbSecPerClust; /* sectors per cluster */
                     61:        u_int16_t       bpbResSectors;  /* number of reserved sectors */
                     62:        u_int8_t        bpbFATs;        /* number of FATs */
                     63:        u_int16_t       bpbRootDirEnts; /* number of root directory entries */
                     64:        u_int16_t       bpbSectors;     /* total number of sectors */
                     65:        u_int8_t        bpbMedia;       /* media descriptor */
                     66:        u_int16_t       bpbFATsecs;     /* number of sectors per FAT */
                     67:        u_int16_t       bpbSecPerTrack; /* sectors per track */
                     68:        u_int16_t       bpbHeads;       /* number of heads */
                     69:        u_int32_t       bpbHiddenSecs;  /* # of hidden sectors */
                     70:        u_int32_t       bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
                     71:        u_int32_t       bpbBigFATsecs;  /* like bpbFATsecs for FAT32 */
                     72:        u_int16_t       bpbExtFlags;    /* extended flags: */
                     73: #define        FATNUM          0xf             /* mask for numbering active FAT */
                     74: #define        FATMIRROR       0x80            /* FAT is mirrored (like it always was) */
                     75:        u_int16_t       bpbFSVers;      /* filesystem version */
                     76: #define        FSVERS          0               /* currently only 0 is understood */
                     77:        u_int32_t       bpbRootClust;   /* start cluster for root directory */
                     78:        u_int16_t       bpbFSInfo;      /* filesystem info structure sector */
                     79:        u_int16_t       bpbBackup;      /* backup boot sector */
1.2       lukem      80:        u_int8_t        bpbReserved[12]; /* Reserved for future expansion */
1.1       jdolecek   81: };
                     82:
                     83: #ifdef atari
                     84: /*
                     85:  * BPB for gemdos filesystems. Atari leaves the obsolete stuff undefined.
                     86:  * Currently there is no need for a separate BPB structure.
                     87:  */
                     88: #if 0
                     89: struct bpb_a {
                     90:        u_int16_t       bpbBytesPerSec; /* bytes per sector             */
                     91:        u_int8_t        bpbSecPerClust; /* sectors per cluster          */
                     92:        u_int16_t       bpbResSectors;  /* number of reserved sectors   */
                     93:        u_int8_t        bpbFATs;        /* number of FATs               */
                     94:        u_int16_t       bpbRootDirEnts; /* number of root directory entries */
                     95:        u_int16_t       bpbSectors;     /* total number of sectors      */
                     96:        u_int8_t        bpbUseless1;    /* meaningless on gemdos fs     */
                     97:        u_int16_t       bpbFATsecs;     /* number of sectors per FAT    */
                     98:        u_int16_t       bpbUseless2;    /* meaningless for harddisk fs  */
                     99:        u_int16_t       bpbUseless3;    /* meaningless for harddisk fs  */
                    100:        u_int16_t       bpbHiddenSecs;  /* the TOS-BIOS ignores this    */
                    101: };
                    102: #endif
                    103: #endif /* atari */
                    104:
                    105: /*
                    106:  * The following structures represent how the bpb's look on disk.  shorts
                    107:  * and longs are just character arrays of the appropriate length.  This is
                    108:  * because the compiler forces shorts and longs to align on word or
                    109:  * halfword boundaries.
                    110:  *
                    111:  * XXX The little-endian code here assumes that the processor can access
                    112:  * 16-bit and 32-bit quantities on byte boundaries.  If this is not true,
                    113:  * use the macros for the big-endian case.
                    114:  */
                    115: #include <machine/endian.h>
1.3     ! christos  116: #ifdef __STDC__
        !           117: #define __ICAST(q,a,x) ((q u_int ## a ## _t *)(q void *)(x))
        !           118: #else
        !           119: #define __ICAST(q,a,x) ((q u_int/**/a/**/_t *)(q void *)(x))
        !           120: #endif
1.1       jdolecek  121: #if (BYTE_ORDER == LITTLE_ENDIAN) && defined(UNALIGNED_ACCESS)
1.3     ! christos  122: #define        getushort(x)    *__ICAST(const,16,x)
        !           123: #define        getulong(x)     *__ICAST(const,32,x)
        !           124: #define        putushort(p, v) (void)(*__ICAST(,16,p) = (v))
        !           125: #define        putulong(p, v)  (void)(*__ICAST(,32,p) = (v))
1.1       jdolecek  126: #else
1.3     ! christos  127: #define getushort(x)   (__ICAST(const,8,x)[0] + (__ICAST(const,8,x)[1] << 8))
        !           128: #define getulong(x)    (__ICAST(const,8,x)[0] + (__ICAST(const,8,x)[1] << 8) \
        !           129:                         + (__ICAST(const,8,x)[2] << 16)        \
        !           130:                         + (__ICAST(const,8,x)[3] << 24))
        !           131: #define putushort(p, v)        (__ICAST(,8,p)[0] = (v),        \
        !           132:                         __ICAST(,8,p)[1] = (v) >> 8)
        !           133: #define putulong(p, v) (__ICAST(,8,p)[0] = (v),        \
        !           134:                         __ICAST(,8,p)[1] = (v) >> 8, \
        !           135:                         __ICAST(,8,p)[2] = (v) >> 16,\
        !           136:                         __ICAST(,8,p)[3] = (v) >> 24)
1.1       jdolecek  137: #endif
                    138:
                    139: /*
                    140:  * BIOS Parameter Block (BPB) for DOS 3.3
                    141:  */
                    142: struct byte_bpb33 {
                    143:        int8_t bpbBytesPerSec[2];       /* bytes per sector */
                    144:        int8_t bpbSecPerClust;          /* sectors per cluster */
                    145:        int8_t bpbResSectors[2];        /* number of reserved sectors */
                    146:        int8_t bpbFATs;                 /* number of FATs */
                    147:        int8_t bpbRootDirEnts[2];       /* number of root directory entries */
                    148:        int8_t bpbSectors[2];           /* total number of sectors */
                    149:        int8_t bpbMedia;                /* media descriptor */
                    150:        int8_t bpbFATsecs[2];           /* number of sectors per FAT */
                    151:        int8_t bpbSecPerTrack[2];       /* sectors per track */
                    152:        int8_t bpbHeads[2];             /* number of heads */
                    153:        int8_t bpbHiddenSecs[2];        /* number of hidden sectors */
                    154: };
                    155:
                    156: /*
                    157:  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
                    158:  * and bpbHugeSectors is not in the 3.3 bpb.
                    159:  */
                    160: struct byte_bpb50 {
                    161:        int8_t bpbBytesPerSec[2];       /* bytes per sector */
                    162:        int8_t bpbSecPerClust;          /* sectors per cluster */
                    163:        int8_t bpbResSectors[2];        /* number of reserved sectors */
                    164:        int8_t bpbFATs;                 /* number of FATs */
                    165:        int8_t bpbRootDirEnts[2];       /* number of root directory entries */
                    166:        int8_t bpbSectors[2];           /* total number of sectors */
                    167:        int8_t bpbMedia;                /* media descriptor */
                    168:        int8_t bpbFATsecs[2];           /* number of sectors per FAT */
                    169:        int8_t bpbSecPerTrack[2];       /* sectors per track */
                    170:        int8_t bpbHeads[2];             /* number of heads */
                    171:        int8_t bpbHiddenSecs[4];        /* number of hidden sectors */
                    172:        int8_t bpbHugeSectors[4];       /* # of sectors if bpbSectors == 0 */
                    173: };
                    174:
                    175: /*
                    176:  * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
                    177:  */
                    178: struct byte_bpb710 {
                    179:        u_int8_t bpbBytesPerSec[2];     /* bytes per sector */
                    180:        u_int8_t bpbSecPerClust;        /* sectors per cluster */
                    181:        u_int8_t bpbResSectors[2];      /* number of reserved sectors */
                    182:        u_int8_t bpbFATs;               /* number of FATs */
                    183:        u_int8_t bpbRootDirEnts[2];     /* number of root directory entries */
                    184:        u_int8_t bpbSectors[2];         /* total number of sectors */
                    185:        u_int8_t bpbMedia;              /* media descriptor */
                    186:        u_int8_t bpbFATsecs[2];         /* number of sectors per FAT */
                    187:        u_int8_t bpbSecPerTrack[2];     /* sectors per track */
                    188:        u_int8_t bpbHeads[2];           /* number of heads */
                    189:        u_int8_t bpbHiddenSecs[4];      /* # of hidden sectors */
                    190:        u_int8_t bpbHugeSectors[4];     /* # of sectors if bpbSectors == 0 */
                    191:        u_int8_t bpbBigFATsecs[4];      /* like bpbFATsecs for FAT32 */
                    192:        u_int8_t bpbExtFlags[2];        /* extended flags: */
                    193:        u_int8_t bpbFSVers[2];          /* filesystem version */
                    194:        u_int8_t bpbRootClust[4];       /* start cluster for root directory */
                    195:        u_int8_t bpbFSInfo[2];          /* filesystem info structure sector */
                    196:        u_int8_t bpbBackup[2];          /* backup boot sector */
1.2       lukem     197:        u_int8_t bpbReserved[12];       /* Reserved for future expansion */
1.1       jdolecek  198: };
                    199:
                    200: /*
                    201:  * FAT32 FSInfo block.
                    202:  */
                    203: struct fsinfo {
                    204:        u_int8_t fsisig1[4];
                    205:        u_int8_t fsifill1[480];
                    206:        u_int8_t fsisig2[4];
                    207:        u_int8_t fsinfree[4];
                    208:        u_int8_t fsinxtfree[4];
                    209:        u_int8_t fsifill2[12];
                    210:        u_int8_t fsisig3[4];
                    211:        u_int8_t fsifill3[508];
                    212:        u_int8_t fsisig4[4];
                    213: };

CVSweb <webmaster@jp.NetBSD.org>