1 /* @(#)sunlabel.h	1.5 03/12/28 Copyright 1999-2003 J. Schilling */
2 /*
3  *	Support for Sun disk label
4  *
5  *	Copyright (c) 1999-2003 J. Schilling
6  */
7 /*
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; see the file COPYING.  If not, write to the Free Software
19  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 #ifndef howmany
23 #define	howmany(x, y)	(((x)+((y)-1))/(y))
24 #endif
25 #ifndef roundup
26 #define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))
27 #endif
28 
29 #define	NDKMAP		8		/* # of sparc partitions */
30 #define	NX86MAP		16		/* # if x86   partitions */
31 #define	DKL_MAGIC	0xDABE		/* magic number */
32 #define	DKL_MAGIC_0	0xDA		/* magic number high byte */
33 #define	DKL_MAGIC_1	0xBE		/* magic number low byte  */
34 
35 #define	CD_DEFLABEL	"CD-ROM Disc with Sun sparc boot created by mkisofs"
36 #define	CD_X86LABEL	"CD-ROM Disc with Sun x86 boot created by mkisofs"
37 
38 /*
39  * Define a virtual geometry for the CD disk label.
40  * The current values are stolen from Sun install disks and do not seem to be
41  * a good idea as they limit the size of the CD to 327680 sectors which is less
42  * than 74 minutes.
43  * There are 84 minute CD's with 378000 sectors and there will be DVD's with
44  * even more.
45  */
46 #define	CD_RPM		350
47 #define	CD_PCYL		2048
48 #define	CD_APC		0
49 #define	CD_INTRLV	1
50 #define	CD_NCYL		2048
51 #define	CD_ACYL		0
52 #define	CD_NHEAD	1
53 #define	CD_NSECT	640
54 
55 /*
56  * NOTE: The virtual cylinder size on CD must be a mutiple of 2048.
57  *	 This is true if CD_NSECT is a multiple of 4.
58  */
59 #define	CD_CYLSIZE	(CD_NSECT*CD_NHEAD*512)
60 
61 #define	V_VERSION	1		/* The VTOC version	 */
62 #define	VTOC_SANE	0x600DDEEE	/* Indicates a sane VTOC */
63 
64 #define	V_ROOT		0x02		/* Root partiton	 */
65 #define	V_USR		0x04		/* Usr partiton		 */
66 
67 #define	V_RONLY		0x10		/* Read only		 */
68 
69 /*
70  * The Sun sparc disk label (at offset 0 on a disk)
71  */
72 struct sun_label {
73 	char		dkl_ascilabel[128];
74 	struct dk_vtoc {
75 		Uchar	v_version[4];	/* layout version	 */
76 		char	v_volume[8];	/* volume name		 */
77 		Uchar	v_nparts[2];	/* number of partitions	 */
78 		struct dk_map2 {
79 			Uchar	p_tag[2]; /* ID tag of partition */
80 			Uchar	p_flag[2]; /* permission flag	 */
81 
82 		}	v_part[NDKMAP];
83 		Uchar	v_xxpad[2];	/* To come over Sun's alignement problem */
84 		Uchar	v_bootinfo[3*4]; /* info for mboot	 */
85 		Uchar	v_sanity[4];	/* to verify vtoc sanity */
86 		Uchar	v_reserved[10*4];
87 		Uchar	v_timestamp[NDKMAP*4];
88 
89 	}		dkl_vtoc;	/* vtoc inclusions from AT&T SVr4 */
90 	char		dkl_pad[512-(128+sizeof (struct dk_vtoc)+NDKMAP*8+14*2)];
91 	Uchar		dkl_rpm[2];	/* rotations per minute */
92 	Uchar		dkl_pcyl[2];	/* # physical cylinders */
93 	Uchar		dkl_apc[2];	/* alternates per cylinder */
94 	Uchar		dkl_obs1[2];	/* obsolete */
95 	Uchar		dkl_obs2[2];	/* obsolete */
96 	Uchar		dkl_intrlv[2];	/* interleave factor */
97 	Uchar		dkl_ncyl[2];	/* # of data cylinders */
98 	Uchar		dkl_acyl[2];	/* # of alternate cylinders */
99 	Uchar		dkl_nhead[2];	/* # of heads in this partition */
100 	Uchar		dkl_nsect[2];	/* # of 512 byte sectors per track */
101 	Uchar		dkl_obs3[2];	/* obsolete */
102 	Uchar		dkl_obs4[2];	/* obsolete */
103 
104 	struct dk_map {			/* logical partitions */
105 		Uchar	dkl_cylno[4];	/* starting cylinder */
106 		Uchar	dkl_nblk[4];	/* number of blocks */
107 	}		dkl_map[NDKMAP]; /* logical partition headers */
108 
109 	Uchar		dkl_magic[2];	/* identifies this label format */
110 	Uchar		dkl_cksum[2];	/* xor checksum of sector */
111 };
112 
113 /*
114  * The Sun x86 / AT&T disk label (at offset 512 on a fdisk partition)
115  */
116 struct x86_label {
117 	struct x86_vtoc {
118 		Uchar	v_bootinfo[3*4]; /* unsupported		  */
119 		Uchar	v_sanity[4];	/* to verify vtoc sanity  */
120 		Uchar	v_version[4];	/* layout version	  */
121 		char    v_volume[8];	/* volume name		  */
122 		Uchar	v_sectorsz[2]; 	/* # of bytes in a sector */
123 		Uchar	v_nparts[2]; 	/* # of partitions */
124 		Uchar	v_reserved[10*4];
125 		struct dkl_partition    {
126 			Uchar	p_tag[2];	/* ID tag of partition */
127 			Uchar	p_flag[2];	/* permission flag    */
128 			Uchar	p_start[4];	/* starting sector    */
129 			Uchar	p_size[4];	/* number of blocks   */
130 		}	v_part[NX86MAP];
131 		Uchar	timestamp[NX86MAP][4];
132 		char    v_asciilabel[128];
133 	}		dkl_vtoc;	/* vtoc inclusions from AT&T SVr4 */
134 	Uchar		dkl_pcyl[4];	/* # physical cylinders */
135 	Uchar		dkl_ncyl[4];	/* # of data cylinders */
136 	Uchar		dkl_acyl[2];	/* # of alternate cylinders */
137 	Uchar		dkl_bcyl[2];
138 	Uchar		dkl_nhead[4];	/* # of heads in this partition */
139 	Uchar		dkl_nsect[4];	/* # of 512 byte sectors per track */
140 	Uchar		dkl_intrlv[2];	/* interleave factor */
141 	Uchar		dkl_skew[2];
142 	Uchar		dkl_apc[2];	/* alternates per cylinder */
143 	Uchar		dkl_rpm[2];	/* rotations per minute */
144 	Uchar		dkl_write_reinstruct[2];
145 	Uchar		dkl_read_reinstruct[2];
146 	Uchar		dkl_extra[4*2];	/* for later expansions */
147 	char		dkl_pad[512-(sizeof (struct x86_vtoc)+4*4+14*2)];
148 	Uchar		dkl_magic[2];	/* identifies this label format */
149 	Uchar		dkl_cksum[2];	/* xor checksum of sector */
150 };
151 
152 /*
153  * One x86 PC fdisk partition record.
154  */
155 struct pc_pr {
156 	Uchar	pr_status;		/* Boot status */
157 	Uchar	pr_head;		/* Starting head # */
158 	char	pr_sec_cyl[2];		/* Starting sec+cyl # */
159 	Uchar	pr_type;		/* Partition type */
160 	Uchar	pr_e_head;		/* Ending head # */
161 	char	pr_e_sec_cyl[2];	/* Ending sec+cyl # */
162 	char	pr_partoff[4];		/* Partition start sector # */
163 	char	pr_nsect[4];		/* # of sectors in partition */
164 };
165 
166 /*
167  * Flags and macros for above partition record.
168  */
169 #define	SEC_MASK	0x3F
170 #define	GET_SEC(a)	((a) & SEC_MASK)
171 #define	GET_CYL(a)	((((a) & 0xFF) >> 8) | (((a) & 0xC0) << 2))
172 
173 #define	STATUS_INACT	0		/* Marked non bootable	*/
174 #define	STATUS_ACTIVE	0x80		/* Marked as bootable	*/
175 
176 #define	TYPE_FREE		0	/* Unused partition	*/
177 #define	TYPE_DOS12		0x01	/* FAT12 fileystem	*/
178 #define	TYPE_XENIX		0x02	/* XENIX root		*/
179 #define	TYPE_XENIX2		0x03	/* XENIX usr		*/
180 #define	TYPE_DOS16		0x04	/* FAT16 filesystem	*/
181 #define	TYPE_XDOS		0x05	/* Extended DOS part	*/
182 #define	TYPE_DOS4		0x06	/* FAT16 >= 32 MB	*/
183 #define	TYPE_SOLARIS		0x82	/* Solaris x86		*/
184 #define	TYPE_SOLARIS_BOOT	0xBE	/* Solaris boot		*/
185 #define	TYPE_CDOS4		0xDB	/* CPM			*/
186 
187 /*
188  * The first sector on a disk from a x86 PC (at offset 0 on a disk)
189  */
190 struct pc_part {
191 	char		bootcode[0x1BE]; /* Master boot record	    */
192 	struct pc_pr	part[4];	/* The 4 primary partitions */
193 	Uchar		magic[2];	/* Fixed at 0x55 0xAA	    */
194 };
195