1*ead46a34Skrw /* $OpenBSD: partition_map.h,v 1.42 2016/01/31 23:00:11 krw Exp $ */ 2fb04e59aSjasper 386ec409aSkrw /* 486ec409aSkrw * partition_map.h - partition map routines 586ec409aSkrw * 686ec409aSkrw * Written by Eryk Vershen 786ec409aSkrw */ 8dce63815Sdrahn 9dce63815Sdrahn /* 10dce63815Sdrahn * Copyright 1996,1998 by Apple Computer, Inc. 11dce63815Sdrahn * All Rights Reserved 12dce63815Sdrahn * 13dce63815Sdrahn * Permission to use, copy, modify, and distribute this software and 14dce63815Sdrahn * its documentation for any purpose and without fee is hereby granted, 15dce63815Sdrahn * provided that the above copyright notice appears in all copies and 16dce63815Sdrahn * that both the copyright notice and this permission notice appear in 17dce63815Sdrahn * supporting documentation. 18dce63815Sdrahn * 19dce63815Sdrahn * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 20dce63815Sdrahn * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21dce63815Sdrahn * FOR A PARTICULAR PURPOSE. 22dce63815Sdrahn * 23dce63815Sdrahn * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 24dce63815Sdrahn * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 25dce63815Sdrahn * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 26dce63815Sdrahn * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 27dce63815Sdrahn * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 28dce63815Sdrahn */ 29dce63815Sdrahn 30dce63815Sdrahn #ifndef __partition_map__ 31dce63815Sdrahn #define __partition_map__ 32dce63815Sdrahn 33a63f2390Skrw #define BLOCK0_SIGNATURE 0x4552 /* 'ER' */ 34a63f2390Skrw #define DPME_SIGNATURE 0x504D /* 'PM' */ 35a63f2390Skrw 36a63f2390Skrw #define DPISTRLEN 32 37a63f2390Skrw 386f012227Skrw struct ddmap { 396f012227Skrw uint32_t ddBlock; /* 1st driver's starting sbBlkSize block */ 406f012227Skrw uint16_t ddSize; /* size of 1st driver (512-byte blks) */ 416f012227Skrw uint16_t ddType; /* system type (1 for Mac+) */ 426f012227Skrw }; 436f012227Skrw 44f4c16b6bSkrw struct entry; 450392b273Skrw 46356b92ceSkrw struct partition_map { 47f4c16b6bSkrw LIST_HEAD(, entry) disk_order; 48f4c16b6bSkrw LIST_HEAD(, entry) base_order; 49dce63815Sdrahn char *name; 50e4263269Skrw int fd; 51dce63815Sdrahn int changed; 52dce63815Sdrahn int blocks_in_map; 53dce63815Sdrahn int maximum_in_map; 54c579b49fSkrw unsigned long media_size; /* in physical blocks */ 556f012227Skrw 566f012227Skrw /* On-disk block 0 data. */ 576f012227Skrw uint16_t sbSig; /* "ER" */ 586f012227Skrw uint16_t sbBlkSize; /* physical block size of device */ 596f012227Skrw uint32_t sbBlkCount; /* # of physical blocks on device */ 606f012227Skrw uint16_t sbDevType; /* device type */ 616f012227Skrw uint16_t sbDevId; /* device id */ 626f012227Skrw uint32_t sbData; /* not used */ 636f012227Skrw uint16_t sbDrvrCount; /* driver descriptor count */ 646f012227Skrw struct ddmap sbDDMap[8]; /* driver descriptor map*/ 656f012227Skrw uint8_t sbReserved[430]; 66dce63815Sdrahn }; 67dce63815Sdrahn 68f4c16b6bSkrw struct entry { 69f4c16b6bSkrw LIST_ENTRY(entry) disk_entry; 70f4c16b6bSkrw LIST_ENTRY(entry) base_entry; 71356b92ceSkrw struct partition_map *the_map; 72f41ce26fSkrw long disk_address; 73f8fa35e5Skrw 74f8fa35e5Skrw /* On-disk dpme block data.*/ 75f8fa35e5Skrw uint16_t dpme_signature; /* "PM" */ 76f8fa35e5Skrw uint8_t dpme_reserved_1[2]; 77f8fa35e5Skrw uint32_t dpme_map_entries; /* # of partition entries */ 78f8fa35e5Skrw uint32_t dpme_pblock_start; /* physical block start of partition */ 79f8fa35e5Skrw uint32_t dpme_pblocks; /* physical block count of partition */ 80f8fa35e5Skrw char dpme_name[DPISTRLEN+1]; /* name of partition + NUL */ 81f8fa35e5Skrw char dpme_type[DPISTRLEN+1]; /* type of partition + NUL */ 82f8fa35e5Skrw uint32_t dpme_lblock_start; /* logical block start of partition */ 83f8fa35e5Skrw uint32_t dpme_lblocks; /* logical block count of partition */ 84f8fa35e5Skrw uint32_t dpme_flags; 85f8fa35e5Skrw #define DPME_OS_SPECIFIC_1 (1<<8) 86f8fa35e5Skrw #define DPME_OS_SPECIFIC_2 (1<<7) 87f8fa35e5Skrw #define DPME_OS_PIC_CODE (1<<6) 88f8fa35e5Skrw #define DPME_WRITABLE (1<<5) 89f8fa35e5Skrw #define DPME_READABLE (1<<4) 90f8fa35e5Skrw #define DPME_BOOTABLE (1<<3) 91f8fa35e5Skrw #define DPME_IN_USE (1<<2) 92f8fa35e5Skrw #define DPME_ALLOCATED (1<<1) 93f8fa35e5Skrw #define DPME_VALID (1<<0) 94f8fa35e5Skrw uint32_t dpme_boot_block; /* logical block start of boot code */ 95f8fa35e5Skrw uint32_t dpme_boot_bytes; /* byte count of boot code */ 96f8fa35e5Skrw uint16_t dpme_load_addr; /* memory address of boot code */ 97f8fa35e5Skrw uint8_t dpme_reserved_2[4]; 98f8fa35e5Skrw uint32_t dpme_goto_addr; /* memory jump address of boot code */ 99f8fa35e5Skrw uint8_t dpme_reserved_3[4]; 100f8fa35e5Skrw uint32_t dpme_checksum; /* of the boot code. */ 101f8fa35e5Skrw char dpme_processor_id[17]; /* processor type + NUL */ 102f8fa35e5Skrw uint8_t dpme_reserved_4[376]; 103b42d9302Smartin }; 104b42d9302Smartin 105dce63815Sdrahn extern const char *kFreeType; 106dce63815Sdrahn extern const char *kMapType; 107dce63815Sdrahn extern const char *kUnixType; 108dce63815Sdrahn extern const char *kHFSType; 109dce63815Sdrahn 11036bbc7f2Skrw extern int lflag; 11136bbc7f2Skrw extern int rflag; 112dce63815Sdrahn 113cbc59f69Skrw struct partition_map *create_partition_map(int, char *, uint64_t, uint32_t); 114cbc59f69Skrw struct partition_map *open_partition_map(int, char *, uint64_t, uint32_t); 1158887dc3dSkrw 116cbc59f69Skrw struct entry *find_entry_by_disk_address(long, struct partition_map *); 117cbc59f69Skrw struct entry *find_entry_by_type(const char *, struct partition_map *); 118cbc59f69Skrw struct entry *find_entry_by_base(uint32_t, struct partition_map *); 1198887dc3dSkrw 1208887dc3dSkrw int add_partition_to_map(const char *, const char *, uint32_t, uint32_t, 121356b92ceSkrw struct partition_map *); 122cbc59f69Skrw 123575b2bc1Skrw int contains_driver(struct entry *); 124356b92ceSkrw void free_partition_map(struct partition_map *); 125f4c16b6bSkrw void delete_partition_from_map(struct entry *); 126356b92ceSkrw void move_entry_in_map(long, long, struct partition_map *); 127356b92ceSkrw void resize_map(long new_size, struct partition_map *); 128356b92ceSkrw void write_partition_map(struct partition_map *); 129f8fa35e5Skrw void dpme_init_flags(struct entry *); 130dce63815Sdrahn 131dce63815Sdrahn #endif /* __partition_map__ */ 132