mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-26 09:10:53 +00:00
* configure.ac: Bump version to 1.6.
* doc/boot.S: Use tagged multiboot header. * doc/kernel.c (cmain): Parse tagged mbi. * doc/multiboot.texi: Selfishly added myself to authors. (Terminology): New types u_virt and u_phys. (Header address fields): Removed. (Header graphics fields): Likewise. (Header tags): New section. (Information request header tag): Likewise. (Address header tag): Likewise. (Console header tags): Likewise. (Module alignment tag): Likewise. (Header layout): Specify new common header part. (Header magic fields): Likewise. (Machine state): Updated magic value. (Boot information format): Changed to tagged structure. * doc/multiboot2.h: Changed to tagged format. * doc/src2texi: Handle more comments correctly.
This commit is contained in:
commit
3becbd0775
7 files changed
+747
-651
No files matched your search
@@ -1,3 +1,24 @@
|
|||||||
|
2010-03-28 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* configure.ac: Bump version to 1.6.
|
||||||
|
* doc/boot.S: Use tagged multiboot header.
|
||||||
|
* doc/kernel.c (cmain): Parse tagged mbi.
|
||||||
|
* doc/multiboot.texi: Selfishly added myself to authors.
|
||||||
|
(Terminology): New types u_virt and u_phys.
|
||||||
|
(Header address fields): Removed.
|
||||||
|
(Header graphics fields): Likewise.
|
||||||
|
(Header tags): New section.
|
||||||
|
(Information request header tag): Likewise.
|
||||||
|
(Address header tag): Likewise.
|
||||||
|
(Console header tags): Likewise.
|
||||||
|
(Module alignment tag): Likewise.
|
||||||
|
(Header layout): Specify new common header part.
|
||||||
|
(Header magic fields): Likewise.
|
||||||
|
(Machine state): Updated magic value.
|
||||||
|
(Boot information format): Changed to tagged structure.
|
||||||
|
* doc/multiboot2.h: Changed to tagged format.
|
||||||
|
* doc/src2texi: Handle more comments correctly.
|
||||||
|
|
||||||
2010-03-14 Vladimir Serbinenko <phcoder@gmail.com>
|
2010-03-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* doc/kernel.c (cmain): Use padding to properly display 64-bit
|
* doc/kernel.c (cmain): Use padding to properly display 64-bit
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ dnl LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE
|
|||||||
dnl USE OF THIS SOFTWARE.
|
dnl USE OF THIS SOFTWARE.
|
||||||
|
|
||||||
AC_PREREQ(2.59)
|
AC_PREREQ(2.59)
|
||||||
AC_INIT([Multiboot], [0.6.96], [bug-grub@gnu.org])
|
AC_INIT([Multiboot], [1.6], [bug-grub@gnu.org])
|
||||||
AC_CONFIG_SRCDIR([doc/multiboot.texi])
|
AC_CONFIG_SRCDIR([doc/multiboot.texi])
|
||||||
AC_CONFIG_HEADER([config.h])
|
AC_CONFIG_HEADER([config.h])
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
|
|||||||
+27
-15
@@ -34,7 +34,6 @@
|
|||||||
#else
|
#else
|
||||||
# define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
|
# define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
|
||||||
#endif
|
#endif
|
||||||
#define MULTIBOOT_HEADER_FLAGS MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_MODE | AOUT_KLUDGE
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
@@ -43,18 +42,24 @@ start:
|
|||||||
_start:
|
_start:
|
||||||
jmp multiboot_entry
|
jmp multiboot_entry
|
||||||
|
|
||||||
/* Align 32 bits boundary. */
|
/* Align 64 bits boundary. */
|
||||||
.align 4
|
.align 8
|
||||||
|
|
||||||
/* Multiboot header. */
|
/* Multiboot header. */
|
||||||
multiboot_header:
|
multiboot_header:
|
||||||
/* magic */
|
/* magic */
|
||||||
.long MULTIBOOT2_HEADER_MAGIC
|
.long MULTIBOOT2_HEADER_MAGIC
|
||||||
/* flags */
|
/* ISA: i386 */
|
||||||
.long MULTIBOOT_HEADER_FLAGS
|
.long GRUB_MULTIBOOT_ARCHITECTURE_I386
|
||||||
|
/* Header length. */
|
||||||
|
.long multiboot_header_end - multiboot_header
|
||||||
/* checksum */
|
/* checksum */
|
||||||
.long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
|
.long -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
|
||||||
#ifndef __ELF__
|
#ifndef __ELF__
|
||||||
|
address_tag_start:
|
||||||
|
.short MULTIBOOT_HEADER_TAG_ADDRESS
|
||||||
|
.short MULTIBOOT_HEADER_TAG_OPTIONAL
|
||||||
|
.long address_tag_end - address_tag_start
|
||||||
/* header_addr */
|
/* header_addr */
|
||||||
.long multiboot_header
|
.long multiboot_header
|
||||||
/* load_addr */
|
/* load_addr */
|
||||||
@@ -63,20 +68,27 @@ multiboot_header:
|
|||||||
.long _edata
|
.long _edata
|
||||||
/* bss_end_addr */
|
/* bss_end_addr */
|
||||||
.long _end
|
.long _end
|
||||||
|
address_tag_end:
|
||||||
|
entry_address_tag_start:
|
||||||
|
.short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
|
||||||
|
.short MULTIBOOT_HEADER_TAG_OPTIONAL
|
||||||
|
.long entry_address_tag_end - entry_address_tag_start
|
||||||
/* entry_addr */
|
/* entry_addr */
|
||||||
.long multiboot_entry
|
.long multiboot_entry
|
||||||
#else /* ! __ELF__ */
|
entry_address_tag_end:
|
||||||
.long 0
|
|
||||||
.long 0
|
|
||||||
.long 0
|
|
||||||
.long 0
|
|
||||||
.long 0
|
|
||||||
#endif /* __ELF__ */
|
#endif /* __ELF__ */
|
||||||
.long 0
|
framebuffer_tag_start:
|
||||||
|
.short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
|
||||||
|
.short MULTIBOOT_HEADER_TAG_OPTIONAL
|
||||||
|
.long framebuffer_tag_end - framebuffer_tag_start
|
||||||
.long 1024
|
.long 1024
|
||||||
.long 768
|
.long 768
|
||||||
.long 32
|
.long 32
|
||||||
|
framebuffer_tag_end:
|
||||||
|
.short MULTIBOOT_HEADER_TAG_END
|
||||||
|
.short 0
|
||||||
|
.long 8
|
||||||
|
multiboot_header_end:
|
||||||
multiboot_entry:
|
multiboot_entry:
|
||||||
/* Initialize the stack pointer. */
|
/* Initialize the stack pointer. */
|
||||||
movl $(stack + STACK_SIZE), %esp
|
movl $(stack + STACK_SIZE), %esp
|
||||||
|
|||||||
+144
-161
@@ -15,13 +15,10 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <multiboot2.h>
|
#include "multiboot2.h"
|
||||||
|
|
||||||
/* Macros. */
|
/* Macros. */
|
||||||
|
|
||||||
/* Check if the bit BIT in FLAGS is set. */
|
|
||||||
#define CHECK_FLAG(flags,bit) ((flags) & (1 << (bit)))
|
|
||||||
|
|
||||||
/* Some screen stuff. */
|
/* Some screen stuff. */
|
||||||
/* The number of columns. */
|
/* The number of columns. */
|
||||||
#define COLUMNS 80
|
#define COLUMNS 80
|
||||||
@@ -51,9 +48,10 @@ void printf (const char *format, ...);
|
|||||||
pointed by ADDR. */
|
pointed by ADDR. */
|
||||||
void
|
void
|
||||||
cmain (unsigned long magic, unsigned long addr)
|
cmain (unsigned long magic, unsigned long addr)
|
||||||
{
|
{
|
||||||
multiboot_info_t *mbi;
|
struct multiboot_tag *tag;
|
||||||
|
unsigned size;
|
||||||
|
|
||||||
/* Clear the screen. */
|
/* Clear the screen. */
|
||||||
cls ();
|
cls ();
|
||||||
|
|
||||||
@@ -64,177 +62,162 @@ cmain (unsigned long magic, unsigned long addr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set MBI to the address of the Multiboot information structure. */
|
if (addr & 7)
|
||||||
mbi = (multiboot_info_t *) addr;
|
|
||||||
|
|
||||||
/* Print out the flags. */
|
|
||||||
printf ("flags = 0x%x\n", (unsigned) mbi->flags);
|
|
||||||
|
|
||||||
/* Are mem_* valid? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 0))
|
|
||||||
printf ("mem_lower = %uKB, mem_upper = %uKB\n",
|
|
||||||
(unsigned) mbi->mem_lower, (unsigned) mbi->mem_upper);
|
|
||||||
|
|
||||||
/* Is boot_device valid? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 1))
|
|
||||||
printf ("boot_device = 0x%x\n", (unsigned) mbi->boot_device);
|
|
||||||
|
|
||||||
/* Is the command line passed? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 2))
|
|
||||||
printf ("cmdline = %s\n", (char *) mbi->cmdline);
|
|
||||||
|
|
||||||
/* Are mods_* valid? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 3))
|
|
||||||
{
|
{
|
||||||
multiboot_module_t *mod;
|
printf ("Unaligned mbi: 0x%x\n", addr);
|
||||||
int i;
|
|
||||||
|
|
||||||
printf ("mods_count = %d, mods_addr = 0x%x\n",
|
|
||||||
(int) mbi->mods_count, (int) mbi->mods_addr);
|
|
||||||
for (i = 0, mod = (multiboot_module_t *) mbi->mods_addr;
|
|
||||||
i < mbi->mods_count;
|
|
||||||
i++, mod++)
|
|
||||||
printf (" mod_start = 0x%x, mod_end = 0x%x, cmdline = %s\n",
|
|
||||||
(unsigned) mod->mod_start,
|
|
||||||
(unsigned) mod->mod_end,
|
|
||||||
(char *) mod->cmdline);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bits 4 and 5 are mutually exclusive! */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 4) && CHECK_FLAG (mbi->flags, 5))
|
|
||||||
{
|
|
||||||
printf ("Both bits 4 and 5 are set.\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is the symbol table of a.out valid? */
|
size = *(unsigned *) addr;
|
||||||
if (CHECK_FLAG (mbi->flags, 4))
|
printf ("Announced mbi size 0x%x\n", size);
|
||||||
|
for (tag = (struct multiboot_tag *) (addr + 8);
|
||||||
|
tag->type != MULTIBOOT_TAG_TYPE_END;
|
||||||
|
tag = (struct multiboot_tag *) ((multiboot_uint8_t *) tag
|
||||||
|
+ ((tag->size + 7) & ~7)))
|
||||||
{
|
{
|
||||||
multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
|
printf ("Tag 0x%x, Size 0x%x\n", tag->type, tag->size);
|
||||||
|
switch (tag->type)
|
||||||
printf ("multiboot_aout_symbol_table: tabsize = 0x%0x, "
|
|
||||||
"strsize = 0x%x, addr = 0x%x\n",
|
|
||||||
(unsigned) multiboot_aout_sym->tabsize,
|
|
||||||
(unsigned) multiboot_aout_sym->strsize,
|
|
||||||
(unsigned) multiboot_aout_sym->addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is the section header table of ELF valid? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 5))
|
|
||||||
{
|
|
||||||
multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
|
|
||||||
|
|
||||||
printf ("multiboot_elf_sec: num = %u, size = 0x%x,"
|
|
||||||
" addr = 0x%x, shndx = 0x%x\n",
|
|
||||||
(unsigned) multiboot_elf_sec->num, (unsigned) multiboot_elf_sec->size,
|
|
||||||
(unsigned) multiboot_elf_sec->addr, (unsigned) multiboot_elf_sec->shndx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Are mmap_* valid? */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 6))
|
|
||||||
{
|
|
||||||
multiboot_memory_map_t *mmap;
|
|
||||||
|
|
||||||
printf ("mmap_addr = 0x%x, mmap_length = 0x%x\n",
|
|
||||||
(unsigned) mbi->mmap_addr, (unsigned) mbi->mmap_length);
|
|
||||||
for (mmap = (multiboot_memory_map_t *) mbi->mmap_addr;
|
|
||||||
(unsigned long) mmap < mbi->mmap_addr + mbi->mmap_length;
|
|
||||||
mmap = (multiboot_memory_map_t *) ((unsigned long) mmap
|
|
||||||
+ mmap->size + sizeof (mmap->size)))
|
|
||||||
printf (" size = 0x%x, base_addr = 0x%x%08x,"
|
|
||||||
" length = 0x%x%08x, type = 0x%x\n",
|
|
||||||
(unsigned) mmap->size,
|
|
||||||
(unsigned) (mmap->addr >> 32),
|
|
||||||
(unsigned) (mmap->addr & 0xffffffff),
|
|
||||||
(unsigned) (mmap->len >> 32),
|
|
||||||
(unsigned) (mmap->len & 0xffffffff),
|
|
||||||
(unsigned) mmap->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Draw diagonal blue line. */
|
|
||||||
if (CHECK_FLAG (mbi->flags, 12))
|
|
||||||
{
|
|
||||||
multiboot_uint32_t color;
|
|
||||||
unsigned i;
|
|
||||||
void *fb = (void *) (unsigned long) mbi->framebuffer_addr;
|
|
||||||
|
|
||||||
switch (mbi->framebuffer_type)
|
|
||||||
{
|
{
|
||||||
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
|
case MULTIBOOT_TAG_TYPE_CMDLINE:
|
||||||
|
printf ("Command line = %s\n",
|
||||||
|
((struct multiboot_tag_string *) tag)->string);
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
|
||||||
|
printf ("Boot loader name = %s\n",
|
||||||
|
((struct multiboot_tag_string *) tag)->string);
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_MODULE:
|
||||||
|
printf ("Module at 0x%x-0x%x. Command line %s\n",
|
||||||
|
((struct multiboot_tag_module *) tag)->mod_start,
|
||||||
|
((struct multiboot_tag_module *) tag)->mod_end,
|
||||||
|
((struct multiboot_tag_module *) tag)->cmdline);
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
|
||||||
|
printf ("mem_lower = %uKB, mem_upper = %uKB\n",
|
||||||
|
((struct multiboot_tag_basic_meminfo *) tag)->mem_lower,
|
||||||
|
((struct multiboot_tag_basic_meminfo *) tag)->mem_upper);
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_BOOTDEV:
|
||||||
|
printf ("Boot device 0x%x,%u,%u\n",
|
||||||
|
((struct multiboot_tag_bootdev *) tag)->biosdev,
|
||||||
|
((struct multiboot_tag_bootdev *) tag)->slice,
|
||||||
|
((struct multiboot_tag_bootdev *) tag)->part);
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_MMAP:
|
||||||
{
|
{
|
||||||
unsigned best_distance, distance;
|
multiboot_memory_map_t *mmap;
|
||||||
struct multiboot_color *palette;
|
|
||||||
|
|
||||||
palette = (struct multiboot_color *) mbi->framebuffer_palette_addr;
|
|
||||||
|
|
||||||
color = 0;
|
printf ("mmap\n");
|
||||||
best_distance = 4*256*256;
|
|
||||||
|
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;
|
||||||
for (i = 0; i < mbi->framebuffer_palette_num_colors; i++)
|
(multiboot_uint8_t *) mmap
|
||||||
{
|
< (multiboot_uint8_t *) tag + tag->size;
|
||||||
distance = (0xff - palette[i].blue) * (0xff - palette[i].blue)
|
mmap = (multiboot_memory_map_t *)
|
||||||
+ palette[i].red * palette[i].red
|
((unsigned long) mmap
|
||||||
+ palette[i].green * palette[i].green;
|
+ ((struct multiboot_tag_mmap *) tag)->entry_size))
|
||||||
if (distance < best_distance)
|
printf (" base_addr = 0x%x%x,"
|
||||||
{
|
" length = 0x%x%x, type = 0x%x\n",
|
||||||
color = i;
|
(unsigned) (mmap->addr >> 32),
|
||||||
best_distance = distance;
|
(unsigned) (mmap->addr & 0xffffffff),
|
||||||
}
|
(unsigned) (mmap->len >> 32),
|
||||||
}
|
(unsigned) (mmap->len & 0xffffffff),
|
||||||
|
(unsigned) mmap->type);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
|
||||||
|
{
|
||||||
|
multiboot_uint32_t color;
|
||||||
|
unsigned i;
|
||||||
|
struct multiboot_tag_framebuffer *tagfb
|
||||||
|
= (struct multiboot_tag_framebuffer *) tag;
|
||||||
|
void *fb = (void *) (unsigned long) tagfb->common.framebuffer_addr;
|
||||||
|
|
||||||
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
|
switch (tagfb->common.framebuffer_type)
|
||||||
color = ((1 << mbi->framebuffer_blue_mask_size) - 1)
|
{
|
||||||
<< mbi->framebuffer_blue_field_position;
|
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
|
||||||
break;
|
{
|
||||||
|
unsigned best_distance, distance;
|
||||||
|
struct multiboot_color *palette;
|
||||||
|
|
||||||
|
palette = tagfb->framebuffer_palette;
|
||||||
|
|
||||||
case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
|
color = 0;
|
||||||
color = '\\' | 0x0100;
|
best_distance = 4*256*256;
|
||||||
break;
|
|
||||||
|
for (i = 0; i < tagfb->framebuffer_palette_num_colors; i++)
|
||||||
|
{
|
||||||
|
distance = (0xff - palette[i].blue)
|
||||||
|
* (0xff - palette[i].blue)
|
||||||
|
+ palette[i].red * palette[i].red
|
||||||
|
+ palette[i].green * palette[i].green;
|
||||||
|
if (distance < best_distance)
|
||||||
|
{
|
||||||
|
color = i;
|
||||||
|
best_distance = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
|
||||||
color = 0xffffffff;
|
color = ((1 << tagfb->framebuffer_blue_mask_size) - 1)
|
||||||
break;
|
<< tagfb->framebuffer_blue_field_position;
|
||||||
}
|
break;
|
||||||
for (i = 0; i < mbi->framebuffer_width
|
|
||||||
&& i < mbi->framebuffer_height; i++)
|
|
||||||
{
|
|
||||||
switch (mbi->framebuffer_bpp)
|
|
||||||
{
|
|
||||||
case 8:
|
|
||||||
{
|
|
||||||
multiboot_uint8_t *pixel = fb + mbi->framebuffer_pitch * i + i;
|
|
||||||
*pixel = color;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
case 16:
|
|
||||||
{
|
|
||||||
multiboot_uint16_t *pixel
|
|
||||||
= fb + mbi->framebuffer_pitch * i + 2 * i;
|
|
||||||
*pixel = color;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
{
|
|
||||||
multiboot_uint32_t *pixel
|
|
||||||
= fb + mbi->framebuffer_pitch * i + 3 * i;
|
|
||||||
*pixel = (color & 0xffffff) | (*pixel & 0xff000000);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 32:
|
case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
|
||||||
{
|
color = '\\' | 0x0100;
|
||||||
multiboot_uint32_t *pixel
|
break;
|
||||||
= fb + mbi->framebuffer_pitch * i + 4 * i;
|
|
||||||
*pixel = color;
|
default:
|
||||||
|
color = 0xffffffff;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
for (i = 0; i < tagfb->common.framebuffer_width
|
||||||
|
&& i < tagfb->common.framebuffer_height; i++)
|
||||||
|
{
|
||||||
|
switch (tagfb->common.framebuffer_bpp)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
multiboot_uint8_t *pixel = fb
|
||||||
|
+ tagfb->common.framebuffer_pitch * i + i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
multiboot_uint16_t *pixel
|
||||||
|
= fb + tagfb->common.framebuffer_pitch * i + 2 * i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
{
|
||||||
|
multiboot_uint32_t *pixel
|
||||||
|
= fb + tagfb->common.framebuffer_pitch * i + 3 * i;
|
||||||
|
*pixel = (color & 0xffffff) | (*pixel & 0xff000000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 32:
|
||||||
|
{
|
||||||
|
multiboot_uint32_t *pixel
|
||||||
|
= fb + tagfb->common.framebuffer_pitch * i + 4 * i;
|
||||||
|
*pixel = color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tag = (struct multiboot_tag *) ((multiboot_uint8_t *) tag
|
||||||
|
+ ((tag->size + 7) & ~7));
|
||||||
|
printf ("Total mbi size 0x%x\n", (unsigned) tag - addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
|
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
|
||||||
|
|||||||
+367
-339
@@ -53,7 +53,7 @@ versions.
|
|||||||
@titlepage
|
@titlepage
|
||||||
@sp 10
|
@sp 10
|
||||||
@title The Multiboot Specification version @value{VERSION}
|
@title The Multiboot Specification version @value{VERSION}
|
||||||
@author Yoshinori K. Okuji, Bryan Ford, Erich Stefan Boleyn, Kunihiro Ishiguro
|
@author Yoshinori K. Okuji, Bryan Ford, Erich Stefan Boleyn, Kunihiro Ishiguro, Vladimir 'phcoder' Serbinenko
|
||||||
@page
|
@page
|
||||||
@vskip 0pt plus 1filll
|
@vskip 0pt plus 1filll
|
||||||
@insertcopying
|
@insertcopying
|
||||||
@@ -296,6 +296,13 @@ little-endian, u32 is coded in little-endian.
|
|||||||
@item u64
|
@item u64
|
||||||
The type of unsigned 64-bit data. Because the target architecture is
|
The type of unsigned 64-bit data. Because the target architecture is
|
||||||
little-endian, u64 is coded in little-endian.
|
little-endian, u64 is coded in little-endian.
|
||||||
|
|
||||||
|
@item u_phys
|
||||||
|
The type of unsigned data of the same size as target architecture physical address size.
|
||||||
|
|
||||||
|
@item u_virt
|
||||||
|
The type of unsigned data of the same size as target architecture virtual address size.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
@@ -335,8 +342,8 @@ not use shared libraries or other fancy features.
|
|||||||
|
|
||||||
An OS image must contain an additional header called @dfn{Multiboot
|
An OS image must contain an additional header called @dfn{Multiboot
|
||||||
header}, besides the headers of the format used by the OS image. The
|
header}, besides the headers of the format used by the OS image. The
|
||||||
Multiboot header must be contained completely within the first 8192
|
Multiboot header must be contained completely within the first 32768
|
||||||
bytes of the OS image, and must be longword (32-bit) aligned. In
|
bytes of the OS image, and must be 64-bit aligned. In
|
||||||
general, it should come @emph{as early as possible}, and may be
|
general, it should come @emph{as early as possible}, and may be
|
||||||
embedded in the beginning of the text segment after the @emph{real}
|
embedded in the beginning of the text segment after the @emph{real}
|
||||||
executable header.
|
executable header.
|
||||||
@@ -344,8 +351,12 @@ executable header.
|
|||||||
@menu
|
@menu
|
||||||
* Header layout:: The layout of Multiboot header
|
* Header layout:: The layout of Multiboot header
|
||||||
* Header magic fields:: The magic fields of Multiboot header
|
* Header magic fields:: The magic fields of Multiboot header
|
||||||
* Header address fields::
|
* Header tags::
|
||||||
* Header graphics fields::
|
* Information request header tag::
|
||||||
|
* Address header tag::
|
||||||
|
* Console header tags::
|
||||||
|
* Module alignment tag::
|
||||||
|
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
@@ -355,27 +366,17 @@ executable header.
|
|||||||
The layout of the Multiboot header must be as follows:
|
The layout of the Multiboot header must be as follows:
|
||||||
|
|
||||||
@multitable @columnfractions .1 .1 .2 .5
|
@multitable @columnfractions .1 .1 .2 .5
|
||||||
@item Offset @tab Type @tab Field Name @tab Note
|
@item Offset @tab Type @tab Field Name @tab Note
|
||||||
@item 0 @tab u32 @tab magic @tab required
|
@item 0 @tab u32 @tab magic @tab required
|
||||||
@item 4 @tab u32 @tab flags @tab required
|
@item 4 @tab u32 @tab architecture @tab required
|
||||||
@item 8 @tab u32 @tab checksum @tab required
|
@item 8 @tab u32 @tab header_length @tab required
|
||||||
@item 12 @tab u32 @tab header_addr @tab if flags[16] is set
|
@item 12 @tab u32 @tab checksum @tab required
|
||||||
@item 16 @tab u32 @tab load_addr @tab if flags[16] is set
|
@item 16-XX @tab @tab tags @tab required
|
||||||
@item 20 @tab u32 @tab load_end_addr @tab if flags[16] is set
|
|
||||||
@item 24 @tab u32 @tab bss_end_addr @tab if flags[16] is set
|
|
||||||
@item 28 @tab u32 @tab entry_addr @tab if flags[16] is set
|
|
||||||
@item 32 @tab u32 @tab mode_type @tab if flags[2] is set
|
|
||||||
@item 36 @tab u32 @tab width @tab if flags[2] is set
|
|
||||||
@item 40 @tab u32 @tab height @tab if flags[2] is set
|
|
||||||
@item 44 @tab u32 @tab depth @tab if flags[2] is set
|
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
The fields @samp{magic}, @samp{flags} and @samp{checksum} are defined in
|
The fields @samp{magic}, @samp{architecture}, @samp{header_length} and @samp{checksum} are defined in @ref{Header magic fields}, @samp{tags}
|
||||||
@ref{Header magic fields}, the fields @samp{header_addr},
|
are defined in @ref{Header tags}. All fields are in native endianness.
|
||||||
@samp{load_addr}, @samp{load_end_addr}, @samp{bss_end_addr} and
|
On bi-endian platforms native-endianness means the endiannes OS image starts in.
|
||||||
@samp{entry_addr} are defined in @ref{Header address fields}, and the
|
|
||||||
fields @samp{mode_type}, @samp{width}, @samp{height} and @samp{depth} are
|
|
||||||
defined in @ref{Header graphics fields}.
|
|
||||||
|
|
||||||
|
|
||||||
@node Header magic fields
|
@node Header magic fields
|
||||||
@@ -384,58 +385,90 @@ defined in @ref{Header graphics fields}.
|
|||||||
@table @samp
|
@table @samp
|
||||||
@item magic
|
@item magic
|
||||||
The field @samp{magic} is the magic number identifying the header,
|
The field @samp{magic} is the magic number identifying the header,
|
||||||
which must be the hexadecimal value @code{0x1BADB002}.
|
which must be the hexadecimal value @code{0xE85250D6}.
|
||||||
|
|
||||||
@item flags
|
@item architecture
|
||||||
The field @samp{flags} specifies features that the OS image requests or
|
The field @samp{architecture} specifies the Central Processing Unit
|
||||||
requires of an boot loader. Bits 0-15 indicate requirements; if the
|
Instruction Set Architecture. Since @samp{magic} isn't a palindrome
|
||||||
boot loader sees any of these bits set but doesn't understand the flag
|
it already specifies the endianness ISAs differing only in endianness
|
||||||
or can't fulfill the requirements it indicates for some reason, it must
|
recieve the same ID. @samp{0} means 32-bit (protected) mode of i386.
|
||||||
notify the user and fail to load the OS image. Bits 16-31 indicate
|
|
||||||
optional features; if any bits in this range are set but the boot loader
|
|
||||||
doesn't understand them, it may simply ignore them and proceed as
|
|
||||||
usual. Naturally, all as-yet-undefined bits in the @samp{flags} word
|
|
||||||
must be set to zero in OS images. This way, the @samp{flags} fields
|
|
||||||
serves for version control as well as simple feature selection.
|
|
||||||
|
|
||||||
If bit 0 in the @samp{flags} word is set, then all boot modules loaded
|
@item header_length
|
||||||
along with the operating system must be aligned on page (4KB)
|
The field @samp{header_length} specifies the Length of multiboot header
|
||||||
boundaries. Some operating systems expect to be able to map the pages
|
in bytes including magic fields.
|
||||||
containing boot modules directly into a paged address space during
|
|
||||||
startup, and thus need the boot modules to be page-aligned.
|
|
||||||
|
|
||||||
If bit 1 in the @samp{flags} word is set, then information on available
|
|
||||||
memory via at least the @samp{mem_*} fields of the Multiboot information
|
|
||||||
structure (@pxref{Boot information format}) must be included. If the
|
|
||||||
boot loader is capable of passing a memory map (the @samp{mmap_*} fields)
|
|
||||||
and one exists, then it may be included as well.
|
|
||||||
|
|
||||||
If bit 2 in the @samp{flags} word is set, information about the video
|
|
||||||
mode table (@pxref{Boot information format}) must be available to the
|
|
||||||
kernel.
|
|
||||||
|
|
||||||
If bit 16 in the @samp{flags} word is set, then the fields at offsets
|
|
||||||
12-28 in the Multiboot header are valid, and the boot loader should use
|
|
||||||
them instead of the fields in the actual executable header to calculate
|
|
||||||
where to load the OS image. This information does not need to be
|
|
||||||
provided if the kernel image is in @sc{elf} format, but it @emph{must}
|
|
||||||
be provided if the images is in a.out format or in some other
|
|
||||||
format. Compliant boot loaders must be able to load images that either
|
|
||||||
are in @sc{elf} format or contain the load address information embedded
|
|
||||||
in the Multiboot header; they may also directly support other executable
|
|
||||||
formats, such as particular a.out variants, but are not required to.
|
|
||||||
|
|
||||||
@item checksum
|
@item checksum
|
||||||
The field @samp{checksum} is a 32-bit unsigned value which, when added
|
The field @samp{checksum} is a 32-bit unsigned value which, when added
|
||||||
to the other magic fields (i.e. @samp{magic} and @samp{flags}), must
|
to the other magic fields (i.e. @samp{magic}, @samp{architecture}
|
||||||
have a 32-bit unsigned sum of zero.
|
and @samp{header_length}), must have a 32-bit unsigned sum of zero.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
@node Header address fields
|
@node Header tags
|
||||||
@subsection The address fields of Multiboot header
|
@subsection General tag structure
|
||||||
|
Tags constitutes a buffer of structures following each other padded on @samp{u_virt} size.
|
||||||
|
Every structure has following format:
|
||||||
|
|
||||||
All of the address fields enabled by flag bit 16 are physical addresses.
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@samp{type} is divided into 2 parts. Lower contains an identifier of contents of the rest of the tag.
|
||||||
|
@samp{size} contains the size of tag including header fields.
|
||||||
|
If bit @samp{0} of @samp{flags} (also known as @samp{optional}) is set if bootloader may ignore this tag if it
|
||||||
|
lacks relevant support.
|
||||||
|
Tags are terminated by a tag of type @samp{0} and size @samp{8}.
|
||||||
|
|
||||||
|
@node Information request header tag
|
||||||
|
@subsection Multiboot information request
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 1 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size |
|
||||||
|
u32[n] | mbi_tag_types |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@samp{mbi_tag_types} is an array of u32 each one representing an information
|
||||||
|
request
|
||||||
|
If this tag is present and @samp{optional} is set to @samp{0} information
|
||||||
|
conveyed by requested tag types must be present. If bootloader is unable
|
||||||
|
to supply this information it must fail with an error
|
||||||
|
|
||||||
|
Note: it doesn't garantee that any tags of type @samp{mbi_tag_types} will
|
||||||
|
actually be present. E.g. on a videoless system even if you requested tag
|
||||||
|
@samp{8} no tags of type @samp{8} will be present in mbi.
|
||||||
|
|
||||||
|
|
||||||
|
@node Address header tag
|
||||||
|
@subsection The address tag of Multiboot header
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 2 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size |
|
||||||
|
u_virt | header_addr |
|
||||||
|
u_virt | load_addr |
|
||||||
|
u_virt | load_end_addr |
|
||||||
|
u_virt | bss_end_addr |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
All of the address fields in this tag are physical addresses.
|
||||||
The meaning of each is as follows:
|
The meaning of each is as follows:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@@ -466,29 +499,74 @@ occupies to avoid placing boot modules and other data relevant to the
|
|||||||
operating system in that area. If this field is zero, the boot loader
|
operating system in that area. If this field is zero, the boot loader
|
||||||
assumes that no bss segment is present.
|
assumes that no bss segment is present.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@subsection The entry address tag of Multiboot header
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 3 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size |
|
||||||
|
u_virt | entry_addr |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
All of the address fields in this tag are physical addresses.
|
||||||
|
The meaning of each is as follows:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
|
||||||
@item entry_addr
|
@item entry_addr
|
||||||
The physical address to which the boot loader should jump in order to
|
The physical address to which the boot loader should jump in order to
|
||||||
start running the operating system.
|
start running the operating system.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@node Console header tags
|
||||||
|
@subsection Flags tag
|
||||||
|
|
||||||
@node Header graphics fields
|
@example
|
||||||
@subsection The graphics fields of Multiboot header
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 4 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size = 12 |
|
||||||
|
u32 | console_flags |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
All of the graphics fields are enabled by flag bit 2. They specify the
|
If this tag is present and bit 0 of @samp{console_flags} is set
|
||||||
preferred graphics mode. Note that that is only a @emph{recommended}
|
at least one of supported consoles must be present and information about it must be available in mbi.
|
||||||
|
If bit @samp{1} of @samp{console_flags} is set it
|
||||||
|
indicates that the OS image has EGA text support.
|
||||||
|
|
||||||
|
@subsection The framebuffer tag of Multiboot header
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 5 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size = 20 |
|
||||||
|
u32 | width |
|
||||||
|
u32 | height |
|
||||||
|
u32 | depth |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
|
||||||
|
This tag specifies the preferred graphics mode. If this tag is present
|
||||||
|
bootloader assumes that the payload has framebuffer support.
|
||||||
|
Note that that is only a @emph{recommended}
|
||||||
mode by the OS image. Boot loader may choose a different mode if it sees fit.
|
mode by the OS image. Boot loader may choose a different mode if it sees fit.
|
||||||
|
|
||||||
The meaning of each is as follows:
|
The meaning of each is as follows:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item mode_type
|
|
||||||
Contains @samp{0} for linear graphics mode or @samp{1} for
|
|
||||||
EGA-standard text mode. Everything else is reserved for future
|
|
||||||
expansion. Note that the boot loader may set a text mode even if this
|
|
||||||
field contains @samp{0}, or set a video mode even if this field contains
|
|
||||||
@samp{1}.
|
|
||||||
|
|
||||||
@item width
|
@item width
|
||||||
Contains the number of the columns. This is specified in pixels in a
|
Contains the number of the columns. This is specified in pixels in a
|
||||||
graphics mode, and in characters in a text mode. The value zero
|
graphics mode, and in characters in a text mode. The value zero
|
||||||
@@ -506,6 +584,22 @@ preference.
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
|
@node Module alignment tag
|
||||||
|
@subsection Module alignment tag
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u16 | type = 6 |
|
||||||
|
u16 | flags |
|
||||||
|
u32 | size = 12 |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
If this tag is present modules must be page aligned.
|
||||||
|
|
||||||
|
|
||||||
@node Machine state
|
@node Machine state
|
||||||
@section Machine state
|
@section Machine state
|
||||||
|
|
||||||
@@ -514,7 +608,7 @@ must have the following state:
|
|||||||
|
|
||||||
@table @samp
|
@table @samp
|
||||||
@item EAX
|
@item EAX
|
||||||
Must contain the magic value @samp{0x2BADB002}; the presence of this
|
Must contain the magic value @samp{0x36d76289}; the presence of this
|
||||||
value indicates to the operating system that it was loaded by a
|
value indicates to the operating system that it was loaded by a
|
||||||
Multiboot-compliant boot loader (e.g. as opposed to another type of
|
Multiboot-compliant boot loader (e.g. as opposed to another type of
|
||||||
boot loader that the operating system can also be loaded from).
|
boot loader that the operating system can also be loaded from).
|
||||||
@@ -577,9 +671,8 @@ changed them during the switch to 32-bit mode.
|
|||||||
|
|
||||||
|
|
||||||
@node Boot information format
|
@node Boot information format
|
||||||
@section Boot information format
|
@section Boot information
|
||||||
|
@subsection Boot information format
|
||||||
FIXME: Split this chapter like the chapter ``OS image format''.
|
|
||||||
|
|
||||||
Upon entry to the operating system, the @code{EBX} register contains the
|
Upon entry to the operating system, the @code{EBX} register contains the
|
||||||
physical address of a @dfn{Multiboot information} data structure,
|
physical address of a @dfn{Multiboot information} data structure,
|
||||||
@@ -594,317 +687,238 @@ memory reserved for the kernel and boot modules, of course). It is the
|
|||||||
operating system's responsibility to avoid overwriting this memory until
|
operating system's responsibility to avoid overwriting this memory until
|
||||||
it is done using it.
|
it is done using it.
|
||||||
|
|
||||||
The format of the Multiboot information structure (as defined so far)
|
@subsection Basic tags structure
|
||||||
follows:
|
Boot information consists of fixed part and a series of tags. Its start is 8-bytes aligned. Fixed part is as following:
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u32 | total_size |
|
||||||
|
u32 | reserved |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@samp{total_size} contains the total size of boot information including
|
||||||
|
this field and terminating tag in bytes
|
||||||
|
|
||||||
|
@samp{reserved} is always set to zero and must be ignored by OS image
|
||||||
|
|
||||||
|
Every tag begins with following fields:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------------+
|
+-------------------+
|
||||||
0 | flags | (required)
|
u32 | type |
|
||||||
|
u32 | size |
|
||||||
+-------------------+
|
+-------------------+
|
||||||
4 | mem_lower | (present if flags[0] is set)
|
|
||||||
8 | mem_upper | (present if flags[0] is set)
|
|
||||||
+-------------------+
|
|
||||||
12 | boot_device | (present if flags[1] is set)
|
|
||||||
+-------------------+
|
|
||||||
16 | cmdline | (present if flags[2] is set)
|
|
||||||
+-------------------+
|
|
||||||
20 | mods_count | (present if flags[3] is set)
|
|
||||||
24 | mods_addr | (present if flags[3] is set)
|
|
||||||
+-------------------+
|
|
||||||
28 - 40 | syms | (present if flags[4] or
|
|
||||||
| | flags[5] is set)
|
|
||||||
+-------------------+
|
|
||||||
44 | mmap_length | (present if flags[6] is set)
|
|
||||||
48 | mmap_addr | (present if flags[6] is set)
|
|
||||||
+-------------------+
|
|
||||||
52 | drives_length | (present if flags[7] is set)
|
|
||||||
56 | drives_addr | (present if flags[7] is set)
|
|
||||||
+-------------------+
|
|
||||||
60 | config_table | (present if flags[8] is set)
|
|
||||||
+-------------------+
|
|
||||||
64 | boot_loader_name | (present if flags[9] is set)
|
|
||||||
+-------------------+
|
|
||||||
68 | apm_table | (present if flags[10] is set)
|
|
||||||
+-------------------+
|
|
||||||
72 | vbe_control_info | (present if flags[11] is set)
|
|
||||||
76 | vbe_mode_info |
|
|
||||||
80 | vbe_mode |
|
|
||||||
82 | vbe_interface_seg |
|
|
||||||
84 | vbe_interface_off |
|
|
||||||
86 | vbe_interface_len |
|
|
||||||
+-------------------+
|
|
||||||
88 | framebuffer_addr | (present if flags[12] is set)
|
|
||||||
96 | framebuffer_pitch |
|
|
||||||
100 | framebuffer_width |
|
|
||||||
104 | framebuffer_height|
|
|
||||||
108 | framebuffer_bpp |
|
|
||||||
109 | framebuffer_type |
|
|
||||||
110-115 | color_info |
|
|
||||||
+-------------------+
|
|
||||||
|
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The first longword indicates the presence and validity of other fields
|
@samp{type} contains an identifier of contents of the rest of the tag.
|
||||||
in the Multiboot information structure. All as-yet-undefined bits must
|
@samp{size} contains the size of tag including header fields but not including padding.
|
||||||
be set to zero by the boot loader. Any set bits that the operating
|
Tags follow one another padded when necessary in order for each tag to start at 8-bytes aligned address. Tags are terminated by a tag of type @samp{0} and size @samp{8}.
|
||||||
system does not understand should be ignored. Thus, the @samp{flags}
|
|
||||||
field also functions as a version indicator, allowing the Multiboot
|
|
||||||
information structure to be expanded in the future without breaking
|
|
||||||
anything.
|
|
||||||
|
|
||||||
If bit 0 in the @samp{flags} word is set, then the @samp{mem_*} fields
|
@subsection Basic memory information
|
||||||
are valid. @samp{mem_lower} and @samp{mem_upper} indicate the amount of
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u32 | type = 4 |
|
||||||
|
u32 | size = 16 |
|
||||||
|
u32 | mem_lower |
|
||||||
|
u32 | mem_upper |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@samp{mem_lower} and @samp{mem_upper} indicate the amount of
|
||||||
lower and upper memory, respectively, in kilobytes. Lower memory starts
|
lower and upper memory, respectively, in kilobytes. Lower memory starts
|
||||||
at address 0, and upper memory starts at address 1 megabyte. The maximum
|
at address 0, and upper memory starts at address 1 megabyte. The maximum
|
||||||
possible value for lower memory is 640 kilobytes. The value returned for
|
possible value for lower memory is 640 kilobytes. The value returned for
|
||||||
upper memory is maximally the address of the first upper memory hole
|
upper memory is maximally the address of the first upper memory hole
|
||||||
minus 1 megabyte. It is not guaranteed to be this value.
|
minus 1 megabyte. It is not guaranteed to be this value.
|
||||||
|
|
||||||
If bit 1 in the @samp{flags} word is set, then the @samp{boot_device}
|
@subsection BIOS Boot device
|
||||||
field is valid, and indicates which @sc{bios} disk device the boot
|
|
||||||
loader loaded the OS image from. If the OS image was not loaded from a
|
|
||||||
@sc{bios} disk, then this field must not be present (bit 3 must be
|
|
||||||
clear). The operating system may use this field as a hint for
|
|
||||||
determining its own @dfn{root} device, but is not required to. The
|
|
||||||
@samp{boot_device} field is laid out in four one-byte subfields as
|
|
||||||
follows:
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------+-------+-------+-------+
|
+-------------------+
|
||||||
| part3 | part2 | part1 | drive |
|
u32 | type = 5 |
|
||||||
+-------+-------+-------+-------+
|
u32 | size = 20 |
|
||||||
|
u32 | biosdev |
|
||||||
|
u32 | partition |
|
||||||
|
u32 | sub_parition |
|
||||||
|
+-------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The first byte contains the @sc{bios} drive number as understood by the
|
This tag indicates which @sc{bios} disk device the boot
|
||||||
|
loader loaded the OS image from. If the OS image was not loaded from a
|
||||||
|
@sc{bios} disk, then this tag must not be present. The operating system may
|
||||||
|
use this field as a hint for determining its own @dfn{root} device,
|
||||||
|
but is not required to.
|
||||||
|
|
||||||
|
The @samp{biosdev} contains the @sc{bios} drive number as understood by the
|
||||||
@sc{bios} INT 0x13 low-level disk interface: e.g. 0x00 for the first
|
@sc{bios} INT 0x13 low-level disk interface: e.g. 0x00 for the first
|
||||||
floppy disk or 0x80 for the first hard disk.
|
floppy disk or 0x80 for the first hard disk.
|
||||||
|
|
||||||
The three remaining bytes specify the boot partition. @samp{part1}
|
The three remaining bytes specify the boot partition. @samp{partition}
|
||||||
specifies the @dfn{top-level} partition number, @samp{part2} specifies a
|
specifies the @dfn{top-level} partition number, @samp{sub_partition} specifies a
|
||||||
@dfn{sub-partition} in the top-level partition, etc. Partition numbers
|
@dfn{sub-partition} in the top-level partition, etc. Partition numbers
|
||||||
always start from zero. Unused partition bytes must be set to 0xFF. For
|
always start from zero. Unused partition bytes must be set to 0xFFFFFFFF. For
|
||||||
example, if the disk is partitioned using a simple one-level DOS
|
example, if the disk is partitioned using a simple one-level DOS
|
||||||
partitioning scheme, then @samp{part1} contains the DOS partition
|
partitioning scheme, then @samp{partition} contains the DOS partition
|
||||||
number, and @samp{part2} and @samp{part3} are both 0xFF. As another
|
number, and @samp{sub_partition} if 0xFFFFFF. As another
|
||||||
example, if a disk is partitioned first into DOS partitions, and then
|
example, if a disk is partitioned first into DOS partitions, and then
|
||||||
one of those DOS partitions is subdivided into several BSD partitions
|
one of those DOS partitions is subdivided into several BSD partitions
|
||||||
using BSD's @dfn{disklabel} strategy, then @samp{part1} contains the DOS
|
using BSD's @dfn{disklabel} strategy, then @samp{partition} contains the DOS
|
||||||
partition number, @samp{part2} contains the BSD sub-partition within
|
partition number and @samp{sub_partition} contains the BSD sub-partition within
|
||||||
that DOS partition, and @samp{part3} is 0xFF.
|
that DOS partition.
|
||||||
|
|
||||||
DOS extended partitions are indicated as partition numbers starting from
|
DOS extended partitions are indicated as partition numbers starting from
|
||||||
4 and increasing, rather than as nested sub-partitions, even though the
|
4 and increasing, rather than as nested sub-partitions, even though the
|
||||||
underlying disk layout of extended partitions is hierarchical in
|
underlying disk layout of extended partitions is hierarchical in
|
||||||
nature. For example, if the boot loader boots from the second extended
|
nature. For example, if the boot loader boots from the second extended
|
||||||
partition on a disk partitioned in conventional DOS style, then
|
partition on a disk partitioned in conventional DOS style, then
|
||||||
@samp{part1} will be 5, and @samp{part2} and @samp{part3} will both be
|
@samp{partition} will be 5, and @samp{sub_partiton} will be 0xFFFFFFFF.
|
||||||
0xFF.
|
|
||||||
|
|
||||||
If bit 2 of the @samp{flags} longword is set, the @samp{cmdline} field
|
|
||||||
is valid, and contains the physical address of the command line to
|
|
||||||
be passed to the kernel. The command line is a normal C-style
|
|
||||||
zero-terminated string.
|
|
||||||
|
|
||||||
If bit 3 of the @samp{flags} is set, then the @samp{mods} fields
|
|
||||||
indicate to the kernel what boot modules were loaded along with the
|
|
||||||
kernel image, and where they can be found. @samp{mods_count} contains
|
|
||||||
the number of modules loaded; @samp{mods_addr} contains the physical
|
|
||||||
address of the first module structure. @samp{mods_count} may be zero,
|
|
||||||
indicating no boot modules were loaded, even if bit 3 of @samp{flags} is
|
|
||||||
set. Each module structure is formatted as follows:
|
|
||||||
|
|
||||||
|
@subsection Boot command line
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------------+
|
+-------------------+
|
||||||
0 | mod_start |
|
u32 | type = 1 |
|
||||||
4 | mod_end |
|
u32 | size |
|
||||||
+-------------------+
|
u8[n] | string |
|
||||||
8 | string |
|
|
||||||
+-------------------+
|
|
||||||
12 | reserved (0) |
|
|
||||||
+-------------------+
|
+-------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The first two fields contain the start and end addresses of the boot
|
@samp{string} contains command line. The command line is a normal C-style
|
||||||
|
zero-terminated UTF-8 string.
|
||||||
|
|
||||||
|
@subsection Modules
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u32 | type = 3 |
|
||||||
|
u32 | size |
|
||||||
|
u_phys | mod_start |
|
||||||
|
u_phys | mod_end |
|
||||||
|
u8[n] | string |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This tag indicates to the kernel what boot module was loaded along with the
|
||||||
|
kernel image, and where it can be found.
|
||||||
|
|
||||||
|
The @samp{mod_start} and @samp{mod_end} contain the start and end addresses of the boot
|
||||||
module itself. The @samp{string} field provides an arbitrary string to
|
module itself. The @samp{string} field provides an arbitrary string to
|
||||||
be associated with that particular boot module; it is a zero-terminated
|
be associated with that particular boot module; it is a zero-terminated
|
||||||
ASCII string, just like the kernel command line. The @samp{string} field
|
UTF-8 string, just like the kernel command line. Typically the
|
||||||
may be 0 if there is no string associated with the module. Typically the
|
|
||||||
string might be a command line (e.g. if the operating system treats boot
|
string might be a command line (e.g. if the operating system treats boot
|
||||||
modules as executable programs), or a pathname (e.g. if the operating
|
modules as executable programs), or a pathname (e.g. if the operating
|
||||||
system treats boot modules as files in a file system), but its exact use
|
system treats boot modules as files in a file system), but its exact use
|
||||||
is specific to the operating system. The @samp{reserved} field must be
|
is specific to the operating system.
|
||||||
set to 0 by the boot loader and ignored by the operating system.
|
|
||||||
|
|
||||||
@strong{Caution:} Bits 4 & 5 are mutually exclusive.
|
One tag appears per module. This tag type may appear multiple times.
|
||||||
|
|
||||||
If bit 4 in the @samp{flags} word is set, then the following fields in
|
|
||||||
the Multiboot information structure starting at byte 28 are valid:
|
|
||||||
|
|
||||||
|
@subsection ELF-Symbols
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------------+
|
+-------------------+
|
||||||
28 | tabsize |
|
u32 | type = 9 |
|
||||||
32 | strsize |
|
u32 | size |
|
||||||
36 | addr |
|
u16 | num |
|
||||||
40 | reserved (0) |
|
u16 | entsize |
|
||||||
|
u16 | shndx |
|
||||||
|
u16 | reserved |
|
||||||
|
varies | section headers |
|
||||||
+-------------------+
|
+-------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
These indicate where the symbol table from an a.out kernel image can be
|
This tag contains section header table from an ELF kernel, the
|
||||||
found. @samp{addr} is the physical address of the size (4-byte unsigned
|
|
||||||
long) of an array of a.out format @dfn{nlist} structures, followed
|
|
||||||
immediately by the array itself, then the size (4-byte unsigned long) of
|
|
||||||
a set of zero-terminated @sc{ascii} strings (plus sizeof(unsigned long) in
|
|
||||||
this case), and finally the set of strings itself. @samp{tabsize} is
|
|
||||||
equal to its size parameter (found at the beginning of the symbol
|
|
||||||
section), and @samp{strsize} is equal to its size parameter (found at
|
|
||||||
the beginning of the string section) of the following string table to
|
|
||||||
which the symbol table refers. Note that @samp{tabsize} may be 0,
|
|
||||||
indicating no symbols, even if bit 4 in the @samp{flags} word is set.
|
|
||||||
|
|
||||||
If bit 5 in the @samp{flags} word is set, then the following fields in
|
|
||||||
the Multiboot information structure starting at byte 28 are valid:
|
|
||||||
|
|
||||||
@example
|
|
||||||
@group
|
|
||||||
+-------------------+
|
|
||||||
28 | num |
|
|
||||||
32 | size |
|
|
||||||
36 | addr |
|
|
||||||
40 | shndx |
|
|
||||||
+-------------------+
|
|
||||||
@end group
|
|
||||||
@end example
|
|
||||||
|
|
||||||
These indicate where the section header table from an ELF kernel is, the
|
|
||||||
size of each entry, number of entries, and the string table used as the
|
size of each entry, number of entries, and the string table used as the
|
||||||
index of names. They correspond to the @samp{shdr_*} entries
|
index of names. They correspond to the @samp{shdr_*} entries
|
||||||
(@samp{shdr_num}, etc.) in the Executable and Linkable Format (@sc{elf})
|
(@samp{shdr_num}, etc.) in the Executable and Linkable Format (@sc{elf})
|
||||||
specification in the program header. All sections are loaded, and the
|
specification in the program header. All sections are loaded, and the
|
||||||
physical address fields of the @sc{elf} section header then refer to where
|
physical address fields of the @sc{elf} section header then refer to where
|
||||||
the sections are in memory (refer to the i386 @sc{elf} documentation for
|
the sections are in memory (refer to the i386 @sc{elf} documentation for
|
||||||
details as to how to read the section header(s)). Note that
|
details as to how to read the section header(s)).
|
||||||
@samp{shdr_num} may be 0, indicating no symbols, even if bit 5 in the
|
|
||||||
@samp{flags} word is set.
|
|
||||||
|
|
||||||
If bit 6 in the @samp{flags} word is set, then the @samp{mmap_*} fields
|
@subsection Memory map
|
||||||
are valid, and indicate the address and length of a buffer containing a
|
|
||||||
memory map of the machine provided by the @sc{bios}. @samp{mmap_addr} is
|
This tag provides memory map.
|
||||||
the address, and @samp{mmap_length} is the total size of the buffer. The
|
|
||||||
buffer consists of one or more of the following size/structure pairs
|
|
||||||
(@samp{size} is really used for skipping to the next pair):
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------------+
|
+-------------------+
|
||||||
-4 | size |
|
u32 | type = 6 |
|
||||||
+-------------------+
|
u32 | size |
|
||||||
0 | base_addr |
|
u32 | entry_size |
|
||||||
8 | length |
|
u32 | entry_version |
|
||||||
16 | type |
|
varies | entries |
|
||||||
+-------------------+
|
+-------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
where @samp{size} is the size of the associated structure in bytes, which
|
@samp{entry_size} contains the size of one entry so that in future new fields may be added to it. It's guaranteed to be a multiple of 8. @samp{entry_version} is currently set at @samp{0}. Future versions will increment this field. Future version are guranteed to be backward compatible with older format. Each entry has the following structure:
|
||||||
can be greater than the minimum of 20 bytes. @samp{base_addr} is the
|
|
||||||
starting address. @samp{length} is the size of the memory region in bytes.
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u64 | base_addr |
|
||||||
|
u64 | length |
|
||||||
|
u32 | type |
|
||||||
|
u32 | reserved |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@samp{size} contains the size of current entry including this field itself. It may be bigger than 24 bytes in future versions but is guaranteed to be
|
||||||
|
@samp{base_addr} is the starting physical address. @samp{length} is the size of the memory region in bytes.
|
||||||
@samp{type} is the variety of address range represented, where a
|
@samp{type} is the variety of address range represented, where a
|
||||||
value of 1 indicates available @sc{ram}, value of 3 indicates usable memory
|
value of 1 indicates available @sc{ram}, value of 3 indicates usable memory
|
||||||
holding ACPI information, value of 4 indicates reserved memory which needs to
|
holding ACPI information, value of 4 indicates reserved memory which needs to
|
||||||
be preserved on hibernation and all other values currently
|
be preserved on hibernation and all other values currently
|
||||||
indicated a reserved area.
|
indicated a reserved area.
|
||||||
|
@samp{reserved} is set to @samp{0} by bootloader and must be ignored by the OS image.
|
||||||
|
|
||||||
The map provided is guaranteed to list all standard @sc{ram} that should
|
The map provided is guaranteed to list all standard @sc{ram} that should
|
||||||
be available for normal use.
|
be available for normal use.
|
||||||
|
|
||||||
If bit 7 in the @samp{flags} is set, then the @samp{drives_*} fields
|
@subsection Boot loader name
|
||||||
are valid, and indicate the address of the physical address of the first
|
|
||||||
drive structure and the size of drive structures. @samp{drives_addr}
|
|
||||||
is the address, and @samp{drives_length} is the total size of drive
|
|
||||||
structures. Note that @samp{drives_length} may be zero. Each drive
|
|
||||||
structure is formatted as follows:
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------------+
|
+-------------------+
|
||||||
0 | size |
|
u32 | type = 2 |
|
||||||
+-------------------+
|
u32 | size |
|
||||||
4 | drive_number |
|
u8[n] | string |
|
||||||
+-------------------+
|
|
||||||
5 | drive_mode |
|
|
||||||
+-------------------+
|
|
||||||
6 | drive_cylinders |
|
|
||||||
8 | drive_heads |
|
|
||||||
9 | drive_sectors |
|
|
||||||
+-------------------+
|
|
||||||
10 - xx | drive_ports |
|
|
||||||
+-------------------+
|
+-------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The @samp{size} field specifies the size of this structure. The size
|
@samp{string} contains the name of a boot
|
||||||
varies, depending on the number of ports. Note that the size may not be
|
loader booting the kernel. The name is a normal C-style UTF-8 zero-terminated
|
||||||
equal to (10 + 2 * the number of ports), because of an alignment.
|
|
||||||
|
|
||||||
The @samp{drive_number} field contains the BIOS drive number. The
|
|
||||||
@samp{drive_mode} field represents the access mode used by the boot
|
|
||||||
loader. Currently, the following modes are defined:
|
|
||||||
|
|
||||||
@table @samp
|
|
||||||
@item 0
|
|
||||||
CHS mode (traditional cylinder/head/sector addressing mode).
|
|
||||||
|
|
||||||
@item 1
|
|
||||||
LBA mode (Logical Block Addressing mode).
|
|
||||||
@end table
|
|
||||||
|
|
||||||
The three fields, @samp{drive_cylinders}, @samp{drive_heads} and
|
|
||||||
@samp{drive_sectors}, indicate the geometry of the drive detected by the
|
|
||||||
@sc{bios}. @samp{drive_cylinders} contains the number of the
|
|
||||||
cylinders. @samp{drive_heads} contains the number of the
|
|
||||||
heads. @samp{drive_sectors} contains the number of the sectors per
|
|
||||||
track.
|
|
||||||
|
|
||||||
The @samp{drive_ports} field contains the array of the I/O ports used
|
|
||||||
for the drive in the @sc{bios} code. The array consists of zero or more
|
|
||||||
unsigned two-bytes integers, and is terminated with zero. Note that the
|
|
||||||
array may contain any number of I/O ports that are not related to the
|
|
||||||
drive actually (such as @sc{dma} controller's ports).
|
|
||||||
|
|
||||||
If bit 8 in the @samp{flags} is set, then the @samp{config_table} field
|
|
||||||
is valid, and indicates the address of the @sc{rom} configuration table
|
|
||||||
returned by the @dfn{GET CONFIGURATION} @sc{bios} call. If the @sc{bios}
|
|
||||||
call fails, then the size of the table must be @emph{zero}.
|
|
||||||
|
|
||||||
If bit 9 in the @samp{flags} is set, the @samp{boot_loader_name} field
|
|
||||||
is valid, and contains the physical address of the name of a boot
|
|
||||||
loader booting the kernel. The name is a normal C-style zero-terminated
|
|
||||||
string.
|
string.
|
||||||
|
|
||||||
If bit 10 in the @samp{flags} is set, the @samp{apm_table} field is
|
@subsection APM table
|
||||||
valid, and contains the physical address of an @sc{apm} table defined as
|
The tag type 10 contains @sc{apm} table
|
||||||
below:
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+----------------------+
|
+----------------------+
|
||||||
0 | version |
|
u32 | type = 10 |
|
||||||
2 | cseg |
|
u32 | size = 28 |
|
||||||
4 | offset |
|
u16 | version |
|
||||||
8 | cseg_16 |
|
u16 | cseg |
|
||||||
10 | dseg |
|
u32 | offset |
|
||||||
12 | flags |
|
u16 | cseg_16 |
|
||||||
14 | cseg_len |
|
u16 | dseg |
|
||||||
16 | cseg_16_len |
|
u16 | flags |
|
||||||
18 | dseg_len |
|
u16 | cseg_len |
|
||||||
|
u16 | cseg_16_len |
|
||||||
|
u16 | dseg_len |
|
||||||
+----------------------+
|
+----------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
@@ -921,10 +935,24 @@ bytes, and the others are 2 bytes. See
|
|||||||
@uref{http://www.microsoft.com/hwdev/busbios/amp_12.htm, Advanced Power
|
@uref{http://www.microsoft.com/hwdev/busbios/amp_12.htm, Advanced Power
|
||||||
Management (APM) BIOS Interface Specification}, for more information.
|
Management (APM) BIOS Interface Specification}, for more information.
|
||||||
|
|
||||||
If bit 11 in the @samp{flags} is set, the @sc{vbe} table is available.
|
@subsection VBE info
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
+-------------------+
|
||||||
|
u32 | type = 7 |
|
||||||
|
u32 | size = 784 |
|
||||||
|
u16 | vbe_mode |
|
||||||
|
u16 | vbe_interface_seg |
|
||||||
|
u16 | vbe_interface_off |
|
||||||
|
u16 | vbe_interface_len |
|
||||||
|
u8[512] | vbe_control_info |
|
||||||
|
u8[256] | vbe_mode_info |
|
||||||
|
+-------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
The fields @samp{vbe_control_info} and @samp{vbe_mode_info} contain
|
The fields @samp{vbe_control_info} and @samp{vbe_mode_info} contain
|
||||||
the physical addresses of @sc{vbe} control information returned by the
|
@sc{vbe} control information returned by the
|
||||||
@sc{vbe} Function 00h and @sc{vbe} mode information returned by the
|
@sc{vbe} Function 00h and @sc{vbe} mode information returned by the
|
||||||
@sc{vbe} Function 01h, respectively.
|
@sc{vbe} Function 01h, respectively.
|
||||||
|
|
||||||
@@ -939,62 +967,62 @@ mode interface which is incompatible with the old one. If you want to
|
|||||||
use the new protected mode interface, you will have to find the table
|
use the new protected mode interface, you will have to find the table
|
||||||
yourself.
|
yourself.
|
||||||
|
|
||||||
The fields for the graphics table are designed for @sc{vbe}, but
|
@subsection Framebuffer info
|
||||||
Multiboot boot loaders may simulate @sc{vbe} on non-@sc{vbe} modes, as
|
@example
|
||||||
if they were @sc{vbe} modes.
|
@group
|
||||||
|
+--------------------+
|
||||||
|
u32 | type = 8 |
|
||||||
|
u32 | size |
|
||||||
|
u64 | framebuffer_addr |
|
||||||
|
u32 | framebuffer_pitch |
|
||||||
|
u32 | framebuffer_width |
|
||||||
|
u32 | framebuffer_height |
|
||||||
|
u8 | framebuffer_bpp |
|
||||||
|
u8 | framebuffer_type |
|
||||||
|
u8 | reserved |
|
||||||
|
varies | color_info |
|
||||||
|
+--------------------+
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
If bit 12 in the @samp{flags} is set, the @sc{Framebuffer} table is available.
|
The field @samp{framebuffer_addr} contains framebuffer physical address. This field is 64-bit wide but bootloader @dfn{should} set it under 4GiB if possible for compatibility with payloads which aren't aware of PAE or amd64. The field @samp{framebuffer_pitch} contains pitch in bytes. The fields @samp{framebuffer_width}, @samp{framebuffer_height} contain framebuffer dimensions in pixels. The field @samp{framebuffer_bpp} contains number of bits per pixel. @samp{reserved} always contains 0 in current version of specification and must be ignored by OS image. If @samp{framebuffer_type} is set to 0 it means indexed color. In this case color_info is defined as follows:
|
||||||
|
|
||||||
The field @samp{framebuffer_addr} contains framebuffer physical address. This
|
|
||||||
field is 64-bit wide but bootloader @dfn{should} set it under 4 GiB if possible
|
|
||||||
for compatibility with kernels which aren't aware of PAE or AMD64. The field
|
|
||||||
@samp{framebuffer_pitch} contains the framebuffer pitch in bytes. The fields
|
|
||||||
@samp{framebuffer_width}, @samp{framebuffer_height} contain the framebuffer
|
|
||||||
dimensions in pixels. The field @samp{framebuffer_bpp} contains the number of
|
|
||||||
bits per pixel. If @samp{framebuffer_type} is set to @samp{0} it means
|
|
||||||
indexed color will be used. In this case color_info is defined as follows:
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+----------------------------------+
|
+----------------------------------+
|
||||||
110 | framebuffer_palette_addr |
|
u32 | framebuffer_palette_num_colors |
|
||||||
114 | framebuffer_palette_num_colors |
|
varies | framebuffer_palette |
|
||||||
+----------------------------------+
|
+----------------------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
@samp{framebuffer_palette_addr} contains the address of the color palette,
|
@samp{framebuffer_palette} is an array of colour descriptors.
|
||||||
which is an array of color descriptors. Each color descriptor has the
|
Each colour descriptor has following structure:
|
||||||
following structure:
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+-------------+
|
+-------------+
|
||||||
0 | red_value |
|
u8 | red_value |
|
||||||
1 | green_value |
|
u8 | green_value |
|
||||||
2 | blue_value |
|
u8 | blue_value |
|
||||||
+-------------+
|
+-------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
If @samp{framebuffer_type} is set to @samp{1} it means direct RGB color will
|
If @samp{framebuffer_type} is set to @samp{1} it means direct RGB color.
|
||||||
be used. Then color_type is defined as follows:
|
Then color_type is defined as follows:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
+----------------------------------+
|
+----------------------------------+
|
||||||
110 | framebuffer_red_field_position |
|
u8 | framebuffer_red_field_position |
|
||||||
111 | framebuffer_red_mask_size |
|
u8 | framebuffer_red_mask_size |
|
||||||
112 | framebuffer_green_field_position |
|
u8 | framebuffer_green_field_position |
|
||||||
113 | framebuffer_green_mask_size |
|
u8 | framebuffer_green_mask_size |
|
||||||
114 | framebuffer_blue_field_position |
|
u8 | framebuffer_blue_field_position |
|
||||||
115 | framebuffer_blue_mask_size |
|
u8 | framebuffer_blue_mask_size |
|
||||||
+----------------------------------+
|
+----------------------------------+
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
If @samp{framebuffer_type} is set to @samp{2} it means EGA-standard text mode
|
If @samp{framebuffer_type} is set to @samp{2} it means EGA text. In this case @samp{framebuffer_width} and @samp{framebuffer_height} are expressed in characters and not in pixels. @samp{framebuffer_bpp} is equal 16 (16 bits per character) and @samp{framebuffer_pitch} is expressed in bytes per text line.
|
||||||
will be used. In this case @samp{framebuffer_width} and
|
All further values of @samp{framebuffer_type} are reserved for future expansion
|
||||||
@samp{framebuffer_height} are expressed in characters instead of pixels.
|
|
||||||
@samp{framebuffer_bpp} is equal to 16 (bits per character) and
|
|
||||||
@samp{framebuffer_pitch} is expressed in bytes per text line.
|
|
||||||
All further values of @samp{framebuffer_type} are reserved for future expansion.
|
|
||||||
|
|
||||||
@node Examples
|
@node Examples
|
||||||
@chapter Examples
|
@chapter Examples
|
||||||
|
|||||||
+186
-134
@@ -23,7 +23,8 @@
|
|||||||
#define MULTIBOOT_HEADER 1
|
#define MULTIBOOT_HEADER 1
|
||||||
|
|
||||||
/* How many bytes from the start of the file we search for the header. */
|
/* How many bytes from the start of the file we search for the header. */
|
||||||
#define MULTIBOOT_SEARCH 8192
|
#define MULTIBOOT_SEARCH 32768
|
||||||
|
#define MULTIBOOT_HEADER_ALIGN 8
|
||||||
|
|
||||||
/* The magic field should contain this. */
|
/* The magic field should contain this. */
|
||||||
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
|
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
|
||||||
@@ -35,58 +36,36 @@
|
|||||||
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||||
|
|
||||||
/* Alignment of the multiboot info structure. */
|
/* Alignment of the multiboot info structure. */
|
||||||
#define MULTIBOOT_INFO_ALIGN 0x00000004
|
#define MULTIBOOT_INFO_ALIGN 0x00000008
|
||||||
|
|
||||||
/* Flags set in the 'flags' member of the multiboot header. */
|
/* Flags set in the 'flags' member of the multiboot header. */
|
||||||
|
|
||||||
/* Align all boot modules on i386 page (4KB) boundaries. */
|
#define MULTIBOOT_TAG_ALIGN 8
|
||||||
#define MULTIBOOT_PAGE_ALIGN 0x00000001
|
#define MULTIBOOT_TAG_TYPE_END 0
|
||||||
|
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
|
||||||
|
#define MULTIBOOT_TAG_TYPE_MODULE 3
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
|
||||||
|
#define MULTIBOOT_TAG_TYPE_MMAP 6
|
||||||
|
#define MULTIBOOT_TAG_TYPE_VBE 7
|
||||||
|
#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
|
||||||
|
#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
|
||||||
|
#define MULTIBOOT_TAG_TYPE_APM 10
|
||||||
|
|
||||||
/* Must pass memory information to OS. */
|
#define MULTIBOOT_HEADER_TAG_END 0
|
||||||
#define MULTIBOOT_MEMORY_INFO 0x00000002
|
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
|
||||||
|
#define MULTIBOOT_HEADER_TAG_ADDRESS 2
|
||||||
|
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
|
||||||
|
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
|
||||||
|
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
|
||||||
|
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
|
||||||
|
|
||||||
/* Must pass video information to OS. */
|
#define GRUB_MULTIBOOT_ARCHITECTURE_I386 0
|
||||||
#define MULTIBOOT_VIDEO_MODE 0x00000004
|
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
|
||||||
|
|
||||||
/* This flag indicates the use of the address fields in the header. */
|
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
|
||||||
#define MULTIBOOT_AOUT_KLUDGE 0x00010000
|
#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
|
||||||
|
|
||||||
/* Flags to be set in the 'flags' member of the multiboot info structure. */
|
|
||||||
|
|
||||||
/* is there basic lower/upper memory information? */
|
|
||||||
#define MULTIBOOT_INFO_MEMORY 0x00000001
|
|
||||||
/* is there a boot device set? */
|
|
||||||
#define MULTIBOOT_INFO_BOOTDEV 0x00000002
|
|
||||||
/* is the command-line defined? */
|
|
||||||
#define MULTIBOOT_INFO_CMDLINE 0x00000004
|
|
||||||
/* are there modules to do something with? */
|
|
||||||
#define MULTIBOOT_INFO_MODS 0x00000008
|
|
||||||
|
|
||||||
/* These next two are mutually exclusive */
|
|
||||||
|
|
||||||
/* is there a symbol table loaded? */
|
|
||||||
#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
|
|
||||||
/* is there an ELF section header table? */
|
|
||||||
#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
|
|
||||||
|
|
||||||
/* is there a full memory map? */
|
|
||||||
#define MULTIBOOT_INFO_MEM_MAP 0x00000040
|
|
||||||
|
|
||||||
/* Is there drive info? */
|
|
||||||
#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
|
|
||||||
|
|
||||||
/* Is there a config table? */
|
|
||||||
#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
|
|
||||||
|
|
||||||
/* Is there a boot loader name? */
|
|
||||||
#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
|
|
||||||
|
|
||||||
/* Is there a APM table? */
|
|
||||||
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
|
||||||
|
|
||||||
/* Is there video information? */
|
|
||||||
#define MULTIBOOT_INFO_VBE_INFO 0x00000800
|
|
||||||
#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
|
|
||||||
|
|
||||||
#ifndef ASM_FILE
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
@@ -100,45 +79,77 @@ struct multiboot_header
|
|||||||
/* Must be MULTIBOOT_MAGIC - see above. */
|
/* Must be MULTIBOOT_MAGIC - see above. */
|
||||||
multiboot_uint32_t magic;
|
multiboot_uint32_t magic;
|
||||||
|
|
||||||
/* Feature flags. */
|
/* ISA */
|
||||||
multiboot_uint32_t flags;
|
multiboot_uint32_t architecture;
|
||||||
|
|
||||||
|
/* Total header length. */
|
||||||
|
multiboot_uint32_t header_length;
|
||||||
|
|
||||||
/* The above fields plus this one must equal 0 mod 2^32. */
|
/* The above fields plus this one must equal 0 mod 2^32. */
|
||||||
multiboot_uint32_t checksum;
|
multiboot_uint32_t checksum;
|
||||||
|
};
|
||||||
|
|
||||||
/* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
|
struct multiboot_header_tag
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_information_request
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t requests[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_address
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
multiboot_uint32_t header_addr;
|
multiboot_uint32_t header_addr;
|
||||||
multiboot_uint32_t load_addr;
|
multiboot_uint32_t load_addr;
|
||||||
multiboot_uint32_t load_end_addr;
|
multiboot_uint32_t load_end_addr;
|
||||||
multiboot_uint32_t bss_end_addr;
|
multiboot_uint32_t bss_end_addr;
|
||||||
multiboot_uint32_t entry_addr;
|
};
|
||||||
|
|
||||||
/* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
|
struct multiboot_header_tag_entry_address
|
||||||
multiboot_uint32_t mode_type;
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t entry_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_console_flags
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t console_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_framebuffer
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
multiboot_uint32_t width;
|
multiboot_uint32_t width;
|
||||||
multiboot_uint32_t height;
|
multiboot_uint32_t height;
|
||||||
multiboot_uint32_t depth;
|
multiboot_uint32_t depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The symbol table for a.out. */
|
struct multiboot_header_tag_module_align
|
||||||
struct multiboot_aout_symbol_table
|
|
||||||
{
|
{
|
||||||
multiboot_uint32_t tabsize;
|
multiboot_uint16_t type;
|
||||||
multiboot_uint32_t strsize;
|
multiboot_uint16_t flags;
|
||||||
multiboot_uint32_t addr;
|
|
||||||
multiboot_uint32_t reserved;
|
|
||||||
};
|
|
||||||
typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
|
|
||||||
|
|
||||||
/* The section header table for ELF. */
|
|
||||||
struct multiboot_elf_section_header_table
|
|
||||||
{
|
|
||||||
multiboot_uint32_t num;
|
|
||||||
multiboot_uint32_t size;
|
multiboot_uint32_t size;
|
||||||
multiboot_uint32_t addr;
|
multiboot_uint32_t width;
|
||||||
multiboot_uint32_t shndx;
|
multiboot_uint32_t height;
|
||||||
|
multiboot_uint32_t depth;
|
||||||
};
|
};
|
||||||
typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
|
|
||||||
|
|
||||||
struct multiboot_color
|
struct multiboot_color
|
||||||
{
|
{
|
||||||
@@ -147,75 +158,119 @@ struct multiboot_color
|
|||||||
multiboot_uint8_t blue;
|
multiboot_uint8_t blue;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct multiboot_info
|
struct multiboot_mmap_entry
|
||||||
{
|
{
|
||||||
/* Multiboot info version number */
|
multiboot_uint64_t addr;
|
||||||
multiboot_uint32_t flags;
|
multiboot_uint64_t len;
|
||||||
|
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
||||||
|
#define MULTIBOOT_MEMORY_RESERVED 2
|
||||||
|
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
||||||
|
#define MULTIBOOT_MEMORY_NVS 4
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t zero;
|
||||||
|
} __attribute__((packed));
|
||||||
|
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
||||||
|
|
||||||
/* Available memory from BIOS */
|
struct multiboot_tag
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_string
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
char string[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_module
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t mod_start;
|
||||||
|
multiboot_uint32_t mod_end;
|
||||||
|
char cmdline[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_basic_meminfo
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
multiboot_uint32_t mem_lower;
|
multiboot_uint32_t mem_lower;
|
||||||
multiboot_uint32_t mem_upper;
|
multiboot_uint32_t mem_upper;
|
||||||
|
};
|
||||||
|
|
||||||
/* "root" partition */
|
struct multiboot_tag_bootdev
|
||||||
multiboot_uint32_t boot_device;
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t biosdev;
|
||||||
|
multiboot_uint32_t slice;
|
||||||
|
multiboot_uint32_t part;
|
||||||
|
};
|
||||||
|
|
||||||
/* Kernel command line */
|
struct multiboot_tag_mmap
|
||||||
multiboot_uint32_t cmdline;
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t entry_size;
|
||||||
|
multiboot_uint32_t entry_version;
|
||||||
|
struct multiboot_mmap_entry entries[0];
|
||||||
|
};
|
||||||
|
|
||||||
/* Boot-Module list */
|
struct multiboot_vbe_info_block
|
||||||
multiboot_uint32_t mods_count;
|
{
|
||||||
multiboot_uint32_t mods_addr;
|
multiboot_uint8_t external_specification[512];
|
||||||
|
};
|
||||||
|
|
||||||
union
|
struct multiboot_vbe_mode_info_block
|
||||||
{
|
{
|
||||||
multiboot_aout_symbol_table_t aout_sym;
|
multiboot_uint8_t external_specification[256];
|
||||||
multiboot_elf_section_header_table_t elf_sec;
|
};
|
||||||
} u;
|
|
||||||
|
|
||||||
/* Memory Mapping buffer */
|
struct multiboot_tag_vbe
|
||||||
multiboot_uint32_t mmap_length;
|
{
|
||||||
multiboot_uint32_t mmap_addr;
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
|
||||||
/* Drive Info buffer */
|
|
||||||
multiboot_uint32_t drives_length;
|
|
||||||
multiboot_uint32_t drives_addr;
|
|
||||||
|
|
||||||
/* ROM configuration table */
|
|
||||||
multiboot_uint32_t config_table;
|
|
||||||
|
|
||||||
/* Boot Loader Name */
|
|
||||||
multiboot_uint32_t boot_loader_name;
|
|
||||||
|
|
||||||
/* APM table */
|
|
||||||
multiboot_uint32_t apm_table;
|
|
||||||
|
|
||||||
/* Video */
|
|
||||||
multiboot_uint32_t vbe_control_info;
|
|
||||||
multiboot_uint32_t vbe_mode_info;
|
|
||||||
multiboot_uint16_t vbe_mode;
|
multiboot_uint16_t vbe_mode;
|
||||||
multiboot_uint16_t vbe_interface_seg;
|
multiboot_uint16_t vbe_interface_seg;
|
||||||
multiboot_uint16_t vbe_interface_off;
|
multiboot_uint16_t vbe_interface_off;
|
||||||
multiboot_uint16_t vbe_interface_len;
|
multiboot_uint16_t vbe_interface_len;
|
||||||
|
|
||||||
|
struct multiboot_vbe_info_block vbe_control_info;
|
||||||
|
struct multiboot_vbe_mode_info_block vbe_mode_info;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_framebuffer_common
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
|
||||||
multiboot_uint64_t framebuffer_addr;
|
multiboot_uint64_t framebuffer_addr;
|
||||||
multiboot_uint32_t framebuffer_pitch;
|
multiboot_uint32_t framebuffer_pitch;
|
||||||
multiboot_uint32_t framebuffer_width;
|
multiboot_uint32_t framebuffer_width;
|
||||||
multiboot_uint32_t framebuffer_height;
|
multiboot_uint32_t framebuffer_height;
|
||||||
multiboot_uint8_t framebuffer_bpp;
|
multiboot_uint8_t framebuffer_bpp;
|
||||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
||||||
multiboot_uint8_t framebuffer_type;
|
multiboot_uint8_t framebuffer_type;
|
||||||
|
multiboot_uint16_t reserved;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_framebuffer
|
||||||
|
{
|
||||||
|
struct multiboot_tag_framebuffer_common common;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
/* Indexed color. */
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
struct multiboot_color *framebuffer_palette_addr;
|
|
||||||
multiboot_uint16_t framebuffer_palette_num_colors;
|
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||||
|
struct multiboot_color framebuffer_palette[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Direct RGB color. */
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
multiboot_uint8_t framebuffer_red_field_position;
|
multiboot_uint8_t framebuffer_red_field_position;
|
||||||
@@ -227,34 +282,31 @@ struct multiboot_info
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
typedef struct multiboot_info multiboot_info_t;
|
|
||||||
|
|
||||||
struct multiboot_mmap_entry
|
struct multiboot_tag_elf_sections
|
||||||
{
|
{
|
||||||
multiboot_uint32_t size;
|
|
||||||
multiboot_uint64_t addr;
|
|
||||||
multiboot_uint64_t len;
|
|
||||||
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
|
||||||
#define MULTIBOOT_MEMORY_RESERVED 2
|
|
||||||
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
|
||||||
#define MULTIBOOT_MEMORY_NVS 4
|
|
||||||
multiboot_uint32_t type;
|
multiboot_uint32_t type;
|
||||||
} __attribute__((packed));
|
multiboot_uint32_t size;
|
||||||
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
multiboot_uint32_t num;
|
||||||
|
multiboot_uint32_t entsize;
|
||||||
struct multiboot_mod_list
|
multiboot_uint32_t shndx;
|
||||||
{
|
char sections[0];
|
||||||
/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
|
};
|
||||||
multiboot_uint32_t mod_start;
|
|
||||||
multiboot_uint32_t mod_end;
|
struct multiboot_tag_apm
|
||||||
|
{
|
||||||
/* Module command line */
|
multiboot_uint32_t type;
|
||||||
multiboot_uint32_t cmdline;
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint16_t version;
|
||||||
/* padding to take it to 16 bytes (must be zero) */
|
multiboot_uint16_t cseg;
|
||||||
multiboot_uint32_t pad;
|
multiboot_uint32_t offset;
|
||||||
|
multiboot_uint16_t cseg_16;
|
||||||
|
multiboot_uint16_t dseg;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint16_t cseg_len;
|
||||||
|
multiboot_uint16_t cseg_16_len;
|
||||||
|
multiboot_uint16_t dseg_len;
|
||||||
};
|
};
|
||||||
typedef struct multiboot_mod_list multiboot_module_t;
|
|
||||||
|
|
||||||
#endif /* ! ASM_FILE */
|
#endif /* ! ASM_FILE */
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ texi=`basename $3`
|
|||||||
|
|
||||||
sed -e 's,[{}],@&,g' \
|
sed -e 's,[{}],@&,g' \
|
||||||
-e 's,/\*\(@.*\)\*/,\1,g' \
|
-e 's,/\*\(@.*\)\*/,\1,g' \
|
||||||
-e 's,/\* *,/* @r{,g' -e 's, *\*/,} */,' \
|
-e 's,/\*,/* @r{,g' -e 's, *\*/,} */,' \
|
||||||
-e 's/\(@[a-z][a-z]*\)@{\([^}]*\)@}/\1{\2}/g' \
|
-e 's/\(@[a-z][a-z]*\)@{\([^}]*\)@}/\1{\2}/g' \
|
||||||
${dir}/${src} | expand > ${texi}.new
|
${dir}/${src} | expand > ${texi}.new
|
||||||
mv -f ${texi}.new ${dir}/${texi}
|
mv -f ${texi}.new ${dir}/${texi}
|
||||||
Reference in new issue
Block a user