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