114630Sokutsu// 214630Sokutsu// dpme.h - Disk Partition Map Entry (dpme) 314630Sokutsu// 414630Sokutsu// Written by Eryk Vershen 514630Sokutsu// 614630Sokutsu// This file describes structures and values related to the standard 714630Sokutsu// Apple SCSI disk partitioning scheme. 814630Sokutsu// 914630Sokutsu// Each entry is (and shall remain) 512 bytes long. 1014630Sokutsu// 1114630Sokutsu// For more information see: 1214630Sokutsu// "Inside Macintosh: Devices" pages 3-12 to 3-15. 1314630Sokutsu// "Inside Macintosh - Volume V" pages V-576 to V-582 1414630Sokutsu// "Inside Macintosh - Volume IV" page IV-292 1514630Sokutsu// 1614630Sokutsu// There is a kernel file with much of the same info (under different names): 1714630Sokutsu// /usr/src/mklinux-1.0DR2/osfmk/src/mach_kernel/ppc/POWERMAC/mac_label.h 1814630Sokutsu// 1914630Sokutsu 2014630Sokutsu/* 2114630Sokutsu * Copyright 1996 by Apple Computer, Inc. 2214630Sokutsu * All Rights Reserved 2314630Sokutsu * 2414630Sokutsu * Permission to use, copy, modify, and distribute this software and 2514630Sokutsu * its documentation for any purpose and without fee is hereby granted, 2614630Sokutsu * provided that the above copyright notice appears in all copies and 2714630Sokutsu * that both the copyright notice and this permission notice appear in 2814630Sokutsu * supporting documentation. 2914630Sokutsu * 3014630Sokutsu * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 3116077Snishjain * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 3214630Sokutsu * FOR A PARTICULAR PURPOSE. 3316077Snishjain * 3414630Sokutsu * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 3514630Sokutsu * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 3614630Sokutsu * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 3714630Sokutsu * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 3814630Sokutsu * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3914630Sokutsu */ 4014630Sokutsu#ifndef __dpme__ 4114630Sokutsu#define __dpme__ 4214630Sokutsu 4314630Sokutsu#include "bitfield.h" 4414630Sokutsu 4514630Sokutsu// 4614630Sokutsu// Defines 4714630Sokutsu// 4814630Sokutsu#define BLOCK0_SIGNATURE 0x4552 /* i.e. 'ER' */ 4914630Sokutsu 5014630Sokutsu#define DPISTRLEN 32 5114630Sokutsu#define DPME_SIGNATURE 0x504D /* i.e. 'PM' */ 5214630Sokutsu 5314630Sokutsu// A/UX only stuff (tradition!) 5414630Sokutsu#define dpme_bzb dpme_boot_args 5514630Sokutsu#define BZBMAGIC 0xABADBABE /* BZB magic number */ 5614630Sokutsu#define FST ((uint8_t) 0x1) /* standard UNIX FS */ 5714630Sokutsu#define FSTEFS ((uint8_t) 0x2) /* Autorecovery FS */ 5814630Sokutsu#define FSTSFS ((uint8_t) 0x3) /* Swap FS */ 5914630Sokutsu 6014630Sokutsu 6114630Sokutsu// 6214630Sokutsu// Types 6314630Sokutsu// 6414630Sokutsu 6514630Sokutsu// Physical block zero of the disk has this format 6614630Sokutsustruct Block0 { 6714630Sokutsu uint16_t sbSig; /* unique value for SCSI block 0 */ 6814630Sokutsu uint16_t sbBlkSize; /* block size of device */ 6914630Sokutsu uint32_t sbBlkCount; /* number of blocks on device */ 7014630Sokutsu uint16_t sbDevType; /* device type */ 7114630Sokutsu uint16_t sbDevId; /* device id */ 7214630Sokutsu uint32_t sbData; /* not used */ 7314630Sokutsu uint16_t sbDrvrCount; /* driver descriptor count */ 7414630Sokutsu uint16_t sbMap[247]; /* descriptor map */ 7514630Sokutsu}; 7614630Sokutsutypedef struct Block0 Block0; 7714630Sokutsu 7814630Sokutsu// Where &sbMap[0] is actually an array DDMap[sbDrvrCount] 7914630Sokutsu// kludge to get around alignment junk 8014630Sokutsustruct DDMap { 8116077Snishjain uint32_t ddBlock; /* 1st driver's starting block (in sbBlkSize blocks!) */ 8214630Sokutsu uint16_t ddSize; /* size of 1st driver (512-byte blks) */ 8314630Sokutsu uint16_t ddType; /* system type (1 for Mac+) */ 8414630Sokutsu}; 8514630Sokutsutypedef struct DDMap DDMap; 8614630Sokutsu 8714630Sokutsu 8814630Sokutsu// Each partition map entry (blocks 1 through n) has this format 8914630Sokutsustruct dpme { 9014630Sokutsu uint16_t dpme_signature ; 9114630Sokutsu uint16_t dpme_reserved_1 ; 9214630Sokutsu uint32_t dpme_map_entries ; 9314630Sokutsu uint32_t dpme_pblock_start ; 9414630Sokutsu uint32_t dpme_pblocks ; 9514630Sokutsu char dpme_name[DPISTRLEN] ; /* name of partition */ 9614630Sokutsu char dpme_type[DPISTRLEN] ; /* type of partition */ 9714630Sokutsu uint32_t dpme_lblock_start ; 9814630Sokutsu uint32_t dpme_lblocks ; 9914630Sokutsu uint32_t dpme_flags; 10014630Sokutsu#if 0 10116077Snishjain uint32_t dpme_reserved_2 : 23 ; /* Bit 9 through 31. */ 10214630Sokutsu uint32_t dpme_os_specific_1 : 1 ; /* Bit 8. */ 10314630Sokutsu uint32_t dpme_os_specific_2 : 1 ; /* Bit 7. */ 10414630Sokutsu uint32_t dpme_os_pic_code : 1 ; /* Bit 6. */ 10514630Sokutsu uint32_t dpme_writable : 1 ; /* Bit 5. */ 10614630Sokutsu uint32_t dpme_readable : 1 ; /* Bit 4. */ 10714630Sokutsu uint32_t dpme_bootable : 1 ; /* Bit 3. */ 10814630Sokutsu uint32_t dpme_in_use : 1 ; /* Bit 2. */ 10914630Sokutsu uint32_t dpme_allocated : 1 ; /* Bit 1. */ 11014630Sokutsu uint32_t dpme_valid : 1 ; /* Bit 0. */ 11114630Sokutsu#endif 11214630Sokutsu uint32_t dpme_boot_block ; 11314630Sokutsu uint32_t dpme_boot_bytes ; 11414630Sokutsu uint32_t dpme_load_addr ; 11514630Sokutsu uint32_t dpme_load_addr_2 ; 11614630Sokutsu uint32_t dpme_goto_addr ; 11714630Sokutsu uint32_t dpme_goto_addr_2 ; 11814630Sokutsu uint32_t dpme_checksum ; 11914630Sokutsu char dpme_process_id[16] ; 12014630Sokutsu uint32_t dpme_boot_args[32] ; 12114630Sokutsu uint32_t dpme_reserved_3[62] ; 12214630Sokutsu}; 12314630Sokutsutypedef struct dpme DPME; 12414630Sokutsu 12514630Sokutsu#define dpme_diskdriver_set(p, v) bitfield_set(&p->dpme_flags, 9, 1, v) 12614630Sokutsu#define dpme_chainable_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v) 12714630Sokutsu 12814630Sokutsu#define dpme_os_specific_1_set(p, v) bitfield_set(&p->dpme_flags, 8, 1, v) 12914630Sokutsu#define dpme_os_specific_2_set(p, v) bitfield_set(&p->dpme_flags, 7, 1, v) 13014630Sokutsu#define dpme_os_pic_code_set(p, v) bitfield_set(&p->dpme_flags, 6, 1, v) 13114630Sokutsu#define dpme_writable_set(p, v) bitfield_set(&p->dpme_flags, 5, 1, v) 13214630Sokutsu#define dpme_readable_set(p, v) bitfield_set(&p->dpme_flags, 4, 1, v) 13314630Sokutsu#define dpme_bootable_set(p, v) bitfield_set(&p->dpme_flags, 3, 1, v) 13414630Sokutsu#define dpme_in_use_set(p, v) bitfield_set(&p->dpme_flags, 2, 1, v) 13514630Sokutsu#define dpme_allocated_set(p, v) bitfield_set(&p->dpme_flags, 1, 1, v) 13614630Sokutsu#define dpme_valid_set(p, v) bitfield_set(&p->dpme_flags, 0, 1, v) 13714630Sokutsu 13814630Sokutsu#define dpme_diskdriver_get(p) bitfield_get(p->dpme_flags, 9, 1) 13914630Sokutsu#define dpme_chainable_get(p) bitfield_get(p->dpme_flags, 8, 1) 14014630Sokutsu 14114630Sokutsu#define dpme_os_specific_1_get(p) bitfield_get(p->dpme_flags, 8, 1) 14214630Sokutsu#define dpme_os_specific_2_get(p) bitfield_get(p->dpme_flags, 7, 1) 14314630Sokutsu#define dpme_os_pic_code_get(p) bitfield_get(p->dpme_flags, 6, 1) 14414630Sokutsu#define dpme_writable_get(p) bitfield_get(p->dpme_flags, 5, 1) 14514630Sokutsu#define dpme_readable_get(p) bitfield_get(p->dpme_flags, 4, 1) 14614630Sokutsu#define dpme_bootable_get(p) bitfield_get(p->dpme_flags, 3, 1) 14714630Sokutsu#define dpme_in_use_get(p) bitfield_get(p->dpme_flags, 2, 1) 14814630Sokutsu#define dpme_allocated_get(p) bitfield_get(p->dpme_flags, 1, 1) 14914630Sokutsu#define dpme_valid_get(p) bitfield_get(p->dpme_flags, 0, 1) 15014630Sokutsu 15114630Sokutsu 15214630Sokutsu// A/UX only data structures (sentimental reasons?) 15314630Sokutsu 15414630Sokutsu// Alternate block map (aka bad block remaping) [Never really used] 15514630Sokutsustruct abm /* altblk map info stored in bzb */ 15614630Sokutsu{ 15714630Sokutsu uint32_t abm_size; /* size of map in bytes */ 15814630Sokutsu uint32_t abm_ents; /* number of used entries */ 15914630Sokutsu uint32_t abm_start; /* start of altblk map */ 16014630Sokutsu}; 16114630Sokutsutypedef struct abm ABM; 16214630Sokutsu 16314630Sokutsu// BZB (Block Zero Block, but I can't remember the etymology) 16414630Sokutsu// Where &dpme_boot_args[0] is actually the address of a struct bzb 16514630Sokutsu// kludge to get around alignment junk 16614630Sokutsustruct bzb /* block zero block format */ 16714630Sokutsu{ 16814630Sokutsu uint32_t bzb_magic; /* magic number */ 16914630Sokutsu uint8_t bzb_cluster; /* Autorecovery cluster grouping */ 17014630Sokutsu uint8_t bzb_type; /* FS type */ 17114630Sokutsu uint16_t bzb_inode; /* bad block inode number */ 17214630Sokutsu uint32_t bzb_flags; 17314630Sokutsu#if 0 17414630Sokutsu uint16_t bzb_root:1, /* FS is a root FS */ 17514630Sokutsu bzb_usr:1, /* FS is a usr FS */ 17614630Sokutsu bzb_crit:1, /* FS is a critical FS */ 17714630Sokutsu bzb_rsrvd:8, /* reserved for later use */ 17814630Sokutsu bzb_slice:5; /* slice number to associate with plus one */ 17914630Sokutsu uint16_t bzb_filler; /* pad bitfield to 32 bits */ 18014630Sokutsu#endif 18114630Sokutsu uint32_t bzb_tmade; /* time of FS creation */ 18214630Sokutsu uint32_t bzb_tmount; /* time of last mount */ 18314630Sokutsu uint32_t bzb_tumount; /* time of last umount */ 18414630Sokutsu ABM bzb_abm; /* altblk map info */ 18514630Sokutsu uint32_t bzb_fill2[7]; /* for expansion of ABM (ha!ha!) */ 18614630Sokutsu uint8_t bzb_mount_point[64]; /* default mount point name */ 18714630Sokutsu}; 18814630Sokutsutypedef struct bzb BZB; 18914630Sokutsu 19016077Snishjain#define bzb_root_set(p, v) bitfield_set(&p->bzb_flags, 31, 1, v) 19116077Snishjain#define bzb_usr_set(p, v) bitfield_set(&p->bzb_flags, 30, 1, v) 19214630Sokutsu#define bzb_crit_set(p, v) bitfield_set(&p->bzb_flags, 29, 1, v) 19314630Sokutsu#define bzb_slice_set(p, v) bitfield_set(&p->bzb_flags, 20, 5, v) 19414630Sokutsu 19514630Sokutsu#define bzb_root_get(p) bitfield_get(p->bzb_flags, 31, 1) 19614630Sokutsu#define bzb_usr_get(p) bitfield_get(p->bzb_flags, 30, 1) 19714630Sokutsu#define bzb_crit_get(p) bitfield_get(p->bzb_flags, 29, 1) 19814630Sokutsu#define bzb_slice_get(p) bitfield_get(p->bzb_flags, 20, 5) 19916077Snishjain 20016077Snishjain 20114630Sokutsu// 20214630Sokutsu// Global Constants 20314630Sokutsu// 20414630Sokutsu 20514630Sokutsu 20614630Sokutsu// 20714630Sokutsu// Global Variables 20816077Snishjain// 20916077Snishjain 21014630Sokutsu 21114630Sokutsu// 21214630Sokutsu// Forward declarations 21314630Sokutsu// 21414630Sokutsu 21514630Sokutsu#endif /* __dpme__ */ 21614630Sokutsu