/* kernel.c - the C part of the kernel */
/* Copyright (C) 1999 Free Software Foundation, Inc.
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. */
/* Some screen stuff. */
/* The number of columns. */
/* The number of lines. */
/* The attribute of an character. */
/* The video memory address. */
/* 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. */
static void cls (void);
static void putchar (int c);
/* Check if MAGIC is valid and print the Multiboot information structure
pointed by ADDR. */
void
{
/* Clear the screen. */
cls ();
/* Am I booted by a Multiboot-compliant boot loader? */
if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
{
return;
}
/* Set MBI to the address of the Multiboot information structure. */
/* Print out the flags. */
/* Are mem_* valid? */
printf ("mem_lower = %uKB, mem_upper = %uKB\n",
/* Is boot_device valid? */
/* Is the command line passed? */
/* Are mods_* valid? */
{
int i;
printf ("mods_count = %d, mods_addr = 0x%x\n",
i < mbi->mods_count;
i++, mod++)
printf (" mod_start = 0x%x, mod_end = 0x%x, string = %s\n",
}
/* Bits 4 and 5 are mutually exclusive! */
{
printf ("Both bits 4 and 5 are set.\n");
return;
}
/* Is the symbol table of a.out valid? */
{
printf ("aout_symbol_table: tabsize = 0x%0x, "
"strsize = 0x%x, addr = 0x%x\n",
}
/* Is the section header table of ELF valid? */
{
printf ("elf_sec: num = %u, size = 0x%x,"
" addr = 0x%x, shndx = 0x%x\n",
}
/* Are mmap_* valid? */
{
printf ("mmap_addr = 0x%x, mmap_length = 0x%x\n",
printf (" size = 0x%x, base_addr = 0x%x%x,"
" length = 0x%x%x, type = 0x%x\n",
(unsigned) mmap->base_addr_high,
(unsigned) mmap->base_addr_low,
(unsigned) mmap->length_high,
(unsigned) mmap->length_low,
}
}
/* Clear the screen and initialize VIDEO, XPOS and YPOS. */
static void
cls (void)
{
int 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
{
char *p = buf;
unsigned long ud = d;
/* 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
{
}
/* Terminate BUF. */
*p = 0;
/* Reverse BUF. */
p2 = p - 1;
{
p1++;
p2--;
}
}
/* Put the character C on the screen. */
static void
putchar (int c)
{
if (c == '\n' || c == '\r')
{
xpos = 0;
ypos++;
ypos = 0;
return;
}
xpos++;
goto newline;
}
/* Format a string and print it on the screen, just like the libc
function printf. */
void
{
int c;
arg++;
while ((c = *format++) != 0)
{
if (c != '%')
putchar (c);
else
{
char *p;
c = *format++;
switch (c)
{
case 'd':
case 'u':
case 'x':
p = buf;
goto string;
break;
case 's':
p = *arg++;
if (! p)
p = "(null)";
while (*p)
putchar (*p++);
break;
default:
break;
}
}
}
}