shared.h revision 1650e5296608be8925d9831310c9ad3595fd6869
1/* shared.h - definitions used in all GRUB-specific code */ 2/* 3 * GRUB -- GRand Unified Bootloader 4 * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 21/* 22 * Generic defines to use anywhere 23 */ 24 25#ifndef GRUB_SHARED_HEADER 26#define GRUB_SHARED_HEADER 1 27 28#include <config.h> 29 30/* Add an underscore to a C symbol in assembler code if needed. */ 31#ifdef HAVE_ASM_USCORE 32# define EXT_C(sym) _ ## sym 33#else 34# define EXT_C(sym) sym 35#endif 36 37/* Maybe redirect memory requests through grub_scratch_mem. */ 38#ifdef GRUB_UTIL 39extern char *grub_scratch_mem; 40# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem) 41# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4) 42#else 43# define RAW_ADDR(x) (x) 44# define RAW_SEG(x) (x) 45#endif 46 47/* 48 * Integer sizes 49 */ 50 51#define MAXINT 0x7FFFFFFF 52 53/* Maximum command line size. Before you blindly increase this value, 54 see the comment in char_io.c (get_cmdline). */ 55#define MAX_CMDLINE 1600 56#define NEW_HEAPSIZE 1500 57 58/* 512-byte scratch area */ 59#define SCRATCHADDR RAW_ADDR (0x77e00) 60#define SCRATCHSEG RAW_SEG (0x77e0) 61 62/* 63 * This is the location of the raw device buffer. It is 31.5K 64 * in size. 65 */ 66 67#define BUFFERLEN 0x7e00 68#define BUFFERADDR RAW_ADDR (0x70000) 69#define BUFFERSEG RAW_SEG (0x7000) 70 71#define BOOT_PART_TABLE RAW_ADDR (0x07be) 72 73/* 74 * BIOS disk defines 75 */ 76#define BIOSDISK_READ 0x0 77#define BIOSDISK_WRITE 0x1 78#define BIOSDISK_ERROR_GEOMETRY 0x100 79#define BIOSDISK_FLAG_LBA_EXTENSION 0x1 80#define BIOSDISK_FLAG_CDROM 0x2 81 82/* 83 * This is the filesystem (not raw device) buffer. 84 * It is 32K in size, do not overrun! 85 */ 86 87#define FSYS_BUFLEN 0x8000 88#define FSYS_BUF RAW_ADDR (0x68000) 89 90/* Command-line buffer for Multiboot kernels and modules. This area 91 includes the area into which Stage 1.5 and Stage 1 are loaded, but 92 that's no problem. */ 93#define MB_CMDLINE_BUF RAW_ADDR (0x2000) 94#define MB_CMDLINE_BUFLEN 0x6000 95 96/* The buffer for the password. */ 97#define PASSWORD_BUF RAW_ADDR (0x78000) 98#define PASSWORD_BUFLEN 0x200 99 100/* THe buffer for the filename of "/boot/grub/default". */ 101#define DEFAULT_FILE_BUF (PASSWORD_BUF + PASSWORD_BUFLEN) 102#define DEFAULT_FILE_BUFLEN 0x60 103 104/* The buffer for the command-line. */ 105#define CMDLINE_BUF (DEFAULT_FILE_BUF + DEFAULT_FILE_BUFLEN) 106#define CMDLINE_BUFLEN MAX_CMDLINE 107 108/* The kill buffer for the command-line. */ 109#define KILL_BUF (CMDLINE_BUF + CMDLINE_BUFLEN) 110#define KILL_BUFLEN MAX_CMDLINE 111 112/* The history buffer for the command-line. */ 113#define HISTORY_BUF (KILL_BUF + KILL_BUFLEN) 114#define HISTORY_SIZE 5 115#define HISTORY_BUFLEN (MAX_CMDLINE * HISTORY_SIZE) 116 117/* The buffer for the completion. */ 118#define COMPLETION_BUF (HISTORY_BUF + HISTORY_BUFLEN) 119#define COMPLETION_BUFLEN MAX_CMDLINE 120 121/* The buffer for the unique string. */ 122#define UNIQUE_BUF (COMPLETION_BUF + COMPLETION_BUFLEN) 123#define UNIQUE_BUFLEN MAX_CMDLINE 124 125/* The buffer for the menu entries. */ 126#define MENU_BUF (UNIQUE_BUF + UNIQUE_BUFLEN) 127#define MENU_BUFLEN (0x8000 + PASSWORD_BUF - MENU_BUF) 128 129/* The size of the drive map. */ 130#define DRIVE_MAP_SIZE 8 131 132/* The size of the key map. */ 133#define KEY_MAP_SIZE 128 134 135/* The size of the io map. */ 136#define IO_MAP_SIZE 128 137 138/* 139 * Linux setup parameters 140 */ 141 142#define LINUX_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */ 143#define LINUX_DEFAULT_SETUP_SECTS 4 144#define LINUX_FLAG_CAN_USE_HEAP 0x80 145#define LINUX_INITRD_MAX_ADDRESS 0x38000000 146#define LINUX_MAX_SETUP_SECTS 64 147#define LINUX_BOOT_LOADER_TYPE 0x71 148#define LINUX_HEAP_END_OFFSET (0x9000 - 0x200) 149 150#define LINUX_BZIMAGE_ADDR RAW_ADDR (0x100000) 151#define LINUX_ZIMAGE_ADDR RAW_ADDR (0x10000) 152#define LINUX_OLD_REAL_MODE_ADDR RAW_ADDR (0x90000) 153#define LINUX_SETUP_STACK 0x9000 154 155#define LINUX_FLAG_BIG_KERNEL 0x1 156 157/* Linux's video mode selection support. Actually I hate it! */ 158#define LINUX_VID_MODE_NORMAL 0xFFFF 159#define LINUX_VID_MODE_EXTENDED 0xFFFE 160#define LINUX_VID_MODE_ASK 0xFFFD 161 162#define LINUX_CL_OFFSET 0x9000 163#define LINUX_CL_END_OFFSET 0x90FF 164#define LINUX_SETUP_MOVE_SIZE 0x9100 165#define LINUX_CL_MAGIC 0xA33F 166 167/* 168 * General disk stuff 169 */ 170 171#define SECTOR_SIZE 0x200 172#define SECTOR_BITS 9 173#define BIOS_FLAG_FIXED_DISK 0x80 174 175#define BOOTSEC_LOCATION RAW_ADDR (0x7C00) 176#define BOOTSEC_SIGNATURE 0xAA55 177#define BOOTSEC_BPB_OFFSET 0x3 178#define BOOTSEC_BPB_LENGTH 0x3B 179#define BOOTSEC_BPB_SYSTEM_ID 0x3 180#define BOOTSEC_BPB_HIDDEN_SECTORS 0x1C 181#define BOOTSEC_PART_OFFSET 0x1BE 182#define BOOTSEC_PART_LENGTH 0x40 183#define BOOTSEC_SIG_OFFSET 0x1FE 184#define BOOTSEC_LISTSIZE 8 185 186/* Not bad, perhaps. */ 187#define NETWORK_DRIVE 0x20 188 189/* 190 * GRUB specific information 191 * (in LSB order) 192 */ 193 194#include <stage1.h> 195 196#define STAGE2_VER_MAJ_OFFS 0x6 197#define STAGE2_INSTALLPART 0x8 198#define STAGE2_SAVED_ENTRYNO 0xc 199#define STAGE2_STAGE2_ID 0x10 200#define STAGE2_FORCE_LBA 0x11 201#define STAGE2_VER_STR_OFFS 0x12 202 203/* Stage 2 identifiers */ 204#define STAGE2_ID_STAGE2 0 205#define STAGE2_ID_FFS_STAGE1_5 1 206#define STAGE2_ID_E2FS_STAGE1_5 2 207#define STAGE2_ID_FAT_STAGE1_5 3 208#define STAGE2_ID_MINIX_STAGE1_5 4 209#define STAGE2_ID_REISERFS_STAGE1_5 5 210#define STAGE2_ID_VSTAFS_STAGE1_5 6 211#define STAGE2_ID_JFS_STAGE1_5 7 212#define STAGE2_ID_XFS_STAGE1_5 8 213#define STAGE2_ID_ISO9660_STAGE1_5 9 214#define STAGE2_ID_UFS2_STAGE1_5 10 215 216#ifndef STAGE1_5 217# define STAGE2_ID STAGE2_ID_STAGE2 218#else 219# if defined(FSYS_FFS) 220# define STAGE2_ID STAGE2_ID_FFS_STAGE1_5 221# elif defined(FSYS_EXT2FS) 222# define STAGE2_ID STAGE2_ID_E2FS_STAGE1_5 223# elif defined(FSYS_FAT) 224# define STAGE2_ID STAGE2_ID_FAT_STAGE1_5 225# elif defined(FSYS_MINIX) 226# define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5 227# elif defined(FSYS_REISERFS) 228# define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5 229# elif defined(FSYS_VSTAFS) 230# define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5 231# elif defined(FSYS_JFS) 232# define STAGE2_ID STAGE2_ID_JFS_STAGE1_5 233# elif defined(FSYS_XFS) 234# define STAGE2_ID STAGE2_ID_XFS_STAGE1_5 235# elif defined(FSYS_ISO9660) 236# define STAGE2_ID STAGE2_ID_ISO9660_STAGE1_5 237# elif defined(FSYS_UFS2) 238# define STAGE2_ID STAGE2_ID_UFS2_STAGE1_5 239# else 240# error "unknown Stage 2" 241# endif 242#endif 243 244/* 245 * defines for use when switching between real and protected mode 246 */ 247 248#define CR0_PE_ON 0x1 249#define CR0_PE_OFF 0xfffffffe 250#define PROT_MODE_CSEG 0x8 251#define PROT_MODE_DSEG 0x10 252#define PSEUDO_RM_CSEG 0x18 253#define PSEUDO_RM_DSEG 0x20 254#define STACKOFF (0x2000 - 0x10) 255#define PROTSTACKINIT (FSYS_BUF - 0x10) 256 257 258/* 259 * Assembly code defines 260 * 261 * "EXT_C" is assumed to be defined in the Makefile by the configure 262 * command. 263 */ 264 265#define ENTRY(x) .globl EXT_C(x) ; EXT_C(x): 266#define VARIABLE(x) ENTRY(x) 267 268 269#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */ 270#define K_STATUS 0x64 /* keyboard status */ 271#define K_CMD 0x64 /* keybd ctlr command (write-only) */ 272 273#define K_OBUF_FUL 0x01 /* output buffer full */ 274#define K_IBUF_FUL 0x02 /* input buffer full */ 275 276#define KC_CMD_WIN 0xd0 /* read output port */ 277#define KC_CMD_WOUT 0xd1 /* write output port */ 278#define KB_OUTPUT_MASK 0xdd /* enable output buffer full interrupt 279 enable data line 280 enable clock line */ 281#define KB_A20_ENABLE 0x02 282 283/* Codes for getchar. */ 284#define ASCII_CHAR(x) ((x) & 0xFF) 285#if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES) 286# define KEY_LEFT 0x4B00 287# define KEY_RIGHT 0x4D00 288# define KEY_UP 0x4800 289# define KEY_DOWN 0x5000 290# define KEY_IC 0x5200 /* insert char */ 291# define KEY_DC 0x5300 /* delete char */ 292# define KEY_BACKSPACE 0x0008 293# define KEY_HOME 0x4700 294# define KEY_END 0x4F00 295# define KEY_NPAGE 0x5100 296# define KEY_PPAGE 0x4900 297# define A_NORMAL 0x7 298# define A_REVERSE 0x70 299#elif defined(HAVE_NCURSES_CURSES_H) 300# include <ncurses/curses.h> 301#elif defined(HAVE_NCURSES_H) 302# include <ncurses.h> 303#elif defined(HAVE_CURSES_H) 304# include <curses.h> 305#endif 306 307/* In old BSD curses, A_NORMAL and A_REVERSE are not defined, so we 308 define them here if they are undefined. */ 309#ifndef A_NORMAL 310# define A_NORMAL 0 311#endif /* ! A_NORMAL */ 312#ifndef A_REVERSE 313# ifdef A_STANDOUT 314# define A_REVERSE A_STANDOUT 315# else /* ! A_STANDOUT */ 316# define A_REVERSE 0 317# endif /* ! A_STANDOUT */ 318#endif /* ! A_REVERSE */ 319 320/* Define ACS_* ourselves, since the definitions are not consistent among 321 various curses implementations. */ 322#undef ACS_ULCORNER 323#undef ACS_URCORNER 324#undef ACS_LLCORNER 325#undef ACS_LRCORNER 326#undef ACS_HLINE 327#undef ACS_VLINE 328#undef ACS_LARROW 329#undef ACS_RARROW 330#undef ACS_UARROW 331#undef ACS_DARROW 332 333#define ACS_ULCORNER '+' 334#define ACS_URCORNER '+' 335#define ACS_LLCORNER '+' 336#define ACS_LRCORNER '+' 337#define ACS_HLINE '-' 338#define ACS_VLINE '|' 339#define ACS_LARROW '<' 340#define ACS_RARROW '>' 341#define ACS_UARROW '^' 342#define ACS_DARROW 'v' 343 344/* Special graphics characters for IBM displays. */ 345#define DISP_UL 218 346#define DISP_UR 191 347#define DISP_LL 192 348#define DISP_LR 217 349#define DISP_HORIZ 196 350#define DISP_VERT 179 351#define DISP_LEFT 0x1b 352#define DISP_RIGHT 0x1a 353#define DISP_UP 0x18 354#define DISP_DOWN 0x19 355 356/* Remap some libc-API-compatible function names so that we prevent 357 circularararity. */ 358#ifndef WITHOUT_LIBC_STUBS 359#define memmove grub_memmove 360#define memcpy grub_memmove /* we don't need a separate memcpy */ 361#define memset grub_memset 362#define isspace grub_isspace 363#define printf grub_printf 364#define sprintf grub_sprintf 365#undef putchar 366#define putchar grub_putchar 367#define strncat grub_strncat 368#define strstr grub_strstr 369#define memcmp grub_memcmp 370#define strcmp grub_strcmp 371#define tolower grub_tolower 372#define strlen grub_strlen 373#define strcpy grub_strcpy 374#endif /* WITHOUT_LIBC_STUBS */ 375 376 377#ifndef ASM_FILE 378/* 379 * Below this should be ONLY defines and other constructs for C code. 380 */ 381 382/* multiboot stuff */ 383 384#include "mb_header.h" 385#include "mb_info.h" 386 387/* For the Linux/i386 boot protocol version 2.03. */ 388struct linux_kernel_header 389{ 390 char code1[0x0020]; 391 unsigned short cl_magic; /* Magic number 0xA33F */ 392 unsigned short cl_offset; /* The offset of command line */ 393 char code2[0x01F1 - 0x0020 - 2 - 2]; 394 unsigned char setup_sects; /* The size of the setup in sectors */ 395 unsigned short root_flags; /* If the root is mounted readonly */ 396 unsigned short syssize; /* obsolete */ 397 unsigned short swap_dev; /* obsolete */ 398 unsigned short ram_size; /* obsolete */ 399 unsigned short vid_mode; /* Video mode control */ 400 unsigned short root_dev; /* Default root device number */ 401 unsigned short boot_flag; /* 0xAA55 magic number */ 402 unsigned short jump; /* Jump instruction */ 403 unsigned long header; /* Magic signature "HdrS" */ 404 unsigned short version; /* Boot protocol version supported */ 405 unsigned long realmode_swtch; /* Boot loader hook */ 406 unsigned long start_sys; /* Points to kernel version string */ 407 unsigned char type_of_loader; /* Boot loader identifier */ 408 unsigned char loadflags; /* Boot protocol option flags */ 409 unsigned short setup_move_size; /* Move to high memory size */ 410 unsigned long code32_start; /* Boot loader hook */ 411 unsigned long ramdisk_image; /* initrd load address */ 412 unsigned long ramdisk_size; /* initrd size */ 413 unsigned long bootsect_kludge; /* obsolete */ 414 unsigned short heap_end_ptr; /* Free memory after setup end */ 415 unsigned short pad1; /* Unused */ 416 char *cmd_line_ptr; /* Points to the kernel command line */ 417 unsigned long initrd_addr_max; /* The highest address of initrd */ 418} __attribute__ ((packed)); 419 420/* Memory map address range descriptor used by GET_MMAP_ENTRY. */ 421struct mmar_desc 422{ 423 unsigned long desc_len; /* Size of this descriptor. */ 424 unsigned long long addr; /* Base address. */ 425 unsigned long long length; /* Length in bytes. */ 426 unsigned long type; /* Type of address range. */ 427} __attribute__ ((packed)); 428 429/* VBE controller information. */ 430struct vbe_controller 431{ 432 unsigned char signature[4]; 433 unsigned short version; 434 unsigned long oem_string; 435 unsigned long capabilities; 436 unsigned long video_mode; 437 unsigned short total_memory; 438 unsigned short oem_software_rev; 439 unsigned long oem_vendor_name; 440 unsigned long oem_product_name; 441 unsigned long oem_product_rev; 442 unsigned char reserved[222]; 443 unsigned char oem_data[256]; 444} __attribute__ ((packed)); 445 446/* VBE mode information. */ 447struct vbe_mode 448{ 449 unsigned short mode_attributes; 450 unsigned char win_a_attributes; 451 unsigned char win_b_attributes; 452 unsigned short win_granularity; 453 unsigned short win_size; 454 unsigned short win_a_segment; 455 unsigned short win_b_segment; 456 unsigned long win_func; 457 unsigned short bytes_per_scanline; 458 459 /* >=1.2 */ 460 unsigned short x_resolution; 461 unsigned short y_resolution; 462 unsigned char x_char_size; 463 unsigned char y_char_size; 464 unsigned char number_of_planes; 465 unsigned char bits_per_pixel; 466 unsigned char number_of_banks; 467 unsigned char memory_model; 468 unsigned char bank_size; 469 unsigned char number_of_image_pages; 470 unsigned char reserved0; 471 472 /* direct color */ 473 unsigned char red_mask_size; 474 unsigned char red_field_position; 475 unsigned char green_mask_size; 476 unsigned char green_field_position; 477 unsigned char blue_mask_size; 478 unsigned char blue_field_position; 479 unsigned char reserved_mask_size; 480 unsigned char reserved_field_position; 481 unsigned char direct_color_mode_info; 482 483 /* >=2.0 */ 484 unsigned long phys_base; 485 unsigned long reserved1; 486 unsigned short reversed2; 487 488 /* >=3.0 */ 489 unsigned short linear_bytes_per_scanline; 490 unsigned char banked_number_of_image_pages; 491 unsigned char linear_number_of_image_pages; 492 unsigned char linear_red_mask_size; 493 unsigned char linear_red_field_position; 494 unsigned char linear_green_mask_size; 495 unsigned char linear_green_field_position; 496 unsigned char linear_blue_mask_size; 497 unsigned char linear_blue_field_position; 498 unsigned char linear_reserved_mask_size; 499 unsigned char linear_reserved_field_position; 500 unsigned long max_pixel_clock; 501 502 unsigned char reserved3[189]; 503} __attribute__ ((packed)); 504 505 506#undef NULL 507#define NULL ((void *) 0) 508 509/* Error codes (descriptions are in common.c) */ 510typedef enum 511{ 512 ERR_NONE = 0, 513 ERR_BAD_FILENAME, 514 ERR_BAD_FILETYPE, 515 ERR_BAD_GZIP_DATA, 516 ERR_BAD_GZIP_HEADER, 517 ERR_BAD_PART_TABLE, 518 ERR_BAD_VERSION, 519 ERR_BELOW_1MB, 520 ERR_BOOT_COMMAND, 521 ERR_BOOT_FAILURE, 522 ERR_BOOT_FEATURES, 523 ERR_DEV_FORMAT, 524 ERR_DEV_VALUES, 525 ERR_EXEC_FORMAT, 526 ERR_FILELENGTH, 527 ERR_FILE_NOT_FOUND, 528 ERR_FSYS_CORRUPT, 529 ERR_FSYS_MOUNT, 530 ERR_GEOM, 531 ERR_NEED_LX_KERNEL, 532 ERR_NEED_MB_KERNEL, 533 ERR_NO_DISK, 534 ERR_NO_PART, 535 ERR_NUMBER_PARSING, 536 ERR_OUTSIDE_PART, 537 ERR_READ, 538 ERR_SYMLINK_LOOP, 539 ERR_UNRECOGNIZED, 540 ERR_WONT_FIT, 541 ERR_WRITE, 542 ERR_BAD_ARGUMENT, 543 ERR_UNALIGNED, 544 ERR_PRIVILEGED, 545 ERR_DEV_NEED_INIT, 546 ERR_NO_DISK_SPACE, 547 ERR_NUMBER_OVERFLOW, 548 549 MAX_ERR_NUM 550} grub_error_t; 551 552extern unsigned long install_partition; 553extern unsigned long boot_drive; 554extern unsigned long install_second_sector; 555extern struct apm_info apm_bios_info; 556extern unsigned long boot_part_addr; 557extern int saved_entryno; 558extern unsigned char force_lba; 559extern char version_string[]; 560extern char config_file[]; 561extern unsigned long linux_text_len; 562extern char *linux_data_tmp_addr; 563extern char *linux_data_real_addr; 564 565#ifdef GRUB_UTIL 566/* If not using config file, this variable is set to zero, 567 otherwise non-zero. */ 568extern int use_config_file; 569/* If using the preset menu, this variable is set to non-zero, 570 otherwise zero. */ 571extern int use_preset_menu; 572/* If not using curses, this variable is set to zero, otherwise non-zero. */ 573extern int use_curses; 574/* The flag for verbose messages. */ 575extern int verbose; 576/* The flag for read-only. */ 577extern int read_only; 578/* The number of floppies to be probed. */ 579extern int floppy_disks; 580/* The map between BIOS drives and UNIX device file names. */ 581extern char **device_map; 582/* The filename which stores the information about a device map. */ 583extern char *device_map_file; 584/* The array of geometries. */ 585extern struct geometry *disks; 586/* Assign DRIVE to a device name DEVICE. */ 587extern void assign_device_name (int drive, const char *device); 588#endif 589 590#ifndef STAGE1_5 591/* GUI interface variables. */ 592# define MAX_FALLBACK_ENTRIES 8 593extern int fallback_entries[MAX_FALLBACK_ENTRIES]; 594extern int fallback_entryno; 595extern int default_entry; 596extern int current_entryno; 597 598/* The constants for password types. */ 599typedef enum 600{ 601 PASSWORD_PLAIN, 602 PASSWORD_MD5, 603 PASSWORD_UNSUPPORTED 604} 605password_t; 606 607extern char *password; 608extern password_t password_type; 609extern int auth; 610extern char commands[]; 611 612/* For `more'-like feature. */ 613extern int max_lines; 614extern int count_lines; 615extern int use_pager; 616#endif 617 618#ifndef NO_DECOMPRESSION 619extern int no_decompression; 620extern int compressed_file; 621#endif 622 623/* instrumentation variables */ 624extern void (*disk_read_hook) (int, int, int); 625extern void (*disk_read_func) (int, int, int); 626 627#ifndef STAGE1_5 628/* The flag for debug mode. */ 629extern int debug; 630#endif /* STAGE1_5 */ 631 632extern unsigned long current_drive; 633extern unsigned long current_partition; 634 635extern int fsys_type; 636 637/* The information for a disk geometry. The CHS information is only for 638 DOS/Partition table compatibility, and the real number of sectors is 639 stored in TOTAL_SECTORS. */ 640struct geometry 641{ 642 /* The number of cylinders */ 643 unsigned long cylinders; 644 /* The number of heads */ 645 unsigned long heads; 646 /* The number of sectors */ 647 unsigned long sectors; 648 /* The total number of sectors */ 649 unsigned long total_sectors; 650 /* Device sector size */ 651 unsigned long sector_size; 652 /* Flags */ 653 unsigned long flags; 654}; 655 656extern unsigned long part_start; 657extern unsigned long part_length; 658 659extern int current_slice; 660 661extern int buf_drive; 662extern int buf_track; 663extern struct geometry buf_geom; 664 665/* these are the current file position and maximum file position */ 666extern int filepos; 667extern int filemax; 668 669/* 670 * Common BIOS/boot data. 671 */ 672 673extern struct multiboot_info mbi; 674extern unsigned long saved_drive; 675extern unsigned long saved_partition; 676extern unsigned long cdrom_drive; 677#ifndef STAGE1_5 678extern unsigned long saved_mem_upper; 679extern unsigned long extended_memory; 680#endif 681 682/* 683 * Error variables. 684 */ 685 686extern grub_error_t errnum; 687extern char *err_list[]; 688 689/* Simplify declaration of entry_addr. */ 690typedef void (*entry_func) (int, int, int, int, int, int) 691 __attribute__ ((noreturn)); 692 693extern entry_func entry_addr; 694 695/* Enter the stage1.5/stage2 C code after the stack is set up. */ 696void cmain (void); 697 698/* Halt the processor (called after an unrecoverable error). */ 699void stop (void) __attribute__ ((noreturn)); 700 701/* Reboot the system. */ 702void grub_reboot (void) __attribute__ ((noreturn)); 703 704/* Halt the system, using APM if possible. If NO_APM is true, don't use 705 APM even if it is available. */ 706void grub_halt (int no_apm) __attribute__ ((noreturn)); 707 708/* Copy MAP to the drive map and set up int13_handler. */ 709void set_int13_handler (unsigned short *map); 710 711/* Set up int15_handler. */ 712void set_int15_handler (void); 713 714/* Restore the original int15 handler. */ 715void unset_int15_handler (void); 716 717/* Track the int13 handler to probe I/O address space. */ 718void track_int13 (int drive); 719 720/* The key map. */ 721extern unsigned short bios_key_map[]; 722extern unsigned short ascii_key_map[]; 723extern unsigned short io_map[]; 724 725/* calls for direct boot-loader chaining */ 726void chain_stage1 (unsigned long segment, unsigned long offset, 727 unsigned long part_table_addr) 728 __attribute__ ((noreturn)); 729void chain_stage2 (unsigned long segment, unsigned long offset, 730 int second_sector) 731 __attribute__ ((noreturn)); 732 733/* do some funky stuff, then boot linux */ 734void linux_boot (void) __attribute__ ((noreturn)); 735 736/* do some funky stuff, then boot bzImage linux */ 737void big_linux_boot (void) __attribute__ ((noreturn)); 738 739/* booting a multiboot executable */ 740void multi_boot (int start, int mb_info) __attribute__ ((noreturn)); 741 742/* If LINEAR is nonzero, then set the Intel processor to linear mode. 743 Otherwise, bit 20 of all memory accesses is always forced to zero, 744 causing a wraparound effect for bugwards compatibility with the 745 8086 CPU. */ 746void gateA20 (int linear); 747 748/* memory probe routines */ 749int get_memsize (int type); 750int get_eisamemsize (void); 751 752/* Fetch the next entry in the memory map and return the continuation 753 value. DESC is a pointer to the descriptor buffer, and CONT is the 754 previous continuation value (0 to get the first entry in the 755 map). */ 756int get_mmap_entry (struct mmar_desc *desc, int cont); 757 758/* Get the linear address of a ROM configuration table. Return zero, 759 if fails. */ 760unsigned long get_rom_config_table (void); 761 762/* Get APM BIOS information. */ 763void get_apm_info (void); 764 765/* Get VBE controller information. */ 766int get_vbe_controller_info (struct vbe_controller *controller); 767 768/* Get VBE mode information. */ 769int get_vbe_mode_info (int mode_number, struct vbe_mode *mode); 770 771/* Set VBE mode. */ 772int set_vbe_mode (int mode_number); 773 774/* Return the data area immediately following our code. */ 775int get_code_end (void); 776 777/* low-level timing info */ 778int getrtsecs (void); 779int currticks (void); 780 781/* Clear the screen. */ 782void cls (void); 783 784/* Turn on/off cursor. */ 785int setcursor (int on); 786 787/* Get the current cursor position (where 0,0 is the top left hand 788 corner of the screen). Returns packed values, (RET >> 8) is x, 789 (RET & 0xff) is y. */ 790int getxy (void); 791 792/* Set the cursor position. */ 793void gotoxy (int x, int y); 794 795/* Displays an ASCII character. IBM displays will translate some 796 characters to special graphical ones (see the DISP_* constants). */ 797void grub_putchar (int c); 798 799/* Wait for a keypress, and return its packed BIOS/ASCII key code. 800 Use ASCII_CHAR(ret) to extract the ASCII code. */ 801int getkey (void); 802 803/* Like GETKEY, but doesn't block, and returns -1 if no keystroke is 804 available. */ 805int checkkey (void); 806 807/* Low-level disk I/O */ 808int get_diskinfo (int drive, struct geometry *geometry); 809int biosdisk (int subfunc, int drive, struct geometry *geometry, 810 int sector, int nsec, int segment); 811void stop_floppy (void); 812 813/* Command-line interface functions. */ 814#ifndef STAGE1_5 815 816/* The flags for the builtins. */ 817#define BUILTIN_CMDLINE 0x1 /* Run in the command-line. */ 818#define BUILTIN_MENU 0x2 /* Run in the menu. */ 819#define BUILTIN_TITLE 0x4 /* Only for the command title. */ 820#define BUILTIN_SCRIPT 0x8 /* Run in the script. */ 821#define BUILTIN_NO_ECHO 0x10 /* Don't print command on booting. */ 822#define BUILTIN_HELP_LIST 0x20 /* Show help in listing. */ 823 824/* The table for a builtin. */ 825struct builtin 826{ 827 /* The command name. */ 828 char *name; 829 /* The callback function. */ 830 int (*func) (char *, int); 831 /* The combination of the flags defined above. */ 832 int flags; 833 /* The short version of the documentation. */ 834 char *short_doc; 835 /* The long version of the documentation. */ 836 char *long_doc; 837}; 838 839/* All the builtins are registered in this. */ 840extern struct builtin *builtin_table[]; 841 842/* The constants for kernel types. */ 843typedef enum 844{ 845 KERNEL_TYPE_NONE, /* None is loaded. */ 846 KERNEL_TYPE_MULTIBOOT, /* Multiboot. */ 847 KERNEL_TYPE_LINUX, /* Linux. */ 848 KERNEL_TYPE_BIG_LINUX, /* Big Linux. */ 849 KERNEL_TYPE_FREEBSD, /* FreeBSD. */ 850 KERNEL_TYPE_NETBSD, /* NetBSD. */ 851 KERNEL_TYPE_CHAINLOADER /* Chainloader. */ 852} 853kernel_t; 854 855extern kernel_t kernel_type; 856extern int show_menu; 857extern int grub_timeout; 858 859void init_builtins (void); 860void init_config (void); 861char *skip_to (int after_equal, char *cmdline); 862struct builtin *find_command (char *command); 863void print_cmdline_message (int forever); 864void enter_cmdline (char *heap, int forever); 865int run_script (char *script, char *heap); 866#endif 867 868/* C library replacement functions with identical semantics. */ 869void grub_printf (const char *format,...); 870int grub_sprintf (char *buffer, const char *format, ...); 871int grub_tolower (int c); 872int grub_isspace (int c); 873int grub_strncat (char *s1, const char *s2, int n); 874void *grub_memmove (void *to, const void *from, int len); 875void *grub_memset (void *start, int c, int len); 876int grub_strncat (char *s1, const char *s2, int n); 877char *grub_strstr (const char *s1, const char *s2); 878int grub_memcmp (const char *s1, const char *s2, int n); 879int grub_strcmp (const char *s1, const char *s2); 880int grub_strlen (const char *str); 881char *grub_strcpy (char *dest, const char *src); 882 883#ifndef GRUB_UTIL 884typedef unsigned long grub_jmp_buf[6]; 885#else 886/* In the grub shell, use the libc jmp_buf instead. */ 887# include <setjmp.h> 888# define grub_jmp_buf jmp_buf 889#endif 890 891#ifdef GRUB_UTIL 892# define grub_setjmp setjmp 893# define grub_longjmp longjmp 894#else /* ! GRUB_UTIL */ 895int grub_setjmp (grub_jmp_buf env); 896void grub_longjmp (grub_jmp_buf env, int val); 897#endif /* ! GRUB_UTIL */ 898 899/* The environment for restarting Stage 2. */ 900extern grub_jmp_buf restart_env; 901/* The environment for restarting the command-line interface. */ 902extern grub_jmp_buf restart_cmdline_env; 903 904/* misc */ 905void init_page (void); 906void print_error (void); 907char *convert_to_ascii (char *buf, int c, ...); 908int get_cmdline (char *prompt, char *cmdline, int maxlen, 909 int echo_char, int history); 910int substring (const char *s1, const char *s2); 911int nul_terminate (char *str); 912int get_based_digit (int c, int base); 913int safe_parse_maxint (char **str_ptr, int *myint_ptr); 914int memcheck (int start, int len); 915void grub_putstr (const char *str); 916 917#ifndef NO_DECOMPRESSION 918/* Compression support. */ 919int gunzip_test_header (void); 920int gunzip_read (char *buf, int len); 921#endif /* NO_DECOMPRESSION */ 922 923int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf); 924int devread (int sector, int byte_offset, int byte_len, char *buf); 925int rawwrite (int drive, int sector, char *buf); 926int devwrite (int sector, int sector_len, char *buf); 927 928/* Parse a device string and initialize the global parameters. */ 929char *set_device (char *device); 930int open_device (void); 931int real_open_partition (int flags); 932int open_partition (void); 933int next_partition (unsigned long drive, unsigned long dest, 934 unsigned long *partition, int *type, 935 unsigned long *start, unsigned long *len, 936 unsigned long *offset, int *entry, 937 unsigned long *ext_offset, char *buf); 938 939/* Sets device to the one represented by the SAVED_* parameters. */ 940int make_saved_active (void); 941 942/* Set or clear the current root partition's hidden flag. */ 943int set_partition_hidden_flag (int hidden); 944 945/* Open a file or directory on the active device, using GRUB's 946 internal filesystem support. */ 947int grub_open (char *filename); 948 949/* Read LEN bytes into BUF from the file that was opened with 950 GRUB_OPEN. If LEN is -1, read all the remaining data in the file. */ 951int grub_read (char *buf, int len); 952 953/* Reposition a file offset. */ 954int grub_seek (int offset); 955 956/* Close a file. */ 957void grub_close (void); 958 959/* List the contents of the directory that was opened with GRUB_OPEN, 960 printing all completions. */ 961int dir (char *dirname); 962 963int set_bootdev (int hdbias); 964 965/* Display statistics on the current active device. */ 966void print_fsys_type (void); 967 968/* Display device and filename completions. */ 969void print_a_completion (char *filename); 970int print_completions (int is_filename, int is_completion); 971 972/* Copies the current partition data to the desired address. */ 973void copy_current_part_entry (char *buf); 974 975#ifndef STAGE1_5 976void bsd_boot (kernel_t type, int bootdev, char *arg) 977 __attribute__ ((noreturn)); 978 979/* Define flags for load_image here. */ 980/* Don't pass a Linux's mem option automatically. */ 981#define KERNEL_LOAD_NO_MEM_OPTION (1 << 0) 982 983kernel_t load_image (char *kernel, char *arg, kernel_t suggested_type, 984 unsigned long load_flags); 985 986int load_module (char *module, char *arg); 987int load_initrd (char *initrd); 988 989int check_password(char *entered, char* expected, password_t type); 990#endif 991 992void init_bios_info (void); 993 994#endif /* ASM_FILE */ 995 996#endif /* ! GRUB_SHARED_HEADER */ 997