/* Copyright (C) 1999, 2001  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.  */

#ifndef __MULTIBOOT_H__
#define __MULTIBOOT_H__

/*
 * Multiboot header structure.
 */
#define MULTIBOOT_HEADER_MAGIC         0x1BADB002
#define MULTIBOOT_HEADER_MODS_ALIGNED  0x00000001
#define MULTIBOOT_HEADER_WANT_MEMORY   0x00000002
#define MULTIBOOT_HEADER_HAS_VBE       0x00000004
#define MULTIBOOT_HEADER_HAS_ADDR      0x00010000

/* The magic number passed by a Multiboot-compliant boot loader. */
#define MULTIBOOT_BOOTLOADER_MAGIC     0x2BADB002

#define MBI_MEMLIMITS  (1u<< 0)
#define MBI_BOOTDEV    (1u<< 1)
#define MBI_CMDLINE    (1u<< 2)
#define MBI_MODULES    (1u<< 3)
#define MBI_AOUT_SYMS  (1u<< 4)
#define MBI_ELF_SYMS   (1u<< 5)
#define MBI_MEMMAP     (1u<< 6)
#define MBI_DRIVES     (1u<< 7)
#define MBI_BIOSCONFIG (1u<< 8)
#define MBI_LOADERNAME (1u<< 9)
#define MBI_APM        (1u<<10)

#ifndef __ASSEMBLY__

/* The symbol table for a.out.  */
typedef struct {
	u32 tabsize;
	u32 strsize;
	u32 addr;
	u32 reserved;
} aout_symbol_table_t;

/* The section header table for ELF.  */
typedef struct {
	u32 num;
	u32 size;
	u32 addr;
	u32 shndx;
} elf_section_header_table_t;

/* The Multiboot information.  */
typedef struct {
	u32 flags;

	/* Valid if flags sets MBI_MEMLIMITS */
	u32 mem_lower;
	u32 mem_upper;

	/* Valid if flags sets MBI_BOOTDEV */
	u32 boot_device;

	/* Valid if flags sets MBI_CMDLINE */
	u32 cmdline;

	/* Valid if flags sets MBI_MODULES */
	u32 mods_count;
	u32 mods_addr;

	/* Valid if flags sets ... */
	union {
		aout_symbol_table_t aout_sym;        /* ... MBI_AOUT_SYMS */
		elf_section_header_table_t elf_sec;  /* ... MBI_ELF_SYMS */
	} u;

	/* Valid if flags sets MBI_MEMMAP */
	u32 mmap_length;
	u32 mmap_addr;

	/* Valid if flags sets MBI_DRIVES */
	u32 drives_length;
	u32 drives_addr;

	/* Valid if flags sets MBI_BIOSCONFIG */
	u32 config_table;

	/* Valid if flags sets MBI_LOADERNAME */
	u32 boot_loader_name;

	/* Valid if flags sets MBI_APM */
	u32 apm_table;
} multiboot_info_t;

/* The module structure.  */
typedef struct {
	u32 mod_start;
	u32 mod_end;
	u32 string;
	u32 reserved;
} module_t;

/* The memory map. Be careful that the offset 0 is base_addr_low
   but no size.  */
typedef struct {
	u32 size;
	u32 base_addr_low;
	u32 base_addr_high;
	u32 length_low;
	u32 length_high;
	u32 type;
} memory_map_t;


#endif /* __ASSEMBLY__ */


#endif /* _BOOTSTUB_MB_H */
