xref: /titanic_50/usr/src/cmd/boot/bootadm/bootadm.h (revision eb2bd6624e082e367f66e2b0fdfe54c9b5d493af)
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 /*
22d876c67dSjg  * Copyright 2008 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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30ae115bc7Smrj 
31ae115bc7Smrj #ifdef	__cplusplus
32ae115bc7Smrj extern "C" {
33ae115bc7Smrj #endif
34ae115bc7Smrj 
35*eb2bd662Svikram #include <assert.h>
36*eb2bd662Svikram 
37ae115bc7Smrj #ifndef	TEXT_DOMAIN
38ae115bc7Smrj #define	TEXT_DOMAIN	"SUNW_OST_OSCMD"
39ae115bc7Smrj #endif  /* TEXT_DOMAIN */
40ae115bc7Smrj 
41ae115bc7Smrj /* Type definitions */
42ae115bc7Smrj 
43ae115bc7Smrj /* GRUB menu per-line classification */
44ae115bc7Smrj typedef enum {
45ae115bc7Smrj 	BAM_INVALID = 0,
46ae115bc7Smrj 	BAM_EMPTY,
47ae115bc7Smrj 	BAM_COMMENT,
48ae115bc7Smrj 	BAM_GLOBAL,
49ae115bc7Smrj 	BAM_ENTRY,
50ae115bc7Smrj 	BAM_TITLE
51ae115bc7Smrj } menu_flag_t;
52ae115bc7Smrj 
53ae115bc7Smrj /* struct for menu.lst contents */
54ae115bc7Smrj typedef struct line {
55ae115bc7Smrj 	int  lineNum;	/* Line number in menu.lst */
56ae115bc7Smrj 	int  entryNum;	/* menu boot entry #. ENTRY_INIT if not applicable */
57ae115bc7Smrj 	char *cmd;
58ae115bc7Smrj 	char *sep;
59ae115bc7Smrj 	char *arg;
60ae115bc7Smrj 	char *line;
61ae115bc7Smrj 	menu_flag_t flags;
62ae115bc7Smrj 	struct line *next;
63ae115bc7Smrj 	struct line *prev;
64ae115bc7Smrj } line_t;
65ae115bc7Smrj 
66ae115bc7Smrj typedef struct entry {
67ae115bc7Smrj 	struct entry *next;
68ae115bc7Smrj 	struct entry *prev;
69ae115bc7Smrj 	line_t *start;
70ae115bc7Smrj 	line_t *end;
71ae115bc7Smrj 	int	entryNum;
72*eb2bd662Svikram 	uint_t	flags;
73ae115bc7Smrj } entry_t;
74ae115bc7Smrj 
75ae115bc7Smrj /* For flags value in entry_t */
76ae115bc7Smrj #define	BAM_ENTRY_BOOTADM	0x01	/* entry created by bootadm */
77ae115bc7Smrj #define	BAM_ENTRY_LU		0x02	/* entry created by Live Upgrade */
78ae115bc7Smrj #define	BAM_ENTRY_CHAINLOADER	0x04	/* chainloader entry; do not disturb */
79ae115bc7Smrj #define	BAM_ENTRY_ROOT		0x08	/* entry has a root line */
80*eb2bd662Svikram #define	BAM_ENTRY_FAILSAFE	0x10	/* failsafe entry  */
81*eb2bd662Svikram #define	BAM_ENTRY_DBOOT		0x20	/* Is dboot (normal or failsafe) */
82ae115bc7Smrj #define	BAM_ENTRY_32BIT		0x40	/* Is a 32-bit entry */
83843e1988Sjohnlev #define	BAM_ENTRY_HV		0x80	/* Is a hypervisor entry */
84*eb2bd662Svikram #define	BAM_ENTRY_FINDROOT	0x100	/* entry has a findroot line */
85*eb2bd662Svikram #define	BAM_ENTRY_MULTIBOOT	0x200	/* is multiboot (normal or failsafe) */
86*eb2bd662Svikram #define	BAM_ENTRY_64BIT		0x400	/* Is a 64-bit entry */
87ae115bc7Smrj 
88ae115bc7Smrj typedef struct {
89ae115bc7Smrj 	line_t	*start;
90ae115bc7Smrj 	line_t	*end;
91ae115bc7Smrj 	line_t	*curdefault;	/* line containing default */
92ae115bc7Smrj 	line_t	*olddefault;	/* old default line (commented) */
93ae115bc7Smrj 	line_t	*old_rc_default;	/* old default line for bootenv.rc */
94ae115bc7Smrj 	entry_t	*entries;	/* os entries */
95ae115bc7Smrj } menu_t;
96ae115bc7Smrj 
97ae115bc7Smrj typedef enum {
98ae115bc7Smrj 	BAM_ERROR = -1,	/* Must be negative. add_boot_entry() depends on it */
99ae115bc7Smrj 	BAM_SUCCESS = 0,
100ae115bc7Smrj 	BAM_WRITE = 2,
101*eb2bd662Svikram 	BAM_MSG	/* Used by upgrade_menu() */
102ae115bc7Smrj } error_t;
103ae115bc7Smrj 
104ae115bc7Smrj /*
105ae115bc7Smrj  * Menu related
106ae115bc7Smrj  * menu_cmd_t and menu_cmds must be kept in sync
107843e1988Sjohnlev  *
108843e1988Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
109843e1988Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
110ae115bc7Smrj  */
111ae115bc7Smrj typedef enum {
112ae115bc7Smrj 	DEFAULT_CMD = 0,
113ae115bc7Smrj 	TIMEOUT_CMD,
114ae115bc7Smrj 	TITLE_CMD,
115ae115bc7Smrj 	ROOT_CMD,
116ae115bc7Smrj 	KERNEL_CMD,
117843e1988Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
118ae115bc7Smrj 	MODULE_CMD,
119843e1988Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
120ae115bc7Smrj 	SEP_CMD,
121ae115bc7Smrj 	COMMENT_CMD,
122ae115bc7Smrj 	CHAINLOADER_CMD,
123*eb2bd662Svikram 	ARGS_CMD,
124*eb2bd662Svikram 	FINDROOT_CMD
125ae115bc7Smrj } menu_cmd_t;
126ae115bc7Smrj 
127ae115bc7Smrj extern char *menu_cmds[];
128ae115bc7Smrj 
129ae115bc7Smrj /* For multi- or direct-boot */
130ae115bc7Smrj typedef enum {
131ae115bc7Smrj 	BAM_DIRECT_NOT_SET,
132ae115bc7Smrj 	BAM_DIRECT_MULTIBOOT,
133ae115bc7Smrj 	BAM_DIRECT_DBOOT
134ae115bc7Smrj } direct_or_multi_t;
135ae115bc7Smrj 
136843e1988Sjohnlev /* Is there a hypervisor present? */
137843e1988Sjohnlev typedef enum {
138843e1988Sjohnlev 	BAM_HV_UNKNOWN,
139843e1988Sjohnlev 	BAM_HV_NO,
140843e1988Sjohnlev 	BAM_HV_PRESENT
141843e1988Sjohnlev } hv_t;
142843e1988Sjohnlev 
143*eb2bd662Svikram /* Is there findroot capability present ? */
144*eb2bd662Svikram typedef enum {
145*eb2bd662Svikram 	BAM_FINDROOT_UNKNOWN,
146*eb2bd662Svikram 	BAM_FINDROOT_ABSENT,
147*eb2bd662Svikram 	BAM_FINDROOT_PRESENT
148*eb2bd662Svikram } findroot_t;
149*eb2bd662Svikram 
150ae115bc7Smrj extern int bam_verbose;
151ae115bc7Smrj extern int bam_force;
152ae115bc7Smrj extern direct_or_multi_t bam_direct;
153843e1988Sjohnlev extern hv_t bam_is_hv;
154*eb2bd662Svikram extern findroot_t bam_is_findroot;
155*eb2bd662Svikram extern int bam_debug;
156ae115bc7Smrj 
157*eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
158*eb2bd662Svikram extern void update_numbering(menu_t *mp);
159ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
160ae115bc7Smrj extern void *s_calloc(size_t, size_t);
161ae115bc7Smrj extern void *s_realloc(void *, size_t);
162ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
163ae115bc7Smrj extern void bam_error(char *format, ...);
164*eb2bd662Svikram extern void bam_print(char *, ...);
165ae115bc7Smrj extern void bam_print_stderr(char *format, ...);
166*eb2bd662Svikram extern void bam_derror(char *format, ...);
167*eb2bd662Svikram extern error_t get_boot_cap(const char *osroot);
168ae115bc7Smrj extern char *get_special(char *);
169ae115bc7Smrj extern char *os_to_grubdisk(char *, int);
170ae115bc7Smrj extern void update_line(line_t *);
171843e1988Sjohnlev extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *);
172986fd29aSsetje extern int is_grub(const char *);
173*eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev);
174*eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
175*eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root);
176*eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp);
177*eb2bd662Svikram extern void line_free(line_t *lp);
178*eb2bd662Svikram extern char *s_strdup(char *);
179*eb2bd662Svikram extern int is_sparc(void);
180ae115bc7Smrj 
181ae115bc7Smrj #define	BAM_MAXLINE	8192
182ae115bc7Smrj 
183ae115bc7Smrj /* menu.lst comments created by bootadm */
184ae115bc7Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
185ae115bc7Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
186ae115bc7Smrj 
187ae115bc7Smrj /*
188ae115bc7Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
189ae115bc7Smrj  * the comment strings - there will be other text before them.
190ae115bc7Smrj  */
191ae115bc7Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
192ae115bc7Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
193ae115bc7Smrj 
194ae115bc7Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
195ae115bc7Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
196ae115bc7Smrj 
197ae115bc7Smrj /* Title used for failsafe entries */
198ae115bc7Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
199ae115bc7Smrj 
200843e1988Sjohnlev /* Title used for hv entries */
201843e1988Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
202843e1988Sjohnlev 
203e7cbe64fSgw25295 /* ZFS boot option */
204e7cbe64fSgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
205e7cbe64fSgw25295 
206ae115bc7Smrj /* multiboot */
207ae115bc7Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
208ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
209ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
210ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
211ae115bc7Smrj 
212ae115bc7Smrj /* directboot kernels */
213ae115bc7Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
214ae115bc7Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
215ae115bc7Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
216ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_KERNEL	"/boot/platform/i86pc/kernel/unix"
217ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
218e7cbe64fSgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
219e7cbe64fSgw25295 #define	DIRECT_BOOT_FAILSAFE_LINE_ZFS	DIRECT_BOOT_FAILSAFE_LINE " " ZFS_BOOT
220ae115bc7Smrj 
221*eb2bd662Svikram /* xVM kernels */
222*eb2bd662Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
223*eb2bd662Svikram 
224ae115bc7Smrj /* Boot archives */
225d876c67dSjg #define	SUN4U_ARCHIVE		"/platform/sun4u/boot_archive"
226d876c67dSjg #define	SUN4V_ARCHIVE		"/platform/sun4v/boot_archive"
227ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
228ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
229ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
230*eb2bd662Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
231*eb2bd662Svikram #define	FAILSAFE_ARCHIVE	"/boot/x86.miniroot-safe"
232ae115bc7Smrj 
233843e1988Sjohnlev /* Hypervisors */
234843e1988Sjohnlev #define	XEN_32			"/boot/xen.gz"
235843e1988Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
236843e1988Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
237843e1988Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
238*eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
239*eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
240e7cbe64fSgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
241843e1988Sjohnlev 
242*eb2bd662Svikram /* A first guess at the number of entries in a menu */
243*eb2bd662Svikram #define	BAM_ENTRY_NUM		10
244*eb2bd662Svikram 
245*eb2bd662Svikram /*
246*eb2bd662Svikram  * Debugging defines
247*eb2bd662Svikram  */
248*eb2bd662Svikram #define	INJECT_ERROR1(x, y)	\
249*eb2bd662Svikram { \
250*eb2bd662Svikram 	if (bam_debug) { \
251*eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
252*eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
253*eb2bd662Svikram 			y;	\
254*eb2bd662Svikram 		} \
255*eb2bd662Svikram 	} \
256*eb2bd662Svikram }
257*eb2bd662Svikram 
258*eb2bd662Svikram #define	INJECT_ERROR2(x, y, z)	\
259*eb2bd662Svikram { \
260*eb2bd662Svikram 	if (bam_debug) { \
261*eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
262*eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
263*eb2bd662Svikram 			y;	\
264*eb2bd662Svikram 			z;	\
265*eb2bd662Svikram 		} \
266*eb2bd662Svikram 	} \
267*eb2bd662Svikram }
268*eb2bd662Svikram 
269*eb2bd662Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
270*eb2bd662Svikram 
271ae115bc7Smrj #ifdef __cplusplus
272ae115bc7Smrj }
273ae115bc7Smrj #endif
274ae115bc7Smrj 
275ae115bc7Smrj #endif	/* _BOOTADM_H */
276