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