www.pudn.com > COS0.0.1.rar > kmain.c
/*
kmain.c - main kernel entry point
Author: Paul Barker
Part of: COS
Created: 16/09/04
Last Modified: 05/11/04
Copyright (C) 2004 Paul Barker
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.
(See file "Copying")
*/
/*
This is based on the way the multiboot demo kernel dumps the
multiboot_info_t structure.
*/
#include
#include "../version.h"
#include
#include
#include
#include
#include
// the stack, should be in bss
u8_t g_stack[16384];
// this is here so it can be checked before sysinfo has been created
u32_t g_kernel_state = 0;
void kmain(multiboot_info_t* info)
{
TRACE(("cos v%s : {%d,%d}\n", COS_VERSION_STR, COS_V_UNIQUE_HI,
COS_V_UNIQUE_LO));
TRACE(("\t{%s}\n\n", COS_V_UNIQUE_STR));
TRACE(("Dumping multiboot info struct at 0x%x\n", info));
TRACE(("flags = 0x%x\n", info->flags));
/* Are mem_* valid? */
if (info->flags & 0x01)
TRACE(("mem_lower = %uKB, mem_upper = %uKB\n",
(unsigned) info->mem_lower,
(unsigned) info->mem_upper));
else
TRACE(("No memory size given\n"));
/* Is boot_device valid? */
if (info->flags & 0x02)
TRACE(("boot_device = 0x%x\n", (unsigned) info->boot_device));
else
TRACE(("No boot device given\n"));
/* Has a command line been passed? */
if (info->flags & 0x04)
TRACE(("cmdline = %s\n", (char *) info->cmdline));
else
TRACE(("No command line given\n"));
/* Are mods_* valid? */
if (info->flags & 0x08)
{
module_t *mod;
int i;
TRACE(("mods_count = %d, mods_addr = 0x%x\n",
(int) info->mods_count, (int) info->mods_addr));
for (i = 0, mod = (module_t *) info->mods_addr;
i < info->mods_count;
i++, mod += sizeof (module_t))
TRACE((" mod_start = 0x%x, mod_end = 0x%x,"
" string = %s\n",
(unsigned) mod->mod_start,
(unsigned) mod->mod_end,
(char *) mod->string));
}
else
TRACE(("No module info given\n"));
/* Bits 4 and 5 are mutually exclusive! */
if ((info->flags & 0x10) && (info->flags & 0x20))
{
TRACE(("Both bits 4 and 5 are set. This is illegal!\n"));
}
/* Is the symbol table of a.out valid? */
else if (info->flags & 0x10)
{
aout_symbol_table_t *aout_sym = &(info->u.aout_sym);
TRACE(("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? */
else if (info->flags & 0x20)
{
elf_section_header_table_t *elf_sec = &(info->u.elf_sec);
TRACE(("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));
}
/* neither the above are valid */
else
TRACE(("Neither an aout symbol table or elf section header "
"table given\n"));
/* Are mmap_* valid? */
if (info->flags & 0x40)
{
memory_map_t *mmap;
TRACE(("mmap_addr = 0x%x, mmap_length = 0x%x\n",
(unsigned) info->mmap_addr,
(unsigned) info->mmap_length));
for (mmap = (memory_map_t *) info->mmap_addr;
(unsigned long) mmap < info->mmap_addr
+ info->mmap_length;
mmap = (memory_map_t *) ((unsigned long) mmap
+ mmap->size + sizeof (mmap->size)))
TRACE((" 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));
}
else
TRACE(("No memory map given\n"));
TRACE(("Finished dumping multiboot info\n\n"));
TRACE(("Dumping kernel memory info:\n"));
TRACE(("kernel=%x, end_kernel=%x\n", &kernel, &end_kernel));
TRACE(("cosinit=%x, end_cosinit=%x\n", &cosinit, &end_cosinit));
TRACE(("code=%x, end_code=%x\n", &code, &end_code));
TRACE(("data=%x, end_data=%x\n", &data, &end_data));
TRACE(("bss=%x, end_bss=%x\n", &bss, &end_bss));
TRACE(("rodata=%x, end_rodata=%x\n", &rodata, &end_rodata));
TRACE(("g_stack=%x, end of g_stack=%x\n", g_stack, g_stack + 16384));
TRACE(("Finished dumping kernel memory info\n\n"));
sys_init(info);
gdt_init();
tss_init();
int_init();
phys_init();
kalloc_init();
thread_init();
do_tests();
TRACE(("Going into infinite loop...\n"));
while (1) halt();
}