summaryrefslogtreecommitdiff
path: root/sbin/pdisk/partition_map.h
blob: ad1e0d2393149b4bffbeb5bf9a7b8ed4957eeac4 (plain)
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
/*	$OpenBSD: partition_map.h,v 1.42 2016/01/31 23:00:11 krw Exp $	*/

/*
 * partition_map.h - partition map routines
 *
 * Written by Eryk Vershen
 */

/*
 * Copyright 1996,1998 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 __partition_map__
#define __partition_map__

#define	BLOCK0_SIGNATURE	0x4552	/* 'ER' */
#define	DPME_SIGNATURE		0x504D	/* 'PM' */

#define	DPISTRLEN	32

struct ddmap {
    uint32_t	ddBlock;	/* 1st driver's starting sbBlkSize block */
    uint16_t	ddSize;		/* size of 1st driver (512-byte blks) */
    uint16_t	ddType;		/* system type (1 for Mac+) */
};

struct entry;

struct partition_map {
    LIST_HEAD(, entry)	disk_order;
    LIST_HEAD(, entry)	base_order;
    char	       *name;
    int			fd;
    int			changed;
    int			blocks_in_map;
    int			maximum_in_map;
    unsigned long	media_size;	/* in physical blocks */

    /* On-disk block 0 data. */
    uint16_t		sbSig;		/* "ER" */
    uint16_t		sbBlkSize;	/* physical block size of device */
    uint32_t		sbBlkCount;	/* # of physical blocks on device */
    uint16_t		sbDevType;	/* device type */
    uint16_t		sbDevId;	/* device id */
    uint32_t		sbData;		/* not used */
    uint16_t		sbDrvrCount;	/* driver descriptor count */
    struct ddmap	sbDDMap[8];	/* driver descriptor map*/
    uint8_t		sbReserved[430];
};

struct entry {
    LIST_ENTRY(entry)		disk_entry;
    LIST_ENTRY(entry)		base_entry;
    struct partition_map       *the_map;
    long			disk_address;

    /* On-disk dpme block data.*/
    uint16_t	dpme_signature;		/* "PM" */
    uint8_t	dpme_reserved_1[2];
    uint32_t	dpme_map_entries;	/* # of partition entries */
    uint32_t	dpme_pblock_start;	/* physical block start of partition */
    uint32_t	dpme_pblocks;		/* physical block count of partition */
    char	dpme_name[DPISTRLEN+1];	/* name of partition + NUL */
    char	dpme_type[DPISTRLEN+1];	/* type of partition + NUL */
    uint32_t	dpme_lblock_start;	/* logical block start of partition */
    uint32_t	dpme_lblocks;		/* logical block count of partition */
    uint32_t	dpme_flags;
#define	DPME_OS_SPECIFIC_1	(1<<8)
#define	DPME_OS_SPECIFIC_2	(1<<7)
#define	DPME_OS_PIC_CODE	(1<<6)
#define	DPME_WRITABLE		(1<<5)
#define	DPME_READABLE		(1<<4)
#define	DPME_BOOTABLE		(1<<3)
#define	DPME_IN_USE		(1<<2)
#define	DPME_ALLOCATED		(1<<1)
#define	DPME_VALID		(1<<0)
    uint32_t	dpme_boot_block;	/* logical block start of boot code */
    uint32_t	dpme_boot_bytes;	/* byte count of boot code */
    uint16_t	dpme_load_addr;		/* memory address of boot code */
    uint8_t	dpme_reserved_2[4];
    uint32_t	dpme_goto_addr;		/* memory jump address of boot code */
    uint8_t	dpme_reserved_3[4];
    uint32_t	dpme_checksum;		/* of the boot code. */
    char	dpme_processor_id[17];	/* processor type + NUL */
    uint8_t	dpme_reserved_4[376];
};

extern const char *kFreeType;
extern const char *kMapType;
extern const char *kUnixType;
extern const char *kHFSType;

extern int lflag;
extern int rflag;

struct partition_map	*create_partition_map(int, char *, uint64_t, uint32_t);
struct partition_map	*open_partition_map(int, char *, uint64_t, uint32_t);

struct entry	*find_entry_by_disk_address(long, struct partition_map *);
struct entry	*find_entry_by_type(const char *, struct partition_map *);
struct entry	*find_entry_by_base(uint32_t, struct partition_map *);

int	add_partition_to_map(const char *, const char *, uint32_t, uint32_t,
    struct partition_map *);

int	contains_driver(struct entry *);
void	free_partition_map(struct partition_map *);
void	delete_partition_from_map(struct entry *);
void	move_entry_in_map(long, long, struct partition_map *);
void	resize_map(long new_size, struct partition_map *);
void	write_partition_map(struct partition_map *);
void	dpme_init_flags(struct entry *);

#endif /* __partition_map__ */