1/* $FreeBSD$ */
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 _FS_MSDOSFS_BPB_H_
21#define	_FS_MSDOSFS_BPB_H_
22
23/*
24 * BIOS Parameter Block (BPB) for DOS 3.3
25 */
26struct 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 */
44struct 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 */
62struct 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/*
88 * The following structures represent how the bpb's look on disk.  shorts
89 * and longs are just character arrays of the appropriate length.  This is
90 * because the compiler forces shorts and longs to align on word or
91 * halfword boundaries.
92 */
93
94#include <sys/endian.h>
95
96#define	getushort(x)	le16dec(x)
97#define	getulong(x)	le32dec(x)
98#define	putushort(p, v)	le16enc(p, v)
99#define	putulong(p, v)	le32enc(p, v)
100
101/*
102 * BIOS Parameter Block (BPB) for DOS 3.3
103 */
104struct byte_bpb33 {
105	int8_t bpbBytesPerSec[2];	/* bytes per sector */
106	int8_t bpbSecPerClust;		/* sectors per cluster */
107	int8_t bpbResSectors[2];	/* number of reserved sectors */
108	int8_t bpbFATs;			/* number of FATs */
109	int8_t bpbRootDirEnts[2];	/* number of root directory entries */
110	int8_t bpbSectors[2];		/* total number of sectors */
111	int8_t bpbMedia;		/* media descriptor */
112	int8_t bpbFATsecs[2];		/* number of sectors per FAT */
113	int8_t bpbSecPerTrack[2];	/* sectors per track */
114	int8_t bpbHeads[2];		/* number of heads */
115	int8_t bpbHiddenSecs[2];	/* number of hidden sectors */
116};
117
118/*
119 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
120 * and bpbHugeSectors is not in the 3.3 bpb.
121 */
122struct byte_bpb50 {
123	int8_t bpbBytesPerSec[2];	/* bytes per sector */
124	int8_t bpbSecPerClust;		/* sectors per cluster */
125	int8_t bpbResSectors[2];	/* number of reserved sectors */
126	int8_t bpbFATs;			/* number of FATs */
127	int8_t bpbRootDirEnts[2];	/* number of root directory entries */
128	int8_t bpbSectors[2];		/* total number of sectors */
129	int8_t bpbMedia;		/* media descriptor */
130	int8_t bpbFATsecs[2];		/* number of sectors per FAT */
131	int8_t bpbSecPerTrack[2];	/* sectors per track */
132	int8_t bpbHeads[2];		/* number of heads */
133	int8_t bpbHiddenSecs[4];	/* number of hidden sectors */
134	int8_t bpbHugeSectors[4];	/* # of sectors if bpbSectors == 0 */
135};
136
137/*
138 * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
139 */
140struct byte_bpb710 {
141	u_int8_t bpbBytesPerSec[2];	/* bytes per sector */
142	u_int8_t bpbSecPerClust;	/* sectors per cluster */
143	u_int8_t bpbResSectors[2];	/* number of reserved sectors */
144	u_int8_t bpbFATs;		/* number of FATs */
145	u_int8_t bpbRootDirEnts[2];	/* number of root directory entries */
146	u_int8_t bpbSectors[2];		/* total number of sectors */
147	u_int8_t bpbMedia;		/* media descriptor */
148	u_int8_t bpbFATsecs[2];		/* number of sectors per FAT */
149	u_int8_t bpbSecPerTrack[2];	/* sectors per track */
150	u_int8_t bpbHeads[2];		/* number of heads */
151	u_int8_t bpbHiddenSecs[4];	/* # of hidden sectors */
152	u_int8_t bpbHugeSectors[4];	/* # of sectors if bpbSectors == 0 */
153	u_int8_t bpbBigFATsecs[4];	/* like bpbFATsecs for FAT32 */
154	u_int8_t bpbExtFlags[2];	/* extended flags: */
155	u_int8_t bpbFSVers[2];		/* filesystem version */
156	u_int8_t bpbRootClust[4];	/* start cluster for root directory */
157	u_int8_t bpbFSInfo[2];		/* filesystem info structure sector */
158	u_int8_t bpbBackup[2];		/* backup boot sector */
159	u_int8_t bpbReserved[12];	/* reserved for future expansion */
160};
161
162/*
163 * FAT32 FSInfo block.
164 */
165struct fsinfo {
166	u_int8_t fsisig1[4];
167	u_int8_t fsifill1[480];
168	u_int8_t fsisig2[4];
169	u_int8_t fsinfree[4];
170	u_int8_t fsinxtfree[4];
171	u_int8_t fsifill2[12];
172	u_int8_t fsisig3[4];
173};
174#endif /* !_FS_MSDOSFS_BPB_H_ */
175