xref: /titanic_51/usr/src/cmd/boot/bootadm/bootadm.h (revision eeb2c267081a273494b3e0a5831f0a0990af432b)
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.
24*eeb2c267SToomas Soome  *
25*eeb2c267SToomas Soome  * Copyright 2016 Toomas Soome <tsoome@me.com>.
26ae115bc7Smrj  */
27ae115bc7Smrj 
28ae115bc7Smrj #ifndef _BOOTADM_H
29ae115bc7Smrj #define	_BOOTADM_H
30ae115bc7Smrj 
31ae115bc7Smrj #ifdef	__cplusplus
32ae115bc7Smrj extern "C" {
33ae115bc7Smrj #endif
34ae115bc7Smrj 
35eb2bd662Svikram #include <assert.h>
36eb2bd662Svikram 
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;
72eb2bd662Svikram 	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 */
80eb2bd662Svikram #define	BAM_ENTRY_FAILSAFE	0x10	/* failsafe entry  */
81eb2bd662Svikram #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 */
84eb2bd662Svikram #define	BAM_ENTRY_FINDROOT	0x100	/* entry has a findroot line */
85eb2bd662Svikram #define	BAM_ENTRY_MULTIBOOT	0x200	/* is multiboot (normal or failsafe) */
86eb2bd662Svikram #define	BAM_ENTRY_64BIT		0x400	/* Is a 64-bit entry */
87ae115bc7Smrj 
88bbcc54bdSEnrico Perla - Sun Microsystems #define	BAM_ENTRY_UPGFSKERNEL	0x800	/* Upgrade failsafe kernel entry */
89bbcc54bdSEnrico Perla - Sun Microsystems #define	BAM_ENTRY_UPGFSMODULE	0x1000  /* Upgrade failsafe module entry */
90bbcc54bdSEnrico Perla - Sun Microsystems 
91772d6a58SWilliam Kucharski #define	BAM_ENTRY_LIBBE		0x2000	/* entry created by libbe */
92772d6a58SWilliam Kucharski 
93ae115bc7Smrj typedef struct {
94ae115bc7Smrj 	line_t	*start;
95ae115bc7Smrj 	line_t	*end;
96ae115bc7Smrj 	line_t	*curdefault;	/* line containing default */
97ae115bc7Smrj 	line_t	*olddefault;	/* old default line (commented) */
98ae115bc7Smrj 	line_t	*old_rc_default;	/* old default line for bootenv.rc */
99ae115bc7Smrj 	entry_t	*entries;	/* os entries */
100ae115bc7Smrj } menu_t;
101ae115bc7Smrj 
102ae115bc7Smrj typedef enum {
103ae115bc7Smrj 	BAM_ERROR = -1,	/* Must be negative. add_boot_entry() depends on it */
104ae115bc7Smrj 	BAM_SUCCESS = 0,
105ae115bc7Smrj 	BAM_WRITE = 2,
10644da779fSWilliam Kucharski 	BAM_MSG,	/* Used by upgrade_menu() */
10744da779fSWilliam Kucharski 	BAM_NOCHANGE	/* Used by cvt_to_hyper()/cvt_to_metal() */
108ae115bc7Smrj } error_t;
109ae115bc7Smrj 
110ae115bc7Smrj /*
111ae115bc7Smrj  * Menu related
112ae115bc7Smrj  * menu_cmd_t and menu_cmds must be kept in sync
113843e1988Sjohnlev  *
114843e1988Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
115843e1988Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
116ae115bc7Smrj  */
117ae115bc7Smrj typedef enum {
118ae115bc7Smrj 	DEFAULT_CMD = 0,
119ae115bc7Smrj 	TIMEOUT_CMD,
120ae115bc7Smrj 	TITLE_CMD,
121ae115bc7Smrj 	ROOT_CMD,
122ae115bc7Smrj 	KERNEL_CMD,
123843e1988Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
124ae115bc7Smrj 	MODULE_CMD,
125843e1988Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
126ae115bc7Smrj 	SEP_CMD,
127ae115bc7Smrj 	COMMENT_CMD,
128ae115bc7Smrj 	CHAINLOADER_CMD,
129eb2bd662Svikram 	ARGS_CMD,
13044da779fSWilliam Kucharski 	FINDROOT_CMD,
13144da779fSWilliam Kucharski 	BOOTFS_CMD
132ae115bc7Smrj } menu_cmd_t;
133ae115bc7Smrj 
134ae115bc7Smrj extern char *menu_cmds[];
135ae115bc7Smrj 
136ae115bc7Smrj /* For multi- or direct-boot */
137ae115bc7Smrj typedef enum {
138ae115bc7Smrj 	BAM_DIRECT_NOT_SET,
139ae115bc7Smrj 	BAM_DIRECT_MULTIBOOT,
140ae115bc7Smrj 	BAM_DIRECT_DBOOT
141ae115bc7Smrj } direct_or_multi_t;
142ae115bc7Smrj 
143843e1988Sjohnlev /* Is there a hypervisor present? */
144843e1988Sjohnlev typedef enum {
145843e1988Sjohnlev 	BAM_HV_UNKNOWN,
146843e1988Sjohnlev 	BAM_HV_NO,
147843e1988Sjohnlev 	BAM_HV_PRESENT
148843e1988Sjohnlev } hv_t;
149843e1988Sjohnlev 
150eb2bd662Svikram /* Is there findroot capability present ? */
151eb2bd662Svikram typedef enum {
152eb2bd662Svikram 	BAM_FINDROOT_UNKNOWN,
153eb2bd662Svikram 	BAM_FINDROOT_ABSENT,
154eb2bd662Svikram 	BAM_FINDROOT_PRESENT
155eb2bd662Svikram } findroot_t;
156eb2bd662Svikram 
157ae115bc7Smrj extern int bam_verbose;
158ae115bc7Smrj extern int bam_force;
159ae115bc7Smrj extern direct_or_multi_t bam_direct;
160843e1988Sjohnlev extern hv_t bam_is_hv;
161eb2bd662Svikram extern findroot_t bam_is_findroot;
162eb2bd662Svikram extern int bam_debug;
163ae115bc7Smrj 
164eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
165eb2bd662Svikram extern void update_numbering(menu_t *mp);
16644da779fSWilliam Kucharski extern error_t set_global(menu_t *, char *, int);
167ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
16844da779fSWilliam Kucharski extern error_t cvt_to_hyper(menu_t *, char *, char *);
16944da779fSWilliam Kucharski extern error_t cvt_to_metal(menu_t *, char *, char *);
170ae115bc7Smrj extern void *s_calloc(size_t, size_t);
171ae115bc7Smrj extern void *s_realloc(void *, size_t);
172ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
173ae115bc7Smrj extern void bam_error(char *format, ...);
17466b6aef6SWilliam Kucharski extern void bam_exit(int);
175eb2bd662Svikram extern void bam_print(char *, ...);
176ae115bc7Smrj extern void bam_print_stderr(char *format, ...);
177eb2bd662Svikram extern void bam_derror(char *format, ...);
178eb2bd662Svikram extern error_t get_boot_cap(const char *osroot);
179ae115bc7Smrj extern char *get_special(char *);
180ae115bc7Smrj extern char *os_to_grubdisk(char *, int);
181ae115bc7Smrj extern void update_line(line_t *);
18244da779fSWilliam Kucharski extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *,
18344da779fSWilliam Kucharski     char *);
18444da779fSWilliam Kucharski extern error_t delete_boot_entry(menu_t *, int, int);
185986fd29aSsetje extern int is_grub(const char *);
186eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev);
187eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
188eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root);
189eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp);
190eb2bd662Svikram extern void line_free(line_t *lp);
191eb2bd662Svikram extern char *s_strdup(char *);
192eb2bd662Svikram extern int is_sparc(void);
193*eeb2c267SToomas Soome extern int bootadm_digest(const char *, char **);
194ae115bc7Smrj 
195ae115bc7Smrj #define	BAM_MAXLINE	8192
196ae115bc7Smrj 
197ae115bc7Smrj /* menu.lst comments created by bootadm */
198ae115bc7Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
199ae115bc7Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
200ae115bc7Smrj 
201ae115bc7Smrj /*
202ae115bc7Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
203ae115bc7Smrj  * the comment strings - there will be other text before them.
204ae115bc7Smrj  */
205ae115bc7Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
206ae115bc7Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
207ae115bc7Smrj 
208ae115bc7Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
209ae115bc7Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
210ae115bc7Smrj 
211772d6a58SWilliam Kucharski /*
212772d6a58SWilliam Kucharski  * menu.lst comment created by libbe
213772d6a58SWilliam Kucharski  */
214772d6a58SWilliam Kucharski #define	BAM_LIBBE_FTR	"============ End of LIBBE entry ============="
215772d6a58SWilliam Kucharski 
216ae115bc7Smrj /* Title used for failsafe entries */
217ae115bc7Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
218ae115bc7Smrj 
219843e1988Sjohnlev /* Title used for hv entries */
220843e1988Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
221843e1988Sjohnlev 
222e7cbe64fSgw25295 /* ZFS boot option */
223e7cbe64fSgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
224e7cbe64fSgw25295 
225ae115bc7Smrj /* multiboot */
226ae115bc7Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
227ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
228ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
229ae115bc7Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
230ae115bc7Smrj 
231ae115bc7Smrj /* directboot kernels */
232ae115bc7Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
233ae115bc7Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
234ae115bc7Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
235bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_32	"/boot/platform/i86pc/kernel/unix"
236bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_64	"/boot/platform/i86pc/kernel/amd64/unix"
237bbcc54bdSEnrico Perla - Sun Microsystems #define	DIRECT_BOOT_FAILSAFE_KERNEL \
238bbcc54bdSEnrico Perla - Sun Microsystems 	"/boot/platform/i86pc/kernel/$ISADIR/unix"
239ae115bc7Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
240e7cbe64fSgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
24137eb779cSVikram Hegde #define	DIRECT_BOOT_PREFIX	"/platform/i86pc/"
24237eb779cSVikram Hegde #define	KERNEL_PREFIX	"/platform/i86pc/"
24337eb779cSVikram Hegde #define	AMD_UNIX_SPACE	"/amd64/unix "
24437eb779cSVikram Hegde #define	UNIX_SPACE	"/unix "
245ae115bc7Smrj 
246eb2bd662Svikram /* xVM kernels */
247eb2bd662Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
248eb2bd662Svikram 
249ae115bc7Smrj /* Boot archives */
25079755401Ssetje #define	ARCHIVE_PREFIX		"/platform/"
25179755401Ssetje #define	ARCHIVE_SUFFIX		"/boot_archive"
25248847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_SUFFIX		"/archive_cache"
25348847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_SUFFIX	"/updates"
254ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
255ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
256ae115bc7Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
257eb2bd662Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
258bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE	"/boot/$ISADIR/x86.miniroot-safe"
259bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_32	"/boot/x86.miniroot-safe"
260bbcc54bdSEnrico Perla - Sun Microsystems #define	FAILSAFE_ARCHIVE_64	"/boot/amd64/x86.miniroot-safe"
26148847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_32		"/platform/i86pc/archive_cache"
26248847494SEnrico Perla - Sun Microsystems #define	CACHEDIR_64		"/platform/i86pc/amd64/archive_cache"
26348847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_32		"/platform/i86pc/updates"
26448847494SEnrico Perla - Sun Microsystems #define	UPDATEDIR_64		"/platform/i86pc/amd64/updates"
265ae115bc7Smrj 
266843e1988Sjohnlev /* Hypervisors */
267843e1988Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
268843e1988Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
269843e1988Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
270eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
271eb2bd662Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
272e7cbe64fSgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
273843e1988Sjohnlev 
27448847494SEnrico Perla - Sun Microsystems /* Helpers */
275cedc7e57SEnrico Perla - Sun Microsystems #define	MKISOFS_PATH		"/usr/bin/mkisofs"
27648847494SEnrico Perla - Sun Microsystems #define	DD_PATH_USR		"/usr/bin/dd"
277cedc7e57SEnrico Perla - Sun Microsystems #define	LOCKFS_PATH		"/usr/sbin/lockfs"
27848847494SEnrico Perla - Sun Microsystems 
279eb2bd662Svikram /* A first guess at the number of entries in a menu */
280eb2bd662Svikram #define	BAM_ENTRY_NUM		10
281eb2bd662Svikram 
28244da779fSWilliam Kucharski /* toggle for whether delete_boot_entry prints an error message or not */
28344da779fSWilliam Kucharski #define	DBE_PRINTERR		0
28444da779fSWilliam Kucharski #define	DBE_QUIET		1
28544da779fSWilliam Kucharski 
286eb2bd662Svikram /*
287eb2bd662Svikram  * Debugging defines
288eb2bd662Svikram  */
289eb2bd662Svikram #define	INJECT_ERROR1(x, y)	\
290eb2bd662Svikram { \
291eb2bd662Svikram 	if (bam_debug) { \
292eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
293eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
294eb2bd662Svikram 			y;	\
295eb2bd662Svikram 		} \
296eb2bd662Svikram 	} \
297eb2bd662Svikram }
298eb2bd662Svikram 
299eb2bd662Svikram #define	INJECT_ERROR2(x, y, z)	\
300eb2bd662Svikram { \
301eb2bd662Svikram 	if (bam_debug) { \
302eb2bd662Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
303eb2bd662Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
304eb2bd662Svikram 			y;	\
305eb2bd662Svikram 			z;	\
306eb2bd662Svikram 		} \
307eb2bd662Svikram 	} \
308eb2bd662Svikram }
309eb2bd662Svikram 
310eb2bd662Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
311eb2bd662Svikram 
312ae115bc7Smrj #ifdef __cplusplus
313ae115bc7Smrj }
314ae115bc7Smrj #endif
315ae115bc7Smrj 
316ae115bc7Smrj #endif	/* _BOOTADM_H */
317