summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/multiboot.h
blob: 0e8d41d8ecc36d082c047f0ab5c7bf7abcc3764a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_MULTIBOOT_H
#define	_MULTIBOOT_H

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Definitions of structures/data for using a multiboot compliant OS loader.
 */
#define	MB_HEADER_MAGIC		 0x1BADB002	/* magic */

/* The 32-bit kernel does not require the use of the AOUT kludge */
#define	MB_HEADER_FLAGS_32	 0x00000003	/* flags we use */
#define	MB_HEADER_CHECKSUM_32	-0x1BADB005	/* -(magic + flag) */

#define	MB_HEADER_FLAGS_64	 0x00010003	/* flags we use */
#define	MB_HEADER_CHECKSUM_64	-0x1BAEB005	/* -(magic + flag) */

/*
 * passed by boot loader to kernel
 */
#define	MB_BOOTLOADER_MAGIC	0x2BADB002

#ifndef _ASM		/* excluded from assembly routines */

#include <sys/types.h>
#include <sys/types32.h>

/*
 * The Multiboot header must be somewhere in the 1st 8K of the image that
 * the loader loads into memory.
 */
typedef struct multiboot_header {
	uint32_t	magic;
	uint32_t	flags;
	uint32_t	checksum;
	caddr32_t	header_addr;	/* use as (mutliboot_header_t *) */
	caddr32_t	load_addr;
	caddr32_t	load_end_addr;
	caddr32_t	bss_end_addr;
	caddr32_t	entry_addr;
} multiboot_header_t;

/* The section header table for ELF. */
typedef struct mb_elf_shtable {
	uint32_t num;
	uint32_t size;
	uint32_t addr;
	uint32_t shndx;
} mb_elf_shtable_t;

/* The module structure. */
typedef struct mb_module {
	caddr32_t	mod_start;
	caddr32_t	mod_end;
	caddr32_t	mod_name;	/* use as (char *) */
	uint32_t	reserved;
} mb_module_t;

/*
 * Memory map data structure. Walked in a bizarre way - see mutltiboot
 * documentation for example.
 */
typedef struct mb_memory_map {
	uint32_t	size;
	uint32_t	base_addr_low;
	uint32_t	base_addr_high;
	uint32_t	length_low;
	uint32_t	length_high;
	uint32_t	type;		/* only value of 1 is RAM */
} mb_memory_map_t;


/* Drive Info structure.  */
typedef struct mb_drive_info {
	uint32_t	size;		/* The size of this structure */
	uint8_t		drive_number;	/* The BIOS drive number */
	uint8_t		drive_mode;	/* The access mode (see below) */
	uint16_t	drive_cylinders;	/* The BIOS geometry */
	uint8_t		drive_heads;
	uint8_t		drive_sectors;
	/* The array of I/O ports used for the drive.  */
	uint16_t	drive_ports[1];
} mb_drive_info_t;

/* Drive Mode.  */
#define	MB_DI_CHS_MODE		0
#define	MB_DI_LBA_MODE		1


/*
 * The Multiboot information. This is supplied by the multiboot loader
 * for the OS.
 *
 * The flag bit fields defined what multiboot info the boot
 * loader (see struct multiboot_info below) supplied:
 */
/* flag[0]	mem_upper, mem_loader */
#define	MB_INFO_MEMORY			0x00000001
/* flag[1]	boot_device */
#define	MB_INFO_BOOTDEV			0x00000002
/* flag[2]	cmdline (for launching kernel) */
#define	MB_INFO_CMDLINE			0x00000004
/* flag[3]	mods_count, mods_addr */
#define	MB_INFO_MODS			0x00000008
/* flag[4]	symbol table for a.out */
#define	MB_INFO_AOUT_SYMS		0x00000010
/* flag[5]	symbol table for elf */
#define	MB_INFO_ELF_SHDR		0x00000020
/* flag[6]	mmap_length, mmap_addr */
#define	MB_INFO_MEM_MAP			0x00000040
/* flag[7]	drives_length, drivers_addr */
#define	MB_INFO_DRIVE_INFO		0x00000080
/* flag[8]	config_table */
#define	MB_INFO_CONFIG_TABLE		0x00000100
/* flag[9]	boot_loader_name */
#define	MB_INFO_BOOT_LOADER_NAME	0x00000200
/* flag[10]	apm_table */
#define	MB_INFO_APM_TABLE		0x00000400
/*
 * flag[11]	vbe_control_info
 *		vbe_mode_info
 *		vbe_mode
 *		vbe_interface_seg
 *		vbe_interface_off
 *		vbe_interface_len
 */
#define	MB_INFO_VIDEO_INFO		0x00000800

typedef struct multiboot_info {
	uint32_t	flags;
	uint32_t	mem_lower;	/* # of pages below 1Meg */
	uint32_t	mem_upper;	/* # of pages above 1Meg */
	uint32_t	boot_device;
	caddr32_t	cmdline;	/* use as (char *) */
	uint32_t	mods_count;
	caddr32_t	mods_addr;	/* use as (mb_module_t *) */
	mb_elf_shtable_t elf_sec;
	uint32_t	mmap_length;
	caddr32_t	mmap_addr;	/* use as (mb_memory_map_t *) */
	uint32_t	drives_length;
	caddr32_t	drives_addr;
	caddr32_t	config_table;
	caddr32_t	boot_loader_name;
	caddr32_t	apm_table;
	uint32_t	vbe_control_info;
	uint32_t	vbe_mode_info;
	uint16_t	vbe_mode;
	uint16_t	vbe_interface_seg;
	uint16_t	vbe_interface_off;
	uint16_t	vbe_interface_len;
} multiboot_info_t;

/*
 * netinfo for Solaris diskless booting
 * XXX - not part of multiboot spec
 */
struct sol_netinfo {
	uint8_t sn_infotype;
	uint8_t sn_mactype;
	uint8_t sn_maclen;
	uint8_t sn_padding;
	uint32_t sn_ciaddr;
	uint32_t sn_siaddr;
	uint32_t sn_giaddr;
	uint32_t sn_netmask;
	uint8_t sn_macaddr[1];
};

/* identify bootp/dhcp reply or rarp/ifconfig */
#define	SN_TYPE_BOOTP   2
#define	SN_TYPE_RARP    0xf0


#endif /* _ASM */


#ifdef	__cplusplus
}
#endif

#endif	/* _MULTIBOOT_H */