xref: /titanic_44/usr/src/cmd/boot/bootadm/bootadm.h (revision 772d6a58e8b646d197debb720cdea7723d5892d8)
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 
89*772d6a58SWilliam Kucharski #define	BAM_ENTRY_LIBBE		0x2000	/* entry created by libbe */
90*772d6a58SWilliam Kucharski 
91ae115bc7Smrj typedef struct {
92ae115bc7Smrj 	line_t	*start;
93ae115bc7Smrj 	line_t	*end;
94ae115bc7Smrj 	line_t	*curdefault;	/* line containing default */
95ae115bc7Smrj 	line_t	*olddefault;	/* old default line (commented) */
96ae115bc7Smrj 	line_t	*old_rc_default;	/* old default line for bootenv.rc */
97ae115bc7Smrj 	entry_t	*entries;	/* os entries */
98ae115bc7Smrj } menu_t;
99ae115bc7Smrj 
100ae115bc7Smrj typedef enum {
101ae115bc7Smrj 	BAM_ERROR = -1,	/* Must be negative. add_boot_entry() depends on it */
102ae115bc7Smrj 	BAM_SUCCESS = 0,
103ae115bc7Smrj 	BAM_WRITE = 2,
10444da779fSWilliam Kucharski 	BAM_MSG,	/* Used by upgrade_menu() */
10544da779fSWilliam Kucharski 	BAM_NOCHANGE	/* Used by cvt_to_hyper()/cvt_to_metal() */
106ae115bc7Smrj } error_t;
107ae115bc7Smrj 
108ae115bc7Smrj /*
109ae115bc7Smrj  * Menu related
110ae115bc7Smrj  * menu_cmd_t and menu_cmds must be kept in sync
111843e1988Sjohnlev  *
112843e1988Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
113843e1988Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
114ae115bc7Smrj  */
115ae115bc7Smrj typedef enum {
116ae115bc7Smrj 	DEFAULT_CMD = 0,
117ae115bc7Smrj 	TIMEOUT_CMD,
118ae115bc7Smrj 	TITLE_CMD,
119ae115bc7Smrj 	ROOT_CMD,
120ae115bc7Smrj 	KERNEL_CMD,
121843e1988Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
122ae115bc7Smrj 	MODULE_CMD,
123843e1988Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
124ae115bc7Smrj 	SEP_CMD,
125ae115bc7Smrj 	COMMENT_CMD,
126ae115bc7Smrj 	CHAINLOADER_CMD,
127eb2bd662Svikram 	ARGS_CMD,
12844da779fSWilliam Kucharski 	FINDROOT_CMD,
12944da779fSWilliam Kucharski 	BOOTFS_CMD
130ae115bc7Smrj } menu_cmd_t;
131ae115bc7Smrj 
132ae115bc7Smrj extern char *menu_cmds[];
133ae115bc7Smrj 
134ae115bc7Smrj /* For multi- or direct-boot */
135ae115bc7Smrj typedef enum {
136ae115bc7Smrj 	BAM_DIRECT_NOT_SET,
137ae115bc7Smrj 	BAM_DIRECT_MULTIBOOT,
138ae115bc7Smrj 	BAM_DIRECT_DBOOT
139ae115bc7Smrj } direct_or_multi_t;
140ae115bc7Smrj 
141843e1988Sjohnlev /* Is there a hypervisor present? */
142843e1988Sjohnlev typedef enum {
143843e1988Sjohnlev 	BAM_HV_UNKNOWN,
144843e1988Sjohnlev 	BAM_HV_NO,
145843e1988Sjohnlev 	BAM_HV_PRESENT
146843e1988Sjohnlev } hv_t;
147843e1988Sjohnlev 
148eb2bd662Svikram /* Is there findroot capability present ? */
149eb2bd662Svikram typedef enum {
150eb2bd662Svikram 	BAM_FINDROOT_UNKNOWN,
151eb2bd662Svikram 	BAM_FINDROOT_ABSENT,
152eb2bd662Svikram 	BAM_FINDROOT_PRESENT
153eb2bd662Svikram } findroot_t;
154eb2bd662Svikram 
155ae115bc7Smrj extern int bam_verbose;
156ae115bc7Smrj extern int bam_force;
157ae115bc7Smrj extern direct_or_multi_t bam_direct;
158843e1988Sjohnlev extern hv_t bam_is_hv;
159eb2bd662Svikram extern findroot_t bam_is_findroot;
160eb2bd662Svikram extern int bam_debug;
161ae115bc7Smrj 
162eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
163eb2bd662Svikram extern void update_numbering(menu_t *mp);
16444da779fSWilliam Kucharski extern error_t set_global(menu_t *, char *, int);
165ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
16644da779fSWilliam Kucharski extern error_t cvt_to_hyper(menu_t *, char *, char *);
16744da779fSWilliam Kucharski extern error_t cvt_to_metal(menu_t *, char *, char *);
168ae115bc7Smrj extern void *s_calloc(size_t, size_t);
169ae115bc7Smrj extern void *s_realloc(void *, size_t);
170ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
171ae115bc7Smrj extern void bam_error(char *format, ...);
17266b6aef6SWilliam Kucharski extern void bam_exit(int);
173eb2bd662Svikram extern void bam_print(char *, ...);
174ae115bc7Smrj extern void bam_print_stderr(char *format, ...);
175eb2bd662Svikram extern void bam_derror(char *format, ...);
176eb2bd662Svikram extern error_t get_boot_cap(const char *osroot);
177ae115bc7Smrj extern char *get_special(char *);
178ae115bc7Smrj extern char *os_to_grubdisk(char *, int);
179ae115bc7Smrj extern void update_line(line_t *);
18044da779fSWilliam Kucharski extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *,
18144da779fSWilliam Kucharski     char *);
18244da779fSWilliam Kucharski extern error_t delete_boot_entry(menu_t *, int, int);
183986fd29aSsetje extern int is_grub(const char *);
184eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev);
185eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
186eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root);
187eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp);
188eb2bd662Svikram extern void line_free(line_t *lp);
189eb2bd662Svikram extern char *s_strdup(char *);
190eb2bd662Svikram extern int is_sparc(void);
191ae115bc7Smrj 
192ae115bc7Smrj #define	BAM_MAXLINE	8192
193ae115bc7Smrj 
194ae115bc7Smrj /* menu.lst comments created by bootadm */
195ae115bc7Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
196ae115bc7Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
197ae115bc7Smrj 
198ae115bc7Smrj /*
199ae115bc7Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
200ae115bc7Smrj  * the comment strings - there will be other text before them.
201ae115bc7Smrj  */
202ae115bc7Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
203ae115bc7Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
204ae115bc7Smrj 
205ae115bc7Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
206ae115bc7Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
207ae115bc7Smrj 
208*772d6a58SWilliam Kucharski /*
209*772d6a58SWilliam Kucharski  * menu.lst comment created by libbe
210*772d6a58SWilliam Kucharski  */
211*772d6a58SWilliam Kucharski #define	BAM_LIBBE_FTR	"============ End of LIBBE entry ============="
212*772d6a58SWilliam Kucharski 
213ae115bc7Smrj /* Title used for failsafe entries */
214ae115bc7Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
215ae115bc7Smrj 
216843e1988Sjohnlev /* Title used for hv entries */
217843e1988Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
218843e1988Sjohnlev 
219e7cbe64fSgw25295 /* ZFS boot option */
220e7cbe64fSgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
221e7cbe64fSgw25295 
222ae115bc7Smrj /* multiboot */
223ae115bc7Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
224ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
225ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
226ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
227ae115bc7Smrj 
228ae115bc7Smrj /* directboot kernels */
229ae115bc7Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
230ae115bc7Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
231ae115bc7Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
232bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_32	"/boot/platform/i86pc/kernel/unix"
233bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_64	"/boot/platform/i86pc/kernel/amd64/unix"
234bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_KERNEL \
235bbcc54bdSEnrico Perla - Sun Microsystems 	"/boot/platform/i86pc/kernel/$ISADIR/unix"
236ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
237e7cbe64fSgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
23837eb779cSVikram Hegde #define	DIRECT_BOOT_PREFIX	"/platform/i86pc/"
23937eb779cSVikram Hegde #define	KERNEL_PREFIX	"/platform/i86pc/"
24037eb779cSVikram Hegde #define	AMD_UNIX_SPACE	"/amd64/unix "
24137eb779cSVikram Hegde #define	UNIX_SPACE	"/unix "
242ae115bc7Smrj 
243eb2bd662Svikram /* xVM kernels */
244eb2bd662Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
245eb2bd662Svikram 
246ae115bc7Smrj /* Boot archives */
24779755401Ssetje #define	ARCHIVE_PREFIX		"/platform/"
24879755401Ssetje #define	ARCHIVE_SUFFIX		"/boot_archive"
24948847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_SUFFIX		"/archive_cache"
25048847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_SUFFIX	"/updates"
251ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
252ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
253ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
254eb2bd662Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
255bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE	"/boot/$ISADIR/x86.miniroot-safe"
256bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_32	"/boot/x86.miniroot-safe"
257bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_64	"/boot/amd64/x86.miniroot-safe"
25848847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_32		"/platform/i86pc/archive_cache"
25948847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_64		"/platform/i86pc/amd64/archive_cache"
26048847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_32		"/platform/i86pc/updates"
26148847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_64		"/platform/i86pc/amd64/updates"
262ae115bc7Smrj 
263843e1988Sjohnlev /* Hypervisors */
264843e1988Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
265843e1988Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
266843e1988Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
267eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
268eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
269e7cbe64fSgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
270843e1988Sjohnlev 
27148847494SEnrico Perla - Sun Microsystems /* Helpers */
272cedc7e57SEnrico Perla - Sun Microsystems #define	MKISOFS_PATH		"/usr/bin/mkisofs"
27348847494SEnrico Perla - Sun Microsystems #define	DD_PATH_USR		"/usr/bin/dd"
274cedc7e57SEnrico Perla - Sun Microsystems #define	LOCKFS_PATH		"/usr/sbin/lockfs"
27548847494SEnrico Perla - Sun Microsystems 
276eb2bd662Svikram /* A first guess at the number of entries in a menu */
277eb2bd662Svikram #define	BAM_ENTRY_NUM		10
278eb2bd662Svikram 
27944da779fSWilliam Kucharski /* toggle for whether delete_boot_entry prints an error message or not */
28044da779fSWilliam Kucharski #define	DBE_PRINTERR		0
28144da779fSWilliam Kucharski #define	DBE_QUIET		1
28244da779fSWilliam Kucharski 
283eb2bd662Svikram /*
284eb2bd662Svikram  * Debugging defines
285eb2bd662Svikram  */
286eb2bd662Svikram #define	INJECT_ERROR1(x, y)	\
287eb2bd662Svikram { \
288eb2bd662Svikram 	if (bam_debug) { \
289eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
290eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
291eb2bd662Svikram 			y;	\
292eb2bd662Svikram 		} \
293eb2bd662Svikram 	} \
294eb2bd662Svikram }
295eb2bd662Svikram 
296eb2bd662Svikram #define	INJECT_ERROR2(x, y, z)	\
297eb2bd662Svikram { \
298eb2bd662Svikram 	if (bam_debug) { \
299eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
300eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
301eb2bd662Svikram 			y;	\
302eb2bd662Svikram 			z;	\
303eb2bd662Svikram 		} \
304eb2bd662Svikram 	} \
305eb2bd662Svikram }
306eb2bd662Svikram 
307eb2bd662Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
308eb2bd662Svikram 
309ae115bc7Smrj #ifdef __cplusplus
310ae115bc7Smrj }
311ae115bc7Smrj #endif
312ae115bc7Smrj 
313ae115bc7Smrj #endif	/* _BOOTADM_H */
314