1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
24  * Copyright 2016 Toomas Soome <tsoome@me.com>
25  */
26 
27 #ifndef	_INSTALLBOOT_H
28 #define	_INSTALLBOOT_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 #include <sys/multiboot.h>
35 #include <sys/types.h>
36 
37 #define	SECTOR_SIZE	(512)
38 
39 /* partitioning type for device */
40 enum ig_devtype_t {
41 	IG_DEV_VTOC = 0,
42 	IG_DEV_MBR,
43 	IG_DEV_EFI
44 };
45 
46 /* file system type */
47 enum ig_fstype_t {
48 	IG_FS_NONE = 0,
49 	IG_FS_ZFS,
50 	IG_FS_UFS,
51 	IG_FS_PCFS
52 };
53 
54 /* partition info for boot block location. */
55 struct stage_part {
56 	char *path;			/* device name */
57 	int fd;				/* open file descriptor */
58 	int id;				/* partition/slice number */
59 	enum ig_devtype_t devtype;	/* partitioning type */
60 	enum ig_fstype_t fstype;	/* none or pcfs */
61 	uint64_t start;			/* partition LBA */
62 	uint64_t size;			/* partition size */
63 	uint64_t offset;		/* block offset */
64 };
65 
66 /* boot device data */
67 typedef struct _ib_device {
68 	char		*path;			/* whole disk */
69 	int		fd;			/* whole disk fd */
70 	enum ig_devtype_t devtype;
71 	struct stage_part stage;		/* location of boot block */
72 	struct stage_part target;		/* target file system */
73 	char		mbr[SECTOR_SIZE];
74 } ib_device_t;
75 
76 /* stage 2 location */
77 typedef struct _ib_bootblock {
78 	char			*buf;
79 	char			*file;
80 	char			*extra;
81 	multiboot_header_t	*mboot;
82 	uint32_t		mboot_off;
83 	uint32_t		file_size;
84 	uint32_t		buf_size;
85 	uint32_t		extra_size;
86 } ib_bootblock_t;
87 
88 typedef struct _ib_data {
89 	unsigned char	stage1[SECTOR_SIZE];	/* partition boot block */
90 	ib_device_t	device;			/* boot device */
91 	ib_bootblock_t	bootblock;		/* stage 2 */
92 } ib_data_t;
93 
94 #define	BBLK_BLKLIST_OFF	50	/* vtoc/disk boot offset */
95 #define	BBLK_ZFS_BLK_OFF	1024	/* vdev boot offset */
96 #define	BBLK_ZFS_BLK_SIZE	(7ULL << 19)	/* vdev max boot size */
97 
98 /* locations of MBR parts, must be reviewd if mbr code is changed */
99 #define	STAGE1_BPB_OFFSET	(0x3)	/* technically BPB starts at 0xb */
100 #define	STAGE1_BPB_SIZE		(0x3b)
101 #define	STAGE1_MBR_VERSION	(0xfa)	/* 2 bytes, not used */
102 #define	STAGE1_STAGE2_SIZE	(0xfc)	/* 16bits */
103 #define	STAGE1_STAGE2_LBA	(0xfe)	/* 64bits */
104 #define	STAGE1_STAGE2_UUID	(0x106)	/* 128bits */
105 #define	STAGE1_SIG		(0x1b8)	/* 4+2 bytes */
106 #define	STAGE1_PARTTBL		(0x1be)	/* MBR partition table */
107 #define	STAGE1_MAGIC		(0x1fe)	/* 0xAA55 */
108 #ifdef	__cplusplus
109 }
110 #endif
111 
112 #endif /* _INSTALLBOOT_H */
113