xref: /illumos-gate/usr/src/cmd/fs.d/pcfs/mkfs/mkfs_pcfs.h (revision 2a8bcb4e)
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 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 #define	BPSEC		512	/* Assumed # of bytes per sector */
35 
36 #define	OPCODE1		0xE9
37 #define	OPCODE2		0xEB
38 #define	BOOTSECSIG	0xAA55
39 
40 /*
41  * Offset (in bytes) from address of boot sector to where we put
42  * the backup copy of that sector.  (FAT32 only)
43  */
44 #define	BKUP_BOOTSECT_OFFSET	0xC00
45 
46 #define	uppercase(c)	((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))
47 
48 #define	FAT12_TYPE_STRING	"FAT12   "
49 #define	FAT16_TYPE_STRING	"FAT16   "
50 #define	FAT32_TYPE_STRING	"FAT32   "
51 
52 #define	FAT12_ENTSPERSECT	341
53 #define	FAT16_ENTSPERSECT	256
54 #define	FAT32_ENTSPERSECT	128
55 
56 #ifndef	SUNIXOSBOOT
57 #define	SUNIXOSBOOT	190	/* Solaris UNIX boot partition */
58 #endif
59 
60 /*
61  *  A macro implementing a ceiling function for integer divides.
62  */
63 #define	idivceil(dvend, dvsor) \
64 	((dvend)/(dvsor) + (((dvend)%(dvsor) == 0) ? 0 : 1))
65 
66 /*
67  *  Return values for the seek_XXX functions
68  */
69 #define	PART_NOT_FOUND 0
70 #define	PART_FOUND 1
71 
72 /*
73  *	MS-DOS Disk layout:
74  *
75  *	---------------------
76  *	|    Boot sector    |
77  *	|-------------------|
78  *	|   Reserved area   |
79  *	|-------------------|
80  *	|	FAT #1      |
81  *	|-------------------|
82  *	|	FAT #2      |
83  *	|-------------------|
84  *	|   Root directory  |
85  *	|-------------------|
86  *	|                   |
87  *	|     File area     |
88  *	|___________________|
89  */
90 
91 #ifdef i386
92 #pragma	pack(1)
93 #endif
94 struct _orig_bios_param_blk {
95 	uint16_t bytes_sector;
96 	uchar_t	 sectors_per_cluster;
97 	uint16_t resv_sectors;
98 	uchar_t	 num_fats;
99 	uint16_t num_root_entries;
100 	uint16_t sectors_in_volume;
101 	uchar_t	 media;
102 	uint16_t sectors_per_fat;
103 	uint16_t sectors_per_track;
104 	uint16_t heads;
105 	uint32_t hidden_sectors;
106 	uint32_t sectors_in_logical_volume;
107 };
108 #ifdef i386
109 #pragma pack()
110 #endif
111 
112 #ifdef i386
113 #pragma	pack(1)
114 #endif
115 struct _bpb32_extensions {
116 	uint32_t big_sectors_per_fat;
117 	uint16_t ext_flags;
118 	uchar_t	 fs_vers_lo;
119 	uchar_t	 fs_vers_hi;
120 	uint32_t root_dir_clust;
121 	uint16_t fsinfosec;
122 	uint16_t backupboot;
123 	uint16_t reserved[6];
124 };
125 #ifdef i386
126 #pragma pack()
127 #endif
128 
129 #ifdef i386
130 #pragma	pack(1)
131 #endif
132 struct _bpb_extensions {
133 	uchar_t  phys_drive_num;
134 	uchar_t  reserved;
135 	uchar_t  ext_signature;
136 	uint32_t volume_id;
137 	uchar_t  volume_label[11];
138 	uchar_t  type[8];
139 };
140 #ifdef i386
141 #pragma pack()
142 #endif
143 
144 #ifdef i386
145 #pragma	pack(1)
146 #endif
147 struct _sun_bpb_extensions {
148 	uint16_t  bs_offset_high;
149 	uint16_t  bs_offset_low;
150 };
151 #ifdef i386
152 #pragma pack()
153 #endif
154 
155 /*
156  * bpb_t is a conglomeration of all the fields a bpb can have.  Every
157  * bpb will have the orig_bios struct, but only FAT32's will have bpb32,
158  * and only Solaris boot diskettes will have the sunbpb structure.
159  */
160 typedef struct _bios_param_blk {
161 	struct _orig_bios_param_blk bpb;
162 	struct _bpb32_extensions    bpb32;
163 	struct _bpb_extensions	    ebpb;
164 	struct _sun_bpb_extensions  sunbpb;
165 } bpb_t;
166 
167 #ifdef i386
168 #pragma	pack(1)
169 struct _bpb_head {
170 	uchar_t			    bs_jump_code[3];
171 	uchar_t			    bs_oem_name[8];
172 	struct _orig_bios_param_blk bs_bpb;
173 };
174 #pragma pack()
175 
176 #pragma	pack(1)
177 struct _boot_sector {
178 	struct _bpb_head	    bs_front;
179 	struct _bpb_extensions	    bs_ebpb;
180 	struct _sun_bpb_extensions  bs_sebpb;
181 	uchar_t			    bs_bootstrap[444];
182 	uchar_t			    bs_signature[2];
183 };
184 #pragma pack()
185 
186 #pragma	pack(1)
187 struct _boot_sector32 {
188 	struct _bpb_head	    bs_front;
189 	struct _bpb32_extensions    bs_bpb32;
190 	struct _bpb_extensions	    bs_ebpb;
191 	uchar_t			    bs_bootstrap[420];
192 	uchar_t			    bs_signature[2];
193 };
194 #pragma pack()
195 #else
196 #define	ORIG_BPB_START_INDEX	8	/* index into filler field */
197 #define	EXT_BPB_START_INDEX	33	/* index into filler field */
198 #define	BPB_32_START_INDEX	33	/* index into filler field */
199 #define	EXT_BPB_32_START_INDEX	61	/* index into filler field */
200 struct _boot_sector {
201 	uchar_t	 bs_jump_code[3];
202 	uchar_t  bs_filler[59];
203 	uchar_t  bs_sun_bpb[4];
204 	uchar_t	 bs_bootstrap[444];
205 	uchar_t  bs_signature[2];
206 };
207 
208 struct _boot_sector32 {
209 	uchar_t	 bs_jump_code[3];
210 	uchar_t  bs_filler[87];
211 	uchar_t	 bs_bootstrap[420];
212 	uchar_t  bs_signature[2];
213 };
214 #endif
215 
216 typedef union _ubso {
217 	struct _boot_sector	bs;
218 	struct _boot_sector32	bs32;
219 	struct mboot		mb;
220 	uchar_t			buf[BPSEC];
221 } boot_sector_t;
222 
223 #ifdef	__cplusplus
224 }
225 #endif
226 
227 #endif	/* _MKFS_PCFS_H */
228