1 | /* $NetBSD: bpb.h,v 1.8 2016/01/22 22:53:36 dholland Exp $ */ |
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 | #ifndef _MSDOSFS_BPB_H_ |
20 | #define _MSDOSFS_BPB_H_ |
21 | |
22 | /* |
23 | * BIOS Parameter Block (BPB) for DOS 3.3 |
24 | */ |
25 | struct bpb33 { |
26 | uint16_t bpbBytesPerSec; /* bytes per sector */ |
27 | uint8_t bpbSecPerClust; /* sectors per cluster */ |
28 | uint16_t bpbResSectors; /* number of reserved sectors */ |
29 | uint8_t bpbFATs; /* number of FATs */ |
30 | uint16_t bpbRootDirEnts; /* number of root directory entries */ |
31 | uint16_t bpbSectors; /* total number of sectors */ |
32 | uint8_t bpbMedia; /* media descriptor */ |
33 | uint16_t bpbFATsecs; /* number of sectors per FAT */ |
34 | uint16_t bpbSecPerTrack; /* sectors per track */ |
35 | uint16_t bpbHeads; /* number of heads */ |
36 | uint16_t bpbHiddenSecs; /* number of hidden sectors */ |
37 | }; |
38 | |
39 | /* |
40 | * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, |
41 | * and bpbHugeSectors is not in the 3.3 bpb. |
42 | */ |
43 | struct bpb50 { |
44 | uint16_t bpbBytesPerSec; /* bytes per sector */ |
45 | uint8_t bpbSecPerClust; /* sectors per cluster */ |
46 | uint16_t bpbResSectors; /* number of reserved sectors */ |
47 | uint8_t bpbFATs; /* number of FATs */ |
48 | uint16_t bpbRootDirEnts; /* number of root directory entries */ |
49 | uint16_t bpbSectors; /* total number of sectors */ |
50 | uint8_t bpbMedia; /* media descriptor */ |
51 | uint16_t bpbFATsecs; /* number of sectors per FAT */ |
52 | uint16_t bpbSecPerTrack; /* sectors per track */ |
53 | uint16_t bpbHeads; /* number of heads */ |
54 | uint32_t bpbHiddenSecs; /* # of hidden sectors */ |
55 | uint32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ |
56 | }; |
57 | |
58 | /* |
59 | * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. |
60 | */ |
61 | struct bpb710 { |
62 | uint16_t bpbBytesPerSec; /* bytes per sector */ |
63 | uint8_t bpbSecPerClust; /* sectors per cluster */ |
64 | uint16_t bpbResSectors; /* number of reserved sectors */ |
65 | uint8_t bpbFATs; /* number of FATs */ |
66 | uint16_t bpbRootDirEnts; /* number of root directory entries */ |
67 | uint16_t bpbSectors; /* total number of sectors */ |
68 | uint8_t bpbMedia; /* media descriptor */ |
69 | uint16_t bpbFATsecs; /* number of sectors per FAT */ |
70 | uint16_t bpbSecPerTrack; /* sectors per track */ |
71 | uint16_t bpbHeads; /* number of heads */ |
72 | uint32_t bpbHiddenSecs; /* # of hidden sectors */ |
73 | uint32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ |
74 | uint32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */ |
75 | uint16_t bpbExtFlags; /* extended flags: */ |
76 | #define FATNUM 0xf /* mask for numbering active FAT */ |
77 | #define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */ |
78 | uint16_t bpbFSVers; /* filesystem version */ |
79 | #define FSVERS 0 /* currently only 0 is understood */ |
80 | uint32_t bpbRootClust; /* start cluster for root directory */ |
81 | uint16_t bpbFSInfo; /* filesystem info structure sector */ |
82 | uint16_t bpbBackup; /* backup boot sector */ |
83 | uint8_t bpbReserved[12]; /* Reserved for future expansion */ |
84 | }; |
85 | |
86 | #ifdef atari |
87 | /* |
88 | * BPB for GEMDOS filesystems. Atari leaves the obsolete stuff undefined. |
89 | * Currently there is no need for a separate BPB structure. |
90 | */ |
91 | #if 0 |
92 | struct bpb_a { |
93 | uint16_t bpbBytesPerSec; /* bytes per sector */ |
94 | uint8_t bpbSecPerClust; /* sectors per cluster */ |
95 | uint16_t bpbResSectors; /* number of reserved sectors */ |
96 | uint8_t bpbFATs; /* number of FATs */ |
97 | uint16_t bpbRootDirEnts; /* number of root directory entries */ |
98 | uint16_t bpbSectors; /* total number of sectors */ |
99 | uint8_t bpbUseless1; /* meaningless on GEMDOS FS */ |
100 | uint16_t bpbFATsecs; /* number of sectors per FAT */ |
101 | uint16_t bpbUseless2; /* meaningless for harddisk fs */ |
102 | uint16_t bpbUseless3; /* meaningless for harddisk fs */ |
103 | uint16_t bpbHiddenSecs; /* the TOS-BIOS ignores this */ |
104 | }; |
105 | #endif |
106 | #endif /* atari */ |
107 | |
108 | /* |
109 | * The following structures represent how the bpb's look on disk. shorts |
110 | * and longs are just character arrays of the appropriate length. This is |
111 | * because the compiler forces shorts and longs to align on word or |
112 | * halfword boundaries. |
113 | */ |
114 | |
115 | #include <sys/endian.h> |
116 | |
117 | #define getushort(p) le16dec(p) |
118 | #define getulong(p) le32dec(p) |
119 | #define putushort(p, v) le16enc((p), (v)) |
120 | #define putulong(p, v) le32enc((p), (v)) |
121 | |
122 | /* |
123 | * BIOS Parameter Block (BPB) for DOS 3.3 |
124 | */ |
125 | struct byte_bpb33 { |
126 | int8_t bpbBytesPerSec[2]; /* bytes per sector */ |
127 | int8_t bpbSecPerClust; /* sectors per cluster */ |
128 | int8_t bpbResSectors[2]; /* number of reserved sectors */ |
129 | int8_t bpbFATs; /* number of FATs */ |
130 | int8_t bpbRootDirEnts[2]; /* number of root directory entries */ |
131 | int8_t bpbSectors[2]; /* total number of sectors */ |
132 | int8_t bpbMedia; /* media descriptor */ |
133 | int8_t bpbFATsecs[2]; /* number of sectors per FAT */ |
134 | int8_t bpbSecPerTrack[2]; /* sectors per track */ |
135 | int8_t bpbHeads[2]; /* number of heads */ |
136 | int8_t bpbHiddenSecs[2]; /* number of hidden sectors */ |
137 | }; |
138 | |
139 | /* |
140 | * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, |
141 | * and bpbHugeSectors is not in the 3.3 bpb. |
142 | */ |
143 | struct byte_bpb50 { |
144 | int8_t bpbBytesPerSec[2]; /* bytes per sector */ |
145 | int8_t bpbSecPerClust; /* sectors per cluster */ |
146 | int8_t bpbResSectors[2]; /* number of reserved sectors */ |
147 | int8_t bpbFATs; /* number of FATs */ |
148 | int8_t bpbRootDirEnts[2]; /* number of root directory entries */ |
149 | int8_t bpbSectors[2]; /* total number of sectors */ |
150 | int8_t bpbMedia; /* media descriptor */ |
151 | int8_t bpbFATsecs[2]; /* number of sectors per FAT */ |
152 | int8_t bpbSecPerTrack[2]; /* sectors per track */ |
153 | int8_t bpbHeads[2]; /* number of heads */ |
154 | int8_t bpbHiddenSecs[4]; /* number of hidden sectors */ |
155 | int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ |
156 | }; |
157 | |
158 | /* |
159 | * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. |
160 | */ |
161 | struct byte_bpb710 { |
162 | uint8_t bpbBytesPerSec[2]; /* bytes per sector */ |
163 | uint8_t bpbSecPerClust; /* sectors per cluster */ |
164 | uint8_t bpbResSectors[2]; /* number of reserved sectors */ |
165 | uint8_t bpbFATs; /* number of FATs */ |
166 | uint8_t bpbRootDirEnts[2]; /* number of root directory entries */ |
167 | uint8_t bpbSectors[2]; /* total number of sectors */ |
168 | uint8_t bpbMedia; /* media descriptor */ |
169 | uint8_t bpbFATsecs[2]; /* number of sectors per FAT */ |
170 | uint8_t bpbSecPerTrack[2]; /* sectors per track */ |
171 | uint8_t bpbHeads[2]; /* number of heads */ |
172 | uint8_t bpbHiddenSecs[4]; /* # of hidden sectors */ |
173 | uint8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ |
174 | uint8_t bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */ |
175 | uint8_t bpbExtFlags[2]; /* extended flags: */ |
176 | uint8_t bpbFSVers[2]; /* filesystem version */ |
177 | uint8_t bpbRootClust[4]; /* start cluster for root directory */ |
178 | uint8_t bpbFSInfo[2]; /* filesystem info structure sector */ |
179 | uint8_t bpbBackup[2]; /* backup boot sector */ |
180 | uint8_t bpbReserved[12]; /* Reserved for future expansion */ |
181 | }; |
182 | |
183 | /* |
184 | * FAT32 FSInfo block. |
185 | */ |
186 | struct fsinfo { |
187 | uint8_t fsisig1[4]; |
188 | uint8_t fsifill1[480]; |
189 | uint8_t fsisig2[4]; |
190 | uint8_t fsinfree[4]; |
191 | uint8_t fsinxtfree[4]; |
192 | uint8_t fsifill2[12]; |
193 | uint8_t fsisig3[4]; |
194 | uint8_t fsifill3[508]; |
195 | uint8_t fsisig4[4]; |
196 | }; |
197 | #endif /* _MSDOSFS_BPB_H_ */ |
198 | |