2010-01-21 Robert Millan <rmh.grub@aybabtu.com>

* configure.ac: Remove `--enable-example-kernel' option.
	* docs/Makefile.am
	* docs/grub.texi: Remove referenced to `mbchk'.
	
	* docs/boot.S: Remove.  Update all users.
	* docs/boot.S.texi: Likewise.
	* docs/kernel.c: Likewise.
	* docs/kernel.c.texi: Likewise.
	* docs/mbchk.1: Likewise.
	* docs/multiboot.h: Likewise.
	* docs/multiboot.h.texi: Likewise.
	* docs/multiboot.texi: Likewise.
	* util/mbchk.c: Likewise.
This commit is contained in:
Robert Millan committed 2010-01-21 17:17:59 +00:00
1 parent e8b13ced38
commit 8dbf5c8999
14 files changed
+20 -2527

No files matched your search

+16
View File
@@ -1,3 +1,19 @@
2010-01-21 Robert Millan <rmh.grub@aybabtu.com>
* configure.ac: Remove `--enable-example-kernel' option.
* docs/Makefile.am
* docs/grub.texi: Remove referenced to `mbchk'.
* docs/boot.S: Remove. Update all users.
* docs/boot.S.texi: Likewise.
* docs/kernel.c: Likewise.
* docs/kernel.c.texi: Likewise.
* docs/mbchk.1: Likewise.
* docs/multiboot.h: Likewise.
* docs/multiboot.h.texi: Likewise.
* docs/multiboot.texi: Likewise.
* util/mbchk.c: Likewise.
2010-01-21 Robert Millan <rmh@aybabtu.com>
* autogen.sh: New file.
-6
View File
@@ -647,12 +647,6 @@ else
fi
fi
dnl Build the example Multiboot kernel.
AC_ARG_ENABLE(example-kernel,
[ --enable-example-kernel
build the example Multiboot kernel])
AM_CONDITIONAL(BUILD_EXAMPLE_KERNEL, test "x$enable_example_kernel" = xyes)
dnl Automatic Linux mem= option.
AC_ARG_ENABLE(auto-linux-mem-opt,
[ --disable-auto-linux-mem-opt
+3 -23
View File
@@ -1,26 +1,11 @@
info_TEXINFOS = grub.texi multiboot.texi
info_TEXINFOS = grub.texi
grub_TEXINFOS = internals.texi fdl.texi
EXAMPLES = boot.S kernel.c multiboot.h
multiboot_TEXINFOS = boot.S.texi kernel.c.texi multiboot.h.texi
man_MANS = grub.8 mbchk.1 grub-install.8 grub-md5-crypt.8 grub-terminfo.8
man_MANS = grub.8 grub-install.8 grub-md5-crypt.8 grub-terminfo.8
HELP2MAN = help2man
SRC2TEXI = src2texi
noinst_SCRIPTS = $(HELP2MAN) $(SRC2TEXI)
EXTRA_PROGRAMS = kernel
# The example kernel is built if you specify --enable-example-kernel.
if BUILD_EXAMPLE_KERNEL
noinst_PROGRAMS = kernel
kernel_SOURCES = $(EXAMPLES)
kernel_CFLAGS = -fno-builtin -nostdinc -O -g -Wall \
-imacros $(top_builddir)/config.h
kernel_LDFLAGS = -nostdlib -Wl,-N -Wl,-Ttext -Wl,100000
boot.o: multiboot.h
endif
EXTRA_DIST = menu.lst $(man_MANS) $(noinst_SCRIPTS) \
$(EXAMPLES) $(multiboot_TEXINFOS)
EXTRA_DIST = menu.lst $(man_MANS) $(noinst_SCRIPTS)
CLEANFILES = $(noinst_PROGRAMS)
# Cancel the rule %.texi -> %. This rule may confuse make to determine
@@ -46,11 +31,6 @@ $(srcdir)/grub-install.8: ../util/grub-install $(srcdir)/$(HELP2MAN)
$(PERL) $(srcdir)/$(HELP2MAN) --name="install GRUB on your drive" \
--section=8 --output=$@ $<
$(srcdir)/mbchk.1: ../util/mbchk $(srcdir)/$(HELP2MAN)
$(PERL) $(srcdir)/$(HELP2MAN) \
--name="check the format of a Multiboot kernel" \
--section=1 --output=$@ $<
$(srcdir)/grub-md5-crypt.8: ../util/grub-md5-crypt $(srcdir)/$(HELP2MAN)
chmod 755 $<
$(PERL) $(srcdir)/$(HELP2MAN) \
-79
View File
@@ -1,79 +0,0 @@
/* boot.S - bootstrap the kernel */
/* Copyright (C) 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define ASM 1
#include <multiboot.h>
.text
.globl start, _start
start:
_start:
jmp multiboot_entry
/* Align 32 bits boundary. */
.align 4
/* Multiboot header. */
multiboot_header:
/* magic */
.long MULTIBOOT_HEADER_MAGIC
/* flags */
.long MULTIBOOT_HEADER_FLAGS
/* checksum */
.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
#ifndef __ELF__
/* header_addr */
.long multiboot_header
/* load_addr */
.long _start
/* load_end_addr */
.long _edata
/* bss_end_addr */
.long _end
/* entry_addr */
.long multiboot_entry
#endif /* ! __ELF__ */
multiboot_entry:
/* Initialize the stack pointer. */
movl $(stack + STACK_SIZE), %esp
/* Reset EFLAGS. */
pushl $0
popf
/* Push the pointer to the Multiboot information structure. */
pushl %ebx
/* Push the magic value. */
pushl %eax
/* Now enter the C main function... */
call EXT_C(cmain)
/* Halt. */
pushl $halt_message
call EXT_C(printf)
loop: hlt
jmp loop
halt_message:
.asciz "Halted."
/* Our stack area. */
.comm stack, STACK_SIZE
-79
View File
@@ -1,79 +0,0 @@
/* @r{boot.S - bootstrap the kernel} */
/* @r{Copyright (C) 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.} */
#define ASM 1
#include <multiboot.h>
.text
.globl start, _start
start:
_start:
jmp multiboot_entry
/* @r{Align 32 bits boundary.} */
.align 4
/* @r{Multiboot header.} */
multiboot_header:
/* @r{magic} */
.long MULTIBOOT_HEADER_MAGIC
/* @r{flags} */
.long MULTIBOOT_HEADER_FLAGS
/* @r{checksum} */
.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
#ifndef __ELF__
/* @r{header_addr} */
.long multiboot_header
/* @r{load_addr} */
.long _start
/* @r{load_end_addr} */
.long _edata
/* @r{bss_end_addr} */
.long _end
/* @r{entry_addr} */
.long multiboot_entry
#endif /* @r{! __ELF__} */
multiboot_entry:
/* @r{Initialize the stack pointer.} */
movl $(stack + STACK_SIZE), %esp
/* @r{Reset EFLAGS.} */
pushl $0
popf
/* @r{Push the pointer to the Multiboot information structure.} */
pushl %ebx
/* @r{Push the magic value.} */
pushl %eax
/* @r{Now enter the C main function...} */
call EXT_C(cmain)
/* @r{Halt.} */
pushl $halt_message
call EXT_C(printf)
loop: hlt
jmp loop
halt_message:
.asciz "Halted."
/* @r{Our stack area.} */
.comm stack, STACK_SIZE
+1 -25
View File
@@ -48,7 +48,6 @@ Software Foundation raise funds for GNU development.''
terminfo name
* grub-set-default: (grub)Invoking grub-set-default. Set a default boot
entry
* mbchk: (grub)Invoking mbchk. Check for the format of a Multiboot kernel
@end direntry
@setchapternewpage odd
@@ -103,7 +102,6 @@ This edition documents version @value{VERSION}.
* Invoking grub-md5-crypt:: How to generate a cryptic password
* Invoking grub-terminfo:: How to generate a terminfo command
* Invoking grub-set-default:: How to set a default boot entry
* Invoking mbchk:: How to use the Multiboot checker
* Obtaining and Building GRUB:: How to obtain and build GRUB
* Reporting bugs:: Where you should send a bug report
* Future:: Some future plans on GRUB
@@ -3802,27 +3800,6 @@ make your system quite robust. @xref{Making your system robust}, for
more hints about how to set up a robust system.
@node Invoking mbchk
@chapter Invoking mbchk
The program @command{mbchk} checks for the format of a Multiboot
kernel. We recommend using this program before booting your own kernel
by GRUB.
@command{mbchk} accepts the following options:
@table @option
@item --help
Print a summary of the command-line options and exit.
@item --version
Print the version number of GRUB and exit.
@item --quiet
Suppress all normal output.
@end table
@node Obtaining and Building GRUB
@appendix How to obtain and build GRUB
@@ -3861,8 +3838,7 @@ just do:
@end example
This will install the grub shell @file{grub} (@pxref{Invoking the grub
shell}), the Multiboot checker @file{mbchk} (@pxref{Invoking mbchk}),
and the GRUB images. This will also install the GRUB manual.
shell}), and the GRUB images. This will also install the GRUB manual.
Also, the latest version is available from the CVS. See
@uref{http://savannah.gnu.org/cvs/?group=grub} for more information.
-284
View File
@@ -1,284 +0,0 @@
/* kernel.c - the C part of the kernel */
/* Copyright (C) 1999 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <multiboot.h>
/* Macros. */
/* Check if the bit BIT in FLAGS is set. */
#define CHECK_FLAG(flags,bit) ((flags) & (1 << (bit)))
/* Some screen stuff. */
/* The number of columns. */
#define COLUMNS 80
/* The number of lines. */
#define LINES 24
/* The attribute of an character. */
#define ATTRIBUTE 7
/* The video memory address. */
#define VIDEO 0xB8000
/* Variables. */
/* Save the X position. */
static int xpos;
/* Save the Y position. */
static int ypos;
/* Point to the video memory. */
static volatile unsigned char *video;
/* Forward declarations. */
void cmain (unsigned long magic, unsigned long addr);
static void cls (void);
static void itoa (char *buf, int base, int d);
static void putchar (int c);
void printf (const char *format, ...);
/* Check if MAGIC is valid and print the Multiboot information structure
pointed by ADDR. */
void
cmain (unsigned long magic, unsigned long addr)
{
multiboot_info_t *mbi;
/* Clear the screen. */
cls ();
/* Am I booted by a Multiboot-compliant boot loader? */
if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
{
printf ("Invalid magic number: 0x%x\n", (unsigned) magic);
return;
}
/* Set MBI to the address of the Multiboot information structure. */
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))
{
module_t *mod;
int i;
printf ("mods_count = %d, mods_addr = 0x%x\n",
(int) mbi->mods_count, (int) mbi->mods_addr);
for (i = 0, mod = (module_t *) mbi->mods_addr;
i < mbi->mods_count;
i++, mod++)
printf (" mod_start = 0x%x, mod_end = 0x%x, string = %s\n",
(unsigned) mod->mod_start,
(unsigned) mod->mod_end,
(char *) mod->string);
}
/* 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;
}
/* Is the symbol table of a.out valid? */
if (CHECK_FLAG (mbi->flags, 4))
{
aout_symbol_table_t *aout_sym = &(mbi->u.aout_sym);
printf ("aout_symbol_table: tabsize = 0x%0x, "
"strsize = 0x%x, addr = 0x%x\n",
(unsigned) aout_sym->tabsize,
(unsigned) aout_sym->strsize,
(unsigned) aout_sym->addr);
}
/* Is the section header table of ELF valid? */
if (CHECK_FLAG (mbi->flags, 5))
{
elf_section_header_table_t *elf_sec = &(mbi->u.elf_sec);
printf ("elf_sec: num = %u, size = 0x%x,"
" addr = 0x%x, shndx = 0x%x\n",
(unsigned) elf_sec->num, (unsigned) elf_sec->size,
(unsigned) elf_sec->addr, (unsigned) elf_sec->shndx);
}
/* Are mmap_* valid? */
if (CHECK_FLAG (mbi->flags, 6))
{
memory_map_t *mmap;
printf ("mmap_addr = 0x%x, mmap_length = 0x%x\n",
(unsigned) mbi->mmap_addr, (unsigned) mbi->mmap_length);
for (mmap = (memory_map_t *) mbi->mmap_addr;
(unsigned long) mmap < mbi->mmap_addr + mbi->mmap_length;
mmap = (memory_map_t *) ((unsigned long) mmap
+ mmap->size + sizeof (mmap->size)))
printf (" size = 0x%x, base_addr = 0x%x%x,"
" length = 0x%x%x, type = 0x%x\n",
(unsigned) mmap->size,
(unsigned) mmap->base_addr_high,
(unsigned) mmap->base_addr_low,
(unsigned) mmap->length_high,
(unsigned) mmap->length_low,
(unsigned) mmap->type);
}
}
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
static void
cls (void)
{
int i;
video = (unsigned char *) VIDEO;
for (i = 0; i < COLUMNS * LINES * 2; i++)
*(video + i) = 0;
xpos = 0;
ypos = 0;
}
/* Convert the integer D to a string and save the string in BUF. If
BASE is equal to 'd', interpret that D is decimal, and if BASE is
equal to 'x', interpret that D is hexadecimal. */
static void
itoa (char *buf, int base, int d)
{
char *p = buf;
char *p1, *p2;
unsigned long ud = d;
int divisor = 10;
/* If %d is specified and D is minus, put `-' in the head. */
if (base == 'd' && d < 0)
{
*p++ = '-';
buf++;
ud = -d;
}
else if (base == 'x')
divisor = 16;
/* Divide UD by DIVISOR until UD == 0. */
do
{
int remainder = ud % divisor;
*p++ = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10;
}
while (ud /= divisor);
/* Terminate BUF. */
*p = 0;
/* Reverse BUF. */
p1 = buf;
p2 = p - 1;
while (p1 < p2)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
}
}
/* Put the character C on the screen. */
static void
putchar (int c)
{
if (c == '\n' || c == '\r')
{
newline:
xpos = 0;
ypos++;
if (ypos >= LINES)
ypos = 0;
return;
}
*(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
*(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;
xpos++;
if (xpos >= COLUMNS)
goto newline;
}
/* Format a string and print it on the screen, just like the libc
function printf. */
void
printf (const char *format, ...)
{
char **arg = (char **) &format;
int c;
char buf[20];
arg++;
while ((c = *format++) != 0)
{
if (c != '%')
putchar (c);
else
{
char *p;
c = *format++;
switch (c)
{
case 'd':
case 'u':
case 'x':
itoa (buf, c, *((int *) arg++));
p = buf;
goto string;
break;
case 's':
p = *arg++;
if (! p)
p = "(null)";
string:
while (*p)
putchar (*p++);
break;
default:
putchar (*((int *) arg++));
break;
}
}
}
}
-284
View File
@@ -1,284 +0,0 @@
/* @r{kernel.c - the C part of the kernel} */
/* @r{Copyright (C) 1999 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.} */
#include <multiboot.h>
/* @r{Macros.} */
/* @r{Check if the bit BIT in FLAGS is set.} */
#define CHECK_FLAG(flags,bit) ((flags) & (1 << (bit)))
/* @r{Some screen stuff.} */
/* @r{The number of columns.} */
#define COLUMNS 80
/* @r{The number of lines.} */
#define LINES 24
/* @r{The attribute of an character.} */
#define ATTRIBUTE 7
/* @r{The video memory address.} */
#define VIDEO 0xB8000
/* @r{Variables.} */
/* @r{Save the X position.} */
static int xpos;
/* @r{Save the Y position.} */
static int ypos;
/* @r{Point to the video memory.} */
static volatile unsigned char *video;
/* @r{Forward declarations.} */
void cmain (unsigned long magic, unsigned long addr);
static void cls (void);
static void itoa (char *buf, int base, int d);
static void putchar (int c);
void printf (const char *format, ...);
/* @r{Check if MAGIC is valid and print the Multiboot information structure
pointed by ADDR.} */
void
cmain (unsigned long magic, unsigned long addr)
@{
multiboot_info_t *mbi;
/* @r{Clear the screen.} */
cls ();
/* @r{Am I booted by a Multiboot-compliant boot loader?} */
if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
@{
printf ("Invalid magic number: 0x%x\n", (unsigned) magic);
return;
@}
/* @r{Set MBI to the address of the Multiboot information structure.} */
mbi = (multiboot_info_t *) addr;
/* @r{Print out the flags.} */
printf ("flags = 0x%x\n", (unsigned) mbi->flags);
/* @r{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);
/* @r{Is boot_device valid?} */
if (CHECK_FLAG (mbi->flags, 1))
printf ("boot_device = 0x%x\n", (unsigned) mbi->boot_device);
/* @r{Is the command line passed?} */
if (CHECK_FLAG (mbi->flags, 2))
printf ("cmdline = %s\n", (char *) mbi->cmdline);
/* @r{Are mods_* valid?} */
if (CHECK_FLAG (mbi->flags, 3))
@{
module_t *mod;
int i;
printf ("mods_count = %d, mods_addr = 0x%x\n",
(int) mbi->mods_count, (int) mbi->mods_addr);
for (i = 0, mod = (module_t *) mbi->mods_addr;
i < mbi->mods_count;
i++, mod++)
printf (" mod_start = 0x%x, mod_end = 0x%x, string = %s\n",
(unsigned) mod->mod_start,
(unsigned) mod->mod_end,
(char *) mod->string);
@}
/* @r{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;
@}
/* @r{Is the symbol table of a.out valid?} */
if (CHECK_FLAG (mbi->flags, 4))
@{
aout_symbol_table_t *aout_sym = &(mbi->u.aout_sym);
printf ("aout_symbol_table: tabsize = 0x%0x, "
"strsize = 0x%x, addr = 0x%x\n",
(unsigned) aout_sym->tabsize,
(unsigned) aout_sym->strsize,
(unsigned) aout_sym->addr);
@}
/* @r{Is the section header table of ELF valid?} */
if (CHECK_FLAG (mbi->flags, 5))
@{
elf_section_header_table_t *elf_sec = &(mbi->u.elf_sec);
printf ("elf_sec: num = %u, size = 0x%x,"
" addr = 0x%x, shndx = 0x%x\n",
(unsigned) elf_sec->num, (unsigned) elf_sec->size,
(unsigned) elf_sec->addr, (unsigned) elf_sec->shndx);
@}
/* @r{Are mmap_* valid?} */
if (CHECK_FLAG (mbi->flags, 6))
@{
memory_map_t *mmap;
printf ("mmap_addr = 0x%x, mmap_length = 0x%x\n",
(unsigned) mbi->mmap_addr, (unsigned) mbi->mmap_length);
for (mmap = (memory_map_t *) mbi->mmap_addr;
(unsigned long) mmap < mbi->mmap_addr + mbi->mmap_length;
mmap = (memory_map_t *) ((unsigned long) mmap
+ mmap->size + sizeof (mmap->size)))
printf (" size = 0x%x, base_addr = 0x%x%x,"
" length = 0x%x%x, type = 0x%x\n",
(unsigned) mmap->size,
(unsigned) mmap->base_addr_high,
(unsigned) mmap->base_addr_low,
(unsigned) mmap->length_high,
(unsigned) mmap->length_low,
(unsigned) mmap->type);
@}
@}
/* @r{Clear the screen and initialize VIDEO, XPOS and YPOS.} */
static void
cls (void)
@{
int i;
video = (unsigned char *) VIDEO;
for (i = 0; i < COLUMNS * LINES * 2; i++)
*(video + i) = 0;
xpos = 0;
ypos = 0;
@}
/* @r{Convert the integer D to a string and save the string in BUF. If
BASE is equal to 'd', interpret that D is decimal, and if BASE is
equal to 'x', interpret that D is hexadecimal.} */
static void
itoa (char *buf, int base, int d)
@{
char *p = buf;
char *p1, *p2;
unsigned long ud = d;
int divisor = 10;
/* @r{If %d is specified and D is minus, put `-' in the head.} */
if (base == 'd' && d < 0)
@{
*p++ = '-';
buf++;
ud = -d;
@}
else if (base == 'x')
divisor = 16;
/* @r{Divide UD by DIVISOR until UD == 0.} */
do
@{
int remainder = ud % divisor;
*p++ = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10;
@}
while (ud /= divisor);
/* @r{Terminate BUF.} */
*p = 0;
/* @r{Reverse BUF.} */
p1 = buf;
p2 = p - 1;
while (p1 < p2)
@{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
@}
@}
/* @r{Put the character C on the screen.} */
static void
putchar (int c)
@{
if (c == '\n' || c == '\r')
@{
newline:
xpos = 0;
ypos++;
if (ypos >= LINES)
ypos = 0;
return;
@}
*(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
*(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;
xpos++;
if (xpos >= COLUMNS)
goto newline;
@}
/* @r{Format a string and print it on the screen, just like the libc
function printf.} */
void
printf (const char *format, ...)
@{
char **arg = (char **) &format;
int c;
char buf[20];
arg++;
while ((c = *format++) != 0)
@{
if (c != '%')
putchar (c);
else
@{
char *p;
c = *format++;
switch (c)
@{
case 'd':
case 'u':
case 'x':
itoa (buf, c, *((int *) arg++));
p = buf;
goto string;
break;
case 's':
p = *arg++;
if (! p)
p = "(null)";
string:
while (*p)
putchar (*p++);
break;
default:
putchar (*((int *) arg++));
break;
@}
@}
@}
@}
-27
View File
@@ -1,27 +0,0 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
.TH MBCHK "1" "June 2006" "mbchk (GNU GRUB 0.97)" FSF
.SH NAME
mbchk \- check the format of a Multiboot kernel
.SH SYNOPSIS
.B mbchk
[\fIOPTION\fR]... [\fIFILE\fR]...
.SH DESCRIPTION
Check if the format of FILE complies with the Multiboot Specification.
.PP
\fB\-q\fR, \fB\-\-quiet\fR suppress all normal output
\fB\-h\fR, \fB\-\-help\fR display this help and exit
\fB\-v\fR, \fB\-\-version\fR output version information and exit.
.SH "REPORTING BUGS"
Report bugs to <bug-grub@gnu.org>.
.SH "SEE ALSO"
The full documentation for
.B mbchk
is maintained as a Texinfo manual. If the
.B info
and
.B mbchk
programs are properly installed at your site, the command
.IP
.B info mbchk
.PP
should give you access to the complete manual.
-119
View File
@@ -1,119 +0,0 @@
/* multiboot.h - the header for Multiboot */
/* Copyright (C) 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Macros. */
/* The magic number for the Multiboot header. */
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
/* The flags for the Multiboot header. */
#ifdef __ELF__
# define MULTIBOOT_HEADER_FLAGS 0x00000003
#else
# define MULTIBOOT_HEADER_FLAGS 0x00010003
#endif
/* The magic number passed by a Multiboot-compliant boot loader. */
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
/* The size of our stack (16KB). */
#define STACK_SIZE 0x4000
/* C symbol format. HAVE_ASM_USCORE is defined by configure. */
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym) _ ## sym
#else
# define EXT_C(sym) sym
#endif
#ifndef ASM
/* Do not include here in boot.S. */
/* Types. */
/* The Multiboot header. */
typedef struct multiboot_header
{
unsigned long magic;
unsigned long flags;
unsigned long checksum;
unsigned long header_addr;
unsigned long load_addr;
unsigned long load_end_addr;
unsigned long bss_end_addr;
unsigned long entry_addr;
} multiboot_header_t;
/* The symbol table for a.out. */
typedef struct aout_symbol_table
{
unsigned long tabsize;
unsigned long strsize;
unsigned long addr;
unsigned long reserved;
} aout_symbol_table_t;
/* The section header table for ELF. */
typedef struct elf_section_header_table
{
unsigned long num;
unsigned long size;
unsigned long addr;
unsigned long shndx;
} elf_section_header_table_t;
/* The Multiboot information. */
typedef struct multiboot_info
{
unsigned long flags;
unsigned long mem_lower;
unsigned long mem_upper;
unsigned long boot_device;
unsigned long cmdline;
unsigned long mods_count;
unsigned long mods_addr;
union
{
aout_symbol_table_t aout_sym;
elf_section_header_table_t elf_sec;
} u;
unsigned long mmap_length;
unsigned long mmap_addr;
} multiboot_info_t;
/* The module structure. */
typedef struct module
{
unsigned long mod_start;
unsigned long mod_end;
unsigned long string;
unsigned long reserved;
} module_t;
/* The memory map. Be careful that the offset 0 is base_addr_low
but no size. */
typedef struct memory_map
{
unsigned long size;
unsigned long base_addr_low;
unsigned long base_addr_high;
unsigned long length_low;
unsigned long length_high;
unsigned long type;
} memory_map_t;
#endif /* ! ASM */
-119
View File
@@ -1,119 +0,0 @@
/* @r{multiboot.h - the header for Multiboot} */
/* @r{Copyright (C) 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.} */
/* @r{Macros.} */
/* @r{The magic number for the Multiboot header.} */
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
/* @r{The flags for the Multiboot header.} */
#ifdef __ELF__
# define MULTIBOOT_HEADER_FLAGS 0x00000003
#else
# define MULTIBOOT_HEADER_FLAGS 0x00010003
#endif
/* @r{The magic number passed by a Multiboot-compliant boot loader.} */
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
/* @r{The size of our stack (16KB).} */
#define STACK_SIZE 0x4000
/* @r{C symbol format. HAVE_ASM_USCORE is defined by configure.} */
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym) _ ## sym
#else
# define EXT_C(sym) sym
#endif
#ifndef ASM
/* @r{Do not include here in boot.S.} */
/* @r{Types.} */
/* @r{The Multiboot header.} */
typedef struct multiboot_header
@{
unsigned long magic;
unsigned long flags;
unsigned long checksum;
unsigned long header_addr;
unsigned long load_addr;
unsigned long load_end_addr;
unsigned long bss_end_addr;
unsigned long entry_addr;
@} multiboot_header_t;
/* @r{The symbol table for a.out.} */
typedef struct aout_symbol_table
@{
unsigned long tabsize;
unsigned long strsize;
unsigned long addr;
unsigned long reserved;
@} aout_symbol_table_t;
/* @r{The section header table for ELF.} */
typedef struct elf_section_header_table
@{
unsigned long num;
unsigned long size;
unsigned long addr;
unsigned long shndx;
@} elf_section_header_table_t;
/* @r{The Multiboot information.} */
typedef struct multiboot_info
@{
unsigned long flags;
unsigned long mem_lower;
unsigned long mem_upper;
unsigned long boot_device;
unsigned long cmdline;
unsigned long mods_count;
unsigned long mods_addr;
union
@{
aout_symbol_table_t aout_sym;
elf_section_header_table_t elf_sec;
@} u;
unsigned long mmap_length;
unsigned long mmap_addr;
@} multiboot_info_t;
/* @r{The module structure.} */
typedef struct module
@{
unsigned long mod_start;
unsigned long mod_end;
unsigned long string;
unsigned long reserved;
@} module_t;
/* @r{The memory map. Be careful that the offset 0 is base_addr_low
but no size.} */
typedef struct memory_map
@{
unsigned long size;
unsigned long base_addr_low;
unsigned long base_addr_high;
unsigned long length_low;
unsigned long length_high;
unsigned long type;
@} memory_map_t;
#endif /* @r{! ASM} */
-1234
View File
File diff suppressed because it is too large. Load diff
-4
View File
@@ -1,4 +1,3 @@
bin_PROGRAMS = mbchk
sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo \
grub-set-default
noinst_SCRIPTS = grub-image mkbimage
@@ -7,6 +6,3 @@ EXTRA_DIST = mkbimage
# XXX: Need to search for a header file in docs, because of multiboot.h.
AM_CFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/docs
mbchk_SOURCES = mbchk.c
mbchk_LDADD = ../lib/libcommon.a
-244
View File
@@ -1,244 +0,0 @@
/* mbchk - a simple checker for the format of a Multiboot kernel */
/*
* Copyright (C) 1999,2001,2002 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <multiboot.h>
static int quiet = 0;
static char *optstring = "hvq";
static struct option longopts[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{"quiet", no_argument, 0, 'q'},
{0}
};
static void
usage (int status)
{
if (status)
fprintf (stderr, "Try ``mbchk --help'' for more information.\n");
else
printf ("Usage: mbchk [OPTION]... [FILE]...\n"
"Check if the format of FILE complies with the Multiboot Specification.\n"
"\n"
"-q, --quiet suppress all normal output\n"
"-h, --help display this help and exit\n"
"-v, --version output version information and exit.\n"
"\n"
"Report bugs to <bug-grub@gnu.org>.\n");
exit (status);
}
static int
check_multiboot (const char *filename, FILE *fp)
{
multiboot_header_t *mbh = 0;
int i;
char buf[8192];
if (fread (buf, 1, 8192, fp) < 0)
{
fprintf (stderr, "%s: Read error.\n", filename);
return 0;
}
for (i = 0; i < 8192 - sizeof (multiboot_header_t); i++)
{
unsigned long magic = *((unsigned long *) (buf + i));
if (magic == MULTIBOOT_HEADER_MAGIC)
{
mbh = (multiboot_header_t *) (buf + i);
break;
}
}
if (! mbh)
{
fprintf (stderr, "%s: No Multiboot header.\n", filename);
return 0;
}
if (! quiet)
printf ("%s: The Multiboot header is found at the offset %d.\n",
filename, i);
/* Check for the checksum. */
if (mbh->magic + mbh->flags + mbh->checksum != 0)
{
fprintf (stderr,
"%s: Bad checksum (0x%lx).\n",
filename, mbh->checksum);
return 0;
}
/* Reserved flags must be zero. */
if (mbh->flags & ~0x00010003)
{
fprintf (stderr,
"%s: Non-zero is found in reserved flags (0x%lx).\n",
filename, mbh->flags);
return 0;
}
if (! quiet)
{
printf ("%s: Page alignment is turned %s.\n",
filename, (mbh->flags & 0x1)? "on" : "off");
printf ("%s: Memory information is turned %s.\n",
filename, (mbh->flags & 0x2)? "on" : "off");
printf ("%s: Address fields is turned %s.\n",
filename, (mbh->flags & 0x10000)? "on" : "off");
}
/* Check for the address fields. */
if (mbh->flags & 0x10000)
{
if (mbh->header_addr < mbh->load_addr)
{
fprintf (stderr,
"%s: header_addr is less than "
"load_addr (0x%lx > 0x%lx).\n",
filename, mbh->header_addr, mbh->load_addr);
return 0;
}
if (mbh->load_end_addr && mbh->load_addr >= mbh->load_end_addr)
{
fprintf (stderr,
"%s: load_addr is not less than load_end_addr"
" (0x%lx >= 0x%lx).\n",
filename, mbh->load_addr, mbh->load_end_addr);
return 0;
}
if (mbh->bss_end_addr && mbh->load_end_addr > mbh->bss_end_addr)
{
fprintf (stderr,
"%s: load_end_addr is greater than bss_end_addr"
" (0x%lx > 0x%lx).\n",
filename, mbh->load_end_addr, mbh->bss_end_addr);
return 0;
}
if (mbh->load_addr > mbh->entry_addr)
{
fprintf (stderr,
"%s: load_addr is greater than entry_addr"
" (0x%lx > 0x%lx).\n",
filename, mbh->load_addr, mbh->entry_addr);
return 0;
}
/* FIXME: It is better to check if the entry address is within the
file, especially when the load end address is zero. */
if (mbh->load_end_addr && mbh->load_end_addr <= mbh->entry_addr)
{
fprintf (stderr,
"%s: load_end_addr is not greater than entry_addr"
" (0x%lx <= 0x%lx).\n",
filename, mbh->load_end_addr, mbh->entry_addr);
return 0;
}
/* This is a GRUB-specific limitation. */
if (mbh->load_addr < 0x100000)
{
fprintf (stderr,
"%s: Cannot be loaded at less than 1MB by GRUB"
" (0x%lx).\n",
filename, mbh->load_addr);
return 0;
}
}
if (! quiet)
printf ("%s: All checks passed.\n", filename);
return 1;
}
int
main (int argc, char *argv[])
{
int c;
do
{
c = getopt_long (argc, argv, optstring, longopts, 0);
switch (c)
{
case EOF:
break;
case 'h':
usage (0);
break;
case 'v':
printf ("mbchk (GNU GRUB " VERSION ")\n");
exit (0);
break;
case 'q':
quiet = 1;
break;
default:
usage (1);
break;
}
}
while (c != EOF);
if (optind < argc)
{
while (optind < argc)
{
FILE *fp;
fp = fopen (argv[optind], "r");
if (! fp)
{
fprintf (stderr, "%s: No such file.\n", argv[optind]);
exit (1);
}
if (! check_multiboot (argv[optind], fp))
exit (1);
fclose (fp);
optind++;
}
}
else
{
if (! check_multiboot ("<stdin>", stdin))
exit (1);
}
return 0;
}