1 #ifndef _MACHINE_MULTIBOOT_H /* LSC: FIXME: In MINIX this header is included everywhere... */ 2 #define _MACHINE_MULTIBOOT_H 1 3 4 /* $NetBSD: multiboot.h,v 1.8 2009/02/22 18:05:42 ahoka Exp $ */ 5 6 /*- 7 * Copyright (c) 2005, 2006 The NetBSD Foundation, Inc. 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to The NetBSD Foundation 11 * by Julio M. Merino Vidal. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 /* --------------------------------------------------------------------- */ 36 37 /* 38 * Multiboot header structure. 39 */ 40 #define MULTIBOOT_HEADER_MAGIC 0x1BADB002 41 #define MULTIBOOT_HEADER_MODS_ALIGNED 0x00000001 42 #define MULTIBOOT_HEADER_WANT_MEMORY 0x00000002 43 #define MULTIBOOT_HEADER_HAS_VBE 0x00000004 44 #define MULTIBOOT_HEADER_HAS_ADDR 0x00010000 45 46 #if defined(__minix) && !defined(__ASSEMBLY__) && (defined(_MINIX_SYSTEM) || defined(_STANDALONE)) 47 48 #if !defined(_LOCORE) 49 50 #include <machine/types.h> 51 52 struct multiboot_header { 53 uint32_t mh_magic; 54 uint32_t mh_flags; 55 uint32_t mh_checksum; 56 57 /* Valid if mh_flags sets MULTIBOOT_HEADER_HAS_ADDR. */ 58 paddr_t mh_header_addr; 59 paddr_t mh_load_addr; 60 paddr_t mh_load_end_addr; 61 paddr_t mh_bss_end_addr; 62 paddr_t mh_entry_addr; 63 64 /* Valid if mh_flags sets MULTIBOOT_HEADER_HAS_VBE. */ 65 uint32_t mh_mode_type; 66 uint32_t mh_width; 67 uint32_t mh_height; 68 uint32_t mh_depth; 69 }; 70 #endif /* !defined(_LOCORE) */ 71 72 /* 73 * Symbols defined in locore.S. 74 */ 75 #if !defined(_LOCORE) && defined(_KERNEL) 76 extern struct multiboot_header *Multiboot_Header; 77 #endif /* !defined(_LOCORE) && defined(_KERNEL) */ 78 79 #endif /* defined(__minix) && !defined(__ASSEMBLY__) && (defined(_MINIX_SYSTEM) || defined(_STANDALONE))*/ 80 81 /* --------------------------------------------------------------------- */ 82 83 /* 84 * Multiboot information structure. 85 */ 86 #define MULTIBOOT_INFO_MAGIC 0x2BADB002 87 #define MULTIBOOT_INFO_HAS_MEMORY 0x00000001 88 #define MULTIBOOT_INFO_HAS_BOOT_DEVICE 0x00000002 89 #define MULTIBOOT_INFO_HAS_CMDLINE 0x00000004 90 #define MULTIBOOT_INFO_HAS_MODS 0x00000008 91 #define MULTIBOOT_INFO_HAS_AOUT_SYMS 0x00000010 92 #define MULTIBOOT_INFO_HAS_ELF_SYMS 0x00000020 93 #define MULTIBOOT_INFO_HAS_MMAP 0x00000040 94 #define MULTIBOOT_INFO_HAS_DRIVES 0x00000080 95 #define MULTIBOOT_INFO_HAS_CONFIG_TABLE 0x00000100 96 #define MULTIBOOT_INFO_HAS_LOADER_NAME 0x00000200 97 #define MULTIBOOT_INFO_HAS_APM_TABLE 0x00000400 98 #define MULTIBOOT_INFO_HAS_VBE 0x00000800 99 #define MULTIBOOT_INFO_HAS_FRAMEBUFFER 0x00001000 100 101 #if defined(__minix) && !defined(__ASSEMBLY__) && (defined(_MINIX_SYSTEM) || defined(_STANDALONE)) 102 103 #if !defined(_LOCORE) 104 struct multiboot_info { 105 uint32_t mi_flags; 106 107 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_MEMORY. */ 108 uint32_t mi_mem_lower; 109 uint32_t mi_mem_upper; 110 111 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_BOOT_DEVICE. */ 112 uint8_t mi_boot_device_part3; 113 uint8_t mi_boot_device_part2; 114 uint8_t mi_boot_device_part1; 115 uint8_t mi_boot_device_drive; 116 117 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_CMDLINE. */ 118 char * mi_cmdline; 119 120 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_MODS. */ 121 uint32_t mi_mods_count; 122 vaddr_t mi_mods_addr; 123 124 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_{AOUT,ELF}_SYMS. */ 125 uint32_t mi_elfshdr_num; 126 uint32_t mi_elfshdr_size; 127 vaddr_t mi_elfshdr_addr; 128 uint32_t mi_elfshdr_shndx; 129 130 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_MMAP. */ 131 uint32_t mi_mmap_length; 132 vaddr_t mi_mmap_addr; 133 134 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_DRIVES. */ 135 uint32_t mi_drives_length; 136 vaddr_t mi_drives_addr; 137 138 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_CONFIG_TABLE. */ 139 void * unused_mi_config_table; 140 141 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_LOADER_NAME. */ 142 char * mi_loader_name; 143 144 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_APM. */ 145 void * unused_mi_apm_table; 146 147 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_VBE. */ 148 uint32_t vbe_control_info; 149 uint32_t vbe_mode_info; 150 uint16_t vbe_mode; 151 uint16_t vbe_interface_seg; 152 uint16_t vbe_interface_off; 153 uint16_t vbe_interface_len; 154 155 /* Valid if mi_flags sets MULTIBOOT_INFO_HAS_FRAMEBUFFER. */ 156 uint64_t framebuffer_addr; 157 uint32_t framebuffer_pitch; 158 uint32_t framebuffer_width; 159 uint32_t framebuffer_height; 160 uint8_t framebuffer_bpp; 161 #define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 162 #define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 163 #define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 164 uint8_t framebuffer_type; 165 union 166 { 167 struct 168 { 169 uint32_t framebuffer_palette_addr; 170 uint16_t framebuffer_palette_num_colors; 171 }; 172 struct 173 { 174 uint8_t framebuffer_red_field_position; 175 uint8_t framebuffer_red_mask_size; 176 uint8_t framebuffer_green_field_position; 177 uint8_t framebuffer_green_mask_size; 178 uint8_t framebuffer_blue_field_position; 179 uint8_t framebuffer_blue_mask_size; 180 }; 181 }; 182 }; 183 184 /* --------------------------------------------------------------------- */ 185 186 /* 187 * Drive information. This describes an entry in the drives table as 188 * pointed to by mi_drives_addr. 189 */ 190 struct multiboot_drive { 191 uint32_t md_length; 192 uint8_t md_number; 193 uint8_t md_mode; 194 uint16_t md_cylinders; 195 uint8_t md_heads; 196 uint8_t md_sectors; 197 198 /* The variable-sized 'ports' field comes here, so this structure 199 * can be longer. */ 200 }; 201 202 /* --------------------------------------------------------------------- */ 203 204 /* 205 * Memory mapping. This describes an entry in the memory mappings table 206 * as pointed to by mi_mmap_addr. 207 * 208 * Be aware that mm_size specifies the size of all other fields *except* 209 * for mm_size. In order to jump between two different entries, you 210 * have to count mm_size + 4 bytes. 211 */ 212 struct multiboot_mmap { 213 uint32_t mm_size; 214 uint64_t mm_base_addr; 215 uint64_t mm_length; 216 uint32_t mm_type; 217 }; 218 219 /* 220 * Modules. This describes an entry in the modules table as pointed 221 * to by mi_mods_addr. 222 */ 223 224 struct multiboot_module { 225 uint32_t mmo_start; 226 uint32_t mmo_end; 227 char * mmo_string; 228 uint32_t mmo_reserved; 229 }; 230 231 #endif /* !defined(_LOCORE) */ 232 233 #endif /* defined(__minix) && !defined(__ASSEMBLY__) && (defined(_MINIX_SYSTEM) || defined(_STANDALONE))*/ 234 235 #if defined(__minix) 236 237 #ifndef __ASSEMBLY__ 238 typedef struct multiboot_info multiboot_info_t; 239 typedef struct multiboot_module multiboot_module_t; 240 typedef struct multiboot_mmap multiboot_memory_map_t; 241 #endif 242 243 #define MULTIBOOT_MEMORY_AVAILABLE 1 244 #define MULTIBOOT_MAX_MODS 20 245 246 #define mod_start mmo_start 247 #define mod_end mmo_end 248 249 #define mmap_addr mi_mmap_addr 250 #define mmap_length mi_mmap_length 251 252 #define MULTIBOOT_VIDEO_MODE 0x00000004 253 #define MULTIBOOT_VIDEO_MODE_EGA 1 254 #define MULTIBOOT_VIDEO_BUFFER 0xB8000 255 256 #define MULTIBOOT_CONSOLE_LINES 25 257 #define MULTIBOOT_CONSOLE_COLS 80 258 259 #define MULTIBOOT_PARAM_BUF_SIZE 1024 260 #endif /* defined(__minix) */ 261 262 /* --------------------------------------------------------------------- */ 263 264 /* 265 * Prototypes for public functions defined in multiboot.c. 266 */ 267 #if !defined(_LOCORE) && defined(_KERNEL) 268 void multiboot_pre_reloc(struct multiboot_info *); 269 void multiboot_post_reloc(void); 270 void multiboot_print_info(void); 271 bool multiboot_ksyms_addsyms_elf(void); 272 #endif /* !defined(_LOCORE) */ 273 274 /* --------------------------------------------------------------------- */ 275 276 #endif /* _MACHINE_MULTIBOOT_H */ 277