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