xref: /titanic_52/usr/src/cmd/boot/bootadm/bootadm.h (revision 37eb779c8a97fc374b781e6a5a65a9d82b806059)
1ae115bc7Smrj /*
2ae115bc7Smrj  * CDDL HEADER START
3ae115bc7Smrj  *
4ae115bc7Smrj  * The contents of this file are subject to the terms of the
5ae115bc7Smrj  * Common Development and Distribution License (the "License").
6ae115bc7Smrj  * You may not use this file except in compliance with the License.
7ae115bc7Smrj  *
8ae115bc7Smrj  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9ae115bc7Smrj  * or http://www.opensolaris.org/os/licensing.
10ae115bc7Smrj  * See the License for the specific language governing permissions
11ae115bc7Smrj  * and limitations under the License.
12ae115bc7Smrj  *
13ae115bc7Smrj  * When distributing Covered Code, include this CDDL HEADER in each
14ae115bc7Smrj  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15ae115bc7Smrj  * If applicable, add the following below this CDDL HEADER, with the
16ae115bc7Smrj  * fields enclosed by brackets "[]" replaced with your own identifying
17ae115bc7Smrj  * information: Portions Copyright [yyyy] [name of copyright owner]
18ae115bc7Smrj  *
19ae115bc7Smrj  * CDDL HEADER END
20ae115bc7Smrj  */
21ae115bc7Smrj /*
22*37eb779cSVikram Hegde  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23ae115bc7Smrj  * Use is subject to license terms.
24ae115bc7Smrj  */
25ae115bc7Smrj 
26ae115bc7Smrj #ifndef _BOOTADM_H
27ae115bc7Smrj #define	_BOOTADM_H
28ae115bc7Smrj 
29ae115bc7Smrj #ifdef	__cplusplus
30ae115bc7Smrj extern "C" {
31ae115bc7Smrj #endif
32ae115bc7Smrj 
33eb2bd662Svikram #include <assert.h>
34eb2bd662Svikram 
35ae115bc7Smrj #ifndef	TEXT_DOMAIN
36ae115bc7Smrj #define	TEXT_DOMAIN	"SUNW_OST_OSCMD"
37ae115bc7Smrj #endif  /* TEXT_DOMAIN */
38ae115bc7Smrj 
39ae115bc7Smrj /* Type definitions */
40ae115bc7Smrj 
41ae115bc7Smrj /* GRUB menu per-line classification */
42ae115bc7Smrj typedef enum {
43ae115bc7Smrj 	BAM_INVALID = 0,
44ae115bc7Smrj 	BAM_EMPTY,
45ae115bc7Smrj 	BAM_COMMENT,
46ae115bc7Smrj 	BAM_GLOBAL,
47ae115bc7Smrj 	BAM_ENTRY,
48ae115bc7Smrj 	BAM_TITLE
49ae115bc7Smrj } menu_flag_t;
50ae115bc7Smrj 
51ae115bc7Smrj /* struct for menu.lst contents */
52ae115bc7Smrj typedef struct line {
53ae115bc7Smrj 	int  lineNum;	/* Line number in menu.lst */
54ae115bc7Smrj 	int  entryNum;	/* menu boot entry #. ENTRY_INIT if not applicable */
55ae115bc7Smrj 	char *cmd;
56ae115bc7Smrj 	char *sep;
57ae115bc7Smrj 	char *arg;
58ae115bc7Smrj 	char *line;
59ae115bc7Smrj 	menu_flag_t flags;
60ae115bc7Smrj 	struct line *next;
61ae115bc7Smrj 	struct line *prev;
62ae115bc7Smrj } line_t;
63ae115bc7Smrj 
64ae115bc7Smrj typedef struct entry {
65ae115bc7Smrj 	struct entry *next;
66ae115bc7Smrj 	struct entry *prev;
67ae115bc7Smrj 	line_t *start;
68ae115bc7Smrj 	line_t *end;
69ae115bc7Smrj 	int	entryNum;
70eb2bd662Svikram 	uint_t	flags;
71ae115bc7Smrj } entry_t;
72ae115bc7Smrj 
73ae115bc7Smrj /* For flags value in entry_t */
74ae115bc7Smrj #define	BAM_ENTRY_BOOTADM	0x01	/* entry created by bootadm */
75ae115bc7Smrj #define	BAM_ENTRY_LU		0x02	/* entry created by Live Upgrade */
76ae115bc7Smrj #define	BAM_ENTRY_CHAINLOADER	0x04	/* chainloader entry; do not disturb */
77ae115bc7Smrj #define	BAM_ENTRY_ROOT		0x08	/* entry has a root line */
78eb2bd662Svikram #define	BAM_ENTRY_FAILSAFE	0x10	/* failsafe entry  */
79eb2bd662Svikram #define	BAM_ENTRY_DBOOT		0x20	/* Is dboot (normal or failsafe) */
80ae115bc7Smrj #define	BAM_ENTRY_32BIT		0x40	/* Is a 32-bit entry */
81843e1988Sjohnlev #define	BAM_ENTRY_HV		0x80	/* Is a hypervisor entry */
82eb2bd662Svikram #define	BAM_ENTRY_FINDROOT	0x100	/* entry has a findroot line */
83eb2bd662Svikram #define	BAM_ENTRY_MULTIBOOT	0x200	/* is multiboot (normal or failsafe) */
84eb2bd662Svikram #define	BAM_ENTRY_64BIT		0x400	/* Is a 64-bit entry */
85ae115bc7Smrj 
86bbcc54bdSEnrico Perla - Sun Microsystems #define	BAM_ENTRY_UPGFSKERNEL	0x800	/* Upgrade failsafe kernel entry */
87bbcc54bdSEnrico Perla - Sun Microsystems #define	BAM_ENTRY_UPGFSMODULE	0x1000  /* Upgrade failsafe module entry */
88bbcc54bdSEnrico Perla - Sun Microsystems 
89ae115bc7Smrj typedef struct {
90ae115bc7Smrj 	line_t	*start;
91ae115bc7Smrj 	line_t	*end;
92ae115bc7Smrj 	line_t	*curdefault;	/* line containing default */
93ae115bc7Smrj 	line_t	*olddefault;	/* old default line (commented) */
94ae115bc7Smrj 	line_t	*old_rc_default;	/* old default line for bootenv.rc */
95ae115bc7Smrj 	entry_t	*entries;	/* os entries */
96ae115bc7Smrj } menu_t;
97ae115bc7Smrj 
98ae115bc7Smrj typedef enum {
99ae115bc7Smrj 	BAM_ERROR = -1,	/* Must be negative. add_boot_entry() depends on it */
100ae115bc7Smrj 	BAM_SUCCESS = 0,
101ae115bc7Smrj 	BAM_WRITE = 2,
102eb2bd662Svikram 	BAM_MSG	/* Used by upgrade_menu() */
103ae115bc7Smrj } error_t;
104ae115bc7Smrj 
105ae115bc7Smrj /*
106ae115bc7Smrj  * Menu related
107ae115bc7Smrj  * menu_cmd_t and menu_cmds must be kept in sync
108843e1988Sjohnlev  *
109843e1988Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
110843e1988Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
111ae115bc7Smrj  */
112ae115bc7Smrj typedef enum {
113ae115bc7Smrj 	DEFAULT_CMD = 0,
114ae115bc7Smrj 	TIMEOUT_CMD,
115ae115bc7Smrj 	TITLE_CMD,
116ae115bc7Smrj 	ROOT_CMD,
117ae115bc7Smrj 	KERNEL_CMD,
118843e1988Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
119ae115bc7Smrj 	MODULE_CMD,
120843e1988Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
121ae115bc7Smrj 	SEP_CMD,
122ae115bc7Smrj 	COMMENT_CMD,
123ae115bc7Smrj 	CHAINLOADER_CMD,
124eb2bd662Svikram 	ARGS_CMD,
125eb2bd662Svikram 	FINDROOT_CMD
126ae115bc7Smrj } menu_cmd_t;
127ae115bc7Smrj 
128ae115bc7Smrj extern char *menu_cmds[];
129ae115bc7Smrj 
130ae115bc7Smrj /* For multi- or direct-boot */
131ae115bc7Smrj typedef enum {
132ae115bc7Smrj 	BAM_DIRECT_NOT_SET,
133ae115bc7Smrj 	BAM_DIRECT_MULTIBOOT,
134ae115bc7Smrj 	BAM_DIRECT_DBOOT
135ae115bc7Smrj } direct_or_multi_t;
136ae115bc7Smrj 
137843e1988Sjohnlev /* Is there a hypervisor present? */
138843e1988Sjohnlev typedef enum {
139843e1988Sjohnlev 	BAM_HV_UNKNOWN,
140843e1988Sjohnlev 	BAM_HV_NO,
141843e1988Sjohnlev 	BAM_HV_PRESENT
142843e1988Sjohnlev } hv_t;
143843e1988Sjohnlev 
144eb2bd662Svikram /* Is there findroot capability present ? */
145eb2bd662Svikram typedef enum {
146eb2bd662Svikram 	BAM_FINDROOT_UNKNOWN,
147eb2bd662Svikram 	BAM_FINDROOT_ABSENT,
148eb2bd662Svikram 	BAM_FINDROOT_PRESENT
149eb2bd662Svikram } findroot_t;
150eb2bd662Svikram 
151ae115bc7Smrj extern int bam_verbose;
152ae115bc7Smrj extern int bam_force;
153ae115bc7Smrj extern direct_or_multi_t bam_direct;
154843e1988Sjohnlev extern hv_t bam_is_hv;
155eb2bd662Svikram extern findroot_t bam_is_findroot;
156eb2bd662Svikram extern int bam_debug;
157ae115bc7Smrj 
158eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
159eb2bd662Svikram extern void update_numbering(menu_t *mp);
160ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
161ae115bc7Smrj extern void *s_calloc(size_t, size_t);
162ae115bc7Smrj extern void *s_realloc(void *, size_t);
163ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
164ae115bc7Smrj extern void bam_error(char *format, ...);
165eb2bd662Svikram extern void bam_print(char *, ...);
166ae115bc7Smrj extern void bam_print_stderr(char *format, ...);
167eb2bd662Svikram extern void bam_derror(char *format, ...);
168eb2bd662Svikram extern error_t get_boot_cap(const char *osroot);
169ae115bc7Smrj extern char *get_special(char *);
170ae115bc7Smrj extern char *os_to_grubdisk(char *, int);
171ae115bc7Smrj extern void update_line(line_t *);
172843e1988Sjohnlev extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *);
173986fd29aSsetje extern int is_grub(const char *);
174eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev);
175eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
176eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root);
177eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp);
178eb2bd662Svikram extern void line_free(line_t *lp);
179eb2bd662Svikram extern char *s_strdup(char *);
180eb2bd662Svikram extern int is_sparc(void);
181ae115bc7Smrj 
182ae115bc7Smrj #define	BAM_MAXLINE	8192
183ae115bc7Smrj 
184ae115bc7Smrj /* menu.lst comments created by bootadm */
185ae115bc7Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
186ae115bc7Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
187ae115bc7Smrj 
188ae115bc7Smrj /*
189ae115bc7Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
190ae115bc7Smrj  * the comment strings - there will be other text before them.
191ae115bc7Smrj  */
192ae115bc7Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
193ae115bc7Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
194ae115bc7Smrj 
195ae115bc7Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
196ae115bc7Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
197ae115bc7Smrj 
198ae115bc7Smrj /* Title used for failsafe entries */
199ae115bc7Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
200ae115bc7Smrj 
201843e1988Sjohnlev /* Title used for hv entries */
202843e1988Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
203843e1988Sjohnlev 
204e7cbe64fSgw25295 /* ZFS boot option */
205e7cbe64fSgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
206e7cbe64fSgw25295 
207ae115bc7Smrj /* multiboot */
208ae115bc7Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
209ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
210ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
211ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
212ae115bc7Smrj 
213ae115bc7Smrj /* directboot kernels */
214ae115bc7Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
215ae115bc7Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
216ae115bc7Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
217bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_32	"/boot/platform/i86pc/kernel/unix"
218bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_64	"/boot/platform/i86pc/kernel/amd64/unix"
219bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_KERNEL \
220bbcc54bdSEnrico Perla - Sun Microsystems 	"/boot/platform/i86pc/kernel/$ISADIR/unix"
221ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
222e7cbe64fSgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
223*37eb779cSVikram Hegde #define	DIRECT_BOOT_PREFIX	"/platform/i86pc/"
224*37eb779cSVikram Hegde #define	KERNEL_PREFIX	"/platform/i86pc/"
225*37eb779cSVikram Hegde #define	AMD_UNIX_SPACE	"/amd64/unix "
226*37eb779cSVikram Hegde #define	UNIX_SPACE	"/unix "
227ae115bc7Smrj 
228eb2bd662Svikram /* xVM kernels */
229eb2bd662Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
230eb2bd662Svikram 
231ae115bc7Smrj /* Boot archives */
23279755401Ssetje #define	ARCHIVE_PREFIX		"/platform/"
23379755401Ssetje #define	ARCHIVE_SUFFIX		"/boot_archive"
234ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
235ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
236ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
237eb2bd662Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
238bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE	"/boot/$ISADIR/x86.miniroot-safe"
239bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_32	"/boot/x86.miniroot-safe"
240bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_64	"/boot/amd64/x86.miniroot-safe"
241ae115bc7Smrj 
242843e1988Sjohnlev /* Hypervisors */
243843e1988Sjohnlev #define	XEN_32			"/boot/xen.gz"
244843e1988Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
245843e1988Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
246843e1988Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
247eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
248eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
249e7cbe64fSgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
250843e1988Sjohnlev 
251eb2bd662Svikram /* A first guess at the number of entries in a menu */
252eb2bd662Svikram #define	BAM_ENTRY_NUM		10
253eb2bd662Svikram 
254eb2bd662Svikram /*
255eb2bd662Svikram  * Debugging defines
256eb2bd662Svikram  */
257eb2bd662Svikram #define	INJECT_ERROR1(x, y)	\
258eb2bd662Svikram { \
259eb2bd662Svikram 	if (bam_debug) { \
260eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
261eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
262eb2bd662Svikram 			y;	\
263eb2bd662Svikram 		} \
264eb2bd662Svikram 	} \
265eb2bd662Svikram }
266eb2bd662Svikram 
267eb2bd662Svikram #define	INJECT_ERROR2(x, y, z)	\
268eb2bd662Svikram { \
269eb2bd662Svikram 	if (bam_debug) { \
270eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
271eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
272eb2bd662Svikram 			y;	\
273eb2bd662Svikram 			z;	\
274eb2bd662Svikram 		} \
275eb2bd662Svikram 	} \
276eb2bd662Svikram }
277eb2bd662Svikram 
278eb2bd662Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
279eb2bd662Svikram 
280ae115bc7Smrj #ifdef __cplusplus
281ae115bc7Smrj }
282ae115bc7Smrj #endif
283ae115bc7Smrj 
284ae115bc7Smrj #endif	/* _BOOTADM_H */
285