xref: /illumos-gate/usr/src/cmd/fs.d/pcfs/mkfs/mkfs_pcfs.h (revision f20211217f12ce291fd518e61065cd273f23e4ea)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1996, 1998, 1999 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef _MKFS_PCFS_H
28 #define	_MKFS_PCFS_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 #define	BPSEC		512	/* Assumed # of bytes per sector */
37 
38 #define	OPCODE1		0xE9
39 #define	OPCODE2		0xEB
40 #define	BOOTSECSIG	0xAA55
41 
42 /*
43  * Offset (in bytes) from address of boot sector to where we put
44  * the backup copy of that sector.  (FAT32 only)
45  */
46 #define	BKUP_BOOTSECT_OFFSET	0xC00
47 
48 #define	uppercase(c)	((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))
49 
50 #define	FAT12_TYPE_STRING	"FAT12   "
51 #define	FAT16_TYPE_STRING	"FAT16   "
52 #define	FAT32_TYPE_STRING	"FAT32   "
53 
54 #define	FAT12_ENTSPERSECT	341
55 #define	FAT16_ENTSPERSECT	256
56 #define	FAT32_ENTSPERSECT	128
57 
58 #ifndef	SUNIXOSBOOT
59 #define	SUNIXOSBOOT	190	/* Solaris UNIX boot partition */
60 #endif
61 
62 /*
63  *  A macro implementing a ceiling function for integer divides.
64  */
65 #define	idivceil(dvend, dvsor) \
66 	((dvend)/(dvsor) + (((dvend)%(dvsor) == 0) ? 0 : 1))
67 
68 /*
69  *  Return values for the seek_XXX functions
70  */
71 #define	PART_NOT_FOUND 0
72 #define	PART_FOUND 1
73 
74 /*
75  *	MS-DOS Disk layout:
76  *
77  *	---------------------
78  *	|    Boot sector    |
79  *	|-------------------|
80  *	|   Reserved area   |
81  *	|-------------------|
82  *	|	FAT #1      |
83  *	|-------------------|
84  *	|	FAT #2      |
85  *	|-------------------|
86  *	|   Root directory  |
87  *	|-------------------|
88  *	|                   |
89  *	|     File area     |
90  *	|___________________|
91  */
92 
93 #ifdef i386
94 #pragma	pack(1)
95 #endif
96 struct _orig_bios_param_blk {
97 	uint16_t bytes_sector;
98 	uchar_t	 sectors_per_cluster;
99 	uint16_t resv_sectors;
100 	uchar_t	 num_fats;
101 	uint16_t num_root_entries;
102 	uint16_t sectors_in_volume;
103 	uchar_t	 media;
104 	uint16_t sectors_per_fat;
105 	uint16_t sectors_per_track;
106 	uint16_t heads;
107 	uint32_t hidden_sectors;
108 	uint32_t sectors_in_logical_volume;
109 };
110 #ifdef i386
111 #pragma pack()
112 #endif
113 
114 #ifdef i386
115 #pragma	pack(1)
116 #endif
117 struct _bpb32_extensions {
118 	uint32_t big_sectors_per_fat;
119 	uint16_t ext_flags;
120 	uchar_t	 fs_vers_lo;
121 	uchar_t	 fs_vers_hi;
122 	uint32_t root_dir_clust;
123 	uint16_t fsinfosec;
124 	uint16_t backupboot;
125 	uint16_t reserved[6];
126 };
127 #ifdef i386
128 #pragma pack()
129 #endif
130 
131 #ifdef i386
132 #pragma	pack(1)
133 #endif
134 struct _bpb_extensions {
135 	uchar_t  phys_drive_num;
136 	uchar_t  reserved;
137 	uchar_t  ext_signature;
138 	uint32_t volume_id;
139 	uchar_t  volume_label[11];
140 	uchar_t  type[8];
141 };
142 #ifdef i386
143 #pragma pack()
144 #endif
145 
146 #ifdef i386
147 #pragma	pack(1)
148 #endif
149 struct _sun_bpb_extensions {
150 	uint16_t  bs_offset_high;
151 	uint16_t  bs_offset_low;
152 };
153 #ifdef i386
154 #pragma pack()
155 #endif
156 
157 /*
158  * bpb_t is a conglomeration of all the fields a bpb can have.  Every
159  * bpb will have the orig_bios struct, but only FAT32's will have bpb32,
160  * and only Solaris boot diskettes will have the sunbpb structure.
161  */
162 typedef struct _bios_param_blk {
163 	struct _orig_bios_param_blk bpb;
164 	struct _bpb32_extensions    bpb32;
165 	struct _bpb_extensions	    ebpb;
166 	struct _sun_bpb_extensions  sunbpb;
167 } bpb_t;
168 
169 #ifdef i386
170 #pragma	pack(1)
171 struct _bpb_head {
172 	uchar_t			    bs_jump_code[3];
173 	uchar_t			    bs_oem_name[8];
174 	struct _orig_bios_param_blk bs_bpb;
175 };
176 #pragma pack()
177 
178 #pragma	pack(1)
179 struct _boot_sector {
180 	struct _bpb_head	    bs_front;
181 	struct _bpb_extensions	    bs_ebpb;
182 	struct _sun_bpb_extensions  bs_sebpb;
183 	uchar_t			    bs_bootstrap[444];
184 	uchar_t			    bs_signature[2];
185 };
186 #pragma pack()
187 
188 #pragma	pack(1)
189 struct _boot_sector32 {
190 	struct _bpb_head	    bs_front;
191 	struct _bpb32_extensions    bs_bpb32;
192 	struct _bpb_extensions	    bs_ebpb;
193 	uchar_t			    bs_bootstrap[420];
194 	uchar_t			    bs_signature[2];
195 };
196 #pragma pack()
197 #else
198 #define	ORIG_BPB_START_INDEX	8	/* index into filler field */
199 #define	EXT_BPB_START_INDEX	33	/* index into filler field */
200 #define	BPB_32_START_INDEX	33	/* index into filler field */
201 #define	EXT_BPB_32_START_INDEX	61	/* index into filler field */
202 struct _boot_sector {
203 	uchar_t	 bs_jump_code[3];
204 	uchar_t  bs_filler[59];
205 	uchar_t  bs_sun_bpb[4];
206 	uchar_t	 bs_bootstrap[444];
207 	uchar_t  bs_signature[2];
208 };
209 
210 struct _boot_sector32 {
211 	uchar_t	 bs_jump_code[3];
212 	uchar_t  bs_filler[87];
213 	uchar_t	 bs_bootstrap[420];
214 	uchar_t  bs_signature[2];
215 };
216 #endif
217 
218 typedef union _ubso {
219 	struct _boot_sector	bs;
220 	struct _boot_sector32	bs32;
221 	struct mboot		mb;
222 	uchar_t			buf[BPSEC];
223 } boot_sector_t;
224 
225 #ifdef	__cplusplus
226 }
227 #endif
228 
229 #endif	/* _MKFS_PCFS_H */
230