11b8adde7SWilliam Kucharski /* shared.h - definitions used in all GRUB-specific code */ 21b8adde7SWilliam Kucharski /* 31b8adde7SWilliam Kucharski * GRUB -- GRand Unified Bootloader 41b8adde7SWilliam Kucharski * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc. 5*1a065e93SAndrew Stormont * Copyright 2021 RackTop Systems, Inc. 61b8adde7SWilliam Kucharski * 71b8adde7SWilliam Kucharski * This program is free software; you can redistribute it and/or modify 81b8adde7SWilliam Kucharski * it under the terms of the GNU General Public License as published by 91b8adde7SWilliam Kucharski * the Free Software Foundation; either version 2 of the License, or 101b8adde7SWilliam Kucharski * (at your option) any later version. 111b8adde7SWilliam Kucharski * 121b8adde7SWilliam Kucharski * This program is distributed in the hope that it will be useful, 131b8adde7SWilliam Kucharski * but WITHOUT ANY WARRANTY; without even the implied warranty of 141b8adde7SWilliam Kucharski * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 151b8adde7SWilliam Kucharski * GNU General Public License for more details. 161b8adde7SWilliam Kucharski * 171b8adde7SWilliam Kucharski * You should have received a copy of the GNU General Public License 181b8adde7SWilliam Kucharski * along with this program; if not, write to the Free Software 191b8adde7SWilliam Kucharski * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 201b8adde7SWilliam Kucharski */ 211b8adde7SWilliam Kucharski 221b8adde7SWilliam Kucharski /* 231b8adde7SWilliam Kucharski * Generic defines to use anywhere 241b8adde7SWilliam Kucharski */ 251b8adde7SWilliam Kucharski 261b8adde7SWilliam Kucharski #ifndef GRUB_SHARED_HEADER 271b8adde7SWilliam Kucharski #define GRUB_SHARED_HEADER 1 281b8adde7SWilliam Kucharski 291b8adde7SWilliam Kucharski #include <config.h> 301b8adde7SWilliam Kucharski 311b8adde7SWilliam Kucharski /* Add an underscore to a C symbol in assembler code if needed. */ 321b8adde7SWilliam Kucharski #ifdef HAVE_ASM_USCORE 331b8adde7SWilliam Kucharski # define EXT_C(sym) _ ## sym 341b8adde7SWilliam Kucharski #else 351b8adde7SWilliam Kucharski # define EXT_C(sym) sym 361b8adde7SWilliam Kucharski #endif 371b8adde7SWilliam Kucharski 381b8adde7SWilliam Kucharski /* Maybe redirect memory requests through grub_scratch_mem. */ 391b8adde7SWilliam Kucharski #ifdef GRUB_UTIL 401b8adde7SWilliam Kucharski extern char *grub_scratch_mem; 411b8adde7SWilliam Kucharski # define RAW_ADDR(x) ((x) + (int) grub_scratch_mem) 421b8adde7SWilliam Kucharski # define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4) 431b8adde7SWilliam Kucharski #else 441b8adde7SWilliam Kucharski # define RAW_ADDR(x) (x) 451b8adde7SWilliam Kucharski # define RAW_SEG(x) (x) 461b8adde7SWilliam Kucharski #endif 471b8adde7SWilliam Kucharski 481b8adde7SWilliam Kucharski /* ZFS will use the top 4 Meg of physical memory (below 4Gig) for sratch */ 491b8adde7SWilliam Kucharski #define ZFS_SCRATCH_SIZE 0x400000 501b8adde7SWilliam Kucharski 51ffb5616eSLin Ling #ifndef MAXPATHLEN 52ffb5616eSLin Ling #define MAXPATHLEN 1024 53ffb5616eSLin Ling #endif 54ffb5616eSLin Ling 551b8adde7SWilliam Kucharski #define MAXNAMELEN 256 561b8adde7SWilliam Kucharski #define MIN(x, y) ((x) < (y) ? (x) : (y)) 571b8adde7SWilliam Kucharski 581b8adde7SWilliam Kucharski /* Boot signature related defines for the findroot command */ 591b8adde7SWilliam Kucharski #define BOOTSIGN_DIR "/boot/grub/bootsign" 601b8adde7SWilliam Kucharski #define BOOTSIGN_ARGLEN (MAXNAMELEN + 10) /* (<sign>,0,d) */ 611b8adde7SWilliam Kucharski #define BOOTSIGN_LEN (sizeof (BOOTSIGN_DIR) + 1 + BOOTSIGN_ARGLEN) 621b8adde7SWilliam Kucharski #define BOOTSIGN_BACKUP "/etc/bootsign" 631b8adde7SWilliam Kucharski 641b8adde7SWilliam Kucharski /* 651b8adde7SWilliam Kucharski * Integer sizes 661b8adde7SWilliam Kucharski */ 671b8adde7SWilliam Kucharski 681b8adde7SWilliam Kucharski #define MAXINT 0x7FFFFFFF 69828d47c1SShidokht Yadegari #define MAXUINT 0xFFFFFFFF 701b8adde7SWilliam Kucharski 711b8adde7SWilliam Kucharski /* Maximum command line size. Before you blindly increase this value, 721b8adde7SWilliam Kucharski see the comment in char_io.c (get_cmdline). */ 731b8adde7SWilliam Kucharski #define MAX_CMDLINE 1600 741b8adde7SWilliam Kucharski #define NEW_HEAPSIZE 1500 751b8adde7SWilliam Kucharski 761b8adde7SWilliam Kucharski /* 512-byte scratch area */ 771b8adde7SWilliam Kucharski #define SCRATCHADDR RAW_ADDR (0x77e00) 781b8adde7SWilliam Kucharski #define SCRATCHSEG RAW_SEG (0x77e0) 791b8adde7SWilliam Kucharski 801b8adde7SWilliam Kucharski /* 811b8adde7SWilliam Kucharski * This is the location of the raw device buffer. It is 31.5K 821b8adde7SWilliam Kucharski * in size. 831b8adde7SWilliam Kucharski */ 841b8adde7SWilliam Kucharski 851b8adde7SWilliam Kucharski #define BUFFERLEN 0x7e00 861b8adde7SWilliam Kucharski #define BUFFERADDR RAW_ADDR (0x70000) 871b8adde7SWilliam Kucharski #define BUFFERSEG RAW_SEG (0x7000) 881b8adde7SWilliam Kucharski 891b8adde7SWilliam Kucharski #define BOOT_PART_TABLE RAW_ADDR (0x07be) 901b8adde7SWilliam Kucharski 911b8adde7SWilliam Kucharski /* 921b8adde7SWilliam Kucharski * BIOS disk defines 931b8adde7SWilliam Kucharski */ 941b8adde7SWilliam Kucharski #define BIOSDISK_READ 0x0 951b8adde7SWilliam Kucharski #define BIOSDISK_WRITE 0x1 961b8adde7SWilliam Kucharski #define BIOSDISK_ERROR_GEOMETRY 0x100 971b8adde7SWilliam Kucharski #define BIOSDISK_ERROR_SHORT_IO 0x101 981b8adde7SWilliam Kucharski #define BIOSDISK_FLAG_LBA_EXTENSION 0x1 991b8adde7SWilliam Kucharski #define BIOSDISK_FLAG_CDROM 0x2 1001b8adde7SWilliam Kucharski 1011b8adde7SWilliam Kucharski /* 1021b8adde7SWilliam Kucharski * This is the filesystem (not raw device) buffer. 1031b8adde7SWilliam Kucharski * It is 32K in size, do not overrun! 1041b8adde7SWilliam Kucharski */ 1051b8adde7SWilliam Kucharski 1061b8adde7SWilliam Kucharski #define FSYS_BUFLEN 0x8000 1071b8adde7SWilliam Kucharski #define FSYS_BUF RAW_ADDR (0x68000) 1081b8adde7SWilliam Kucharski 1091b8adde7SWilliam Kucharski /* Command-line buffer for Multiboot kernels and modules. This area 1101b8adde7SWilliam Kucharski includes the area into which Stage 1.5 and Stage 1 are loaded, but 1111b8adde7SWilliam Kucharski that's no problem. */ 1121b8adde7SWilliam Kucharski #define MB_CMDLINE_BUF RAW_ADDR (0x2000) 1131b8adde7SWilliam Kucharski #define MB_CMDLINE_BUFLEN 0x6000 1141b8adde7SWilliam Kucharski 1151b8adde7SWilliam Kucharski /* The buffer for the password. */ 1161b8adde7SWilliam Kucharski #define PASSWORD_BUF RAW_ADDR (0x78000) 1171b8adde7SWilliam Kucharski #define PASSWORD_BUFLEN 0x200 1181b8adde7SWilliam Kucharski 1191b8adde7SWilliam Kucharski /* THe buffer for the filename of "/boot/grub/default". */ 1201b8adde7SWilliam Kucharski #define DEFAULT_FILE_BUF (PASSWORD_BUF + PASSWORD_BUFLEN) 1211b8adde7SWilliam Kucharski #define DEFAULT_FILE_BUFLEN 0x60 1221b8adde7SWilliam Kucharski 1231b8adde7SWilliam Kucharski /* The buffer for the command-line. */ 1241b8adde7SWilliam Kucharski #define CMDLINE_BUF (DEFAULT_FILE_BUF + DEFAULT_FILE_BUFLEN) 1251b8adde7SWilliam Kucharski #define CMDLINE_BUFLEN MAX_CMDLINE 1261b8adde7SWilliam Kucharski 1271b8adde7SWilliam Kucharski /* The kill buffer for the command-line. */ 1281b8adde7SWilliam Kucharski #define KILL_BUF (CMDLINE_BUF + CMDLINE_BUFLEN) 1291b8adde7SWilliam Kucharski #define KILL_BUFLEN MAX_CMDLINE 1301b8adde7SWilliam Kucharski 1311b8adde7SWilliam Kucharski /* The history buffer for the command-line. */ 1321b8adde7SWilliam Kucharski #define HISTORY_BUF (KILL_BUF + KILL_BUFLEN) 1331b8adde7SWilliam Kucharski #define HISTORY_SIZE 5 1341b8adde7SWilliam Kucharski #define HISTORY_BUFLEN (MAX_CMDLINE * HISTORY_SIZE) 1351b8adde7SWilliam Kucharski 1361b8adde7SWilliam Kucharski /* The buffer for the completion. */ 1371b8adde7SWilliam Kucharski #define COMPLETION_BUF (HISTORY_BUF + HISTORY_BUFLEN) 1381b8adde7SWilliam Kucharski #define COMPLETION_BUFLEN MAX_CMDLINE 1391b8adde7SWilliam Kucharski 1401b8adde7SWilliam Kucharski /* The buffer for the unique string. */ 1411b8adde7SWilliam Kucharski #define UNIQUE_BUF (COMPLETION_BUF + COMPLETION_BUFLEN) 1421b8adde7SWilliam Kucharski #define UNIQUE_BUFLEN MAX_CMDLINE 1431b8adde7SWilliam Kucharski 1441b8adde7SWilliam Kucharski /* The buffer for the menu entries. */ 1451b8adde7SWilliam Kucharski #define MENU_BUF (UNIQUE_BUF + UNIQUE_BUFLEN) 1461b8adde7SWilliam Kucharski #define MENU_BUFLEN (0x8000 + PASSWORD_BUF - MENU_BUF) 1471b8adde7SWilliam Kucharski 1481b8adde7SWilliam Kucharski /* The size of the drive map. */ 1491b8adde7SWilliam Kucharski #define DRIVE_MAP_SIZE 8 1501b8adde7SWilliam Kucharski 1511b8adde7SWilliam Kucharski /* The size of the key map. */ 1521b8adde7SWilliam Kucharski #define KEY_MAP_SIZE 128 1531b8adde7SWilliam Kucharski 1541b8adde7SWilliam Kucharski /* The size of the io map. */ 1551b8adde7SWilliam Kucharski #define IO_MAP_SIZE 128 1561b8adde7SWilliam Kucharski 1571b8adde7SWilliam Kucharski /* 1581b8adde7SWilliam Kucharski * Linux setup parameters 1591b8adde7SWilliam Kucharski */ 1601b8adde7SWilliam Kucharski 1611b8adde7SWilliam Kucharski #define LINUX_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */ 1621b8adde7SWilliam Kucharski #define LINUX_DEFAULT_SETUP_SECTS 4 1631b8adde7SWilliam Kucharski #define LINUX_FLAG_CAN_USE_HEAP 0x80 1641b8adde7SWilliam Kucharski #define LINUX_INITRD_MAX_ADDRESS 0x38000000 1651b8adde7SWilliam Kucharski #define LINUX_MAX_SETUP_SECTS 64 1661b8adde7SWilliam Kucharski #define LINUX_BOOT_LOADER_TYPE 0x71 1671b8adde7SWilliam Kucharski #define LINUX_HEAP_END_OFFSET (0x9000 - 0x200) 1681b8adde7SWilliam Kucharski 1691b8adde7SWilliam Kucharski #define LINUX_BZIMAGE_ADDR RAW_ADDR (0x100000) 1701b8adde7SWilliam Kucharski #define LINUX_ZIMAGE_ADDR RAW_ADDR (0x10000) 1711b8adde7SWilliam Kucharski #define LINUX_OLD_REAL_MODE_ADDR RAW_ADDR (0x90000) 1721b8adde7SWilliam Kucharski #define LINUX_SETUP_STACK 0x9000 1731b8adde7SWilliam Kucharski 1741b8adde7SWilliam Kucharski #define LINUX_FLAG_BIG_KERNEL 0x1 1751b8adde7SWilliam Kucharski 1761b8adde7SWilliam Kucharski /* Linux's video mode selection support. Actually I hate it! */ 1771b8adde7SWilliam Kucharski #define LINUX_VID_MODE_NORMAL 0xFFFF 1781b8adde7SWilliam Kucharski #define LINUX_VID_MODE_EXTENDED 0xFFFE 1791b8adde7SWilliam Kucharski #define LINUX_VID_MODE_ASK 0xFFFD 1801b8adde7SWilliam Kucharski 1811b8adde7SWilliam Kucharski #define LINUX_CL_OFFSET 0x9000 1821b8adde7SWilliam Kucharski #define LINUX_CL_END_OFFSET 0x90FF 1831b8adde7SWilliam Kucharski #define LINUX_SETUP_MOVE_SIZE 0x9100 1841b8adde7SWilliam Kucharski #define LINUX_CL_MAGIC 0xA33F 1851b8adde7SWilliam Kucharski 1861b8adde7SWilliam Kucharski /* 1871b8adde7SWilliam Kucharski * General disk stuff 1881b8adde7SWilliam Kucharski */ 1891b8adde7SWilliam Kucharski 1901b8adde7SWilliam Kucharski #define SECTOR_SIZE 0x200 1911b8adde7SWilliam Kucharski #define SECTOR_BITS 9 1921b8adde7SWilliam Kucharski #define BIOS_FLAG_FIXED_DISK 0x80 1931b8adde7SWilliam Kucharski 1941b8adde7SWilliam Kucharski #define BOOTSEC_LOCATION RAW_ADDR (0x7C00) 1951b8adde7SWilliam Kucharski #define BOOTSEC_SIGNATURE 0xAA55 1961b8adde7SWilliam Kucharski #define BOOTSEC_BPB_OFFSET 0x3 1971b8adde7SWilliam Kucharski #define BOOTSEC_BPB_LENGTH 0x3B 1981b8adde7SWilliam Kucharski #define BOOTSEC_BPB_SYSTEM_ID 0x3 1991b8adde7SWilliam Kucharski #define BOOTSEC_BPB_HIDDEN_SECTORS 0x1C 2001b8adde7SWilliam Kucharski #define BOOTSEC_PART_OFFSET 0x1BE 2011b8adde7SWilliam Kucharski #define BOOTSEC_PART_LENGTH 0x40 2021b8adde7SWilliam Kucharski #define BOOTSEC_SIG_OFFSET 0x1FE 2031b8adde7SWilliam Kucharski #define BOOTSEC_LISTSIZE 8 2041b8adde7SWilliam Kucharski 2051b8adde7SWilliam Kucharski /* Not bad, perhaps. */ 2061b8adde7SWilliam Kucharski #define NETWORK_DRIVE 0x20 2071b8adde7SWilliam Kucharski 2081b8adde7SWilliam Kucharski /* 2091b8adde7SWilliam Kucharski * GRUB specific information 2101b8adde7SWilliam Kucharski * (in LSB order) 2111b8adde7SWilliam Kucharski */ 2121b8adde7SWilliam Kucharski 2131b8adde7SWilliam Kucharski #include <stage1.h> 2141b8adde7SWilliam Kucharski 2151b8adde7SWilliam Kucharski #define STAGE2_VER_MAJ_OFFS 0x6 2161b8adde7SWilliam Kucharski #define STAGE2_INSTALLPART 0x8 2171b8adde7SWilliam Kucharski #define STAGE2_SAVED_ENTRYNO 0xc 2181b8adde7SWilliam Kucharski #define STAGE2_STAGE2_ID 0x10 2191b8adde7SWilliam Kucharski #define STAGE2_FORCE_LBA 0x11 2201b8adde7SWilliam Kucharski #define STAGE2_VER_STR_OFFS 0x12 2211b8adde7SWilliam Kucharski 2221b8adde7SWilliam Kucharski /* Stage 2 identifiers */ 2231b8adde7SWilliam Kucharski #define STAGE2_ID_STAGE2 0 2241b8adde7SWilliam Kucharski #define STAGE2_ID_FFS_STAGE1_5 1 2251b8adde7SWilliam Kucharski #define STAGE2_ID_E2FS_STAGE1_5 2 2261b8adde7SWilliam Kucharski #define STAGE2_ID_FAT_STAGE1_5 3 2271b8adde7SWilliam Kucharski #define STAGE2_ID_MINIX_STAGE1_5 4 2281b8adde7SWilliam Kucharski #define STAGE2_ID_REISERFS_STAGE1_5 5 2291b8adde7SWilliam Kucharski #define STAGE2_ID_VSTAFS_STAGE1_5 6 2301b8adde7SWilliam Kucharski #define STAGE2_ID_JFS_STAGE1_5 7 2311b8adde7SWilliam Kucharski #define STAGE2_ID_XFS_STAGE1_5 8 2321b8adde7SWilliam Kucharski #define STAGE2_ID_ISO9660_STAGE1_5 9 2331b8adde7SWilliam Kucharski #define STAGE2_ID_UFS2_STAGE1_5 10 2341b8adde7SWilliam Kucharski #define STAGE2_ID_UFS_STAGE1_5 11 2351b8adde7SWilliam Kucharski #define STAGE2_ID_ZFS_STAGE1_5 12 2361b8adde7SWilliam Kucharski 2371b8adde7SWilliam Kucharski #ifndef STAGE1_5 2381b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_STAGE2 2391b8adde7SWilliam Kucharski #else 2401b8adde7SWilliam Kucharski # if defined(FSYS_FFS) 2411b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_FFS_STAGE1_5 2421b8adde7SWilliam Kucharski # elif defined(FSYS_EXT2FS) 2431b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_E2FS_STAGE1_5 2441b8adde7SWilliam Kucharski # elif defined(FSYS_FAT) 2451b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_FAT_STAGE1_5 2461b8adde7SWilliam Kucharski # elif defined(FSYS_MINIX) 2471b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5 2481b8adde7SWilliam Kucharski # elif defined(FSYS_REISERFS) 2491b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5 2501b8adde7SWilliam Kucharski # elif defined(FSYS_VSTAFS) 2511b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5 2521b8adde7SWilliam Kucharski # elif defined(FSYS_JFS) 2531b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_JFS_STAGE1_5 2541b8adde7SWilliam Kucharski # elif defined(FSYS_XFS) 2551b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_XFS_STAGE1_5 2561b8adde7SWilliam Kucharski # elif defined(FSYS_ISO9660) 2571b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_ISO9660_STAGE1_5 2581b8adde7SWilliam Kucharski # elif defined(FSYS_UFS2) 2591b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_UFS2_STAGE1_5 2601b8adde7SWilliam Kucharski # elif defined(FSYS_UFS) 2611b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_UFS_STAGE1_5 2621b8adde7SWilliam Kucharski # elif defined(FSYS_ZFS) 2631b8adde7SWilliam Kucharski # define STAGE2_ID STAGE2_ID_ZFS_STAGE1_5 2641b8adde7SWilliam Kucharski # else 2651b8adde7SWilliam Kucharski # error "unknown Stage 2" 2661b8adde7SWilliam Kucharski # endif 2671b8adde7SWilliam Kucharski #endif 2681b8adde7SWilliam Kucharski 2691b8adde7SWilliam Kucharski /* 2701b8adde7SWilliam Kucharski * defines for use when switching between real and protected mode 2711b8adde7SWilliam Kucharski */ 2721b8adde7SWilliam Kucharski 2731b8adde7SWilliam Kucharski #define CR0_PE_ON 0x1 2741b8adde7SWilliam Kucharski #define CR0_PE_OFF 0xfffffffe 2751b8adde7SWilliam Kucharski #define PROT_MODE_CSEG 0x8 2761b8adde7SWilliam Kucharski #define PROT_MODE_DSEG 0x10 2771b8adde7SWilliam Kucharski #define PSEUDO_RM_CSEG 0x18 2781b8adde7SWilliam Kucharski #define PSEUDO_RM_DSEG 0x20 2791b8adde7SWilliam Kucharski #define STACKOFF (0x2000 - 0x10) 2801b8adde7SWilliam Kucharski #define PROTSTACKINIT (FSYS_BUF - 0x10) 2811b8adde7SWilliam Kucharski 2821b8adde7SWilliam Kucharski 2831b8adde7SWilliam Kucharski /* 2841b8adde7SWilliam Kucharski * Assembly code defines 2851b8adde7SWilliam Kucharski * 2861b8adde7SWilliam Kucharski * "EXT_C" is assumed to be defined in the Makefile by the configure 2871b8adde7SWilliam Kucharski * command. 2881b8adde7SWilliam Kucharski */ 2891b8adde7SWilliam Kucharski 2901b8adde7SWilliam Kucharski #define ENTRY(x) .globl EXT_C(x) ; EXT_C(x): 2911b8adde7SWilliam Kucharski #define VARIABLE(x) ENTRY(x) 2921b8adde7SWilliam Kucharski 2931b8adde7SWilliam Kucharski 2941b8adde7SWilliam Kucharski #define K_RDWR 0x60 /* keyboard data & cmds (read/write) */ 2951b8adde7SWilliam Kucharski #define K_STATUS 0x64 /* keyboard status */ 2961b8adde7SWilliam Kucharski #define K_CMD 0x64 /* keybd ctlr command (write-only) */ 2971b8adde7SWilliam Kucharski 2981b8adde7SWilliam Kucharski #define K_OBUF_FUL 0x01 /* output buffer full */ 2991b8adde7SWilliam Kucharski #define K_IBUF_FUL 0x02 /* input buffer full */ 3001b8adde7SWilliam Kucharski 3011b8adde7SWilliam Kucharski #define KC_CMD_WIN 0xd0 /* read output port */ 3021b8adde7SWilliam Kucharski #define KC_CMD_WOUT 0xd1 /* write output port */ 3031b8adde7SWilliam Kucharski #define KB_OUTPUT_MASK 0xdd /* enable output buffer full interrupt 3041b8adde7SWilliam Kucharski enable data line 3051b8adde7SWilliam Kucharski enable clock line */ 3061b8adde7SWilliam Kucharski #define KB_A20_ENABLE 0x02 3071b8adde7SWilliam Kucharski 3081b8adde7SWilliam Kucharski /* Codes for getchar. */ 3091b8adde7SWilliam Kucharski #define ASCII_CHAR(x) ((x) & 0xFF) 3101b8adde7SWilliam Kucharski #if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES) 3111b8adde7SWilliam Kucharski # define KEY_LEFT 0x4B00 3121b8adde7SWilliam Kucharski # define KEY_RIGHT 0x4D00 3131b8adde7SWilliam Kucharski # define KEY_UP 0x4800 3141b8adde7SWilliam Kucharski # define KEY_DOWN 0x5000 3151b8adde7SWilliam Kucharski # define KEY_IC 0x5200 /* insert char */ 3161b8adde7SWilliam Kucharski # define KEY_DC 0x5300 /* delete char */ 3171b8adde7SWilliam Kucharski # define KEY_BACKSPACE 0x0008 3181b8adde7SWilliam Kucharski # define KEY_HOME 0x4700 3191b8adde7SWilliam Kucharski # define KEY_END 0x4F00 3201b8adde7SWilliam Kucharski # define KEY_NPAGE 0x5100 3211b8adde7SWilliam Kucharski # define KEY_PPAGE 0x4900 3221b8adde7SWilliam Kucharski # define A_NORMAL 0x7 3231b8adde7SWilliam Kucharski # define A_REVERSE 0x70 3241b8adde7SWilliam Kucharski #elif defined(HAVE_NCURSES_CURSES_H) 3251b8adde7SWilliam Kucharski # include <ncurses/curses.h> 3261b8adde7SWilliam Kucharski #elif defined(HAVE_NCURSES_H) 3271b8adde7SWilliam Kucharski # include <ncurses.h> 3281b8adde7SWilliam Kucharski #elif defined(HAVE_CURSES_H) 3291b8adde7SWilliam Kucharski # include <curses.h> 3301b8adde7SWilliam Kucharski #endif 3311b8adde7SWilliam Kucharski 3321b8adde7SWilliam Kucharski /* In old BSD curses, A_NORMAL and A_REVERSE are not defined, so we 3331b8adde7SWilliam Kucharski define them here if they are undefined. */ 3341b8adde7SWilliam Kucharski #ifndef A_NORMAL 3351b8adde7SWilliam Kucharski # define A_NORMAL 0 3361b8adde7SWilliam Kucharski #endif /* ! A_NORMAL */ 3371b8adde7SWilliam Kucharski #ifndef A_REVERSE 3381b8adde7SWilliam Kucharski # ifdef A_STANDOUT 3391b8adde7SWilliam Kucharski # define A_REVERSE A_STANDOUT 3401b8adde7SWilliam Kucharski # else /* ! A_STANDOUT */ 3411b8adde7SWilliam Kucharski # define A_REVERSE 0 3421b8adde7SWilliam Kucharski # endif /* ! A_STANDOUT */ 3431b8adde7SWilliam Kucharski #endif /* ! A_REVERSE */ 3441b8adde7SWilliam Kucharski 3451b8adde7SWilliam Kucharski /* Define ACS_* ourselves, since the definitions are not consistent among 3461b8adde7SWilliam Kucharski various curses implementations. */ 3471b8adde7SWilliam Kucharski #undef ACS_ULCORNER 3481b8adde7SWilliam Kucharski #undef ACS_URCORNER 3491b8adde7SWilliam Kucharski #undef ACS_LLCORNER 3501b8adde7SWilliam Kucharski #undef ACS_LRCORNER 3511b8adde7SWilliam Kucharski #undef ACS_HLINE 3521b8adde7SWilliam Kucharski #undef ACS_VLINE 3531b8adde7SWilliam Kucharski #undef ACS_LARROW 3541b8adde7SWilliam Kucharski #undef ACS_RARROW 3551b8adde7SWilliam Kucharski #undef ACS_UARROW 3561b8adde7SWilliam Kucharski #undef ACS_DARROW 3571b8adde7SWilliam Kucharski 3581b8adde7SWilliam Kucharski #define ACS_ULCORNER '+' 3591b8adde7SWilliam Kucharski #define ACS_URCORNER '+' 3601b8adde7SWilliam Kucharski #define ACS_LLCORNER '+' 3611b8adde7SWilliam Kucharski #define ACS_LRCORNER '+' 3621b8adde7SWilliam Kucharski #define ACS_HLINE '-' 3631b8adde7SWilliam Kucharski #define ACS_VLINE '|' 3641b8adde7SWilliam Kucharski #define ACS_LARROW '<' 3651b8adde7SWilliam Kucharski #define ACS_RARROW '>' 3661b8adde7SWilliam Kucharski #define ACS_UARROW '^' 3671b8adde7SWilliam Kucharski #define ACS_DARROW 'v' 3681b8adde7SWilliam Kucharski 3691b8adde7SWilliam Kucharski /* Special graphics characters for IBM displays. */ 3701b8adde7SWilliam Kucharski #define DISP_UL 218 3711b8adde7SWilliam Kucharski #define DISP_UR 191 3721b8adde7SWilliam Kucharski #define DISP_LL 192 3731b8adde7SWilliam Kucharski #define DISP_LR 217 3741b8adde7SWilliam Kucharski #define DISP_HORIZ 196 3751b8adde7SWilliam Kucharski #define DISP_VERT 179 3761b8adde7SWilliam Kucharski #define DISP_LEFT 0x1b 3771b8adde7SWilliam Kucharski #define DISP_RIGHT 0x1a 3781b8adde7SWilliam Kucharski #define DISP_UP 0x18 3791b8adde7SWilliam Kucharski #define DISP_DOWN 0x19 3801b8adde7SWilliam Kucharski 3811b8adde7SWilliam Kucharski /* Remap some libc-API-compatible function names so that we prevent 3821b8adde7SWilliam Kucharski circularararity. */ 3831b8adde7SWilliam Kucharski #ifndef WITHOUT_LIBC_STUBS 3841b8adde7SWilliam Kucharski #define memmove grub_memmove 3851b8adde7SWilliam Kucharski #define memcpy grub_memmove /* we don't need a separate memcpy */ 3861b8adde7SWilliam Kucharski #define memset grub_memset 3871b8adde7SWilliam Kucharski #undef isspace 3881b8adde7SWilliam Kucharski #define isspace grub_isspace 3891b8adde7SWilliam Kucharski #define printf grub_printf 3901b8adde7SWilliam Kucharski #define sprintf grub_sprintf 3911b8adde7SWilliam Kucharski #undef putchar 3921b8adde7SWilliam Kucharski #define putchar grub_putchar 3931b8adde7SWilliam Kucharski #define strncat grub_strncat 3941b8adde7SWilliam Kucharski #define strstr grub_strstr 3951b8adde7SWilliam Kucharski #define memcmp grub_memcmp 3961b8adde7SWilliam Kucharski #define strcmp grub_strcmp 3971b8adde7SWilliam Kucharski #define tolower grub_tolower 3981b8adde7SWilliam Kucharski #define strlen grub_strlen 3991b8adde7SWilliam Kucharski #define strcpy grub_strcpy 4001b8adde7SWilliam Kucharski #endif /* WITHOUT_LIBC_STUBS */ 4011b8adde7SWilliam Kucharski 4021b8adde7SWilliam Kucharski #define UNDI_STACK (512 + 64) << 10 4031b8adde7SWilliam Kucharski #define UNDI_STACK_SEG (UNDI_STACK >> 4) /* PXE load GRUB here */ 4041b8adde7SWilliam Kucharski #define UNDI_STACK_OFF (0x10000 - 0x10) 4051b8adde7SWilliam Kucharski 4061b8adde7SWilliam Kucharski #ifndef ASM_FILE 4071b8adde7SWilliam Kucharski /* 4081b8adde7SWilliam Kucharski * Below this should be ONLY defines and other constructs for C code. 4091b8adde7SWilliam Kucharski */ 4101b8adde7SWilliam Kucharski 4111b8adde7SWilliam Kucharski /* multiboot stuff */ 4121b8adde7SWilliam Kucharski 4131b8adde7SWilliam Kucharski #include "mb_header.h" 4141b8adde7SWilliam Kucharski #include "mb_info.h" 4151b8adde7SWilliam Kucharski 4161b8adde7SWilliam Kucharski /* For the Linux/i386 boot protocol version 2.03. */ 4171b8adde7SWilliam Kucharski struct linux_kernel_header 4181b8adde7SWilliam Kucharski { 4191b8adde7SWilliam Kucharski char code1[0x0020]; 4201b8adde7SWilliam Kucharski unsigned short cl_magic; /* Magic number 0xA33F */ 4211b8adde7SWilliam Kucharski unsigned short cl_offset; /* The offset of command line */ 4221b8adde7SWilliam Kucharski char code2[0x01F1 - 0x0020 - 2 - 2]; 4231b8adde7SWilliam Kucharski unsigned char setup_sects; /* The size of the setup in sectors */ 4241b8adde7SWilliam Kucharski unsigned short root_flags; /* If the root is mounted readonly */ 4251b8adde7SWilliam Kucharski unsigned short syssize; /* obsolete */ 4261b8adde7SWilliam Kucharski unsigned short swap_dev; /* obsolete */ 4271b8adde7SWilliam Kucharski unsigned short ram_size; /* obsolete */ 4281b8adde7SWilliam Kucharski unsigned short vid_mode; /* Video mode control */ 4291b8adde7SWilliam Kucharski unsigned short root_dev; /* Default root device number */ 4301b8adde7SWilliam Kucharski unsigned short boot_flag; /* 0xAA55 magic number */ 4311b8adde7SWilliam Kucharski unsigned short jump; /* Jump instruction */ 4321b8adde7SWilliam Kucharski unsigned long header; /* Magic signature "HdrS" */ 4331b8adde7SWilliam Kucharski unsigned short version; /* Boot protocol version supported */ 4341b8adde7SWilliam Kucharski unsigned long realmode_swtch; /* Boot loader hook */ 4351b8adde7SWilliam Kucharski unsigned long start_sys; /* Points to kernel version string */ 4361b8adde7SWilliam Kucharski unsigned char type_of_loader; /* Boot loader identifier */ 4371b8adde7SWilliam Kucharski unsigned char loadflags; /* Boot protocol option flags */ 4381b8adde7SWilliam Kucharski unsigned short setup_move_size; /* Move to high memory size */ 4391b8adde7SWilliam Kucharski unsigned long code32_start; /* Boot loader hook */ 4401b8adde7SWilliam Kucharski unsigned long ramdisk_image; /* initrd load address */ 4411b8adde7SWilliam Kucharski unsigned long ramdisk_size; /* initrd size */ 4421b8adde7SWilliam Kucharski unsigned long bootsect_kludge; /* obsolete */ 4431b8adde7SWilliam Kucharski unsigned short heap_end_ptr; /* Free memory after setup end */ 4441b8adde7SWilliam Kucharski unsigned short pad1; /* Unused */ 4451b8adde7SWilliam Kucharski char *cmd_line_ptr; /* Points to the kernel command line */ 4461b8adde7SWilliam Kucharski unsigned long initrd_addr_max; /* The highest address of initrd */ 4471b8adde7SWilliam Kucharski } __attribute__ ((packed)); 4481b8adde7SWilliam Kucharski 4491b8adde7SWilliam Kucharski /* Memory map address range descriptor used by GET_MMAP_ENTRY. */ 4501b8adde7SWilliam Kucharski struct mmar_desc 4511b8adde7SWilliam Kucharski { 4521b8adde7SWilliam Kucharski unsigned long desc_len; /* Size of this descriptor. */ 4531b8adde7SWilliam Kucharski unsigned long long addr; /* Base address. */ 4541b8adde7SWilliam Kucharski unsigned long long length; /* Length in bytes. */ 4551b8adde7SWilliam Kucharski unsigned long type; /* Type of address range. */ 4561b8adde7SWilliam Kucharski } __attribute__ ((packed)); 4571b8adde7SWilliam Kucharski 4581b8adde7SWilliam Kucharski /* VBE controller information. */ 4591b8adde7SWilliam Kucharski struct vbe_controller 4601b8adde7SWilliam Kucharski { 4611b8adde7SWilliam Kucharski unsigned char signature[4]; 4621b8adde7SWilliam Kucharski unsigned short version; 4631b8adde7SWilliam Kucharski unsigned long oem_string; 4641b8adde7SWilliam Kucharski unsigned long capabilities; 4651b8adde7SWilliam Kucharski unsigned long video_mode; 4661b8adde7SWilliam Kucharski unsigned short total_memory; 4671b8adde7SWilliam Kucharski unsigned short oem_software_rev; 4681b8adde7SWilliam Kucharski unsigned long oem_vendor_name; 4691b8adde7SWilliam Kucharski unsigned long oem_product_name; 4701b8adde7SWilliam Kucharski unsigned long oem_product_rev; 4711b8adde7SWilliam Kucharski unsigned char reserved[222]; 4721b8adde7SWilliam Kucharski unsigned char oem_data[256]; 4731b8adde7SWilliam Kucharski } __attribute__ ((packed)); 4741b8adde7SWilliam Kucharski 4751b8adde7SWilliam Kucharski /* VBE mode information. */ 4761b8adde7SWilliam Kucharski struct vbe_mode 4771b8adde7SWilliam Kucharski { 4781b8adde7SWilliam Kucharski unsigned short mode_attributes; 4791b8adde7SWilliam Kucharski unsigned char win_a_attributes; 4801b8adde7SWilliam Kucharski unsigned char win_b_attributes; 4811b8adde7SWilliam Kucharski unsigned short win_granularity; 4821b8adde7SWilliam Kucharski unsigned short win_size; 4831b8adde7SWilliam Kucharski unsigned short win_a_segment; 4841b8adde7SWilliam Kucharski unsigned short win_b_segment; 4851b8adde7SWilliam Kucharski unsigned long win_func; 4861b8adde7SWilliam Kucharski unsigned short bytes_per_scanline; 4871b8adde7SWilliam Kucharski 4881b8adde7SWilliam Kucharski /* >=1.2 */ 4891b8adde7SWilliam Kucharski unsigned short x_resolution; 4901b8adde7SWilliam Kucharski unsigned short y_resolution; 4911b8adde7SWilliam Kucharski unsigned char x_char_size; 4921b8adde7SWilliam Kucharski unsigned char y_char_size; 4931b8adde7SWilliam Kucharski unsigned char number_of_planes; 4941b8adde7SWilliam Kucharski unsigned char bits_per_pixel; 4951b8adde7SWilliam Kucharski unsigned char number_of_banks; 4961b8adde7SWilliam Kucharski unsigned char memory_model; 4971b8adde7SWilliam Kucharski unsigned char bank_size; 4981b8adde7SWilliam Kucharski unsigned char number_of_image_pages; 4991b8adde7SWilliam Kucharski unsigned char reserved0; 5001b8adde7SWilliam Kucharski 5011b8adde7SWilliam Kucharski /* direct color */ 5021b8adde7SWilliam Kucharski unsigned char red_mask_size; 5031b8adde7SWilliam Kucharski unsigned char red_field_position; 5041b8adde7SWilliam Kucharski unsigned char green_mask_size; 5051b8adde7SWilliam Kucharski unsigned char green_field_position; 5061b8adde7SWilliam Kucharski unsigned char blue_mask_size; 5071b8adde7SWilliam Kucharski unsigned char blue_field_position; 5081b8adde7SWilliam Kucharski unsigned char reserved_mask_size; 5091b8adde7SWilliam Kucharski unsigned char reserved_field_position; 5101b8adde7SWilliam Kucharski unsigned char direct_color_mode_info; 5111b8adde7SWilliam Kucharski 5121b8adde7SWilliam Kucharski /* >=2.0 */ 5131b8adde7SWilliam Kucharski unsigned long phys_base; 5141b8adde7SWilliam Kucharski unsigned long reserved1; 5151b8adde7SWilliam Kucharski unsigned short reversed2; 5161b8adde7SWilliam Kucharski 5171b8adde7SWilliam Kucharski /* >=3.0 */ 5181b8adde7SWilliam Kucharski unsigned short linear_bytes_per_scanline; 5191b8adde7SWilliam Kucharski unsigned char banked_number_of_image_pages; 5201b8adde7SWilliam Kucharski unsigned char linear_number_of_image_pages; 5211b8adde7SWilliam Kucharski unsigned char linear_red_mask_size; 5221b8adde7SWilliam Kucharski unsigned char linear_red_field_position; 5231b8adde7SWilliam Kucharski unsigned char linear_green_mask_size; 5241b8adde7SWilliam Kucharski unsigned char linear_green_field_position; 5251b8adde7SWilliam Kucharski unsigned char linear_blue_mask_size; 5261b8adde7SWilliam Kucharski unsigned char linear_blue_field_position; 5271b8adde7SWilliam Kucharski unsigned char linear_reserved_mask_size; 5281b8adde7SWilliam Kucharski unsigned char linear_reserved_field_position; 5291b8adde7SWilliam Kucharski unsigned long max_pixel_clock; 5301b8adde7SWilliam Kucharski 5311b8adde7SWilliam Kucharski unsigned char reserved3[189]; 5321b8adde7SWilliam Kucharski } __attribute__ ((packed)); 5331b8adde7SWilliam Kucharski 5341b8adde7SWilliam Kucharski #undef NULL 5351b8adde7SWilliam Kucharski #define NULL ((void *) 0) 5361b8adde7SWilliam Kucharski 5371b8adde7SWilliam Kucharski /* Error codes (descriptions are in common.c) */ 5381b8adde7SWilliam Kucharski typedef enum 5391b8adde7SWilliam Kucharski { 5401b8adde7SWilliam Kucharski ERR_NONE = 0, 5411b8adde7SWilliam Kucharski ERR_BAD_FILENAME, 5421b8adde7SWilliam Kucharski ERR_BAD_FILETYPE, 5431b8adde7SWilliam Kucharski ERR_BAD_GZIP_DATA, 5441b8adde7SWilliam Kucharski ERR_BAD_GZIP_HEADER, 5451b8adde7SWilliam Kucharski ERR_BAD_PART_TABLE, 5461b8adde7SWilliam Kucharski ERR_BAD_VERSION, 5471b8adde7SWilliam Kucharski ERR_BELOW_1MB, 5481b8adde7SWilliam Kucharski ERR_BOOT_COMMAND, 5491b8adde7SWilliam Kucharski ERR_BOOT_FAILURE, 5501b8adde7SWilliam Kucharski ERR_BOOT_FEATURES, 5511b8adde7SWilliam Kucharski ERR_DEV_FORMAT, 5521b8adde7SWilliam Kucharski ERR_DEV_VALUES, 5531b8adde7SWilliam Kucharski ERR_EXEC_FORMAT, 5541b8adde7SWilliam Kucharski ERR_FILELENGTH, 5551b8adde7SWilliam Kucharski ERR_FILE_NOT_FOUND, 5561b8adde7SWilliam Kucharski ERR_FSYS_CORRUPT, 5571b8adde7SWilliam Kucharski ERR_FSYS_MOUNT, 5581b8adde7SWilliam Kucharski ERR_GEOM, 5591b8adde7SWilliam Kucharski ERR_NEED_LX_KERNEL, 5601b8adde7SWilliam Kucharski ERR_NEED_MB_KERNEL, 5611b8adde7SWilliam Kucharski ERR_NO_DISK, 5621b8adde7SWilliam Kucharski ERR_NO_PART, 5631b8adde7SWilliam Kucharski ERR_NUMBER_PARSING, 5641b8adde7SWilliam Kucharski ERR_OUTSIDE_PART, 5651b8adde7SWilliam Kucharski ERR_READ, 5661b8adde7SWilliam Kucharski ERR_SYMLINK_LOOP, 5671b8adde7SWilliam Kucharski ERR_UNRECOGNIZED, 5681b8adde7SWilliam Kucharski ERR_WONT_FIT, 5691b8adde7SWilliam Kucharski ERR_WRITE, 5701b8adde7SWilliam Kucharski ERR_BAD_ARGUMENT, 5711b8adde7SWilliam Kucharski ERR_UNALIGNED, 5721b8adde7SWilliam Kucharski ERR_PRIVILEGED, 5731b8adde7SWilliam Kucharski ERR_DEV_NEED_INIT, 5741b8adde7SWilliam Kucharski ERR_NO_DISK_SPACE, 5751b8adde7SWilliam Kucharski ERR_NUMBER_OVERFLOW, 5761b8adde7SWilliam Kucharski ERR_BAD_GZIP_CRC, 5771b8adde7SWilliam Kucharski ERR_FILESYSTEM_NOT_FOUND, 5781b8adde7SWilliam Kucharski ERR_NO_BOOTPATH, 5791b8adde7SWilliam Kucharski ERR_NEWER_VERSION, 5809b4e3ac2SWilliam Kucharski ERR_NOTXPM, 5819b4e3ac2SWilliam Kucharski ERR_TOOMANYCOLORS, 5829b4e3ac2SWilliam Kucharski ERR_CORRUPTXPM, 583a5602e1bSKeith M Wesolowski ERR_NOVAR, 5841b8adde7SWilliam Kucharski MAX_ERR_NUM 5851b8adde7SWilliam Kucharski } grub_error_t; 5861b8adde7SWilliam Kucharski 5872506833eSJan Setje-Eilers typedef enum 5882506833eSJan Setje-Eilers { 5892506833eSJan Setje-Eilers CFG_HARDCODED, 5902506833eSJan Setje-Eilers CFG_150, 5912506833eSJan Setje-Eilers CFG_MAC, 5922506833eSJan Setje-Eilers CFG_BOOTFILE 5932506833eSJan Setje-Eilers } configfile_origin_t; 5942506833eSJan Setje-Eilers 5951b8adde7SWilliam Kucharski extern unsigned long install_partition; 5961b8adde7SWilliam Kucharski extern unsigned long boot_drive; 5971b8adde7SWilliam Kucharski extern unsigned long install_second_sector; 5981b8adde7SWilliam Kucharski extern struct apm_info apm_bios_info; 5991b8adde7SWilliam Kucharski extern unsigned long boot_part_addr; 6001b8adde7SWilliam Kucharski extern int saved_entryno; 6011b8adde7SWilliam Kucharski extern unsigned char force_lba; 6021b8adde7SWilliam Kucharski extern char version_string[]; 6031b8adde7SWilliam Kucharski extern char config_file[]; 6042506833eSJan Setje-Eilers extern char *bootfile; 6052506833eSJan Setje-Eilers extern configfile_origin_t configfile_origin; 6061b8adde7SWilliam Kucharski extern unsigned long linux_text_len; 6071b8adde7SWilliam Kucharski extern char *linux_data_tmp_addr; 6081b8adde7SWilliam Kucharski extern char *linux_data_real_addr; 6091b8adde7SWilliam Kucharski 6101b8adde7SWilliam Kucharski #ifdef GRUB_UTIL 6111b8adde7SWilliam Kucharski /* If not using config file, this variable is set to zero, 6121b8adde7SWilliam Kucharski otherwise non-zero. */ 6131b8adde7SWilliam Kucharski extern int use_config_file; 6141b8adde7SWilliam Kucharski /* If using the preset menu, this variable is set to non-zero, 6151b8adde7SWilliam Kucharski otherwise zero. */ 6161b8adde7SWilliam Kucharski extern int use_preset_menu; 6171b8adde7SWilliam Kucharski /* If not using curses, this variable is set to zero, otherwise non-zero. */ 6181b8adde7SWilliam Kucharski extern int use_curses; 6191b8adde7SWilliam Kucharski /* The flag for verbose messages. */ 6201b8adde7SWilliam Kucharski extern int verbose; 6211b8adde7SWilliam Kucharski /* The flag for read-only. */ 6221b8adde7SWilliam Kucharski extern int read_only; 6231b8adde7SWilliam Kucharski /* The number of floppies to be probed. */ 6241b8adde7SWilliam Kucharski extern int floppy_disks; 6251b8adde7SWilliam Kucharski /* The map between BIOS drives and UNIX device file names. */ 6261b8adde7SWilliam Kucharski extern char **device_map; 6271b8adde7SWilliam Kucharski /* The filename which stores the information about a device map. */ 6281b8adde7SWilliam Kucharski extern char *device_map_file; 6291b8adde7SWilliam Kucharski /* The array of geometries. */ 6301b8adde7SWilliam Kucharski extern struct geometry *disks; 6311b8adde7SWilliam Kucharski /* Assign DRIVE to a device name DEVICE. */ 6321b8adde7SWilliam Kucharski extern void assign_device_name (int drive, const char *device); 6331b8adde7SWilliam Kucharski #endif 6341b8adde7SWilliam Kucharski 6351b8adde7SWilliam Kucharski #ifndef STAGE1_5 6361b8adde7SWilliam Kucharski /* GUI interface variables. */ 6371b8adde7SWilliam Kucharski # define MAX_FALLBACK_ENTRIES 8 6381b8adde7SWilliam Kucharski extern int fallback_entries[MAX_FALLBACK_ENTRIES]; 6391b8adde7SWilliam Kucharski extern int fallback_entryno; 6401b8adde7SWilliam Kucharski extern int default_entry; 6411b8adde7SWilliam Kucharski extern int current_entryno; 6421b8adde7SWilliam Kucharski 643a5602e1bSKeith M Wesolowski extern unsigned int min_mem64; 644a5602e1bSKeith M Wesolowski 6451b8adde7SWilliam Kucharski /* The constants for password types. */ 6461b8adde7SWilliam Kucharski typedef enum 6471b8adde7SWilliam Kucharski { 6481b8adde7SWilliam Kucharski PASSWORD_PLAIN, 6491b8adde7SWilliam Kucharski PASSWORD_MD5, 6501b8adde7SWilliam Kucharski PASSWORD_UNSUPPORTED 6511b8adde7SWilliam Kucharski } 6521b8adde7SWilliam Kucharski password_t; 6531b8adde7SWilliam Kucharski 6541b8adde7SWilliam Kucharski extern char *password; 6551b8adde7SWilliam Kucharski extern password_t password_type; 6561b8adde7SWilliam Kucharski extern int auth; 6571b8adde7SWilliam Kucharski extern char commands[]; 6581b8adde7SWilliam Kucharski 6591b8adde7SWilliam Kucharski /* For `more'-like feature. */ 6601b8adde7SWilliam Kucharski extern int max_lines; 6611b8adde7SWilliam Kucharski extern int count_lines; 6621b8adde7SWilliam Kucharski extern int use_pager; 6631b8adde7SWilliam Kucharski #endif 6641b8adde7SWilliam Kucharski 6651b8adde7SWilliam Kucharski #ifndef NO_DECOMPRESSION 6661b8adde7SWilliam Kucharski extern int no_decompression; 6671b8adde7SWilliam Kucharski extern int compressed_file; 6681b8adde7SWilliam Kucharski #endif 6691b8adde7SWilliam Kucharski 6701b8adde7SWilliam Kucharski /* instrumentation variables */ 6719890706eSHans Rosenfeld extern void (*disk_read_hook) (unsigned long long, int, int); 6729890706eSHans Rosenfeld extern void (*disk_read_func) (unsigned long long, int, int); 6731b8adde7SWilliam Kucharski 6741b8adde7SWilliam Kucharski #ifndef STAGE1_5 6751b8adde7SWilliam Kucharski /* The flag for debug mode. */ 6761b8adde7SWilliam Kucharski extern int debug; 6771b8adde7SWilliam Kucharski #endif /* STAGE1_5 */ 6781b8adde7SWilliam Kucharski 6791b8adde7SWilliam Kucharski extern unsigned long current_drive; 6801b8adde7SWilliam Kucharski extern unsigned long current_partition; 6811b8adde7SWilliam Kucharski extern char current_rootpool[MAXNAMELEN]; 6821b8adde7SWilliam Kucharski extern char current_bootfs[MAXNAMELEN]; 6831b8adde7SWilliam Kucharski extern unsigned long long current_bootfs_obj; 684ffb5616eSLin Ling extern char current_bootpath[MAXPATHLEN]; 685ffb5616eSLin Ling extern char current_devid[MAXPATHLEN]; 686*1a065e93SAndrew Stormont extern unsigned long long current_bootguid; 687*1a065e93SAndrew Stormont extern unsigned long long current_bootvdev; 6881b8adde7SWilliam Kucharski extern int is_zfs_mount; 6891b8adde7SWilliam Kucharski extern unsigned long best_drive; 6901b8adde7SWilliam Kucharski extern unsigned long best_part; 6911b8adde7SWilliam Kucharski extern int find_best_root; 6921b8adde7SWilliam Kucharski 6931b8adde7SWilliam Kucharski extern int fsys_type; 6941b8adde7SWilliam Kucharski 6951b8adde7SWilliam Kucharski /* The information for a disk geometry. The CHS information is only for 6961b8adde7SWilliam Kucharski DOS/Partition table compatibility, and the real number of sectors is 6971b8adde7SWilliam Kucharski stored in TOTAL_SECTORS. */ 6981b8adde7SWilliam Kucharski struct geometry 6991b8adde7SWilliam Kucharski { 7001b8adde7SWilliam Kucharski /* The number of cylinders */ 7011b8adde7SWilliam Kucharski unsigned long cylinders; 7021b8adde7SWilliam Kucharski /* The number of heads */ 7031b8adde7SWilliam Kucharski unsigned long heads; 7041b8adde7SWilliam Kucharski /* The number of sectors */ 7051b8adde7SWilliam Kucharski unsigned long sectors; 7061b8adde7SWilliam Kucharski /* The total number of sectors */ 707828d47c1SShidokht Yadegari unsigned long long total_sectors; 7081b8adde7SWilliam Kucharski /* Device sector size */ 7091b8adde7SWilliam Kucharski unsigned long sector_size; 7101b8adde7SWilliam Kucharski /* Flags */ 7111b8adde7SWilliam Kucharski unsigned long flags; 7121b8adde7SWilliam Kucharski }; 7131b8adde7SWilliam Kucharski 7149890706eSHans Rosenfeld extern unsigned long long part_start; 7159890706eSHans Rosenfeld extern unsigned long long part_length; 7161b8adde7SWilliam Kucharski 7171b8adde7SWilliam Kucharski extern int current_slice; 7181b8adde7SWilliam Kucharski 7191b8adde7SWilliam Kucharski extern int buf_drive; 7209890706eSHans Rosenfeld #define BUF_CACHE_INVALID (-1ULL) 7219890706eSHans Rosenfeld extern unsigned long long buf_track; 7221b8adde7SWilliam Kucharski extern struct geometry buf_geom; 7231b8adde7SWilliam Kucharski 7241b8adde7SWilliam Kucharski /* these are the current file position and maximum file position */ 7251b8adde7SWilliam Kucharski extern int filepos; 7261b8adde7SWilliam Kucharski extern int filemax; 7271b8adde7SWilliam Kucharski 7281b8adde7SWilliam Kucharski /* 7291b8adde7SWilliam Kucharski * Common BIOS/boot data. 7301b8adde7SWilliam Kucharski */ 7311b8adde7SWilliam Kucharski 7321b8adde7SWilliam Kucharski extern struct multiboot_info mbi; 7331b8adde7SWilliam Kucharski extern unsigned long saved_drive; 7341b8adde7SWilliam Kucharski extern unsigned long saved_partition; 7351b8adde7SWilliam Kucharski extern unsigned long cdrom_drive; 7361b8adde7SWilliam Kucharski #ifndef STAGE1_5 7371b8adde7SWilliam Kucharski #ifdef SOLARIS_NETBOOT 7381b8adde7SWilliam Kucharski extern unsigned long dhcpack_length; 7391b8adde7SWilliam Kucharski extern unsigned long dhcpack_buf; 7401b8adde7SWilliam Kucharski #endif 7411b8adde7SWilliam Kucharski extern unsigned long saved_mem_upper; 7421b8adde7SWilliam Kucharski extern unsigned long extended_memory; 7431b8adde7SWilliam Kucharski #endif 7441b8adde7SWilliam Kucharski 7451b8adde7SWilliam Kucharski /* 7461b8adde7SWilliam Kucharski * Error variables. 7471b8adde7SWilliam Kucharski */ 7481b8adde7SWilliam Kucharski 7491b8adde7SWilliam Kucharski extern grub_error_t errnum; 7501b8adde7SWilliam Kucharski extern char *err_list[]; 7511b8adde7SWilliam Kucharski 7521b8adde7SWilliam Kucharski /* don't print geeky noise */ 7531b8adde7SWilliam Kucharski typedef enum 7541b8adde7SWilliam Kucharski { 7551b8adde7SWilliam Kucharski SILENT, 7561b8adde7SWilliam Kucharski VERBOSE, 7571b8adde7SWilliam Kucharski DEFER_SILENT, 7581b8adde7SWilliam Kucharski DEFER_VERBOSE 7591b8adde7SWilliam Kucharski } silent_status; 7601b8adde7SWilliam Kucharski 7611b8adde7SWilliam Kucharski /* one screen worth of messages 80x24 = 1920 chars -- more with newlines */ 7621b8adde7SWilliam Kucharski #define SCREENBUF 2000 7631b8adde7SWilliam Kucharski 7641b8adde7SWilliam Kucharski struct silentbuf { 7651b8adde7SWilliam Kucharski silent_status status; 7661b8adde7SWilliam Kucharski int looped; 7671b8adde7SWilliam Kucharski char buffer[SCREENBUF]; 7681b8adde7SWilliam Kucharski char *buffer_start; 7691b8adde7SWilliam Kucharski }; 7701b8adde7SWilliam Kucharski 7711b8adde7SWilliam Kucharski extern struct silentbuf silent; 7721b8adde7SWilliam Kucharski extern int reset_term; 7731b8adde7SWilliam Kucharski 7741b8adde7SWilliam Kucharski /* Simplify declaration of entry_addr. */ 7751b8adde7SWilliam Kucharski typedef void (*entry_func) (int, int, int, int, int, int) 7761b8adde7SWilliam Kucharski __attribute__ ((noreturn)); 7771b8adde7SWilliam Kucharski 7781b8adde7SWilliam Kucharski extern entry_func entry_addr; 7791b8adde7SWilliam Kucharski 7801b8adde7SWilliam Kucharski /* Enter the stage1.5/stage2 C code after the stack is set up. */ 7811b8adde7SWilliam Kucharski void cmain (void); 7821b8adde7SWilliam Kucharski 7831b8adde7SWilliam Kucharski /* Halt the processor (called after an unrecoverable error). */ 7841b8adde7SWilliam Kucharski void stop (void) __attribute__ ((noreturn)); 7851b8adde7SWilliam Kucharski 7861b8adde7SWilliam Kucharski /* Reboot the system. */ 7871b8adde7SWilliam Kucharski void grub_reboot (void) __attribute__ ((noreturn)); 7881b8adde7SWilliam Kucharski 7891b8adde7SWilliam Kucharski /* Halt the system, using APM if possible. If NO_APM is true, don't use 7901b8adde7SWilliam Kucharski APM even if it is available. */ 7911b8adde7SWilliam Kucharski void grub_halt (int no_apm) __attribute__ ((noreturn)); 7921b8adde7SWilliam Kucharski 7931b8adde7SWilliam Kucharski /* Copy MAP to the drive map and set up int13_handler. */ 7941b8adde7SWilliam Kucharski void set_int13_handler (unsigned short *map); 7951b8adde7SWilliam Kucharski 7961b8adde7SWilliam Kucharski /* Set up int15_handler. */ 7971b8adde7SWilliam Kucharski void set_int15_handler (void); 7981b8adde7SWilliam Kucharski 7991b8adde7SWilliam Kucharski /* Restore the original int15 handler. */ 8001b8adde7SWilliam Kucharski void unset_int15_handler (void); 8011b8adde7SWilliam Kucharski 8021b8adde7SWilliam Kucharski /* Track the int13 handler to probe I/O address space. */ 8031b8adde7SWilliam Kucharski void track_int13 (int drive); 8041b8adde7SWilliam Kucharski 8051b8adde7SWilliam Kucharski /* The key map. */ 8061b8adde7SWilliam Kucharski extern unsigned short bios_key_map[]; 8071b8adde7SWilliam Kucharski extern unsigned short ascii_key_map[]; 8081b8adde7SWilliam Kucharski extern unsigned short io_map[]; 8091b8adde7SWilliam Kucharski 8101b8adde7SWilliam Kucharski /* calls for direct boot-loader chaining */ 8111b8adde7SWilliam Kucharski void chain_stage1 (unsigned long segment, unsigned long offset, 8121b8adde7SWilliam Kucharski unsigned long part_table_addr) 8131b8adde7SWilliam Kucharski __attribute__ ((noreturn)); 8141b8adde7SWilliam Kucharski void chain_stage2 (unsigned long segment, unsigned long offset, 8151b8adde7SWilliam Kucharski int second_sector) 8161b8adde7SWilliam Kucharski __attribute__ ((noreturn)); 8171b8adde7SWilliam Kucharski 8181b8adde7SWilliam Kucharski /* do some funky stuff, then boot linux */ 8191b8adde7SWilliam Kucharski void linux_boot (void) __attribute__ ((noreturn)); 8201b8adde7SWilliam Kucharski 8211b8adde7SWilliam Kucharski /* do some funky stuff, then boot bzImage linux */ 8221b8adde7SWilliam Kucharski void big_linux_boot (void) __attribute__ ((noreturn)); 8231b8adde7SWilliam Kucharski 8241b8adde7SWilliam Kucharski /* booting a multiboot executable */ 8251b8adde7SWilliam Kucharski void multi_boot (int start, int mb_info) __attribute__ ((noreturn)); 8261b8adde7SWilliam Kucharski 8271b8adde7SWilliam Kucharski /* If LINEAR is nonzero, then set the Intel processor to linear mode. 8281b8adde7SWilliam Kucharski Otherwise, bit 20 of all memory accesses is always forced to zero, 8291b8adde7SWilliam Kucharski causing a wraparound effect for bugwards compatibility with the 8301b8adde7SWilliam Kucharski 8086 CPU. */ 8311b8adde7SWilliam Kucharski void gateA20 (int linear); 8321b8adde7SWilliam Kucharski 8331b8adde7SWilliam Kucharski /* memory probe routines */ 8341b8adde7SWilliam Kucharski int get_memsize (int type); 8351b8adde7SWilliam Kucharski int get_eisamemsize (void); 8361b8adde7SWilliam Kucharski 8371b8adde7SWilliam Kucharski /* Fetch the next entry in the memory map and return the continuation 8381b8adde7SWilliam Kucharski value. DESC is a pointer to the descriptor buffer, and CONT is the 8391b8adde7SWilliam Kucharski previous continuation value (0 to get the first entry in the 8401b8adde7SWilliam Kucharski map). */ 8411b8adde7SWilliam Kucharski int get_mmap_entry (struct mmar_desc *desc, int cont); 8421b8adde7SWilliam Kucharski 8431b8adde7SWilliam Kucharski /* Get the linear address of a ROM configuration table. Return zero, 8441b8adde7SWilliam Kucharski if fails. */ 8451b8adde7SWilliam Kucharski unsigned long get_rom_config_table (void); 8461b8adde7SWilliam Kucharski 8471b8adde7SWilliam Kucharski /* Get APM BIOS information. */ 8481b8adde7SWilliam Kucharski void get_apm_info (void); 8491b8adde7SWilliam Kucharski 8501b8adde7SWilliam Kucharski /* Get VBE controller information. */ 8511b8adde7SWilliam Kucharski int get_vbe_controller_info (struct vbe_controller *controller); 8521b8adde7SWilliam Kucharski 8531b8adde7SWilliam Kucharski /* Get VBE mode information. */ 8541b8adde7SWilliam Kucharski int get_vbe_mode_info (int mode_number, struct vbe_mode *mode); 8551b8adde7SWilliam Kucharski 8561b8adde7SWilliam Kucharski /* Set VBE mode. */ 8571b8adde7SWilliam Kucharski int set_vbe_mode (int mode_number); 8581b8adde7SWilliam Kucharski 8591b8adde7SWilliam Kucharski /* Return the data area immediately following our code. */ 8601b8adde7SWilliam Kucharski int get_code_end (void); 8611b8adde7SWilliam Kucharski 8621b8adde7SWilliam Kucharski /* low-level timing info */ 8631b8adde7SWilliam Kucharski int getrtsecs (void); 8641b8adde7SWilliam Kucharski int currticks (void); 8651b8adde7SWilliam Kucharski 8661b8adde7SWilliam Kucharski /* Clear the screen. */ 8671b8adde7SWilliam Kucharski void cls (void); 8681b8adde7SWilliam Kucharski 8691b8adde7SWilliam Kucharski /* Turn on/off cursor. */ 8701b8adde7SWilliam Kucharski int setcursor (int on); 8711b8adde7SWilliam Kucharski 8721b8adde7SWilliam Kucharski /* Get the current cursor position (where 0,0 is the top left hand 8731b8adde7SWilliam Kucharski corner of the screen). Returns packed values, (RET >> 8) is x, 8741b8adde7SWilliam Kucharski (RET & 0xff) is y. */ 8751b8adde7SWilliam Kucharski int getxy (void); 8761b8adde7SWilliam Kucharski 8771b8adde7SWilliam Kucharski /* Set the cursor position. */ 8781b8adde7SWilliam Kucharski void gotoxy (int x, int y); 8791b8adde7SWilliam Kucharski 8801b8adde7SWilliam Kucharski /* Displays an ASCII character. IBM displays will translate some 8811b8adde7SWilliam Kucharski characters to special graphical ones (see the DISP_* constants). */ 8821b8adde7SWilliam Kucharski void grub_putchar (int c); 8831b8adde7SWilliam Kucharski 8841b8adde7SWilliam Kucharski /* Wait for a keypress, and return its packed BIOS/ASCII key code. 8851b8adde7SWilliam Kucharski Use ASCII_CHAR(ret) to extract the ASCII code. */ 8861b8adde7SWilliam Kucharski int getkey (void); 8871b8adde7SWilliam Kucharski 8881b8adde7SWilliam Kucharski /* Like GETKEY, but doesn't block, and returns -1 if no keystroke is 8891b8adde7SWilliam Kucharski available. */ 8901b8adde7SWilliam Kucharski int checkkey (void); 8911b8adde7SWilliam Kucharski 8921b8adde7SWilliam Kucharski /* Low-level disk I/O */ 8931b8adde7SWilliam Kucharski int get_diskinfo (int drive, struct geometry *geometry); 8941b8adde7SWilliam Kucharski int biosdisk (int subfunc, int drive, struct geometry *geometry, 8959890706eSHans Rosenfeld unsigned long long sector, int nsec, int segment); 8961b8adde7SWilliam Kucharski void stop_floppy (void); 8971b8adde7SWilliam Kucharski 8981b8adde7SWilliam Kucharski /* Command-line interface functions. */ 8991b8adde7SWilliam Kucharski #ifndef STAGE1_5 9001b8adde7SWilliam Kucharski 9011b8adde7SWilliam Kucharski /* The flags for the builtins. */ 9021b8adde7SWilliam Kucharski #define BUILTIN_CMDLINE 0x1 /* Run in the command-line. */ 9031b8adde7SWilliam Kucharski #define BUILTIN_MENU 0x2 /* Run in the menu. */ 9041b8adde7SWilliam Kucharski #define BUILTIN_TITLE 0x4 /* Only for the command title. */ 9051b8adde7SWilliam Kucharski #define BUILTIN_SCRIPT 0x8 /* Run in the script. */ 9061b8adde7SWilliam Kucharski #define BUILTIN_NO_ECHO 0x10 /* Don't print command on booting. */ 9071b8adde7SWilliam Kucharski #define BUILTIN_HELP_LIST 0x20 /* Show help in listing. */ 9081b8adde7SWilliam Kucharski 9091b8adde7SWilliam Kucharski /* The table for a builtin. */ 9101b8adde7SWilliam Kucharski struct builtin 9111b8adde7SWilliam Kucharski { 9121b8adde7SWilliam Kucharski /* The command name. */ 9131b8adde7SWilliam Kucharski char *name; 9141b8adde7SWilliam Kucharski /* The callback function. */ 9151b8adde7SWilliam Kucharski int (*func) (char *, int); 9161b8adde7SWilliam Kucharski /* The combination of the flags defined above. */ 9171b8adde7SWilliam Kucharski int flags; 9181b8adde7SWilliam Kucharski /* The short version of the documentation. */ 9191b8adde7SWilliam Kucharski char *short_doc; 9201b8adde7SWilliam Kucharski /* The long version of the documentation. */ 9211b8adde7SWilliam Kucharski char *long_doc; 9221b8adde7SWilliam Kucharski }; 9231b8adde7SWilliam Kucharski 9241b8adde7SWilliam Kucharski /* All the builtins are registered in this. */ 9251b8adde7SWilliam Kucharski extern struct builtin *builtin_table[]; 9261b8adde7SWilliam Kucharski 9271b8adde7SWilliam Kucharski /* The constants for kernel types. */ 9281b8adde7SWilliam Kucharski typedef enum 9291b8adde7SWilliam Kucharski { 9301b8adde7SWilliam Kucharski KERNEL_TYPE_NONE, /* None is loaded. */ 9311b8adde7SWilliam Kucharski KERNEL_TYPE_MULTIBOOT, /* Multiboot. */ 9321b8adde7SWilliam Kucharski KERNEL_TYPE_LINUX, /* Linux. */ 9331b8adde7SWilliam Kucharski KERNEL_TYPE_BIG_LINUX, /* Big Linux. */ 9341b8adde7SWilliam Kucharski KERNEL_TYPE_FREEBSD, /* FreeBSD. */ 9351b8adde7SWilliam Kucharski KERNEL_TYPE_NETBSD, /* NetBSD. */ 9361b8adde7SWilliam Kucharski KERNEL_TYPE_CHAINLOADER /* Chainloader. */ 9371b8adde7SWilliam Kucharski } 9381b8adde7SWilliam Kucharski kernel_t; 9391b8adde7SWilliam Kucharski 9401b8adde7SWilliam Kucharski extern kernel_t kernel_type; 9411b8adde7SWilliam Kucharski extern int show_menu; 9421b8adde7SWilliam Kucharski extern int grub_timeout; 9431b8adde7SWilliam Kucharski 9441b8adde7SWilliam Kucharski void init_builtins (void); 9451b8adde7SWilliam Kucharski void init_config (void); 9461b8adde7SWilliam Kucharski char *skip_to (int after_equal, char *cmdline); 9471b8adde7SWilliam Kucharski struct builtin *find_command (char *command); 9481b8adde7SWilliam Kucharski void print_cmdline_message (int forever); 9491b8adde7SWilliam Kucharski void enter_cmdline (char *heap, int forever); 9501b8adde7SWilliam Kucharski int run_script (char *script, char *heap); 9511b8adde7SWilliam Kucharski #endif 9521b8adde7SWilliam Kucharski 9531b8adde7SWilliam Kucharski /* C library replacement functions with identical semantics. */ 9541b8adde7SWilliam Kucharski void grub_printf (const char *format,...); 9551b8adde7SWilliam Kucharski int grub_sprintf (char *buffer, const char *format, ...); 9561b8adde7SWilliam Kucharski int grub_tolower (int c); 9571b8adde7SWilliam Kucharski int grub_isspace (int c); 9581b8adde7SWilliam Kucharski int grub_strncat (char *s1, const char *s2, int n); 9591b8adde7SWilliam Kucharski void grub_memcpy(void *dest, const void *src, int len); 9601b8adde7SWilliam Kucharski void *grub_memmove (void *to, const void *from, int len); 9611b8adde7SWilliam Kucharski void *grub_memset (void *start, int c, int len); 9621b8adde7SWilliam Kucharski int grub_strncat (char *s1, const char *s2, int n); 9631b8adde7SWilliam Kucharski char *grub_strstr (const char *s1, const char *s2); 9641b8adde7SWilliam Kucharski int grub_memcmp (const char *s1, const char *s2, int n); 9651b8adde7SWilliam Kucharski int grub_strcmp (const char *s1, const char *s2); 9661b8adde7SWilliam Kucharski int grub_strlen (const char *str); 9671b8adde7SWilliam Kucharski char *grub_strcpy (char *dest, const char *src); 9681b8adde7SWilliam Kucharski char *grub_strchr (char *str, char c); 9691b8adde7SWilliam Kucharski 9701b8adde7SWilliam Kucharski void noisy_printf (const char *format,...); 9711b8adde7SWilliam Kucharski 9721b8adde7SWilliam Kucharski #ifndef GRUB_UTIL 9731b8adde7SWilliam Kucharski typedef unsigned long grub_jmp_buf[6]; 9741b8adde7SWilliam Kucharski #else 9751b8adde7SWilliam Kucharski /* In the grub shell, use the libc jmp_buf instead. */ 9761b8adde7SWilliam Kucharski # include <setjmp.h> 9771b8adde7SWilliam Kucharski # define grub_jmp_buf jmp_buf 9781b8adde7SWilliam Kucharski #endif 9791b8adde7SWilliam Kucharski 9801b8adde7SWilliam Kucharski #ifdef GRUB_UTIL 9811b8adde7SWilliam Kucharski # define grub_setjmp setjmp 9821b8adde7SWilliam Kucharski # define grub_longjmp longjmp 9831b8adde7SWilliam Kucharski #else /* ! GRUB_UTIL */ 9841b8adde7SWilliam Kucharski int grub_setjmp (grub_jmp_buf env); 9851b8adde7SWilliam Kucharski void grub_longjmp (grub_jmp_buf env, int val); 9861b8adde7SWilliam Kucharski #endif /* ! GRUB_UTIL */ 9871b8adde7SWilliam Kucharski 9881b8adde7SWilliam Kucharski /* The environment for restarting Stage 2. */ 9891b8adde7SWilliam Kucharski extern grub_jmp_buf restart_env; 9901b8adde7SWilliam Kucharski /* The environment for restarting the command-line interface. */ 9911b8adde7SWilliam Kucharski extern grub_jmp_buf restart_cmdline_env; 9921b8adde7SWilliam Kucharski 9931b8adde7SWilliam Kucharski /* misc */ 9941b8adde7SWilliam Kucharski void init_page (void); 9951b8adde7SWilliam Kucharski void print_error (void); 9969890706eSHans Rosenfeld char *convert_to_ascii (char *buf, int c, unsigned long long num); 9971b8adde7SWilliam Kucharski int get_cmdline (char *prompt, char *cmdline, int maxlen, 9981b8adde7SWilliam Kucharski int echo_char, int history); 9991b8adde7SWilliam Kucharski int substring (const char *s1, const char *s2); 10001b8adde7SWilliam Kucharski int nul_terminate (char *str); 10011b8adde7SWilliam Kucharski int get_based_digit (int c, int base); 10021b8adde7SWilliam Kucharski int safe_parse_maxint (char **str_ptr, int *myint_ptr); 10031b8adde7SWilliam Kucharski int memcheck (unsigned long start, unsigned long len); 10041b8adde7SWilliam Kucharski void grub_putstr (const char *str); 10051b8adde7SWilliam Kucharski 10061b8adde7SWilliam Kucharski #ifndef NO_DECOMPRESSION 10071b8adde7SWilliam Kucharski /* Compression support. */ 10081b8adde7SWilliam Kucharski int gunzip_test_header (void); 10091b8adde7SWilliam Kucharski int gunzip_read (char *buf, int len); 10101b8adde7SWilliam Kucharski #endif /* NO_DECOMPRESSION */ 10111b8adde7SWilliam Kucharski 10129890706eSHans Rosenfeld int rawread (int drive, unsigned long long sector, int byte_offset, int byte_len, 10131b8adde7SWilliam Kucharski char *buf); 10149890706eSHans Rosenfeld int devread (unsigned long long sector, int byte_offset, int byte_len, char *buf); 10159890706eSHans Rosenfeld int rawwrite (int drive, unsigned long long sector, char *buf); 10169890706eSHans Rosenfeld int devwrite (unsigned long long sector, int sector_len, char *buf); 10171b8adde7SWilliam Kucharski 10181b8adde7SWilliam Kucharski /* Parse a device string and initialize the global parameters. */ 10191b8adde7SWilliam Kucharski char *set_device (char *device); 10201b8adde7SWilliam Kucharski int open_device (void); 10211b8adde7SWilliam Kucharski int real_open_partition (int flags); 10221b8adde7SWilliam Kucharski int open_partition (void); 10231b8adde7SWilliam Kucharski int next_partition (unsigned long drive, unsigned long dest, 10241b8adde7SWilliam Kucharski unsigned long *partition, int *type, 10259890706eSHans Rosenfeld unsigned long long *start, unsigned long long *len, 10269890706eSHans Rosenfeld unsigned long long *offset, int *entry, 10279890706eSHans Rosenfeld unsigned long long *ext_offset, 10289890706eSHans Rosenfeld unsigned long long *gpt_offset, int *gpt_count, 102944bc9120SRichard Yao int *gpt_size, char *buf); 10301b8adde7SWilliam Kucharski 10311b8adde7SWilliam Kucharski /* Sets device to the one represented by the SAVED_* parameters. */ 10321b8adde7SWilliam Kucharski int make_saved_active (void); 10331b8adde7SWilliam Kucharski 10341b8adde7SWilliam Kucharski /* Set or clear the current root partition's hidden flag. */ 10351b8adde7SWilliam Kucharski int set_partition_hidden_flag (int hidden); 10361b8adde7SWilliam Kucharski 10371b8adde7SWilliam Kucharski /* Open a file or directory on the active device, using GRUB's 10381b8adde7SWilliam Kucharski internal filesystem support. */ 10391b8adde7SWilliam Kucharski int grub_open (char *filename); 10401b8adde7SWilliam Kucharski 10411b8adde7SWilliam Kucharski /* Read LEN bytes into BUF from the file that was opened with 10421b8adde7SWilliam Kucharski GRUB_OPEN. If LEN is -1, read all the remaining data in the file. */ 10431b8adde7SWilliam Kucharski int grub_read (char *buf, int len); 10441b8adde7SWilliam Kucharski 10451b8adde7SWilliam Kucharski /* Reposition a file offset. */ 10461b8adde7SWilliam Kucharski int grub_seek (int offset); 10471b8adde7SWilliam Kucharski 10481b8adde7SWilliam Kucharski /* Close a file. */ 10491b8adde7SWilliam Kucharski void grub_close (void); 10501b8adde7SWilliam Kucharski 10511b8adde7SWilliam Kucharski /* List the contents of the directory that was opened with GRUB_OPEN, 10521b8adde7SWilliam Kucharski printing all completions. */ 10531b8adde7SWilliam Kucharski int dir (char *dirname); 10541b8adde7SWilliam Kucharski 10551b8adde7SWilliam Kucharski int set_bootdev (int hdbias); 10561b8adde7SWilliam Kucharski 10571b8adde7SWilliam Kucharski /* Display statistics on the current active device. */ 10581b8adde7SWilliam Kucharski void print_fsys_type (void); 10591b8adde7SWilliam Kucharski 10601b8adde7SWilliam Kucharski /* Display device and filename completions. */ 10611b8adde7SWilliam Kucharski void print_a_completion (char *filename); 10621b8adde7SWilliam Kucharski int print_completions (int is_filename, int is_completion); 10631b8adde7SWilliam Kucharski 10641b8adde7SWilliam Kucharski /* Copies the current partition data to the desired address. */ 10651b8adde7SWilliam Kucharski void copy_current_part_entry (char *buf); 10661b8adde7SWilliam Kucharski 10671b8adde7SWilliam Kucharski #ifndef STAGE1_5 10681b8adde7SWilliam Kucharski void bsd_boot (kernel_t type, int bootdev, char *arg) 10691b8adde7SWilliam Kucharski __attribute__ ((noreturn)); 10701b8adde7SWilliam Kucharski 10711b8adde7SWilliam Kucharski /* Define flags for load_image here. */ 10721b8adde7SWilliam Kucharski /* Don't pass a Linux's mem option automatically. */ 10731b8adde7SWilliam Kucharski #define KERNEL_LOAD_NO_MEM_OPTION (1 << 0) 10741b8adde7SWilliam Kucharski 10751b8adde7SWilliam Kucharski kernel_t load_image (char *kernel, char *arg, kernel_t suggested_type, 10761b8adde7SWilliam Kucharski unsigned long load_flags); 10771b8adde7SWilliam Kucharski 10781b8adde7SWilliam Kucharski int load_module (char *module, char *arg); 10791b8adde7SWilliam Kucharski int load_initrd (char *initrd); 10801b8adde7SWilliam Kucharski 10811b8adde7SWilliam Kucharski int check_password(char *entered, char* expected, password_t type); 10821b8adde7SWilliam Kucharski #endif 10831b8adde7SWilliam Kucharski 10841b8adde7SWilliam Kucharski void init_bios_info (void); 10851b8adde7SWilliam Kucharski 10861b8adde7SWilliam Kucharski #endif /* ASM_FILE */ 10871b8adde7SWilliam Kucharski 10881b8adde7SWilliam Kucharski #endif /* ! GRUB_SHARED_HEADER */ 1089