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
207
208
209
210
211
212
213
214
215
216
217
218
219
|
//
// dpme.h - Disk Partition Map Entry (dpme)
//
// Written by Eryk Vershen (eryk@apple.com)
//
// This file describes structures and values related to the standard
// Apple SCSI disk partitioning scheme.
//
// Each entry is (and shall remain) 512 bytes long.
//
// For more information see:
// "Inside Macintosh: Devices" pages 3-12 to 3-15.
// "Inside Macintosh - Volume V" pages V-576 to V-582
// "Inside Macintosh - Volume IV" page IV-292
//
// There is a kernel file with much of the same info (under different names):
// /usr/src/mklinux-1.0DR2/osfmk/src/mach_kernel/ppc/POWERMAC/mac_label.h
//
/*
* Copyright 1996 by Apple Computer, Inc.
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appears in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
* NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef __dpme__
#define __dpme__
#include "bitfield.h"
//
// Defines
//
#define BLOCK0_SIGNATURE 0x4552 /* Signature value. */
#define DPISTRLEN 32
#define DPME_SIGNATURE 0x504D
// A/UX only stuff (tradition!)
#define dpme_bzb dpme_boot_args
#define BZBMAGIC 0xABADBABE /* BZB magic number */
#define FST ((u8) 0x1) /* standard UNIX FS */
#define FSTEFS ((u8) 0x2) /* Autorecovery FS */
#define FSTSFS ((u8) 0x3) /* Swap FS */
//
// Types
//
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
// Physical block zero of the disk has this format
struct Block0 {
u16 sbSig; /* unique value for SCSI block 0 */
u16 sbBlkSize; /* block size of device */
u32 sbBlkCount; /* number of blocks on device */
u16 sbDevType; /* device type */
u16 sbDevId; /* device id */
u32 sbData; /* not used */
u16 sbDrvrCount; /* driver descriptor count */
u16 sbMap[247]; /* descriptor map */
};
typedef struct Block0 Block0;
// Where &sbMap[0] is actually an array DDMap[sbDrvrCount]
// kludge to get around alignment junk
struct DDMap {
u32 ddBlock; /* 1st driver's starting block (in sbBlkSize blocks!) */
u16 ddSize; /* size of 1st driver (512-byte blks) */
u16 ddType; /* system type (1 for Mac+) */
};
typedef struct DDMap DDMap;
// Each partition map entry (blocks 1 through n) has this format
struct dpme {
u16 dpme_signature ;
u16 dpme_reserved_1 ;
u32 dpme_map_entries ;
u32 dpme_pblock_start ;
u32 dpme_pblocks ;
char dpme_name[DPISTRLEN] ; /* name of partition */
char dpme_type[DPISTRLEN] ; /* type of partition */
u32 dpme_lblock_start ;
u32 dpme_lblocks ;
u32 dpme_flags;
#if 0
u32 dpme_reserved_2 : 23 ; /* Bit 9 through 31. */
u32 dpme_os_specific_1 : 1 ; /* Bit 8. */
u32 dpme_os_specific_2 : 1 ; /* Bit 7. */
u32 dpme_os_pic_code : 1 ; /* Bit 6. */
u32 dpme_writable : 1 ; /* Bit 5. */
u32 dpme_readable : 1 ; /* Bit 4. */
u32 dpme_bootable : 1 ; /* Bit 3. */
u32 dpme_in_use : 1 ; /* Bit 2. */
u32 dpme_allocated : 1 ; /* Bit 1. */
u32 dpme_valid : 1 ; /* Bit 0. */
#endif
u32 dpme_boot_block ;
u32 dpme_boot_bytes ;
u8 *dpme_load_addr ;
u8 *dpme_load_addr_2 ;
u8 *dpme_goto_addr ;
u8 *dpme_goto_addr_2 ;
u32 dpme_checksum ;
char dpme_process_id[16] ;
u32 dpme_boot_args[32] ;
u32 dpme_reserved_3[62] ;
};
typedef struct dpme DPME;
#define dpme_diskdriver_set(p, v) bitfield_set(&p->dpme_flags, 9, 1, v)
#define dpme_chainable_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v)
#define dpme_os_specific_1_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v)
#define dpme_os_specific_2_set(p, v) bitfield_set(&p->dpme_flags, 7, 1, v)
#define dpme_os_pic_code_set(p, v) bitfield_set(&p->dpme_flags, 6, 1, v)
#define dpme_writable_set(p, v) bitfield_set(&p->dpme_flags, 5, 1, v)
#define dpme_readable_set(p, v) bitfield_set(&p->dpme_flags, 4, 1, v)
#define dpme_bootable_set(p, v) bitfield_set(&p->dpme_flags, 3, 1, v)
#define dpme_in_use_set(p, v) bitfield_set(&p->dpme_flags, 2, 1, v)
#define dpme_allocated_set(p, v) bitfield_set(&p->dpme_flags, 1, 1, v)
#define dpme_valid_set(p, v) bitfield_set(&p->dpme_flags, 0, 1, v)
#define dpme_diskdriver_get(p) bitfield_get(p->dpme_flags, 9, 1)
#define dpme_chainable_get(p) bitfield_get(p->dpme_flags, 8, 1)
#define dpme_os_specific_1_get(p) bitfield_get(p->dpme_flags, 8, 1)
#define dpme_os_specific_2_get(p) bitfield_get(p->dpme_flags, 7, 1)
#define dpme_os_pic_code_get(p) bitfield_get(p->dpme_flags, 6, 1)
#define dpme_writable_get(p) bitfield_get(p->dpme_flags, 5, 1)
#define dpme_readable_get(p) bitfield_get(p->dpme_flags, 4, 1)
#define dpme_bootable_get(p) bitfield_get(p->dpme_flags, 3, 1)
#define dpme_in_use_get(p) bitfield_get(p->dpme_flags, 2, 1)
#define dpme_allocated_get(p) bitfield_get(p->dpme_flags, 1, 1)
#define dpme_valid_get(p) bitfield_get(p->dpme_flags, 0, 1)
// A/UX only data structures (sentimental reasons?)
// Alternate block map (aka bad block remaping) [Never really used]
struct abm /* altblk map info stored in bzb */
{
u32 abm_size; /* size of map in bytes */
u32 abm_ents; /* number of used entries */
u32 abm_start; /* start of altblk map */
};
typedef struct abm ABM;
// BZB (Block Zero Block, but I can't remember the etymology)
// Where &dpme_boot_args[0] is actually the address of a struct bzb
// kludge to get around alignment junk
struct bzb /* block zero block format */
{
u32 bzb_magic; /* magic number */
u8 bzb_cluster; /* Autorecovery cluster grouping */
u8 bzb_type; /* FS type */
u16 bzb_inode; /* bad block inode number */
u32 bzb_flags;
#if 0
u16 bzb_root:1, /* FS is a root FS */
bzb_usr:1, /* FS is a usr FS */
bzb_crit:1, /* FS is a critical FS */
bzb_rsrvd:8, /* reserved for later use */
bzb_slice:5; /* slice number to associate with plus one */
u16 bzb_filler; /* pad bitfield to 32 bits */
#endif
u32 bzb_tmade; /* time of FS creation */
u32 bzb_tmount; /* time of last mount */
u32 bzb_tumount; /* time of last umount */
ABM bzb_abm; /* altblk map info */
u32 bzb_fill2[7]; /* for expansion of ABM (ha!ha!) */
u8 bzb_mount_point[64]; /* default mount point name */
};
typedef struct bzb BZB;
#define bzb_root_set(p, v) bitfield_set(&p->bzb_flags, 31, 1, v)
#define bzb_usr_set(p, v) bitfield_set(&p->bzb_flags, 30, 1, v)
#define bzb_crit_set(p, v) bitfield_set(&p->bzb_flags, 29, 1, v)
#define bzb_slice_set(p, v) bitfield_set(&p->bzb_flags, 20, 5, v)
#define bzb_root_get(p) bitfield_get(p->bzb_flags, 31, 1)
#define bzb_usr_get(p) bitfield_get(p->bzb_flags, 30, 1)
#define bzb_crit_get(p) bitfield_get(p->bzb_flags, 29, 1)
#define bzb_slice_get(p) bitfield_get(p->bzb_flags, 20, 5)
//
// Global Constants
//
//
// Global Variables
//
//
// Forward declarations
//
#endif /* __dpme__ */
|