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