xref: /illumos-gate/usr/src/uts/common/sys/multiboot.h (revision 6915124b)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5f2be5148Sszhou  * Common Development and Distribution License (the "License").
6f2be5148Sszhou  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
21ae115bc7Smrj 
227c478bd9Sstevel@tonic-gate /*
23a561078eSMark Johnson  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #ifndef	_MULTIBOOT_H
287c478bd9Sstevel@tonic-gate #define	_MULTIBOOT_H
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
317c478bd9Sstevel@tonic-gate extern "C" {
327c478bd9Sstevel@tonic-gate #endif
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate /*
35ae115bc7Smrj  * Definitions of structures/data for using a multiboot compliant OS loader.
367c478bd9Sstevel@tonic-gate  */
37ae115bc7Smrj #define	MB_HEADER_MAGIC		 0x1BADB002	/* magic */
385420b805SSeth Goldberg 
395420b805SSeth Goldberg /* The 32-bit kernel does not require the use of the AOUT kludge */
405420b805SSeth Goldberg #define	MB_HEADER_FLAGS_32	 0x00000003	/* flags we use */
415420b805SSeth Goldberg #define	MB_HEADER_CHECKSUM_32	-0x1BADB005	/* -(magic + flag) */
425420b805SSeth Goldberg 
435420b805SSeth Goldberg #define	MB_HEADER_FLAGS_64	 0x00010003	/* flags we use */
445420b805SSeth Goldberg #define	MB_HEADER_CHECKSUM_64	-0x1BAEB005	/* -(magic + flag) */
457c478bd9Sstevel@tonic-gate 
46ae115bc7Smrj /*
47ae115bc7Smrj  * passed by boot loader to kernel
48ae115bc7Smrj  */
497c478bd9Sstevel@tonic-gate #define	MB_BOOTLOADER_MAGIC	0x2BADB002
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate #ifndef _ASM		/* excluded from assembly routines */
527c478bd9Sstevel@tonic-gate 
537c478bd9Sstevel@tonic-gate #include <sys/types.h>
54ae115bc7Smrj #include <sys/types32.h>
557c478bd9Sstevel@tonic-gate 
56ae115bc7Smrj /*
57ae115bc7Smrj  * The Multiboot header must be somewhere in the 1st 8K of the image that
58ae115bc7Smrj  * the loader loads into memory.
59ae115bc7Smrj  */
607c478bd9Sstevel@tonic-gate typedef struct multiboot_header {
61ae115bc7Smrj 	uint32_t	magic;
62ae115bc7Smrj 	uint32_t	flags;
63ae115bc7Smrj 	uint32_t	checksum;
64ae115bc7Smrj 	caddr32_t	header_addr;	/* use as (mutliboot_header_t *) */
65ae115bc7Smrj 	caddr32_t	load_addr;
66ae115bc7Smrj 	caddr32_t	load_end_addr;
67ae115bc7Smrj 	caddr32_t	bss_end_addr;
68ae115bc7Smrj 	caddr32_t	entry_addr;
697c478bd9Sstevel@tonic-gate } multiboot_header_t;
707c478bd9Sstevel@tonic-gate 
717c478bd9Sstevel@tonic-gate /* The section header table for ELF. */
727c478bd9Sstevel@tonic-gate typedef struct mb_elf_shtable {
73ae115bc7Smrj 	uint32_t num;
74ae115bc7Smrj 	uint32_t size;
75ae115bc7Smrj 	uint32_t addr;
76ae115bc7Smrj 	uint32_t shndx;
777c478bd9Sstevel@tonic-gate } mb_elf_shtable_t;
787c478bd9Sstevel@tonic-gate 
797c478bd9Sstevel@tonic-gate /* The module structure. */
807c478bd9Sstevel@tonic-gate typedef struct mb_module {
81ae115bc7Smrj 	caddr32_t	mod_start;
82ae115bc7Smrj 	caddr32_t	mod_end;
83ae115bc7Smrj 	caddr32_t	mod_name;	/* use as (char *) */
84ae115bc7Smrj 	uint32_t	reserved;
857c478bd9Sstevel@tonic-gate } mb_module_t;
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate /*
88ae115bc7Smrj  * Memory map data structure. Walked in a bizarre way - see mutltiboot
89ae115bc7Smrj  * documentation for example.
907c478bd9Sstevel@tonic-gate  */
917c478bd9Sstevel@tonic-gate typedef struct mb_memory_map {
92ae115bc7Smrj 	uint32_t	size;
93ae115bc7Smrj 	uint32_t	base_addr_low;
94ae115bc7Smrj 	uint32_t	base_addr_high;
95ae115bc7Smrj 	uint32_t	length_low;
96ae115bc7Smrj 	uint32_t	length_high;
97ae115bc7Smrj 	uint32_t	type;		/* only value of 1 is RAM */
987c478bd9Sstevel@tonic-gate } mb_memory_map_t;
997c478bd9Sstevel@tonic-gate 
100ae115bc7Smrj 
101*6915124bSKonstantin Ananyev /* Drive Info structure.  */
102*6915124bSKonstantin Ananyev typedef struct mb_drive_info {
103*6915124bSKonstantin Ananyev 	uint32_t	size;		/* The size of this structure */
104*6915124bSKonstantin Ananyev 	uint8_t		drive_number;	/* The BIOS drive number */
105*6915124bSKonstantin Ananyev 	uint8_t		drive_mode;	/* The access mode (see below) */
106*6915124bSKonstantin Ananyev 	uint16_t	drive_cylinders;	/* The BIOS geometry */
107*6915124bSKonstantin Ananyev 	uint8_t		drive_heads;
108*6915124bSKonstantin Ananyev 	uint8_t		drive_sectors;
109*6915124bSKonstantin Ananyev 	/* The array of I/O ports used for the drive.  */
110*6915124bSKonstantin Ananyev 	uint16_t	drive_ports[1];
111*6915124bSKonstantin Ananyev } mb_drive_info_t;
112*6915124bSKonstantin Ananyev 
113*6915124bSKonstantin Ananyev /* Drive Mode.  */
114*6915124bSKonstantin Ananyev #define	MB_DI_CHS_MODE		0
115*6915124bSKonstantin Ananyev #define	MB_DI_LBA_MODE		1
116*6915124bSKonstantin Ananyev 
117*6915124bSKonstantin Ananyev 
118ae115bc7Smrj /*
119ae115bc7Smrj  * The Multiboot information. This is supplied by the multiboot loader
120ae115bc7Smrj  * for the OS.
121ae115bc7Smrj  *
122ae115bc7Smrj  * The flag bit fields defined what multiboot info the boot
123ae115bc7Smrj  * loader (see struct multiboot_info below) supplied:
124ae115bc7Smrj  */
125*6915124bSKonstantin Ananyev /* flag[0]	mem_upper, mem_loader */
126*6915124bSKonstantin Ananyev #define	MB_INFO_MEMORY			0x00000001
127*6915124bSKonstantin Ananyev /* flag[1]	boot_device */
128*6915124bSKonstantin Ananyev #define	MB_INFO_BOOTDEV			0x00000002
129*6915124bSKonstantin Ananyev /* flag[2]	cmdline (for launching kernel) */
130*6915124bSKonstantin Ananyev #define	MB_INFO_CMDLINE			0x00000004
131*6915124bSKonstantin Ananyev /* flag[3]	mods_count, mods_addr */
132*6915124bSKonstantin Ananyev #define	MB_INFO_MODS			0x00000008
133*6915124bSKonstantin Ananyev /* flag[4]	symbol table for a.out */
134*6915124bSKonstantin Ananyev #define	MB_INFO_AOUT_SYMS		0x00000010
135*6915124bSKonstantin Ananyev /* flag[5]	symbol table for elf */
136*6915124bSKonstantin Ananyev #define	MB_INFO_ELF_SHDR		0x00000020
137*6915124bSKonstantin Ananyev /* flag[6]	mmap_length, mmap_addr */
138*6915124bSKonstantin Ananyev #define	MB_INFO_MEM_MAP			0x00000040
139*6915124bSKonstantin Ananyev /* flag[7]	drives_length, drivers_addr */
140*6915124bSKonstantin Ananyev #define	MB_INFO_DRIVE_INFO		0x00000080
141*6915124bSKonstantin Ananyev /* flag[8]	config_table */
142*6915124bSKonstantin Ananyev #define	MB_INFO_CONFIG_TABLE		0x00000100
143*6915124bSKonstantin Ananyev /* flag[9]	boot_loader_name */
144*6915124bSKonstantin Ananyev #define	MB_INFO_BOOT_LOADER_NAME	0x00000200
145*6915124bSKonstantin Ananyev /* flag[10]	apm_table */
146*6915124bSKonstantin Ananyev #define	MB_INFO_APM_TABLE		0x00000400
147*6915124bSKonstantin Ananyev /*
148*6915124bSKonstantin Ananyev  * flag[11]	vbe_control_info
149*6915124bSKonstantin Ananyev  *		vbe_mode_info
150*6915124bSKonstantin Ananyev  *		vbe_mode
151*6915124bSKonstantin Ananyev  *		vbe_interface_seg
152*6915124bSKonstantin Ananyev  *		vbe_interface_off
153*6915124bSKonstantin Ananyev  *		vbe_interface_len
154*6915124bSKonstantin Ananyev  */
155*6915124bSKonstantin Ananyev #define	MB_INFO_VIDEO_INFO		0x00000800
156*6915124bSKonstantin Ananyev 
157ae115bc7Smrj typedef struct multiboot_info {
158ae115bc7Smrj 	uint32_t	flags;
159ae115bc7Smrj 	uint32_t	mem_lower;	/* # of pages below 1Meg */
160ae115bc7Smrj 	uint32_t	mem_upper;	/* # of pages above 1Meg */
161ae115bc7Smrj 	uint32_t	boot_device;
162ae115bc7Smrj 	caddr32_t	cmdline;	/* use as (char *) */
163ae115bc7Smrj 	uint32_t	mods_count;
164ae115bc7Smrj 	caddr32_t	mods_addr;	/* use as (mb_module_t *) */
165ae115bc7Smrj 	mb_elf_shtable_t elf_sec;
166ae115bc7Smrj 	uint32_t	mmap_length;
167ae115bc7Smrj 	caddr32_t	mmap_addr;	/* use as (mb_memory_map_t *) */
168ae115bc7Smrj 	uint32_t	drives_length;
169ae115bc7Smrj 	caddr32_t	drives_addr;
170ae115bc7Smrj 	caddr32_t	config_table;
171ae115bc7Smrj 	caddr32_t	boot_loader_name;
172ae115bc7Smrj 	caddr32_t	apm_table;
173ae115bc7Smrj 	uint32_t	vbe_control_info;
174ae115bc7Smrj 	uint32_t	vbe_mode_info;
175ae115bc7Smrj 	uint16_t	vbe_mode;
176ae115bc7Smrj 	uint16_t	vbe_interface_seg;
177ae115bc7Smrj 	uint16_t	vbe_interface_off;
178ae115bc7Smrj 	uint16_t	vbe_interface_len;
179ae115bc7Smrj } multiboot_info_t;
180ae115bc7Smrj 
1817c478bd9Sstevel@tonic-gate /*
1827c478bd9Sstevel@tonic-gate  * netinfo for Solaris diskless booting
1837c478bd9Sstevel@tonic-gate  * XXX - not part of multiboot spec
1847c478bd9Sstevel@tonic-gate  */
1857c478bd9Sstevel@tonic-gate struct sol_netinfo {
1867c478bd9Sstevel@tonic-gate 	uint8_t sn_infotype;
1877c478bd9Sstevel@tonic-gate 	uint8_t sn_mactype;
1887c478bd9Sstevel@tonic-gate 	uint8_t sn_maclen;
1897c478bd9Sstevel@tonic-gate 	uint8_t sn_padding;
190a561078eSMark Johnson 	uint32_t sn_ciaddr;
191a561078eSMark Johnson 	uint32_t sn_siaddr;
192a561078eSMark Johnson 	uint32_t sn_giaddr;
193a561078eSMark Johnson 	uint32_t sn_netmask;
1947c478bd9Sstevel@tonic-gate 	uint8_t sn_macaddr[1];
1957c478bd9Sstevel@tonic-gate };
1967c478bd9Sstevel@tonic-gate 
1977c478bd9Sstevel@tonic-gate /* identify bootp/dhcp reply or rarp/ifconfig */
198ae115bc7Smrj #define	SN_TYPE_BOOTP   2
199ae115bc7Smrj #define	SN_TYPE_RARP    0xf0
200ae115bc7Smrj 
2017c478bd9Sstevel@tonic-gate 
202ae115bc7Smrj #endif /* _ASM */
2037c478bd9Sstevel@tonic-gate 
2047c478bd9Sstevel@tonic-gate 
2057c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2067c478bd9Sstevel@tonic-gate }
2077c478bd9Sstevel@tonic-gate #endif
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate #endif	/* _MULTIBOOT_H */
210