xref: /openbsd-src/sbin/pdisk/partition_map.h (revision ead46a348bcad4cd9976c126d6bd865f90febe51)
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