15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 2000 Free Software Foundation, Inc. 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or modify 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * it under the terms of the GNU General Public License as published by 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Free Software Foundation; either version 2 of the License, or 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (at your option) any later version. 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is distributed in the hope that it will be useful, 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GNU General Public License for more details. 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You should have received a copy of the GNU General Public License 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * along with this program; if not, write to the Free Software 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MultiBoot Header description 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct multiboot_header 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Must be MULTIBOOT_MAGIC - see below. */ 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned magic; 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Feature flags - see below. */ 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned flags; 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Checksum 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The above fields plus this one must equal 0 mod 2^32. 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned checksum; 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned header_addr; 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned load_addr; 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned load_end_addr; 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned bss_end_addr; 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned entry_addr; 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */ 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned mode_type; 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned width; 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned height; 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned depth; 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The entire multiboot_header must be contained 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * within the first MULTIBOOT_SEARCH bytes of the kernel image. 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_SEARCH 8192 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_FOUND(addr, len) \ 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (! ((addr) & 0x3) \ 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && (len) >= 12 \ 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && *((int *) (addr)) == MULTIBOOT_MAGIC \ 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && ! (*((unsigned *) (addr)) + *((unsigned *) (addr + 4)) \ 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project + *((unsigned *) (addr + 8))) \ 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && (! (MULTIBOOT_AOUT_KLUDGE & *((int *) (addr + 4))) || (len) >= 32) \ 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && (! (MULTIBOOT_VIDEO_MODE & *((int *) (addr + 4))) || (len) >= 48)) 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Magic value identifying the multiboot_header. */ 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_MAGIC 0x1BADB002 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Features flags for 'flags'. 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If a boot loader sees a flag in MULTIBOOT_MUSTKNOW set 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * and it doesn't understand it, it must fail. 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_MUSTKNOW 0x0000FFFF 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* currently unsupported flags... this is a kind of version number. */ 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_UNSUPPORTED 0x0000FFF8 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Align all boot modules on i386 page (4KB) boundaries. */ 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_PAGE_ALIGN 0x00000001 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Must pass memory information to OS. */ 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_MEMORY_INFO 0x00000002 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Must pass video information to OS. */ 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_VIDEO_MODE 0x00000004 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* This flag indicates the use of the address fields in the header. */ 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MULTIBOOT_AOUT_KLUDGE 0x00010000 91