xref: /titanic_51/usr/src/cmd/boot/bootadm/bootadm.h (revision 66b6aef6578e2ddc6a2c8a3e0482d35fdae62644)
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 /*
2237eb779cSVikram 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,
10244da779fSWilliam Kucharski 	BAM_MSG,	/* Used by upgrade_menu() */
10344da779fSWilliam Kucharski 	BAM_NOCHANGE	/* Used by cvt_to_hyper()/cvt_to_metal() */
104ae115bc7Smrj } error_t;
105ae115bc7Smrj 
106ae115bc7Smrj /*
107ae115bc7Smrj  * Menu related
108ae115bc7Smrj  * menu_cmd_t and menu_cmds must be kept in sync
109843e1988Sjohnlev  *
110843e1988Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
111843e1988Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
112ae115bc7Smrj  */
113ae115bc7Smrj typedef enum {
114ae115bc7Smrj 	DEFAULT_CMD = 0,
115ae115bc7Smrj 	TIMEOUT_CMD,
116ae115bc7Smrj 	TITLE_CMD,
117ae115bc7Smrj 	ROOT_CMD,
118ae115bc7Smrj 	KERNEL_CMD,
119843e1988Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
120ae115bc7Smrj 	MODULE_CMD,
121843e1988Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
122ae115bc7Smrj 	SEP_CMD,
123ae115bc7Smrj 	COMMENT_CMD,
124ae115bc7Smrj 	CHAINLOADER_CMD,
125eb2bd662Svikram 	ARGS_CMD,
12644da779fSWilliam Kucharski 	FINDROOT_CMD,
12744da779fSWilliam Kucharski 	BOOTFS_CMD
128ae115bc7Smrj } menu_cmd_t;
129ae115bc7Smrj 
130ae115bc7Smrj extern char *menu_cmds[];
131ae115bc7Smrj 
132ae115bc7Smrj /* For multi- or direct-boot */
133ae115bc7Smrj typedef enum {
134ae115bc7Smrj 	BAM_DIRECT_NOT_SET,
135ae115bc7Smrj 	BAM_DIRECT_MULTIBOOT,
136ae115bc7Smrj 	BAM_DIRECT_DBOOT
137ae115bc7Smrj } direct_or_multi_t;
138ae115bc7Smrj 
139843e1988Sjohnlev /* Is there a hypervisor present? */
140843e1988Sjohnlev typedef enum {
141843e1988Sjohnlev 	BAM_HV_UNKNOWN,
142843e1988Sjohnlev 	BAM_HV_NO,
143843e1988Sjohnlev 	BAM_HV_PRESENT
144843e1988Sjohnlev } hv_t;
145843e1988Sjohnlev 
146eb2bd662Svikram /* Is there findroot capability present ? */
147eb2bd662Svikram typedef enum {
148eb2bd662Svikram 	BAM_FINDROOT_UNKNOWN,
149eb2bd662Svikram 	BAM_FINDROOT_ABSENT,
150eb2bd662Svikram 	BAM_FINDROOT_PRESENT
151eb2bd662Svikram } findroot_t;
152eb2bd662Svikram 
153ae115bc7Smrj extern int bam_verbose;
154ae115bc7Smrj extern int bam_force;
155ae115bc7Smrj extern direct_or_multi_t bam_direct;
156843e1988Sjohnlev extern hv_t bam_is_hv;
157eb2bd662Svikram extern findroot_t bam_is_findroot;
158eb2bd662Svikram extern int bam_debug;
159ae115bc7Smrj 
160eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
161eb2bd662Svikram extern void update_numbering(menu_t *mp);
16244da779fSWilliam Kucharski extern error_t set_global(menu_t *, char *, int);
163ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
16444da779fSWilliam Kucharski extern error_t cvt_to_hyper(menu_t *, char *, char *);
16544da779fSWilliam Kucharski extern error_t cvt_to_metal(menu_t *, char *, char *);
166ae115bc7Smrj extern void *s_calloc(size_t, size_t);
167ae115bc7Smrj extern void *s_realloc(void *, size_t);
168ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
169ae115bc7Smrj extern void bam_error(char *format, ...);
170*66b6aef6SWilliam Kucharski extern void bam_exit(int);
171eb2bd662Svikram extern void bam_print(char *, ...);
172ae115bc7Smrj extern void bam_print_stderr(char *format, ...);
173eb2bd662Svikram extern void bam_derror(char *format, ...);
174eb2bd662Svikram extern error_t get_boot_cap(const char *osroot);
175ae115bc7Smrj extern char *get_special(char *);
176ae115bc7Smrj extern char *os_to_grubdisk(char *, int);
177ae115bc7Smrj extern void update_line(line_t *);
17844da779fSWilliam Kucharski extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *,
17944da779fSWilliam Kucharski     char *);
18044da779fSWilliam Kucharski extern error_t delete_boot_entry(menu_t *, int, int);
181986fd29aSsetje extern int is_grub(const char *);
182eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev);
183eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
184eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root);
185eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp);
186eb2bd662Svikram extern void line_free(line_t *lp);
187eb2bd662Svikram extern char *s_strdup(char *);
188eb2bd662Svikram extern int is_sparc(void);
189ae115bc7Smrj 
190ae115bc7Smrj #define	BAM_MAXLINE	8192
191ae115bc7Smrj 
192ae115bc7Smrj /* menu.lst comments created by bootadm */
193ae115bc7Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
194ae115bc7Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
195ae115bc7Smrj 
196ae115bc7Smrj /*
197ae115bc7Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
198ae115bc7Smrj  * the comment strings - there will be other text before them.
199ae115bc7Smrj  */
200ae115bc7Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
201ae115bc7Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
202ae115bc7Smrj 
203ae115bc7Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
204ae115bc7Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
205ae115bc7Smrj 
206ae115bc7Smrj /* Title used for failsafe entries */
207ae115bc7Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
208ae115bc7Smrj 
209843e1988Sjohnlev /* Title used for hv entries */
210843e1988Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
211843e1988Sjohnlev 
212e7cbe64fSgw25295 /* ZFS boot option */
213e7cbe64fSgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
214e7cbe64fSgw25295 
215ae115bc7Smrj /* multiboot */
216ae115bc7Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
217ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
218ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
219ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
220ae115bc7Smrj 
221ae115bc7Smrj /* directboot kernels */
222ae115bc7Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
223ae115bc7Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
224ae115bc7Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
225bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_32	"/boot/platform/i86pc/kernel/unix"
226bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_64	"/boot/platform/i86pc/kernel/amd64/unix"
227bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_KERNEL \
228bbcc54bdSEnrico Perla - Sun Microsystems 	"/boot/platform/i86pc/kernel/$ISADIR/unix"
229ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
230e7cbe64fSgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
23137eb779cSVikram Hegde #define	DIRECT_BOOT_PREFIX	"/platform/i86pc/"
23237eb779cSVikram Hegde #define	KERNEL_PREFIX	"/platform/i86pc/"
23337eb779cSVikram Hegde #define	AMD_UNIX_SPACE	"/amd64/unix "
23437eb779cSVikram Hegde #define	UNIX_SPACE	"/unix "
235ae115bc7Smrj 
236eb2bd662Svikram /* xVM kernels */
237eb2bd662Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
238eb2bd662Svikram 
239ae115bc7Smrj /* Boot archives */
24079755401Ssetje #define	ARCHIVE_PREFIX		"/platform/"
24179755401Ssetje #define	ARCHIVE_SUFFIX		"/boot_archive"
24248847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_SUFFIX		"/archive_cache"
24348847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_SUFFIX	"/updates"
244ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
245ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
246ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
247eb2bd662Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
248bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE	"/boot/$ISADIR/x86.miniroot-safe"
249bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_32	"/boot/x86.miniroot-safe"
250bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_64	"/boot/amd64/x86.miniroot-safe"
25148847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_32		"/platform/i86pc/archive_cache"
25248847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_64		"/platform/i86pc/amd64/archive_cache"
25348847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_32		"/platform/i86pc/updates"
25448847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_64		"/platform/i86pc/amd64/updates"
255ae115bc7Smrj 
256843e1988Sjohnlev /* Hypervisors */
257843e1988Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
258843e1988Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
259843e1988Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
260eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
261eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
262e7cbe64fSgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
263843e1988Sjohnlev 
26448847494SEnrico Perla - Sun Microsystems /* Helpers */
265cedc7e57SEnrico Perla - Sun Microsystems #define	MKISOFS_PATH		"/usr/bin/mkisofs"
26648847494SEnrico Perla - Sun Microsystems #define	DD_PATH_USR		"/usr/bin/dd"
267cedc7e57SEnrico Perla - Sun Microsystems #define	LOCKFS_PATH		"/usr/sbin/lockfs"
26848847494SEnrico Perla - Sun Microsystems 
269eb2bd662Svikram /* A first guess at the number of entries in a menu */
270eb2bd662Svikram #define	BAM_ENTRY_NUM		10
271eb2bd662Svikram 
27244da779fSWilliam Kucharski /* toggle for whether delete_boot_entry prints an error message or not */
27344da779fSWilliam Kucharski #define	DBE_PRINTERR		0
27444da779fSWilliam Kucharski #define	DBE_QUIET		1
27544da779fSWilliam Kucharski 
276eb2bd662Svikram /*
277eb2bd662Svikram  * Debugging defines
278eb2bd662Svikram  */
279eb2bd662Svikram #define	INJECT_ERROR1(x, y)	\
280eb2bd662Svikram { \
281eb2bd662Svikram 	if (bam_debug) { \
282eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
283eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
284eb2bd662Svikram 			y;	\
285eb2bd662Svikram 		} \
286eb2bd662Svikram 	} \
287eb2bd662Svikram }
288eb2bd662Svikram 
289eb2bd662Svikram #define	INJECT_ERROR2(x, y, z)	\
290eb2bd662Svikram { \
291eb2bd662Svikram 	if (bam_debug) { \
292eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
293eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
294eb2bd662Svikram 			y;	\
295eb2bd662Svikram 			z;	\
296eb2bd662Svikram 		} \
297eb2bd662Svikram 	} \
298eb2bd662Svikram }
299eb2bd662Svikram 
300eb2bd662Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
301eb2bd662Svikram 
302ae115bc7Smrj #ifdef __cplusplus
303ae115bc7Smrj }
304ae115bc7Smrj #endif
305ae115bc7Smrj 
306ae115bc7Smrj #endif	/* _BOOTADM_H */
307