xref: /onnv-gate/usr/src/cmd/boot/bootadm/bootadm.h (revision 10989:47a08e52035f)
13446Smrj /*
23446Smrj  * CDDL HEADER START
33446Smrj  *
43446Smrj  * The contents of this file are subject to the terms of the
53446Smrj  * Common Development and Distribution License (the "License").
63446Smrj  * You may not use this file except in compliance with the License.
73446Smrj  *
83446Smrj  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93446Smrj  * or http://www.opensolaris.org/os/licensing.
103446Smrj  * See the License for the specific language governing permissions
113446Smrj  * and limitations under the License.
123446Smrj  *
133446Smrj  * When distributing Covered Code, include this CDDL HEADER in each
143446Smrj  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153446Smrj  * If applicable, add the following below this CDDL HEADER, with the
163446Smrj  * fields enclosed by brackets "[]" replaced with your own identifying
173446Smrj  * information: Portions Copyright [yyyy] [name of copyright owner]
183446Smrj  *
193446Smrj  * CDDL HEADER END
203446Smrj  */
213446Smrj /*
228642SVikram.Hegde@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
233446Smrj  * Use is subject to license terms.
243446Smrj  */
253446Smrj 
263446Smrj #ifndef _BOOTADM_H
273446Smrj #define	_BOOTADM_H
283446Smrj 
293446Smrj #ifdef	__cplusplus
303446Smrj extern "C" {
313446Smrj #endif
323446Smrj 
336448Svikram #include <assert.h>
346448Svikram 
353446Smrj #ifndef	TEXT_DOMAIN
363446Smrj #define	TEXT_DOMAIN	"SUNW_OST_OSCMD"
373446Smrj #endif  /* TEXT_DOMAIN */
383446Smrj 
393446Smrj /* Type definitions */
403446Smrj 
413446Smrj /* GRUB menu per-line classification */
423446Smrj typedef enum {
433446Smrj 	BAM_INVALID = 0,
443446Smrj 	BAM_EMPTY,
453446Smrj 	BAM_COMMENT,
463446Smrj 	BAM_GLOBAL,
473446Smrj 	BAM_ENTRY,
483446Smrj 	BAM_TITLE
493446Smrj } menu_flag_t;
503446Smrj 
513446Smrj /* struct for menu.lst contents */
523446Smrj typedef struct line {
533446Smrj 	int  lineNum;	/* Line number in menu.lst */
543446Smrj 	int  entryNum;	/* menu boot entry #. ENTRY_INIT if not applicable */
553446Smrj 	char *cmd;
563446Smrj 	char *sep;
573446Smrj 	char *arg;
583446Smrj 	char *line;
593446Smrj 	menu_flag_t flags;
603446Smrj 	struct line *next;
613446Smrj 	struct line *prev;
623446Smrj } line_t;
633446Smrj 
643446Smrj typedef struct entry {
653446Smrj 	struct entry *next;
663446Smrj 	struct entry *prev;
673446Smrj 	line_t *start;
683446Smrj 	line_t *end;
693446Smrj 	int	entryNum;
706448Svikram 	uint_t	flags;
713446Smrj } entry_t;
723446Smrj 
733446Smrj /* For flags value in entry_t */
743446Smrj #define	BAM_ENTRY_BOOTADM	0x01	/* entry created by bootadm */
753446Smrj #define	BAM_ENTRY_LU		0x02	/* entry created by Live Upgrade */
763446Smrj #define	BAM_ENTRY_CHAINLOADER	0x04	/* chainloader entry; do not disturb */
773446Smrj #define	BAM_ENTRY_ROOT		0x08	/* entry has a root line */
786448Svikram #define	BAM_ENTRY_FAILSAFE	0x10	/* failsafe entry  */
796448Svikram #define	BAM_ENTRY_DBOOT		0x20	/* Is dboot (normal or failsafe) */
803446Smrj #define	BAM_ENTRY_32BIT		0x40	/* Is a 32-bit entry */
815084Sjohnlev #define	BAM_ENTRY_HV		0x80	/* Is a hypervisor entry */
826448Svikram #define	BAM_ENTRY_FINDROOT	0x100	/* entry has a findroot line */
836448Svikram #define	BAM_ENTRY_MULTIBOOT	0x200	/* is multiboot (normal or failsafe) */
846448Svikram #define	BAM_ENTRY_64BIT		0x400	/* Is a 64-bit entry */
853446Smrj 
868104SEnrico.Perla@Sun.COM #define	BAM_ENTRY_UPGFSKERNEL	0x800	/* Upgrade failsafe kernel entry */
878104SEnrico.Perla@Sun.COM #define	BAM_ENTRY_UPGFSMODULE	0x1000  /* Upgrade failsafe module entry */
888104SEnrico.Perla@Sun.COM 
89*10989SWilliam.Kucharski@Sun.COM #define	BAM_ENTRY_LIBBE		0x2000	/* entry created by libbe */
90*10989SWilliam.Kucharski@Sun.COM 
913446Smrj typedef struct {
923446Smrj 	line_t	*start;
933446Smrj 	line_t	*end;
943446Smrj 	line_t	*curdefault;	/* line containing default */
953446Smrj 	line_t	*olddefault;	/* old default line (commented) */
963446Smrj 	line_t	*old_rc_default;	/* old default line for bootenv.rc */
973446Smrj 	entry_t	*entries;	/* os entries */
983446Smrj } menu_t;
993446Smrj 
1003446Smrj typedef enum {
1013446Smrj 	BAM_ERROR = -1,	/* Must be negative. add_boot_entry() depends on it */
1023446Smrj 	BAM_SUCCESS = 0,
1033446Smrj 	BAM_WRITE = 2,
10410499SWilliam.Kucharski@Sun.COM 	BAM_MSG,	/* Used by upgrade_menu() */
10510499SWilliam.Kucharski@Sun.COM 	BAM_NOCHANGE	/* Used by cvt_to_hyper()/cvt_to_metal() */
1063446Smrj } error_t;
1073446Smrj 
1083446Smrj /*
1093446Smrj  * Menu related
1103446Smrj  * menu_cmd_t and menu_cmds must be kept in sync
1115084Sjohnlev  *
1125084Sjohnlev  * The *_DOLLAR_CMD values must be 1 greater than the
1135084Sjohnlev  * respective [KERNEL|MODULE]_CMD values.
1143446Smrj  */
1153446Smrj typedef enum {
1163446Smrj 	DEFAULT_CMD = 0,
1173446Smrj 	TIMEOUT_CMD,
1183446Smrj 	TITLE_CMD,
1193446Smrj 	ROOT_CMD,
1203446Smrj 	KERNEL_CMD,
1215084Sjohnlev 	KERNEL_DOLLAR_CMD,	/* Must be KERNEL_CMD + 1 */
1223446Smrj 	MODULE_CMD,
1235084Sjohnlev 	MODULE_DOLLAR_CMD,	/* Must be MODULE_CMD + 1 */
1243446Smrj 	SEP_CMD,
1253446Smrj 	COMMENT_CMD,
1263446Smrj 	CHAINLOADER_CMD,
1276448Svikram 	ARGS_CMD,
12810499SWilliam.Kucharski@Sun.COM 	FINDROOT_CMD,
12910499SWilliam.Kucharski@Sun.COM 	BOOTFS_CMD
1303446Smrj } menu_cmd_t;
1313446Smrj 
1323446Smrj extern char *menu_cmds[];
1333446Smrj 
1343446Smrj /* For multi- or direct-boot */
1353446Smrj typedef enum {
1363446Smrj 	BAM_DIRECT_NOT_SET,
1373446Smrj 	BAM_DIRECT_MULTIBOOT,
1383446Smrj 	BAM_DIRECT_DBOOT
1393446Smrj } direct_or_multi_t;
1403446Smrj 
1415084Sjohnlev /* Is there a hypervisor present? */
1425084Sjohnlev typedef enum {
1435084Sjohnlev 	BAM_HV_UNKNOWN,
1445084Sjohnlev 	BAM_HV_NO,
1455084Sjohnlev 	BAM_HV_PRESENT
1465084Sjohnlev } hv_t;
1475084Sjohnlev 
1486448Svikram /* Is there findroot capability present ? */
1496448Svikram typedef enum {
1506448Svikram 	BAM_FINDROOT_UNKNOWN,
1516448Svikram 	BAM_FINDROOT_ABSENT,
1526448Svikram 	BAM_FINDROOT_PRESENT
1536448Svikram } findroot_t;
1546448Svikram 
1553446Smrj extern int bam_verbose;
1563446Smrj extern int bam_force;
1573446Smrj extern direct_or_multi_t bam_direct;
1585084Sjohnlev extern hv_t bam_is_hv;
1596448Svikram extern findroot_t bam_is_findroot;
1606448Svikram extern int bam_debug;
1613446Smrj 
1626448Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
1636448Svikram extern void update_numbering(menu_t *mp);
16410499SWilliam.Kucharski@Sun.COM extern error_t set_global(menu_t *, char *, int);
1653446Smrj extern error_t upgrade_menu(menu_t *, char *, char *);
16610499SWilliam.Kucharski@Sun.COM extern error_t cvt_to_hyper(menu_t *, char *, char *);
16710499SWilliam.Kucharski@Sun.COM extern error_t cvt_to_metal(menu_t *, char *, char *);
1683446Smrj extern void *s_calloc(size_t, size_t);
1693446Smrj extern void *s_realloc(void *, size_t);
1703446Smrj extern char *s_fgets(char *buf, int n, FILE *fp);
1713446Smrj extern void bam_error(char *format, ...);
17210787SWilliam.Kucharski@Sun.COM extern void bam_exit(int);
1736448Svikram extern void bam_print(char *, ...);
1743446Smrj extern void bam_print_stderr(char *format, ...);
1756448Svikram extern void bam_derror(char *format, ...);
1766448Svikram extern error_t get_boot_cap(const char *osroot);
1773446Smrj extern char *get_special(char *);
1783446Smrj extern char *os_to_grubdisk(char *, int);
1793446Smrj extern void update_line(line_t *);
18010499SWilliam.Kucharski@Sun.COM extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *,
18110499SWilliam.Kucharski@Sun.COM     char *);
18210499SWilliam.Kucharski@Sun.COM extern error_t delete_boot_entry(menu_t *, int, int);
1835648Ssetje extern int is_grub(const char *);
1846448Svikram extern char *get_grubsign(char *osroot, char *osdev);
1856448Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
1866448Svikram extern int root_optional(char *osroot, char *menu_root);
1876448Svikram extern void unlink_line(menu_t *mp, line_t *lp);
1886448Svikram extern void line_free(line_t *lp);
1896448Svikram extern char *s_strdup(char *);
1906448Svikram extern int is_sparc(void);
1913446Smrj 
1923446Smrj #define	BAM_MAXLINE	8192
1933446Smrj 
1943446Smrj /* menu.lst comments created by bootadm */
1953446Smrj #define	BAM_BOOTADM_HDR	"---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
1963446Smrj #define	BAM_BOOTADM_FTR	"---------------------END BOOTADM--------------------"
1973446Smrj 
1983446Smrj /*
1993446Smrj  * menu.lst comments create by Live Upgrade.  Note that these are the end of
2003446Smrj  * the comment strings - there will be other text before them.
2013446Smrj  */
2023446Smrj #define	BAM_LU_HDR	" - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
2033446Smrj #define	BAM_LU_FTR	" -------------- END LIVE UPGRADE ------------"
2043446Smrj 
2053446Smrj #define	BAM_OLDDEF	"BOOTADM SAVED DEFAULT: "
2063446Smrj #define	BAM_OLD_RC_DEF	"BOOTADM RC SAVED DEFAULT: "
2073446Smrj 
208*10989SWilliam.Kucharski@Sun.COM /*
209*10989SWilliam.Kucharski@Sun.COM  * menu.lst comment created by libbe
210*10989SWilliam.Kucharski@Sun.COM  */
211*10989SWilliam.Kucharski@Sun.COM #define	BAM_LIBBE_FTR	"============ End of LIBBE entry ============="
212*10989SWilliam.Kucharski@Sun.COM 
2133446Smrj /* Title used for failsafe entries */
2143446Smrj #define	FAILSAFE_TITLE	"Solaris failsafe"
2153446Smrj 
2165084Sjohnlev /* Title used for hv entries */
2175084Sjohnlev #define	NEW_HV_ENTRY	"Solaris xVM"
2185084Sjohnlev 
2196423Sgw25295 /* ZFS boot option */
2206423Sgw25295 #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
2216423Sgw25295 
2223446Smrj /* multiboot */
2233446Smrj #define	MULTI_BOOT	"/platform/i86pc/multiboot"
2243446Smrj #define	MULTI_BOOT_FAILSAFE	"/boot/multiboot"
2253446Smrj #define	MULTI_BOOT_FAILSAFE_UNIX	"kernel/unix"
2263446Smrj #define	MULTI_BOOT_FAILSAFE_LINE	"/boot/multiboot kernel/unix -s"
2273446Smrj 
2283446Smrj /* directboot kernels */
2293446Smrj #define	DIRECT_BOOT_32	"/platform/i86pc/kernel/unix"
2303446Smrj #define	DIRECT_BOOT_64	"/platform/i86pc/kernel/amd64/unix"
2313446Smrj #define	DIRECT_BOOT_KERNEL	"/platform/i86pc/kernel/$ISADIR/unix"
2328104SEnrico.Perla@Sun.COM #define	DIRECT_BOOT_FAILSAFE_32	"/boot/platform/i86pc/kernel/unix"
2338104SEnrico.Perla@Sun.COM #define	DIRECT_BOOT_FAILSAFE_64	"/boot/platform/i86pc/kernel/amd64/unix"
2348104SEnrico.Perla@Sun.COM #define	DIRECT_BOOT_FAILSAFE_KERNEL \
2358104SEnrico.Perla@Sun.COM 	"/boot/platform/i86pc/kernel/$ISADIR/unix"
2363446Smrj #define	DIRECT_BOOT_FAILSAFE_LINE	DIRECT_BOOT_FAILSAFE_KERNEL " -s"
2376423Sgw25295 #define	DIRECT_BOOT_KERNEL_ZFS	DIRECT_BOOT_KERNEL " " ZFS_BOOT
2388642SVikram.Hegde@Sun.COM #define	DIRECT_BOOT_PREFIX	"/platform/i86pc/"
2398642SVikram.Hegde@Sun.COM #define	KERNEL_PREFIX	"/platform/i86pc/"
2408642SVikram.Hegde@Sun.COM #define	AMD_UNIX_SPACE	"/amd64/unix "
2418642SVikram.Hegde@Sun.COM #define	UNIX_SPACE	"/unix "
2423446Smrj 
2436448Svikram /* xVM kernels */
2446448Svikram #define	XEN_KERNEL_SUBSTR "xen.gz"
2456448Svikram 
2463446Smrj /* Boot archives */
2476582Ssetje #define	ARCHIVE_PREFIX		"/platform/"
2486582Ssetje #define	ARCHIVE_SUFFIX		"/boot_archive"
2498735SEnrico.Perla@Sun.COM #define	CACHEDIR_SUFFIX		"/archive_cache"
2508735SEnrico.Perla@Sun.COM #define	UPDATEDIR_SUFFIX	"/updates"
2513446Smrj #define	DIRECT_BOOT_ARCHIVE	"/platform/i86pc/$ISADIR/boot_archive"
2523446Smrj #define	DIRECT_BOOT_ARCHIVE_32	"/platform/i86pc/boot_archive"
2533446Smrj #define	DIRECT_BOOT_ARCHIVE_64	"/platform/i86pc/amd64/boot_archive"
2546448Svikram #define	MULTIBOOT_ARCHIVE	DIRECT_BOOT_ARCHIVE_32
2558104SEnrico.Perla@Sun.COM #define	FAILSAFE_ARCHIVE	"/boot/$ISADIR/x86.miniroot-safe"
2568104SEnrico.Perla@Sun.COM #define	FAILSAFE_ARCHIVE_32	"/boot/x86.miniroot-safe"
2578104SEnrico.Perla@Sun.COM #define	FAILSAFE_ARCHIVE_64	"/boot/amd64/x86.miniroot-safe"
2588735SEnrico.Perla@Sun.COM #define	CACHEDIR_32		"/platform/i86pc/archive_cache"
2598735SEnrico.Perla@Sun.COM #define	CACHEDIR_64		"/platform/i86pc/amd64/archive_cache"
2608735SEnrico.Perla@Sun.COM #define	UPDATEDIR_32		"/platform/i86pc/updates"
2618735SEnrico.Perla@Sun.COM #define	UPDATEDIR_64		"/platform/i86pc/amd64/updates"
2623446Smrj 
2635084Sjohnlev /* Hypervisors */
2645084Sjohnlev #define	XEN_64			"/boot/amd64/xen.gz"
2655084Sjohnlev #define	XEN_MENU		"/boot/$ISADIR/xen.gz"
2665084Sjohnlev #define	HYPERVISOR_KERNEL	"/platform/i86xpv/kernel/$ISADIR/unix"
2676448Svikram #define	XEN_KERNEL_MODULE_LINE	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
2686448Svikram #define	XEN_KERNEL_MODULE_LINE_ZFS	\
2696423Sgw25295 	HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
2705084Sjohnlev 
2718735SEnrico.Perla@Sun.COM /* Helpers */
2728954SEnrico.Perla@Sun.COM #define	MKISOFS_PATH		"/usr/bin/mkisofs"
2738735SEnrico.Perla@Sun.COM #define	DD_PATH_USR		"/usr/bin/dd"
2748954SEnrico.Perla@Sun.COM #define	LOCKFS_PATH		"/usr/sbin/lockfs"
2758735SEnrico.Perla@Sun.COM 
2766448Svikram /* A first guess at the number of entries in a menu */
2776448Svikram #define	BAM_ENTRY_NUM		10
2786448Svikram 
27910499SWilliam.Kucharski@Sun.COM /* toggle for whether delete_boot_entry prints an error message or not */
28010499SWilliam.Kucharski@Sun.COM #define	DBE_PRINTERR		0
28110499SWilliam.Kucharski@Sun.COM #define	DBE_QUIET		1
28210499SWilliam.Kucharski@Sun.COM 
2836448Svikram /*
2846448Svikram  * Debugging defines
2856448Svikram  */
2866448Svikram #define	INJECT_ERROR1(x, y)	\
2876448Svikram { \
2886448Svikram 	if (bam_debug) { \
2896448Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
2906448Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
2916448Svikram 			y;	\
2926448Svikram 		} \
2936448Svikram 	} \
2946448Svikram }
2956448Svikram 
2966448Svikram #define	INJECT_ERROR2(x, y, z)	\
2976448Svikram { \
2986448Svikram 	if (bam_debug) { \
2996448Svikram 		char *inj = getenv("_BOOTADM_INJECT"); \
3006448Svikram 		if (inj && strcmp(inj, (x)) == 0) {  \
3016448Svikram 			y;	\
3026448Svikram 			z;	\
3036448Svikram 		} \
3046448Svikram 	} \
3056448Svikram }
3066448Svikram 
3076448Svikram #define	BAM_DPRINTF(x)	{if (bam_debug)  bam_derror x; }
3086448Svikram 
3093446Smrj #ifdef __cplusplus
3103446Smrj }
3113446Smrj #endif
3123446Smrj 
3133446Smrj #endif	/* _BOOTADM_H */
314