xref: /freebsd/sys/fs/msdosfs/bpb.h (revision 1130b656e5fe4c2d1ba299e024d1b40eaeebd380)
1 /*	$FreeBSD$ */
2 /*	$NetBSD: bpb.h,v 1.3 1994/06/29 06:35:29 cgd 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 /*
21  * BIOS Parameter Block (BPB) for DOS 3.3
22  */
23 struct bpb33 {
24 	u_short bpbBytesPerSec;	/* bytes per sector */
25 	u_char bpbSecPerClust;	/* sectors per cluster */
26 	u_short bpbResSectors;	/* number of reserved sectors */
27 	u_char bpbFATs;		/* number of FATs */
28 	u_short bpbRootDirEnts;	/* number of root directory entries */
29 	u_short bpbSectors;	/* total number of sectors */
30 	u_char bpbMedia;	/* media descriptor */
31 	u_short bpbFATsecs;	/* number of sectors per FAT */
32 	u_short bpbSecPerTrack;	/* sectors per track */
33 	u_short bpbHeads;	/* number of heads */
34 	u_short bpbHiddenSecs;	/* number of hidden sectors */
35 };
36 
37 /*
38  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
39  * and bpbHugeSectors is not in the 3.3 bpb.
40  */
41 struct bpb50 {
42 	u_short bpbBytesPerSec;	/* bytes per sector */
43 	u_char bpbSecPerClust;	/* sectors per cluster */
44 	u_short bpbResSectors;	/* number of reserved sectors */
45 	u_char bpbFATs;		/* number of FATs */
46 	u_short bpbRootDirEnts;	/* number of root directory entries */
47 	u_short bpbSectors;	/* total number of sectors */
48 	u_char bpbMedia;	/* media descriptor */
49 	u_short bpbFATsecs;	/* number of sectors per FAT */
50 	u_short bpbSecPerTrack;	/* sectors per track */
51 	u_short bpbHeads;	/* number of heads */
52 	u_long bpbHiddenSecs;	/* number of hidden sectors */
53 	u_long bpbHugeSectors;	/* number of sectors if bpbSectors == 0 */
54 };
55 
56 /*
57  * The following structures represent how the bpb's look on disk.  shorts
58  * and longs are just character arrays of the appropriate length.  This is
59  * because the compiler forces shorts and longs to align on word or
60  * halfword boundaries.
61  *
62  * XXX The little-endian code here assumes that the processor can access
63  * 16-bit and 32-bit quantities on byte boundaries.  If this is not true,
64  * use the macros for the big-endian case.
65  */
66 #include <machine/endian.h>
67 #if BYTE_ORDER == LITTLE_ENDIAN		/* && can do unaligned accesses */
68 #define	getushort(x)	*((u_short *)(x))
69 #define	getulong(x)	*((u_long *)(x))
70 #define	putushort(p, v)	(*((u_short *)(p)) = (v))
71 #define	putulong(p, v)	(*((u_long *)(p)) = (v))
72 
73 #else
74 #define getushort(x)	(((u_char *)(x))[0] + (((u_char *)(x))[1] << 8))
75 #define getulong(x)	(((u_char *)(x))[0] + (((u_char *)(x))[1] << 8) \
76 			 + (((u_char *)(x))[2] << 16)	\
77 			 + (((u_char *)(x))[3] << 24))
78 #define putushort(p, v)	(((u_char *)(p))[0] = (v),	\
79 			 ((u_char *)(p))[1] = (v) >> 8)
80 #define putulong(p, v)	(((u_char *)(p))[0] = (v),	\
81 			 ((u_char *)(p))[1] = (v) >> 8, \
82 			 ((u_char *)(p))[2] = (v) >> 16,\
83 			 ((u_char *)(p))[3] = (v) >> 24)
84 #endif
85 
86 /*
87  * BIOS Parameter Block (BPB) for DOS 3.3
88  */
89 struct byte_bpb33 {
90 	char bpbBytesPerSec[2];	/* bytes per sector */
91 	char bpbSecPerClust;	/* sectors per cluster */
92 	char bpbResSectors[2];	/* number of reserved sectors */
93 	char bpbFATs;		/* number of FATs */
94 	char bpbRootDirEnts[2];	/* number of root directory entries */
95 	char bpbSectors[2];	/* total number of sectors */
96 	char bpbMedia;		/* media descriptor */
97 	char bpbFATsecs[2];	/* number of sectors per FAT */
98 	char bpbSecPerTrack[2];	/* sectors per track */
99 	char bpbHeads[2];	/* number of heads */
100 	char bpbHiddenSecs[2];	/* number of hidden sectors */
101 };
102 
103 /*
104  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
105  * and bpbHugeSectors is not in the 3.3 bpb.
106  */
107 struct byte_bpb50 {
108 	char bpbBytesPerSec[2];	/* bytes per sector */
109 	char bpbSecPerClust;	/* sectors per cluster */
110 	char bpbResSectors[2];	/* number of reserved sectors */
111 	char bpbFATs;		/* number of FATs */
112 	char bpbRootDirEnts[2];	/* number of root directory entries */
113 	char bpbSectors[2];	/* total number of sectors */
114 	char bpbMedia;		/* media descriptor */
115 	char bpbFATsecs[2];	/* number of sectors per FAT */
116 	char bpbSecPerTrack[2];	/* sectors per track */
117 	char bpbHeads[2];	/* number of heads */
118 	char bpbHiddenSecs[4];	/* number of hidden sectors */
119 	char bpbHugeSectors[4];	/* number of sectors if bpbSectors == 0 */
120 };
121