1// 2// dpme.h - Disk Partition Map Entry (dpme) 3// 4// Written by Eryk Vershen 5// 6// This file describes structures and values related to the standard 7// Apple SCSI disk partitioning scheme. 8// 9// Each entry is (and shall remain) 512 bytes long. 10// 11// For more information see: 12// "Inside Macintosh: Devices" pages 3-12 to 3-15. 13// "Inside Macintosh - Volume V" pages V-576 to V-582 14// "Inside Macintosh - Volume IV" page IV-292 15// 16// There is a kernel file with much of the same info (under different names): 17// /usr/src/mklinux-1.0DR2/osfmk/src/mach_kernel/ppc/POWERMAC/mac_label.h 18// 19 20/* 21 * Copyright 1996 by Apple Computer, Inc. 22 * All Rights Reserved 23 * 24 * Permission to use, copy, modify, and distribute this software and 25 * its documentation for any purpose and without fee is hereby granted, 26 * provided that the above copyright notice appears in all copies and 27 * that both the copyright notice and this permission notice appear in 28 * supporting documentation. 29 * 30 * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 31 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 32 * FOR A PARTICULAR PURPOSE. 33 * 34 * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 35 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 36 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 37 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 38 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 39 */ 40#ifndef __dpme__ 41#define __dpme__ 42 43#include "bitfield.h" 44 45// 46// Defines 47// 48#define BLOCK0_SIGNATURE 0x4552 /* i.e. 'ER' */ 49 50#define DPISTRLEN 32 51#define DPME_SIGNATURE 0x504D /* i.e. 'PM' */ 52 53// A/UX only stuff (tradition!) 54#define dpme_bzb dpme_boot_args 55#define BZBMAGIC 0xABADBABE /* BZB magic number */ 56#define FST ((u8) 0x1) /* standard UNIX FS */ 57#define FSTEFS ((u8) 0x2) /* Autorecovery FS */ 58#define FSTSFS ((u8) 0x3) /* Swap FS */ 59 60 61// 62// Types 63// 64typedef unsigned char u8; 65typedef unsigned short u16; 66typedef unsigned long u32; 67 68 69// Physical block zero of the disk has this format 70struct Block0 { 71 u16 sbSig; /* unique value for SCSI block 0 */ 72 u16 sbBlkSize; /* block size of device */ 73 u32 sbBlkCount; /* number of blocks on device */ 74 u16 sbDevType; /* device type */ 75 u16 sbDevId; /* device id */ 76 u32 sbData; /* not used */ 77 u16 sbDrvrCount; /* driver descriptor count */ 78 u16 sbMap[247]; /* descriptor map */ 79}; 80typedef struct Block0 Block0; 81 82// Where &sbMap[0] is actually an array DDMap[sbDrvrCount] 83// kludge to get around alignment junk 84struct DDMap { 85 u32 ddBlock; /* 1st driver's starting block (in sbBlkSize blocks!) */ 86 u16 ddSize; /* size of 1st driver (512-byte blks) */ 87 u16 ddType; /* system type (1 for Mac+) */ 88}; 89typedef struct DDMap DDMap; 90 91 92// Each partition map entry (blocks 1 through n) has this format 93struct dpme { 94 u16 dpme_signature ; 95 u16 dpme_reserved_1 ; 96 u32 dpme_map_entries ; 97 u32 dpme_pblock_start ; 98 u32 dpme_pblocks ; 99 char dpme_name[DPISTRLEN] ; /* name of partition */ 100 char dpme_type[DPISTRLEN] ; /* type of partition */ 101 u32 dpme_lblock_start ; 102 u32 dpme_lblocks ; 103 u32 dpme_flags; 104#if 0 105 u32 dpme_reserved_2 : 23 ; /* Bit 9 through 31. */ 106 u32 dpme_os_specific_1 : 1 ; /* Bit 8. */ 107 u32 dpme_os_specific_2 : 1 ; /* Bit 7. */ 108 u32 dpme_os_pic_code : 1 ; /* Bit 6. */ 109 u32 dpme_writable : 1 ; /* Bit 5. */ 110 u32 dpme_readable : 1 ; /* Bit 4. */ 111 u32 dpme_bootable : 1 ; /* Bit 3. */ 112 u32 dpme_in_use : 1 ; /* Bit 2. */ 113 u32 dpme_allocated : 1 ; /* Bit 1. */ 114 u32 dpme_valid : 1 ; /* Bit 0. */ 115#endif 116 u32 dpme_boot_block ; 117 u32 dpme_boot_bytes ; 118 u8 *dpme_load_addr ; 119 u8 *dpme_load_addr_2 ; 120 u8 *dpme_goto_addr ; 121 u8 *dpme_goto_addr_2 ; 122 u32 dpme_checksum ; 123 char dpme_process_id[16] ; 124 u32 dpme_boot_args[32] ; 125 u32 dpme_reserved_3[62] ; 126}; 127typedef struct dpme DPME; 128 129#define dpme_diskdriver_set(p, v) bitfield_set(&p->dpme_flags, 9, 1, v) 130#define dpme_chainable_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v) 131 132#define dpme_os_specific_1_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v) 133#define dpme_os_specific_2_set(p, v) bitfield_set(&p->dpme_flags, 7, 1, v) 134#define dpme_os_pic_code_set(p, v) bitfield_set(&p->dpme_flags, 6, 1, v) 135#define dpme_writable_set(p, v) bitfield_set(&p->dpme_flags, 5, 1, v) 136#define dpme_readable_set(p, v) bitfield_set(&p->dpme_flags, 4, 1, v) 137#define dpme_bootable_set(p, v) bitfield_set(&p->dpme_flags, 3, 1, v) 138#define dpme_in_use_set(p, v) bitfield_set(&p->dpme_flags, 2, 1, v) 139#define dpme_allocated_set(p, v) bitfield_set(&p->dpme_flags, 1, 1, v) 140#define dpme_valid_set(p, v) bitfield_set(&p->dpme_flags, 0, 1, v) 141 142#define dpme_diskdriver_get(p) bitfield_get(p->dpme_flags, 9, 1) 143#define dpme_chainable_get(p) bitfield_get(p->dpme_flags, 8, 1) 144 145#define dpme_os_specific_1_get(p) bitfield_get(p->dpme_flags, 8, 1) 146#define dpme_os_specific_2_get(p) bitfield_get(p->dpme_flags, 7, 1) 147#define dpme_os_pic_code_get(p) bitfield_get(p->dpme_flags, 6, 1) 148#define dpme_writable_get(p) bitfield_get(p->dpme_flags, 5, 1) 149#define dpme_readable_get(p) bitfield_get(p->dpme_flags, 4, 1) 150#define dpme_bootable_get(p) bitfield_get(p->dpme_flags, 3, 1) 151#define dpme_in_use_get(p) bitfield_get(p->dpme_flags, 2, 1) 152#define dpme_allocated_get(p) bitfield_get(p->dpme_flags, 1, 1) 153#define dpme_valid_get(p) bitfield_get(p->dpme_flags, 0, 1) 154 155 156// A/UX only data structures (sentimental reasons?) 157 158// Alternate block map (aka bad block remaping) [Never really used] 159struct abm /* altblk map info stored in bzb */ 160{ 161 u32 abm_size; /* size of map in bytes */ 162 u32 abm_ents; /* number of used entries */ 163 u32 abm_start; /* start of altblk map */ 164}; 165typedef struct abm ABM; 166 167// BZB (Block Zero Block, but I can't remember the etymology) 168// Where &dpme_boot_args[0] is actually the address of a struct bzb 169// kludge to get around alignment junk 170struct bzb /* block zero block format */ 171{ 172 u32 bzb_magic; /* magic number */ 173 u8 bzb_cluster; /* Autorecovery cluster grouping */ 174 u8 bzb_type; /* FS type */ 175 u16 bzb_inode; /* bad block inode number */ 176 u32 bzb_flags; 177#if 0 178 u16 bzb_root:1, /* FS is a root FS */ 179 bzb_usr:1, /* FS is a usr FS */ 180 bzb_crit:1, /* FS is a critical FS */ 181 bzb_rsrvd:8, /* reserved for later use */ 182 bzb_slice:5; /* slice number to associate with plus one */ 183 u16 bzb_filler; /* pad bitfield to 32 bits */ 184#endif 185 u32 bzb_tmade; /* time of FS creation */ 186 u32 bzb_tmount; /* time of last mount */ 187 u32 bzb_tumount; /* time of last umount */ 188 ABM bzb_abm; /* altblk map info */ 189 u32 bzb_fill2[7]; /* for expansion of ABM (ha!ha!) */ 190 u8 bzb_mount_point[64]; /* default mount point name */ 191}; 192typedef struct bzb BZB; 193 194#define bzb_root_set(p, v) bitfield_set(&p->bzb_flags, 31, 1, v) 195#define bzb_usr_set(p, v) bitfield_set(&p->bzb_flags, 30, 1, v) 196#define bzb_crit_set(p, v) bitfield_set(&p->bzb_flags, 29, 1, v) 197#define bzb_slice_set(p, v) bitfield_set(&p->bzb_flags, 20, 5, v) 198 199#define bzb_root_get(p) bitfield_get(p->bzb_flags, 31, 1) 200#define bzb_usr_get(p) bitfield_get(p->bzb_flags, 30, 1) 201#define bzb_crit_get(p) bitfield_get(p->bzb_flags, 29, 1) 202#define bzb_slice_get(p) bitfield_get(p->bzb_flags, 20, 5) 203 204 205// 206// Global Constants 207// 208 209 210// 211// Global Variables 212// 213 214 215// 216// Forward declarations 217// 218 219#endif /* __dpme__ */ 220