1 3446 mrj /* 2 3446 mrj * CDDL HEADER START 3 3446 mrj * 4 3446 mrj * The contents of this file are subject to the terms of the 5 3446 mrj * Common Development and Distribution License (the "License"). 6 3446 mrj * You may not use this file except in compliance with the License. 7 3446 mrj * 8 3446 mrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 3446 mrj * or http://www.opensolaris.org/os/licensing. 10 3446 mrj * See the License for the specific language governing permissions 11 3446 mrj * and limitations under the License. 12 3446 mrj * 13 3446 mrj * When distributing Covered Code, include this CDDL HEADER in each 14 3446 mrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 3446 mrj * If applicable, add the following below this CDDL HEADER, with the 16 3446 mrj * fields enclosed by brackets "[]" replaced with your own identifying 17 3446 mrj * information: Portions Copyright [yyyy] [name of copyright owner] 18 3446 mrj * 19 3446 mrj * CDDL HEADER END 20 3446 mrj */ 21 3446 mrj /* 22 8642 Vikram * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 3446 mrj * Use is subject to license terms. 24 3446 mrj */ 25 3446 mrj 26 3446 mrj #ifndef _BOOTADM_H 27 3446 mrj #define _BOOTADM_H 28 3446 mrj 29 3446 mrj #ifdef __cplusplus 30 3446 mrj extern "C" { 31 3446 mrj #endif 32 6448 vikram 33 6448 vikram #include <assert.h> 34 3446 mrj 35 3446 mrj #ifndef TEXT_DOMAIN 36 3446 mrj #define TEXT_DOMAIN "SUNW_OST_OSCMD" 37 3446 mrj #endif /* TEXT_DOMAIN */ 38 3446 mrj 39 3446 mrj /* Type definitions */ 40 3446 mrj 41 3446 mrj /* GRUB menu per-line classification */ 42 3446 mrj typedef enum { 43 3446 mrj BAM_INVALID = 0, 44 3446 mrj BAM_EMPTY, 45 3446 mrj BAM_COMMENT, 46 3446 mrj BAM_GLOBAL, 47 3446 mrj BAM_ENTRY, 48 3446 mrj BAM_TITLE 49 3446 mrj } menu_flag_t; 50 3446 mrj 51 3446 mrj /* struct for menu.lst contents */ 52 3446 mrj typedef struct line { 53 3446 mrj int lineNum; /* Line number in menu.lst */ 54 3446 mrj int entryNum; /* menu boot entry #. ENTRY_INIT if not applicable */ 55 3446 mrj char *cmd; 56 3446 mrj char *sep; 57 3446 mrj char *arg; 58 3446 mrj char *line; 59 3446 mrj menu_flag_t flags; 60 3446 mrj struct line *next; 61 3446 mrj struct line *prev; 62 3446 mrj } line_t; 63 3446 mrj 64 3446 mrj typedef struct entry { 65 3446 mrj struct entry *next; 66 3446 mrj struct entry *prev; 67 3446 mrj line_t *start; 68 3446 mrj line_t *end; 69 3446 mrj int entryNum; 70 6448 vikram uint_t flags; 71 3446 mrj } entry_t; 72 3446 mrj 73 3446 mrj /* For flags value in entry_t */ 74 3446 mrj #define BAM_ENTRY_BOOTADM 0x01 /* entry created by bootadm */ 75 3446 mrj #define BAM_ENTRY_LU 0x02 /* entry created by Live Upgrade */ 76 3446 mrj #define BAM_ENTRY_CHAINLOADER 0x04 /* chainloader entry; do not disturb */ 77 3446 mrj #define BAM_ENTRY_ROOT 0x08 /* entry has a root line */ 78 6448 vikram #define BAM_ENTRY_FAILSAFE 0x10 /* failsafe entry */ 79 6448 vikram #define BAM_ENTRY_DBOOT 0x20 /* Is dboot (normal or failsafe) */ 80 3446 mrj #define BAM_ENTRY_32BIT 0x40 /* Is a 32-bit entry */ 81 5084 johnlev #define BAM_ENTRY_HV 0x80 /* Is a hypervisor entry */ 82 6448 vikram #define BAM_ENTRY_FINDROOT 0x100 /* entry has a findroot line */ 83 6448 vikram #define BAM_ENTRY_MULTIBOOT 0x200 /* is multiboot (normal or failsafe) */ 84 6448 vikram #define BAM_ENTRY_64BIT 0x400 /* Is a 64-bit entry */ 85 8104 Enrico 86 8104 Enrico #define BAM_ENTRY_UPGFSKERNEL 0x800 /* Upgrade failsafe kernel entry */ 87 8104 Enrico #define BAM_ENTRY_UPGFSMODULE 0x1000 /* Upgrade failsafe module entry */ 88 10989 William 89 10989 William #define BAM_ENTRY_LIBBE 0x2000 /* entry created by libbe */ 90 3446 mrj 91 3446 mrj typedef struct { 92 3446 mrj line_t *start; 93 3446 mrj line_t *end; 94 3446 mrj line_t *curdefault; /* line containing default */ 95 3446 mrj line_t *olddefault; /* old default line (commented) */ 96 3446 mrj line_t *old_rc_default; /* old default line for bootenv.rc */ 97 3446 mrj entry_t *entries; /* os entries */ 98 3446 mrj } menu_t; 99 3446 mrj 100 3446 mrj typedef enum { 101 3446 mrj BAM_ERROR = -1, /* Must be negative. add_boot_entry() depends on it */ 102 3446 mrj BAM_SUCCESS = 0, 103 3446 mrj BAM_WRITE = 2, 104 10499 William BAM_MSG, /* Used by upgrade_menu() */ 105 10499 William BAM_NOCHANGE /* Used by cvt_to_hyper()/cvt_to_metal() */ 106 3446 mrj } error_t; 107 3446 mrj 108 3446 mrj /* 109 3446 mrj * Menu related 110 3446 mrj * menu_cmd_t and menu_cmds must be kept in sync 111 5084 johnlev * 112 5084 johnlev * The *_DOLLAR_CMD values must be 1 greater than the 113 5084 johnlev * respective [KERNEL|MODULE]_CMD values. 114 3446 mrj */ 115 3446 mrj typedef enum { 116 3446 mrj DEFAULT_CMD = 0, 117 3446 mrj TIMEOUT_CMD, 118 3446 mrj TITLE_CMD, 119 3446 mrj ROOT_CMD, 120 3446 mrj KERNEL_CMD, 121 5084 johnlev KERNEL_DOLLAR_CMD, /* Must be KERNEL_CMD + 1 */ 122 3446 mrj MODULE_CMD, 123 5084 johnlev MODULE_DOLLAR_CMD, /* Must be MODULE_CMD + 1 */ 124 3446 mrj SEP_CMD, 125 3446 mrj COMMENT_CMD, 126 3446 mrj CHAINLOADER_CMD, 127 6448 vikram ARGS_CMD, 128 10499 William FINDROOT_CMD, 129 10499 William BOOTFS_CMD 130 3446 mrj } menu_cmd_t; 131 3446 mrj 132 3446 mrj extern char *menu_cmds[]; 133 3446 mrj 134 3446 mrj /* For multi- or direct-boot */ 135 3446 mrj typedef enum { 136 3446 mrj BAM_DIRECT_NOT_SET, 137 3446 mrj BAM_DIRECT_MULTIBOOT, 138 3446 mrj BAM_DIRECT_DBOOT 139 3446 mrj } direct_or_multi_t; 140 3446 mrj 141 5084 johnlev /* Is there a hypervisor present? */ 142 5084 johnlev typedef enum { 143 5084 johnlev BAM_HV_UNKNOWN, 144 5084 johnlev BAM_HV_NO, 145 5084 johnlev BAM_HV_PRESENT 146 5084 johnlev } hv_t; 147 5084 johnlev 148 6448 vikram /* Is there findroot capability present ? */ 149 6448 vikram typedef enum { 150 6448 vikram BAM_FINDROOT_UNKNOWN, 151 6448 vikram BAM_FINDROOT_ABSENT, 152 6448 vikram BAM_FINDROOT_PRESENT 153 6448 vikram } findroot_t; 154 6448 vikram 155 3446 mrj extern int bam_verbose; 156 3446 mrj extern int bam_force; 157 3446 mrj extern direct_or_multi_t bam_direct; 158 5084 johnlev extern hv_t bam_is_hv; 159 6448 vikram extern findroot_t bam_is_findroot; 160 6448 vikram extern int bam_debug; 161 3446 mrj 162 6448 vikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp); 163 6448 vikram extern void update_numbering(menu_t *mp); 164 10499 William extern error_t set_global(menu_t *, char *, int); 165 3446 mrj extern error_t upgrade_menu(menu_t *, char *, char *); 166 10499 William extern error_t cvt_to_hyper(menu_t *, char *, char *); 167 10499 William extern error_t cvt_to_metal(menu_t *, char *, char *); 168 3446 mrj extern void *s_calloc(size_t, size_t); 169 3446 mrj extern void *s_realloc(void *, size_t); 170 3446 mrj extern char *s_fgets(char *buf, int n, FILE *fp); 171 3446 mrj extern void bam_error(char *format, ...); 172 10787 William extern void bam_exit(int); 173 6448 vikram extern void bam_print(char *, ...); 174 3446 mrj extern void bam_print_stderr(char *format, ...); 175 6448 vikram extern void bam_derror(char *format, ...); 176 6448 vikram extern error_t get_boot_cap(const char *osroot); 177 3446 mrj extern char *get_special(char *); 178 3446 mrj extern char *os_to_grubdisk(char *, int); 179 3446 mrj extern void update_line(line_t *); 180 10499 William extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *, 181 10499 William char *); 182 10499 William extern error_t delete_boot_entry(menu_t *, int, int); 183 5648 setje extern int is_grub(const char *); 184 6448 vikram extern char *get_grubsign(char *osroot, char *osdev); 185 6448 vikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root); 186 6448 vikram extern int root_optional(char *osroot, char *menu_root); 187 6448 vikram extern void unlink_line(menu_t *mp, line_t *lp); 188 6448 vikram extern void line_free(line_t *lp); 189 6448 vikram extern char *s_strdup(char *); 190 6448 vikram extern int is_sparc(void); 191 3446 mrj 192 3446 mrj #define BAM_MAXLINE 8192 193 3446 mrj 194 3446 mrj /* menu.lst comments created by bootadm */ 195 3446 mrj #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------" 196 3446 mrj #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------" 197 3446 mrj 198 3446 mrj /* 199 3446 mrj * menu.lst comments create by Live Upgrade. Note that these are the end of 200 3446 mrj * the comment strings - there will be other text before them. 201 3446 mrj */ 202 3446 mrj #define BAM_LU_HDR " - ADDED BY LIVE UPGRADE - DO NOT EDIT -----" 203 3446 mrj #define BAM_LU_FTR " -------------- END LIVE UPGRADE ------------" 204 3446 mrj 205 3446 mrj #define BAM_OLDDEF "BOOTADM SAVED DEFAULT: " 206 3446 mrj #define BAM_OLD_RC_DEF "BOOTADM RC SAVED DEFAULT: " 207 3446 mrj 208 10989 William /* 209 10989 William * menu.lst comment created by libbe 210 10989 William */ 211 10989 William #define BAM_LIBBE_FTR "============ End of LIBBE entry =============" 212 10989 William 213 3446 mrj /* Title used for failsafe entries */ 214 3446 mrj #define FAILSAFE_TITLE "Solaris failsafe" 215 5084 johnlev 216 5084 johnlev /* Title used for hv entries */ 217 5084 johnlev #define NEW_HV_ENTRY "Solaris xVM" 218 3446 mrj 219 6423 gw25295 /* ZFS boot option */ 220 6423 gw25295 #define ZFS_BOOT "-B $ZFS-BOOTFS" 221 6423 gw25295 222 3446 mrj /* multiboot */ 223 3446 mrj #define MULTI_BOOT "/platform/i86pc/multiboot" 224 3446 mrj #define MULTI_BOOT_FAILSAFE "/boot/multiboot" 225 3446 mrj #define MULTI_BOOT_FAILSAFE_UNIX "kernel/unix" 226 3446 mrj #define MULTI_BOOT_FAILSAFE_LINE "/boot/multiboot kernel/unix -s" 227 3446 mrj 228 3446 mrj /* directboot kernels */ 229 3446 mrj #define DIRECT_BOOT_32 "/platform/i86pc/kernel/unix" 230 3446 mrj #define DIRECT_BOOT_64 "/platform/i86pc/kernel/amd64/unix" 231 3446 mrj #define DIRECT_BOOT_KERNEL "/platform/i86pc/kernel/$ISADIR/unix" 232 8104 Enrico #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix" 233 8104 Enrico #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix" 234 8104 Enrico #define DIRECT_BOOT_FAILSAFE_KERNEL \ 235 8104 Enrico "/boot/platform/i86pc/kernel/$ISADIR/unix" 236 3446 mrj #define DIRECT_BOOT_FAILSAFE_LINE DIRECT_BOOT_FAILSAFE_KERNEL " -s" 237 6423 gw25295 #define DIRECT_BOOT_KERNEL_ZFS DIRECT_BOOT_KERNEL " " ZFS_BOOT 238 8642 Vikram #define DIRECT_BOOT_PREFIX "/platform/i86pc/" 239 8642 Vikram #define KERNEL_PREFIX "/platform/i86pc/" 240 8642 Vikram #define AMD_UNIX_SPACE "/amd64/unix " 241 8642 Vikram #define UNIX_SPACE "/unix " 242 3446 mrj 243 6448 vikram /* xVM kernels */ 244 6448 vikram #define XEN_KERNEL_SUBSTR "xen.gz" 245 6448 vikram 246 3446 mrj /* Boot archives */ 247 6582 setje #define ARCHIVE_PREFIX "/platform/" 248 6582 setje #define ARCHIVE_SUFFIX "/boot_archive" 249 8735 Enrico #define CACHEDIR_SUFFIX "/archive_cache" 250 8735 Enrico #define UPDATEDIR_SUFFIX "/updates" 251 3446 mrj #define DIRECT_BOOT_ARCHIVE "/platform/i86pc/$ISADIR/boot_archive" 252 3446 mrj #define DIRECT_BOOT_ARCHIVE_32 "/platform/i86pc/boot_archive" 253 3446 mrj #define DIRECT_BOOT_ARCHIVE_64 "/platform/i86pc/amd64/boot_archive" 254 6448 vikram #define MULTIBOOT_ARCHIVE DIRECT_BOOT_ARCHIVE_32 255 8104 Enrico #define FAILSAFE_ARCHIVE "/boot/$ISADIR/x86.miniroot-safe" 256 8104 Enrico #define FAILSAFE_ARCHIVE_32 "/boot/x86.miniroot-safe" 257 8104 Enrico #define FAILSAFE_ARCHIVE_64 "/boot/amd64/x86.miniroot-safe" 258 8735 Enrico #define CACHEDIR_32 "/platform/i86pc/archive_cache" 259 8735 Enrico #define CACHEDIR_64 "/platform/i86pc/amd64/archive_cache" 260 8735 Enrico #define UPDATEDIR_32 "/platform/i86pc/updates" 261 8735 Enrico #define UPDATEDIR_64 "/platform/i86pc/amd64/updates" 262 3446 mrj 263 5084 johnlev /* Hypervisors */ 264 5084 johnlev #define XEN_64 "/boot/amd64/xen.gz" 265 5084 johnlev #define XEN_MENU "/boot/$ISADIR/xen.gz" 266 5084 johnlev #define HYPERVISOR_KERNEL "/platform/i86xpv/kernel/$ISADIR/unix" 267 6448 vikram #define XEN_KERNEL_MODULE_LINE HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL 268 6448 vikram #define XEN_KERNEL_MODULE_LINE_ZFS \ 269 6423 gw25295 HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT 270 8735 Enrico 271 8735 Enrico /* Helpers */ 272 8954 Enrico #define MKISOFS_PATH "/usr/bin/mkisofs" 273 8735 Enrico #define DD_PATH_USR "/usr/bin/dd" 274 8954 Enrico #define LOCKFS_PATH "/usr/sbin/lockfs" 275 6448 vikram 276 6448 vikram /* A first guess at the number of entries in a menu */ 277 6448 vikram #define BAM_ENTRY_NUM 10 278 6448 vikram 279 10499 William /* toggle for whether delete_boot_entry prints an error message or not */ 280 10499 William #define DBE_PRINTERR 0 281 10499 William #define DBE_QUIET 1 282 10499 William 283 6448 vikram /* 284 6448 vikram * Debugging defines 285 6448 vikram */ 286 6448 vikram #define INJECT_ERROR1(x, y) \ 287 6448 vikram { \ 288 6448 vikram if (bam_debug) { \ 289 6448 vikram char *inj = getenv("_BOOTADM_INJECT"); \ 290 6448 vikram if (inj && strcmp(inj, (x)) == 0) { \ 291 6448 vikram y; \ 292 6448 vikram } \ 293 6448 vikram } \ 294 6448 vikram } 295 6448 vikram 296 6448 vikram #define INJECT_ERROR2(x, y, z) \ 297 6448 vikram { \ 298 6448 vikram if (bam_debug) { \ 299 6448 vikram char *inj = getenv("_BOOTADM_INJECT"); \ 300 6448 vikram if (inj && strcmp(inj, (x)) == 0) { \ 301 6448 vikram y; \ 302 6448 vikram z; \ 303 6448 vikram } \ 304 6448 vikram } \ 305 6448 vikram } 306 6448 vikram 307 6448 vikram #define BAM_DPRINTF(x) {if (bam_debug) bam_derror x; } 308 5084 johnlev 309 3446 mrj #ifdef __cplusplus 310 3446 mrj } 311 3446 mrj #endif 312 3446 mrj 313 3446 mrj #endif /* _BOOTADM_H */ 314