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