1 /* 2 * GRUB -- GRand Unified Bootloader 3 * Copyright (C) 2000,2003 Free Software Foundation, Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 /* 20 * The structure type "mod_list" is used by the "multiboot_info" structure. 21 */ 22 23 struct mod_list 24 { 25 /* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ 26 unsigned long mod_start; 27 unsigned long mod_end; 28 29 /* Module command line */ 30 unsigned long cmdline; 31 32 /* padding to take it to 16 bytes (must be zero) */ 33 unsigned long pad; 34 }; 35 36 37 /* 38 * INT-15, AX=E820 style "AddressRangeDescriptor" 39 * ...with a "size" parameter on the front which is the structure size - 4, 40 * pointing to the next one, up until the full buffer length of the memory 41 * map has been reached. 42 */ 43 44 struct AddrRangeDesc 45 { 46 unsigned long size; 47 unsigned long long BaseAddr; 48 unsigned long long Length; 49 unsigned long Type; 50 51 /* unspecified optional padding... */ 52 } __attribute__ ((packed)); 53 54 /* usable memory "Type", all others are reserved. */ 55 #define MB_ARD_MEMORY 1 56 57 58 /* Drive Info structure. */ 59 struct drive_info 60 { 61 /* The size of this structure. */ 62 unsigned long size; 63 64 /* The BIOS drive number. */ 65 unsigned char drive_number; 66 67 /* The access mode (see below). */ 68 unsigned char drive_mode; 69 70 /* The BIOS geometry. */ 71 unsigned short drive_cylinders; 72 unsigned char drive_heads; 73 unsigned char drive_sectors; 74 75 /* The array of I/O ports used for the drive. */ 76 unsigned short drive_ports[0]; 77 }; 78 79 /* Drive Mode. */ 80 #define MB_DI_CHS_MODE 0 81 #define MB_DI_LBA_MODE 1 82 83 84 /* APM BIOS info. */ 85 struct apm_info 86 { 87 unsigned short version; 88 unsigned short cseg; 89 unsigned long offset; 90 unsigned short cseg_16; 91 unsigned short dseg_16; 92 unsigned short cseg_len; 93 unsigned short cseg_16_len; 94 unsigned short dseg_16_len; 95 }; 96 97 98 /* 99 * MultiBoot Info description 100 * 101 * This is the struct passed to the boot image. This is done by placing 102 * its address in the EAX register. 103 */ 104 105 struct multiboot_info 106 { 107 /* MultiBoot info version number */ 108 unsigned long flags; 109 110 /* Available memory from BIOS */ 111 unsigned long mem_lower; 112 unsigned long mem_upper; 113 114 /* "root" partition */ 115 unsigned long boot_device; 116 117 /* Kernel command line */ 118 unsigned long cmdline; 119 120 /* Boot-Module list */ 121 unsigned long mods_count; 122 unsigned long mods_addr; 123 124 union 125 { 126 struct 127 { 128 /* (a.out) Kernel symbol table info */ 129 unsigned long tabsize; 130 unsigned long strsize; 131 unsigned long addr; 132 unsigned long pad; 133 } 134 a; 135 136 struct 137 { 138 /* (ELF) Kernel section header table */ 139 unsigned long num; 140 unsigned long size; 141 unsigned long addr; 142 unsigned long shndx; 143 } 144 e; 145 } 146 syms; 147 148 /* Memory Mapping buffer */ 149 unsigned long mmap_length; 150 unsigned long mmap_addr; 151 152 /* Drive Info buffer */ 153 unsigned long drives_length; 154 unsigned long drives_addr; 155 156 /* ROM configuration table */ 157 unsigned long config_table; 158 159 /* Boot Loader Name */ 160 unsigned long boot_loader_name; 161 162 /* APM table */ 163 unsigned long apm_table; 164 165 /* Video */ 166 unsigned long vbe_control_info; 167 unsigned long vbe_mode_info; 168 unsigned short vbe_mode; 169 unsigned short vbe_interface_seg; 170 unsigned short vbe_interface_off; 171 unsigned short vbe_interface_len; 172 }; 173 174 /* 175 * Flags to be set in the 'flags' parameter above 176 */ 177 178 /* is there basic lower/upper memory information? */ 179 #define MB_INFO_MEMORY 0x00000001 180 /* is there a boot device set? */ 181 #define MB_INFO_BOOTDEV 0x00000002 182 /* is the command-line defined? */ 183 #define MB_INFO_CMDLINE 0x00000004 184 /* are there modules to do something with? */ 185 #define MB_INFO_MODS 0x00000008 186 187 /* These next two are mutually exclusive */ 188 189 /* is there a symbol table loaded? */ 190 #define MB_INFO_AOUT_SYMS 0x00000010 191 /* is there an ELF section header table? */ 192 #define MB_INFO_ELF_SHDR 0x00000020 193 194 /* is there a full memory map? */ 195 #define MB_INFO_MEM_MAP 0x00000040 196 197 /* Is there drive info? */ 198 #define MB_INFO_DRIVE_INFO 0x00000080 199 200 /* Is there a config table? */ 201 #define MB_INFO_CONFIG_TABLE 0x00000100 202 203 /* Is there a boot loader name? */ 204 #define MB_INFO_BOOT_LOADER_NAME 0x00000200 205 206 /* Is there a APM table? */ 207 #define MB_INFO_APM_TABLE 0x00000400 208 209 /* Is there video information? */ 210 #define MB_INFO_VIDEO_INFO 0x00000800 211 212 /* 213 * The following value must be present in the EAX register. 214 */ 215 216 #define MULTIBOOT_VALID 0x2BADB002 217