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