1N/A/* shared.h - definitions used in all GRUB-specific code */
1N/A/*
1N/A * GRUB -- GRand Unified Bootloader
1N/A * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
1N/A *
1N/A * This program is free software; you can redistribute it and/or modify
1N/A * it under the terms of the GNU General Public License as published by
1N/A * the Free Software Foundation; either version 2 of the License, or
1N/A * (at your option) any later version.
1N/A *
1N/A * This program is distributed in the hope that it will be useful,
1N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
1N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1N/A * GNU General Public License for more details.
1N/A *
1N/A * You should have received a copy of the GNU General Public License
1N/A * along with this program; if not, write to the Free Software
1N/A * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1N/A */
1N/A
1N/A/*
1N/A * Generic defines to use anywhere
1N/A */
1N/A
1N/A#ifndef GRUB_SHARED_HEADER
1N/A#define GRUB_SHARED_HEADER 1
1N/A
1N/A#include <config.h>
1N/A
1N/A/* Add an underscore to a C symbol in assembler code if needed. */
1N/A#ifdef HAVE_ASM_USCORE
1N/A# define EXT_C(sym) _ ## sym
1N/A#else
1N/A# define EXT_C(sym) sym
1N/A#endif
1N/A
1N/A/* Maybe redirect memory requests through grub_scratch_mem. */
1N/A#ifdef GRUB_UTIL
1N/Aextern char *grub_scratch_mem;
1N/A# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
1N/A# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
1N/A#else
1N/A# define RAW_ADDR(x) (x)
1N/A# define RAW_SEG(x) (x)
1N/A#endif
1N/A
1N/A/* ZFS will use the top 4 Meg of physical memory (below 4Gig) for sratch */
1N/A#define ZFS_SCRATCH_SIZE 0x400000
1N/A
1N/A#ifndef MAXPATHLEN
1N/A#define MAXPATHLEN 1024
1N/A#endif
1N/A
1N/A#define MAXNAMELEN 256
1N/A#define MIN(x, y) ((x) < (y) ? (x) : (y))
1N/A
1N/A/* Boot signature related defines for the findroot command */
1N/A#define BOOTSIGN_DIR "/boot/grub/bootsign"
1N/A#define BOOTSIGN_ARGLEN (MAXNAMELEN + 10) /* (<sign>,0,d) */
1N/A#define BOOTSIGN_LEN (sizeof (BOOTSIGN_DIR) + 1 + BOOTSIGN_ARGLEN)
1N/A#define BOOTSIGN_BACKUP "/etc/bootsign"
1N/A
1N/A/*
1N/A * Integer sizes
1N/A */
1N/A
1N/A#define MAXINT 0x7FFFFFFF
1N/A#define MAXUINT 0xFFFFFFFF
1N/A
1N/A/* Maximum command line size. Before you blindly increase this value,
1N/A see the comment in char_io.c (get_cmdline). */
1N/A#define MAX_CMDLINE 1600
1N/A#define NEW_HEAPSIZE 1500
1N/A
1N/A/* 512-byte scratch area */
1N/A#define SCRATCHADDR RAW_ADDR (0x77e00)
1N/A#define SCRATCHSEG RAW_SEG (0x77e0)
1N/A
1N/A/*
1N/A * This is the location of the raw device buffer. It is 31.5K
1N/A * in size.
1N/A */
1N/A
1N/A#define BUFFERLEN 0x7e00
1N/A#define BUFFERADDR RAW_ADDR (0x70000)
1N/A#define BUFFERSEG RAW_SEG (0x7000)
1N/A
1N/A#define BOOT_PART_TABLE RAW_ADDR (0x07be)
1N/A
1N/A/*
1N/A * BIOS disk defines
1N/A */
1N/A#define BIOSDISK_READ 0x0
1N/A#define BIOSDISK_WRITE 0x1
1N/A#define BIOSDISK_ERROR_GEOMETRY 0x100
1N/A#define BIOSDISK_ERROR_SHORT_IO 0x101
1N/A#define BIOSDISK_FLAG_LBA_EXTENSION 0x1
1N/A#define BIOSDISK_FLAG_CDROM 0x2
1N/A
1N/A/*
1N/A * This is the filesystem (not raw device) buffer.
1N/A * It is 32K in size, do not overrun!
1N/A */
1N/A
1N/A#define FSYS_BUFLEN 0x8000
1N/A#define FSYS_BUF RAW_ADDR (0x68000)
1N/A
1N/A/* Command-line buffer for Multiboot kernels and modules. This area
1N/A includes the area into which Stage 1.5 and Stage 1 are loaded, but
1N/A that's no problem. */
1N/A#define MB_CMDLINE_BUF RAW_ADDR (0x2000)
1N/A#define MB_CMDLINE_BUFLEN 0x6000
1N/A
1N/A/* The buffer for the password. */
1N/A#define PASSWORD_BUF RAW_ADDR (0x78000)
1N/A#define PASSWORD_BUFLEN 0x200
1N/A
1N/A/* THe buffer for the filename of "/boot/grub/default". */
1N/A#define DEFAULT_FILE_BUF (PASSWORD_BUF + PASSWORD_BUFLEN)
1N/A#define DEFAULT_FILE_BUFLEN 0x60
1N/A
1N/A/* The buffer for the command-line. */
1N/A#define CMDLINE_BUF (DEFAULT_FILE_BUF + DEFAULT_FILE_BUFLEN)
1N/A#define CMDLINE_BUFLEN MAX_CMDLINE
1N/A
1N/A/* The kill buffer for the command-line. */
1N/A#define KILL_BUF (CMDLINE_BUF + CMDLINE_BUFLEN)
1N/A#define KILL_BUFLEN MAX_CMDLINE
1N/A
1N/A/* The history buffer for the command-line. */
1N/A#define HISTORY_BUF (KILL_BUF + KILL_BUFLEN)
1N/A#define HISTORY_SIZE 5
1N/A#define HISTORY_BUFLEN (MAX_CMDLINE * HISTORY_SIZE)
1N/A
1N/A/* The buffer for the completion. */
1N/A#define COMPLETION_BUF (HISTORY_BUF + HISTORY_BUFLEN)
1N/A#define COMPLETION_BUFLEN MAX_CMDLINE
1N/A
1N/A/* The buffer for the unique string. */
1N/A#define UNIQUE_BUF (COMPLETION_BUF + COMPLETION_BUFLEN)
1N/A#define UNIQUE_BUFLEN MAX_CMDLINE
1N/A
1N/A/* The buffer for the menu entries. */
1N/A#define MENU_BUF (UNIQUE_BUF + UNIQUE_BUFLEN)
1N/A#define MENU_BUFLEN (0x8000 + PASSWORD_BUF - MENU_BUF)
1N/A
1N/A/* The size of the drive map. */
1N/A#define DRIVE_MAP_SIZE 8
1N/A
1N/A/* The size of the key map. */
1N/A#define KEY_MAP_SIZE 128
1N/A
1N/A/* The size of the io map. */
1N/A#define IO_MAP_SIZE 128
1N/A
1N/A/*
1N/A * Linux setup parameters
1N/A */
1N/A
1N/A#define LINUX_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */
1N/A#define LINUX_DEFAULT_SETUP_SECTS 4
1N/A#define LINUX_FLAG_CAN_USE_HEAP 0x80
1N/A#define LINUX_INITRD_MAX_ADDRESS 0x38000000
1N/A#define LINUX_MAX_SETUP_SECTS 64
1N/A#define LINUX_BOOT_LOADER_TYPE 0x71
1N/A#define LINUX_HEAP_END_OFFSET (0x9000 - 0x200)
1N/A
1N/A#define LINUX_BZIMAGE_ADDR RAW_ADDR (0x100000)
1N/A#define LINUX_ZIMAGE_ADDR RAW_ADDR (0x10000)
1N/A#define LINUX_OLD_REAL_MODE_ADDR RAW_ADDR (0x90000)
1N/A#define LINUX_SETUP_STACK 0x9000
1N/A
1N/A#define LINUX_FLAG_BIG_KERNEL 0x1
1N/A
1N/A/* Linux's video mode selection support. Actually I hate it! */
1N/A#define LINUX_VID_MODE_NORMAL 0xFFFF
1N/A#define LINUX_VID_MODE_EXTENDED 0xFFFE
1N/A#define LINUX_VID_MODE_ASK 0xFFFD
1N/A
1N/A#define LINUX_CL_OFFSET 0x9000
1N/A#define LINUX_CL_END_OFFSET 0x90FF
1N/A#define LINUX_SETUP_MOVE_SIZE 0x9100
1N/A#define LINUX_CL_MAGIC 0xA33F
1N/A
1N/A/*
1N/A * General disk stuff
1N/A */
1N/A
1N/A#define SECTOR_SIZE 0x200
1N/A#define SECTOR_BITS 9
1N/A#define BIOS_FLAG_FIXED_DISK 0x80
1N/A
1N/A#define BOOTSEC_LOCATION RAW_ADDR (0x7C00)
1N/A#define BOOTSEC_SIGNATURE 0xAA55
1N/A#define BOOTSEC_BPB_OFFSET 0x3
1N/A#define BOOTSEC_BPB_LENGTH 0x3B
1N/A#define BOOTSEC_BPB_SYSTEM_ID 0x3
1N/A#define BOOTSEC_BPB_HIDDEN_SECTORS 0x1C
1N/A#define BOOTSEC_PART_OFFSET 0x1BE
1N/A#define BOOTSEC_PART_LENGTH 0x40
1N/A#define BOOTSEC_SIG_OFFSET 0x1FE
1N/A#define BOOTSEC_LISTSIZE 8
1N/A
1N/A/* Not bad, perhaps. */
1N/A#define NETWORK_DRIVE 0x20
1N/A
1N/A/*
1N/A * GRUB specific information
1N/A * (in LSB order)
1N/A */
1N/A
1N/A#include <stage1.h>
1N/A
1N/A#define STAGE2_VER_MAJ_OFFS 0x6
1N/A#define STAGE2_INSTALLPART 0x8
1N/A#define STAGE2_SAVED_ENTRYNO 0xc
1N/A#define STAGE2_STAGE2_ID 0x10
1N/A#define STAGE2_FORCE_LBA 0x11
1N/A#define STAGE2_VER_STR_OFFS 0x12
1N/A
1N/A/* Stage 2 identifiers */
1N/A#define STAGE2_ID_STAGE2 0
1N/A#define STAGE2_ID_FFS_STAGE1_5 1
1N/A#define STAGE2_ID_E2FS_STAGE1_5 2
1N/A#define STAGE2_ID_FAT_STAGE1_5 3
1N/A#define STAGE2_ID_MINIX_STAGE1_5 4
1N/A#define STAGE2_ID_REISERFS_STAGE1_5 5
1N/A#define STAGE2_ID_VSTAFS_STAGE1_5 6
1N/A#define STAGE2_ID_JFS_STAGE1_5 7
1N/A#define STAGE2_ID_XFS_STAGE1_5 8
1N/A#define STAGE2_ID_ISO9660_STAGE1_5 9
1N/A#define STAGE2_ID_UFS2_STAGE1_5 10
1N/A#define STAGE2_ID_UFS_STAGE1_5 11
1N/A#define STAGE2_ID_ZFS_STAGE1_5 12
1N/A
1N/A#ifndef STAGE1_5
1N/A# define STAGE2_ID STAGE2_ID_STAGE2
1N/A#else
1N/A# if defined(FSYS_FFS)
1N/A# define STAGE2_ID STAGE2_ID_FFS_STAGE1_5
1N/A# elif defined(FSYS_EXT2FS)
1N/A# define STAGE2_ID STAGE2_ID_E2FS_STAGE1_5
1N/A# elif defined(FSYS_FAT)
1N/A# define STAGE2_ID STAGE2_ID_FAT_STAGE1_5
1N/A# elif defined(FSYS_MINIX)
1N/A# define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5
1N/A# elif defined(FSYS_REISERFS)
1N/A# define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5
1N/A# elif defined(FSYS_VSTAFS)
1N/A# define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5
1N/A# elif defined(FSYS_JFS)
1N/A# define STAGE2_ID STAGE2_ID_JFS_STAGE1_5
1N/A# elif defined(FSYS_XFS)
1N/A# define STAGE2_ID STAGE2_ID_XFS_STAGE1_5
1N/A# elif defined(FSYS_ISO9660)
1N/A# define STAGE2_ID STAGE2_ID_ISO9660_STAGE1_5
1N/A# elif defined(FSYS_UFS2)
1N/A# define STAGE2_ID STAGE2_ID_UFS2_STAGE1_5
1N/A# elif defined(FSYS_UFS)
1N/A# define STAGE2_ID STAGE2_ID_UFS_STAGE1_5
1N/A# elif defined(FSYS_ZFS)
1N/A# define STAGE2_ID STAGE2_ID_ZFS_STAGE1_5
1N/A# else
1N/A# error "unknown Stage 2"
1N/A# endif
1N/A#endif
1N/A
1N/A/*
1N/A * defines for use when switching between real and protected mode
1N/A */
1N/A
1N/A#define CR0_PE_ON 0x1
1N/A#define CR0_PE_OFF 0xfffffffe
1N/A#define PROT_MODE_CSEG 0x8
1N/A#define PROT_MODE_DSEG 0x10
1N/A#define PSEUDO_RM_CSEG 0x18
1N/A#define PSEUDO_RM_DSEG 0x20
1N/A#define STACKOFF (0x2000 - 0x10)
1N/A#define PROTSTACKINIT (FSYS_BUF - 0x10)
1N/A
1N/A
1N/A/*
1N/A * Assembly code defines
1N/A *
1N/A * "EXT_C" is assumed to be defined in the Makefile by the configure
1N/A * command.
1N/A */
1N/A
1N/A#define ENTRY(x) .globl EXT_C(x) ; EXT_C(x):
1N/A#define VARIABLE(x) ENTRY(x)
1N/A
1N/A
1N/A#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
1N/A#define K_STATUS 0x64 /* keyboard status */
1N/A#define K_CMD 0x64 /* keybd ctlr command (write-only) */
1N/A
1N/A#define K_OBUF_FUL 0x01 /* output buffer full */
1N/A#define K_IBUF_FUL 0x02 /* input buffer full */
1N/A
1N/A#define KC_CMD_WIN 0xd0 /* read output port */
1N/A#define KC_CMD_WOUT 0xd1 /* write output port */
1N/A#define KB_OUTPUT_MASK 0xdd /* enable output buffer full interrupt
1N/A enable data line
1N/A enable clock line */
1N/A#define KB_A20_ENABLE 0x02
1N/A
1N/A/* Codes for getchar. */
1N/A#define ASCII_CHAR(x) ((x) & 0xFF)
1N/A#if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES)
1N/A# define KEY_LEFT 0x4B00
1N/A# define KEY_RIGHT 0x4D00
1N/A# define KEY_UP 0x4800
1N/A# define KEY_DOWN 0x5000
1N/A# define KEY_IC 0x5200 /* insert char */
1N/A# define KEY_DC 0x5300 /* delete char */
1N/A# define KEY_BACKSPACE 0x0008
1N/A# define KEY_HOME 0x4700
1N/A# define KEY_END 0x4F00
1N/A# define KEY_NPAGE 0x5100
1N/A# define KEY_PPAGE 0x4900
1N/A# define A_NORMAL 0x7
1N/A# define A_REVERSE 0x70
1N/A#elif defined(HAVE_NCURSES_CURSES_H)
1N/A# include <ncurses/curses.h>
1N/A#elif defined(HAVE_NCURSES_H)
1N/A# include <ncurses.h>
1N/A#elif defined(HAVE_CURSES_H)
1N/A# include <curses.h>
1N/A#endif
1N/A
1N/A/* In old BSD curses, A_NORMAL and A_REVERSE are not defined, so we
1N/A define them here if they are undefined. */
1N/A#ifndef A_NORMAL
1N/A# define A_NORMAL 0
1N/A#endif /* ! A_NORMAL */
1N/A#ifndef A_REVERSE
1N/A# ifdef A_STANDOUT
1N/A# define A_REVERSE A_STANDOUT
1N/A# else /* ! A_STANDOUT */
1N/A# define A_REVERSE 0
1N/A# endif /* ! A_STANDOUT */
1N/A#endif /* ! A_REVERSE */
1N/A
1N/A/* Define ACS_* ourselves, since the definitions are not consistent among
1N/A various curses implementations. */
1N/A#undef ACS_ULCORNER
1N/A#undef ACS_URCORNER
1N/A#undef ACS_LLCORNER
1N/A#undef ACS_LRCORNER
1N/A#undef ACS_HLINE
1N/A#undef ACS_VLINE
1N/A#undef ACS_LARROW
1N/A#undef ACS_RARROW
1N/A#undef ACS_UARROW
1N/A#undef ACS_DARROW
1N/A
1N/A#define ACS_ULCORNER '+'
1N/A#define ACS_URCORNER '+'
1N/A#define ACS_LLCORNER '+'
1N/A#define ACS_LRCORNER '+'
1N/A#define ACS_HLINE '-'
1N/A#define ACS_VLINE '|'
1N/A#define ACS_LARROW '<'
1N/A#define ACS_RARROW '>'
1N/A#define ACS_UARROW '^'
1N/A#define ACS_DARROW 'v'
1N/A
1N/A/* Special graphics characters for IBM displays. */
1N/A#define DISP_UL 218
1N/A#define DISP_UR 191
1N/A#define DISP_LL 192
1N/A#define DISP_LR 217
1N/A#define DISP_HORIZ 196
1N/A#define DISP_VERT 179
1N/A#define DISP_LEFT 0x1b
1N/A#define DISP_RIGHT 0x1a
1N/A#define DISP_UP 0x18
1N/A#define DISP_DOWN 0x19
1N/A
1N/A/* Remap some libc-API-compatible function names so that we prevent
1N/A circularararity. */
1N/A#ifndef WITHOUT_LIBC_STUBS
1N/A#define memmove grub_memmove
1N/A#define memcpy grub_memmove /* we don't need a separate memcpy */
1N/A#define memset grub_memset
1N/A#undef isspace
1N/A#define isspace grub_isspace
1N/A#define printf grub_printf
1N/A#define sprintf grub_sprintf
1N/A#undef putchar
1N/A#define putchar grub_putchar
1N/A#define strncat grub_strncat
1N/A#define strstr grub_strstr
1N/A#define memcmp grub_memcmp
1N/A#define strcmp grub_strcmp
1N/A#define tolower grub_tolower
1N/A#define strlen grub_strlen
1N/A#define strcpy grub_strcpy
1N/A#endif /* WITHOUT_LIBC_STUBS */
1N/A
1N/A#define UNDI_STACK (512 + 64) << 10
1N/A#define UNDI_STACK_SEG (UNDI_STACK >> 4) /* PXE load GRUB here */
1N/A#define UNDI_STACK_OFF (0x10000 - 0x10)
1N/A
1N/A#ifndef ASM_FILE
1N/A/*
1N/A * Below this should be ONLY defines and other constructs for C code.
1N/A */
1N/A
1N/A/* multiboot stuff */
1N/A
1N/A#include "mb_header.h"
1N/A#include "mb_info.h"
1N/A
1N/A/* For the Linux/i386 boot protocol version 2.03. */
1N/Astruct linux_kernel_header
1N/A{
1N/A char code1[0x0020];
1N/A unsigned short cl_magic; /* Magic number 0xA33F */
1N/A unsigned short cl_offset; /* The offset of command line */
1N/A char code2[0x01F1 - 0x0020 - 2 - 2];
1N/A unsigned char setup_sects; /* The size of the setup in sectors */
1N/A unsigned short root_flags; /* If the root is mounted readonly */
1N/A unsigned short syssize; /* obsolete */
1N/A unsigned short swap_dev; /* obsolete */
1N/A unsigned short ram_size; /* obsolete */
1N/A unsigned short vid_mode; /* Video mode control */
1N/A unsigned short root_dev; /* Default root device number */
1N/A unsigned short boot_flag; /* 0xAA55 magic number */
1N/A unsigned short jump; /* Jump instruction */
1N/A unsigned long header; /* Magic signature "HdrS" */
1N/A unsigned short version; /* Boot protocol version supported */
1N/A unsigned long realmode_swtch; /* Boot loader hook */
1N/A unsigned long start_sys; /* Points to kernel version string */
1N/A unsigned char type_of_loader; /* Boot loader identifier */
1N/A unsigned char loadflags; /* Boot protocol option flags */
1N/A unsigned short setup_move_size; /* Move to high memory size */
1N/A unsigned long code32_start; /* Boot loader hook */
1N/A unsigned long ramdisk_image; /* initrd load address */
1N/A unsigned long ramdisk_size; /* initrd size */
1N/A unsigned long bootsect_kludge; /* obsolete */
1N/A unsigned short heap_end_ptr; /* Free memory after setup end */
1N/A unsigned short pad1; /* Unused */
1N/A char *cmd_line_ptr; /* Points to the kernel command line */
1N/A unsigned long initrd_addr_max; /* The highest address of initrd */
1N/A} __attribute__ ((packed));
1N/A
1N/A/* Memory map address range descriptor used by GET_MMAP_ENTRY. */
1N/Astruct mmar_desc
1N/A{
1N/A unsigned long desc_len; /* Size of this descriptor. */
1N/A unsigned long long addr; /* Base address. */
1N/A unsigned long long length; /* Length in bytes. */
1N/A unsigned long type; /* Type of address range. */
1N/A} __attribute__ ((packed));
1N/A
1N/A/* VBE controller information. */
1N/Astruct vbe_controller
1N/A{
1N/A unsigned char signature[4];
1N/A unsigned short version;
1N/A unsigned long oem_string;
1N/A unsigned long capabilities;
1N/A unsigned long video_mode;
1N/A unsigned short total_memory;
1N/A unsigned short oem_software_rev;
1N/A unsigned long oem_vendor_name;
1N/A unsigned long oem_product_name;
1N/A unsigned long oem_product_rev;
1N/A unsigned char reserved[222];
1N/A unsigned char oem_data[256];
1N/A} __attribute__ ((packed));
1N/A
1N/A/* VBE mode information. */
1N/Astruct vbe_mode
1N/A{
1N/A unsigned short mode_attributes;
1N/A unsigned char win_a_attributes;
1N/A unsigned char win_b_attributes;
1N/A unsigned short win_granularity;
1N/A unsigned short win_size;
1N/A unsigned short win_a_segment;
1N/A unsigned short win_b_segment;
1N/A unsigned long win_func;
1N/A unsigned short bytes_per_scanline;
1N/A
1N/A /* >=1.2 */
1N/A unsigned short x_resolution;
1N/A unsigned short y_resolution;
1N/A unsigned char x_char_size;
1N/A unsigned char y_char_size;
1N/A unsigned char number_of_planes;
1N/A unsigned char bits_per_pixel;
1N/A unsigned char number_of_banks;
1N/A unsigned char memory_model;
1N/A unsigned char bank_size;
1N/A unsigned char number_of_image_pages;
1N/A unsigned char reserved0;
1N/A
1N/A /* direct color */
1N/A unsigned char red_mask_size;
1N/A unsigned char red_field_position;
1N/A unsigned char green_mask_size;
1N/A unsigned char green_field_position;
1N/A unsigned char blue_mask_size;
1N/A unsigned char blue_field_position;
1N/A unsigned char reserved_mask_size;
1N/A unsigned char reserved_field_position;
1N/A unsigned char direct_color_mode_info;
1N/A
1N/A /* >=2.0 */
1N/A unsigned long phys_base;
1N/A unsigned long reserved1;
1N/A unsigned short reversed2;
1N/A
1N/A /* >=3.0 */
1N/A unsigned short linear_bytes_per_scanline;
1N/A unsigned char banked_number_of_image_pages;
1N/A unsigned char linear_number_of_image_pages;
1N/A unsigned char linear_red_mask_size;
1N/A unsigned char linear_red_field_position;
1N/A unsigned char linear_green_mask_size;
1N/A unsigned char linear_green_field_position;
1N/A unsigned char linear_blue_mask_size;
1N/A unsigned char linear_blue_field_position;
1N/A unsigned char linear_reserved_mask_size;
1N/A unsigned char linear_reserved_field_position;
1N/A unsigned long max_pixel_clock;
1N/A
1N/A unsigned char reserved3[189];
1N/A} __attribute__ ((packed));
1N/A
1N/A#undef NULL
1N/A#define NULL ((void *) 0)
1N/A
1N/A/* Error codes (descriptions are in common.c) */
1N/Atypedef enum
1N/A{
1N/A ERR_NONE = 0,
1N/A ERR_BAD_FILENAME,
1N/A ERR_BAD_FILETYPE,
1N/A ERR_BAD_GZIP_DATA,
1N/A ERR_BAD_GZIP_HEADER,
1N/A ERR_BAD_PART_TABLE,
1N/A ERR_BAD_VERSION,
1N/A ERR_BELOW_1MB,
1N/A ERR_BOOT_COMMAND,
1N/A ERR_BOOT_FAILURE,
1N/A ERR_BOOT_FEATURES,
1N/A ERR_DEV_FORMAT,
1N/A ERR_DEV_VALUES,
1N/A ERR_EXEC_FORMAT,
1N/A ERR_FILELENGTH,
1N/A ERR_FILE_NOT_FOUND,
1N/A ERR_FSYS_CORRUPT,
1N/A ERR_FSYS_MOUNT,
1N/A ERR_GEOM,
1N/A ERR_NEED_LX_KERNEL,
1N/A ERR_NEED_MB_KERNEL,
1N/A ERR_NO_DISK,
1N/A ERR_NO_PART,
1N/A ERR_NUMBER_PARSING,
1N/A ERR_OUTSIDE_PART,
1N/A ERR_READ,
1N/A ERR_SYMLINK_LOOP,
1N/A ERR_UNRECOGNIZED,
1N/A ERR_WONT_FIT,
1N/A ERR_WRITE,
1N/A ERR_BAD_ARGUMENT,
1N/A ERR_UNALIGNED,
1N/A ERR_PRIVILEGED,
1N/A ERR_DEV_NEED_INIT,
1N/A ERR_NO_DISK_SPACE,
1N/A ERR_NUMBER_OVERFLOW,
1N/A ERR_BAD_GZIP_CRC,
1N/A ERR_FILESYSTEM_NOT_FOUND,
1N/A ERR_NO_BOOTPATH,
1N/A ERR_NEWER_VERSION,
1N/A ERR_NOTXPM,
1N/A ERR_TOOMANYCOLORS,
1N/A ERR_CORRUPTXPM,
1N/A
1N/A MAX_ERR_NUM
1N/A} grub_error_t;
1N/A
1N/Atypedef enum
1N/A{
1N/A CFG_HARDCODED,
1N/A CFG_150,
1N/A CFG_MAC,
1N/A CFG_BOOTFILE
1N/A} configfile_origin_t;
1N/A
1N/Aextern unsigned long install_partition;
1N/Aextern unsigned long boot_drive;
1N/Aextern unsigned long install_second_sector;
1N/Aextern struct apm_info apm_bios_info;
1N/Aextern unsigned long boot_part_addr;
1N/Aextern int saved_entryno;
1N/Aextern unsigned char force_lba;
1N/Aextern char version_string[];
1N/Aextern char config_file[];
1N/Aextern char *bootfile;
1N/Aextern configfile_origin_t configfile_origin;
1N/Aextern unsigned long linux_text_len;
1N/Aextern char *linux_data_tmp_addr;
1N/Aextern char *linux_data_real_addr;
1N/A
1N/A#ifdef GRUB_UTIL
1N/A/* If not using config file, this variable is set to zero,
1N/A otherwise non-zero. */
1N/Aextern int use_config_file;
1N/A/* If using the preset menu, this variable is set to non-zero,
1N/A otherwise zero. */
1N/Aextern int use_preset_menu;
1N/A/* If not using curses, this variable is set to zero, otherwise non-zero. */
1N/Aextern int use_curses;
1N/A/* The flag for verbose messages. */
1N/Aextern int verbose;
1N/A/* The flag for read-only. */
1N/Aextern int read_only;
1N/A/* The number of floppies to be probed. */
1N/Aextern int floppy_disks;
1N/A/* The map between BIOS drives and UNIX device file names. */
1N/Aextern char **device_map;
1N/A/* The filename which stores the information about a device map. */
1N/Aextern char *device_map_file;
1N/A/* The array of geometries. */
1N/Aextern struct geometry *disks;
1N/A/* Assign DRIVE to a device name DEVICE. */
1N/Aextern void assign_device_name (int drive, const char *device);
1N/A#endif
1N/A
1N/A#ifndef STAGE1_5
1N/A/* GUI interface variables. */
1N/A# define MAX_FALLBACK_ENTRIES 8
1N/Aextern int fallback_entries[MAX_FALLBACK_ENTRIES];
1N/Aextern int fallback_entryno;
1N/Aextern int default_entry;
1N/Aextern int current_entryno;
1N/A
1N/A/* The constants for password types. */
1N/Atypedef enum
1N/A{
1N/A PASSWORD_PLAIN,
1N/A PASSWORD_MD5,
1N/A PASSWORD_UNSUPPORTED
1N/A}
1N/Apassword_t;
1N/A
1N/Aextern char *password;
1N/Aextern password_t password_type;
1N/Aextern int auth;
1N/Aextern char commands[];
1N/A
1N/A/* For `more'-like feature. */
1N/Aextern int max_lines;
1N/Aextern int count_lines;
1N/Aextern int use_pager;
1N/A#endif
1N/A
1N/A#ifndef NO_DECOMPRESSION
1N/Aextern int no_decompression;
1N/Aextern int compressed_file;
1N/A#endif
1N/A
1N/A/* instrumentation variables */
1N/Aextern void (*disk_read_hook) (unsigned int, int, int);
1N/Aextern void (*disk_read_func) (unsigned int, int, int);
1N/A
1N/A#ifndef STAGE1_5
1N/A/* The flag for debug mode. */
1N/Aextern int debug;
1N/A#endif /* STAGE1_5 */
1N/A
1N/Aextern unsigned long current_drive;
1N/Aextern unsigned long current_partition;
1N/Aextern char current_rootpool[MAXNAMELEN];
1N/Aextern char current_bootfs[MAXNAMELEN];
1N/Aextern unsigned long long current_bootfs_obj;
1N/Aextern char current_bootpath[MAXPATHLEN];
1N/Aextern char current_devid[MAXPATHLEN];
1N/Aextern int is_zfs_mount;
1N/Aextern unsigned long best_drive;
1N/Aextern unsigned long best_part;
1N/Aextern int find_best_root;
1N/A
1N/Aextern int fsys_type;
1N/A
1N/A/* The information for a disk geometry. The CHS information is only for
1N/A DOS/Partition table compatibility, and the real number of sectors is
1N/A stored in TOTAL_SECTORS. */
1N/Astruct geometry
1N/A{
1N/A /* The number of cylinders */
1N/A unsigned long cylinders;
1N/A /* The number of heads */
1N/A unsigned long heads;
1N/A /* The number of sectors */
1N/A unsigned long sectors;
1N/A /* The total number of sectors */
1N/A unsigned long long total_sectors;
1N/A /* Device sector size */
1N/A unsigned long sector_size;
1N/A /* Flags */
1N/A unsigned long flags;
1N/A};
1N/A
1N/Aextern unsigned long part_start;
1N/Aextern unsigned long part_length;
1N/A
1N/Aextern int current_slice;
1N/A
1N/Aextern int buf_drive;
1N/A#define BUF_CACHE_INVALID 0xffffffff
1N/Aextern unsigned int buf_track;
1N/Aextern struct geometry buf_geom;
1N/A
1N/A/* these are the current file position and maximum file position */
1N/Aextern int filepos;
1N/Aextern int filemax;
1N/A
1N/A/*
1N/A * Common BIOS/boot data.
1N/A */
1N/A
1N/Aextern struct multiboot_info mbi;
1N/Aextern struct vbe_controller mbi_vbe_controller;
1N/Aextern struct vbe_mode mbi_vbe_mode_info;
1N/Aextern unsigned long saved_drive;
1N/Aextern unsigned long saved_partition;
1N/Aextern unsigned long cdrom_drive;
1N/A#ifndef STAGE1_5
1N/A#ifdef SOLARIS_NETBOOT
1N/Aextern unsigned long dhcpack_length;
1N/Aextern unsigned long dhcpack_buf;
1N/A#endif
1N/Aextern unsigned long saved_mem_upper;
1N/Aextern unsigned long extended_memory;
1N/A#endif
1N/A
1N/A/*
1N/A * Error variables.
1N/A */
1N/A
1N/Aextern grub_error_t errnum;
1N/Aextern char *err_list[];
1N/A
1N/A/* don't print geeky noise */
1N/Atypedef enum
1N/A{
1N/A SILENT,
1N/A VERBOSE,
1N/A DEFER_SILENT,
1N/A DEFER_VERBOSE
1N/A} silent_status;
1N/A
1N/A/* one screen worth of messages 80x24 = 1920 chars -- more with newlines */
1N/A#define SCREENBUF 2000
1N/A
1N/Astruct silentbuf {
1N/A silent_status status;
1N/A int looped;
1N/A char buffer[SCREENBUF];
1N/A char *buffer_start;
1N/A};
1N/A
1N/Aextern struct silentbuf silent;
1N/Aextern int reset_term;
1N/A
1N/A/* Simplify declaration of entry_addr. */
1N/Atypedef void (*entry_func) (int, int, int, int, int, int)
1N/A __attribute__ ((noreturn));
1N/A
1N/Aextern entry_func entry_addr;
1N/A
1N/A/* Enter the stage1.5/stage2 C code after the stack is set up. */
1N/Avoid cmain (void);
1N/A
1N/A/* Halt the processor (called after an unrecoverable error). */
1N/Avoid stop (void) __attribute__ ((noreturn));
1N/A
1N/A/* Reboot the system. */
1N/Avoid grub_reboot (void) __attribute__ ((noreturn));
1N/A
1N/A/* Halt the system, using APM if possible. If NO_APM is true, don't use
1N/A APM even if it is available. */
1N/Avoid grub_halt (int no_apm) __attribute__ ((noreturn));
1N/A
1N/A/* Copy MAP to the drive map and set up int13_handler. */
1N/Avoid set_int13_handler (unsigned short *map);
1N/A
1N/A/* Set up int15_handler. */
1N/Avoid set_int15_handler (void);
1N/A
1N/A/* Restore the original int15 handler. */
1N/Avoid unset_int15_handler (void);
1N/A
1N/A/* Track the int13 handler to probe I/O address space. */
1N/Avoid track_int13 (int drive);
1N/A
1N/A/* The key map. */
1N/Aextern unsigned short bios_key_map[];
1N/Aextern unsigned short ascii_key_map[];
1N/Aextern unsigned short io_map[];
1N/A
1N/A/* calls for direct boot-loader chaining */
1N/Avoid chain_stage1 (unsigned long segment, unsigned long offset,
1N/A unsigned long part_table_addr)
1N/A __attribute__ ((noreturn));
1N/Avoid chain_stage2 (unsigned long segment, unsigned long offset,
1N/A int second_sector)
1N/A __attribute__ ((noreturn));
1N/A
1N/A/* do some funky stuff, then boot linux */
1N/Avoid linux_boot (void) __attribute__ ((noreturn));
1N/A
1N/A/* do some funky stuff, then boot bzImage linux */
1N/Avoid big_linux_boot (void) __attribute__ ((noreturn));
1N/A
1N/A/* booting a multiboot executable */
1N/Avoid multi_boot (int start, int mb_info) __attribute__ ((noreturn));
1N/A
1N/A/* If LINEAR is nonzero, then set the Intel processor to linear mode.
1N/A Otherwise, bit 20 of all memory accesses is always forced to zero,
1N/A causing a wraparound effect for bugwards compatibility with the
1N/A 8086 CPU. */
1N/Avoid gateA20 (int linear);
1N/A
1N/A/* memory probe routines */
1N/Aint get_memsize (int type);
1N/Aint get_eisamemsize (void);
1N/A
1N/A/* Fetch the next entry in the memory map and return the continuation
1N/A value. DESC is a pointer to the descriptor buffer, and CONT is the
1N/A previous continuation value (0 to get the first entry in the
1N/A map). */
1N/Aint get_mmap_entry (struct mmar_desc *desc, int cont);
1N/A
1N/A/* Get the linear address of a ROM configuration table. Return zero,
1N/A if fails. */
1N/Aunsigned long get_rom_config_table (void);
1N/A
1N/A/* Get APM BIOS information. */
1N/Avoid get_apm_info (void);
1N/A
1N/A/* Get VBE controller information. */
1N/Aint get_vbe_controller_info (struct vbe_controller *controller);
1N/A
1N/A/* Get VBE mode information. */
1N/Aint get_vbe_mode_info (int mode_number, struct vbe_mode *mode);
1N/A
1N/A/* Set VBE mode. */
1N/Aint set_vbe_mode (int mode_number);
1N/A
1N/A/* Return the data area immediately following our code. */
1N/Aint get_code_end (void);
1N/A
1N/A/* low-level timing info */
1N/Aint getrtsecs (void);
1N/Aint currticks (void);
1N/A
1N/A/* Clear the screen. */
1N/Avoid cls (void);
1N/A
1N/A/* Turn on/off cursor. */
1N/Aint setcursor (int on);
1N/A
1N/A/* Get the current cursor position (where 0,0 is the top left hand
1N/A corner of the screen). Returns packed values, (RET >> 8) is x,
1N/A (RET & 0xff) is y. */
1N/Aint getxy (void);
1N/A
1N/A/* Set the cursor position. */
1N/Avoid gotoxy (int x, int y);
1N/A
1N/A/* Displays an ASCII character. IBM displays will translate some
1N/A characters to special graphical ones (see the DISP_* constants). */
1N/Avoid grub_putchar (int c);
1N/A
1N/A/* Wait for a keypress, and return its packed BIOS/ASCII key code.
1N/A Use ASCII_CHAR(ret) to extract the ASCII code. */
1N/Aint getkey (void);
1N/A
1N/A/* Like GETKEY, but doesn't block, and returns -1 if no keystroke is
1N/A available. */
1N/Aint checkkey (void);
1N/A
1N/A/* Low-level disk I/O */
1N/Aint get_diskinfo (int drive, struct geometry *geometry);
1N/Aint biosdisk (int subfunc, int drive, struct geometry *geometry,
1N/A unsigned int sector, int nsec, int segment);
1N/Avoid stop_floppy (void);
1N/A
1N/A/* Command-line interface functions. */
1N/A#ifndef STAGE1_5
1N/A
1N/A/* The flags for the builtins. */
1N/A#define BUILTIN_CMDLINE 0x1 /* Run in the command-line. */
1N/A#define BUILTIN_MENU 0x2 /* Run in the menu. */
1N/A#define BUILTIN_TITLE 0x4 /* Only for the command title. */
1N/A#define BUILTIN_SCRIPT 0x8 /* Run in the script. */
1N/A#define BUILTIN_NO_ECHO 0x10 /* Don't print command on booting. */
1N/A#define BUILTIN_HELP_LIST 0x20 /* Show help in listing. */
1N/A
1N/A/* The table for a builtin. */
1N/Astruct builtin
1N/A{
1N/A /* The command name. */
1N/A char *name;
1N/A /* The callback function. */
1N/A int (*func) (char *, int);
1N/A /* The combination of the flags defined above. */
1N/A int flags;
1N/A /* The short version of the documentation. */
1N/A char *short_doc;
1N/A /* The long version of the documentation. */
1N/A char *long_doc;
1N/A};
1N/A
1N/A/* All the builtins are registered in this. */
1N/Aextern struct builtin *builtin_table[];
1N/A
1N/A/* The constants for kernel types. */
1N/Atypedef enum
1N/A{
1N/A KERNEL_TYPE_NONE, /* None is loaded. */
1N/A KERNEL_TYPE_MULTIBOOT, /* Multiboot. */
1N/A KERNEL_TYPE_LINUX, /* Linux. */
1N/A KERNEL_TYPE_BIG_LINUX, /* Big Linux. */
1N/A KERNEL_TYPE_FREEBSD, /* FreeBSD. */
1N/A KERNEL_TYPE_NETBSD, /* NetBSD. */
1N/A KERNEL_TYPE_CHAINLOADER /* Chainloader. */
1N/A}
1N/Akernel_t;
1N/A
1N/Aextern kernel_t kernel_type;
1N/Aextern int show_menu;
1N/Aextern int grub_timeout;
1N/A
1N/Avoid init_builtins (void);
1N/Avoid init_config (void);
1N/Achar *skip_to (int after_equal, char *cmdline);
1N/Astruct builtin *find_command (char *command);
1N/Avoid print_cmdline_message (int forever);
1N/Avoid enter_cmdline (char *heap, int forever);
1N/Aint run_script (char *script, char *heap);
1N/A#endif
1N/A
1N/A/* C library replacement functions with identical semantics. */
1N/Avoid grub_printf (const char *format,...);
1N/Aint grub_sprintf (char *buffer, const char *format, ...);
1N/Aint grub_tolower (int c);
1N/Aint grub_isspace (int c);
1N/Aint grub_strncat (char *s1, const char *s2, int n);
1N/Avoid grub_memcpy(void *dest, const void *src, int len);
1N/Avoid *grub_memmove (void *to, const void *from, int len);
1N/Avoid *grub_memset (void *start, int c, int len);
1N/Aint grub_strncat (char *s1, const char *s2, int n);
1N/Achar *grub_strstr (const char *s1, const char *s2);
1N/Aint grub_memcmp (const char *s1, const char *s2, int n);
1N/Aint grub_strcmp (const char *s1, const char *s2);
1N/Aint grub_strlen (const char *str);
1N/Achar *grub_strcpy (char *dest, const char *src);
1N/Achar *grub_strchr (char *str, char c);
1N/Achar *grub_strrchr (char *str, char c);
1N/A
1N/Avoid noisy_printf (const char *format,...);
1N/A
1N/A#ifndef GRUB_UTIL
1N/Atypedef unsigned long grub_jmp_buf[6];
1N/A#else
1N/A/* In the grub shell, use the libc jmp_buf instead. */
1N/A# include <setjmp.h>
1N/A# define grub_jmp_buf jmp_buf
1N/A#endif
1N/A
1N/A#ifdef GRUB_UTIL
1N/A# define grub_setjmp setjmp
1N/A# define grub_longjmp longjmp
1N/A#else /* ! GRUB_UTIL */
1N/Aint grub_setjmp (grub_jmp_buf env);
1N/Avoid grub_longjmp (grub_jmp_buf env, int val);
1N/A#endif /* ! GRUB_UTIL */
1N/A
1N/A/* The environment for restarting Stage 2. */
1N/Aextern grub_jmp_buf restart_env;
1N/A/* The environment for restarting the command-line interface. */
1N/Aextern grub_jmp_buf restart_cmdline_env;
1N/A
1N/A/* misc */
1N/Avoid init_page (void);
1N/Avoid print_error (void);
1N/Achar *convert_to_ascii (char *buf, int c, ...);
1N/Aint get_cmdline (char *prompt, char *cmdline, int maxlen,
1N/A int echo_char, int history);
1N/Aint substring (const char *s1, const char *s2);
1N/Aint nul_terminate (char *str);
1N/Aint get_based_digit (int c, int base);
1N/Aint safe_parse_maxint (char **str_ptr, int *myint_ptr);
1N/Aint memcheck (unsigned long start, unsigned long len);
1N/Avoid grub_putstr (const char *str);
1N/A
1N/A#ifndef NO_DECOMPRESSION
1N/A/* Compression support. */
1N/Aint gunzip_test_header (void);
1N/Aint gunzip_read (char *buf, int len);
1N/A#endif /* NO_DECOMPRESSION */
1N/A
1N/Aint rawread (int drive, unsigned int sector, int byte_offset, int byte_len,
1N/A char *buf);
1N/Aint devread (unsigned int sector, int byte_offset, int byte_len, char *buf);
1N/Aint rawwrite (int drive, unsigned int sector, char *buf);
1N/Aint devwrite (unsigned int sector, int sector_len, char *buf);
1N/A
1N/A/* Parse a device string and initialize the global parameters. */
1N/Achar *set_device (char *device);
1N/Aint open_device (void);
1N/Aint real_open_partition (int flags);
1N/Aint open_partition (void);
1N/Aint next_partition (unsigned long drive, unsigned long dest,
1N/A unsigned long *partition, int *type,
1N/A unsigned long *start, unsigned long *len,
1N/A unsigned long *offset, int *entry,
1N/A unsigned long *ext_offset, char *buf);
1N/A
1N/A/* Sets device to the one represented by the SAVED_* parameters. */
1N/Aint make_saved_active (void);
1N/A
1N/A/* Set or clear the current root partition's hidden flag. */
1N/Aint set_partition_hidden_flag (int hidden);
1N/A
1N/A/* Open a file or directory on the active device, using GRUB's
1N/A internal filesystem support. */
1N/Aint grub_open (char *filename);
1N/A
1N/A/* Read LEN bytes into BUF from the file that was opened with
1N/A GRUB_OPEN. If LEN is -1, read all the remaining data in the file. */
1N/Aint grub_read (char *buf, int len);
1N/A
1N/A/* Reposition a file offset. */
1N/Aint grub_seek (int offset);
1N/A
1N/A/* Close a file. */
1N/Avoid grub_close (void);
1N/A
1N/A/* List the contents of the directory that was opened with GRUB_OPEN,
1N/A printing all completions. */
1N/Aint dir (char *dirname);
1N/A
1N/Aint set_bootdev (int hdbias);
1N/A
1N/A/* Display statistics on the current active device. */
1N/Avoid print_fsys_type (void);
1N/A
1N/A/* Display device and filename completions. */
1N/Avoid print_a_completion (char *filename);
1N/Aint print_completions (int is_filename, int is_completion);
1N/A
1N/A/* Copies the current partition data to the desired address. */
1N/Avoid copy_current_part_entry (char *buf);
1N/A
1N/A/* Read a line from a text config file. */
1N/Aint get_line_from_config (char *cmdline, int maxlen, int read_from_file);
1N/A
1N/A#ifndef STAGE1_5
1N/Avoid bsd_boot (kernel_t type, int bootdev, char *arg)
1N/A __attribute__ ((noreturn));
1N/A
1N/A/* Define flags for load_image here. */
1N/A/* Don't pass a Linux's mem option automatically. */
1N/A#define KERNEL_LOAD_NO_MEM_OPTION (1 << 0)
1N/A
1N/Akernel_t load_image (char *kernel, char *arg, kernel_t suggested_type,
1N/A unsigned long load_flags);
1N/A
1N/Aint load_module (char *module, char *arg);
1N/Aint load_initrd (char *initrd);
1N/A
1N/Aint check_password(char *entered, char* expected, password_t type);
1N/A#endif
1N/A
1N/Avoid init_bios_info (void);
1N/A
1N/A#endif /* ASM_FILE */
1N/A
1N/A#endif /* ! GRUB_SHARED_HEADER */