* Copyright 2008-2010, FranΓ§ois Revol, revol@free.fr. All rights reserved.
* Copyright 2003-2010, Axel DΓΆrfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#include <KernelExport.h>
#include <boot/platform.h>
#include <boot/heap.h>
#include <boot/stage2.h>
#include <arch/cpu.h>
#include <string.h>
#include "console.h"
#include "cpu.h"
#include "mmu.h"
#include "keyboard.h"
#include "toscalls.h"
extern void (*__ctor_list)(void);
extern void (*__ctor_end)(void);
extern uint8 __bss_start;
extern uint8 _end;
extern "C" int main(stage2_args *args);
extern "C" void _start(void);
static uint32 sBootOptions;
static void
clear_bss(void)
{
memset(&__bss_start, 0, &_end - &__bss_start);
}
static void
call_ctors(void)
{
void (**f)(void);
for (f = &__ctor_list; f < &__ctor_end; f++) {
(**f)();
}
}
extern "C" uint32
platform_boot_options(void)
{
#if 0
if (!gKernelArgs.fb.enabled)
sBootOptions |= check_for_boot_keys();
#endif
return sBootOptions;
}
extern "C" void
platform_start_kernel(void)
{
static struct kernel_args *args = &gKernelArgs;
addr_t stackTop
= gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size;
preloaded_elf32_image *image = static_cast<preloaded_elf32_image *>(
gKernelArgs.kernel_image.Pointer());
mmu_init_for_kernel();
#warning M68K: stop ints
dprintf("kernel entry at %lx\n", image->elf_header.e_entry);
asm volatile (
"move.l %0,%%sp; "
: : "m" (stackTop));
asm volatile (
"or #0x0700,%%sr; " : : );
asm volatile (
"move.l #0x0,-(%%sp); "
"move.l %0,-(%%sp); "
"move.l #0x0,-(%%sp);"
"move.l %1,-(%%sp); "
"rts; "
: : "g" (args), "g" (image->elf_header.e_entry));
asm volatile (
"and #0xf8ff,%%sr; " : : );
panic("kernel returned!\n");
}
extern "C" void
platform_exit(void)
{
int32 nfShutdownId = nat_feat_getid("NF_SHUTDOWN");
if (nfShutdownId)
nat_feat_call(nfShutdownId, 0);
Pterm0();
}
extern "C" void
_start(void)
{
stage2_args args;
Bconout(DEV_CON, 'H');
clear_bss();
Bconout(DEV_CON, 'A');
call_ctors();
Bconout(DEV_CON, 'I');
args.heap_size = 0;
args.arguments = NULL;
init_nat_features();
Bconout(DEV_CON, 'K');
console_init();
Bconout(DEV_CON, 'U');
Bconout(DEV_CON, '\n');
dprintf("membot = %p\n", (void*)*TOSVAR_membot);
dprintf("memtop = %p\n", (void*)*TOSVAR_memtop);
dprintf("v_bas_ad = %p\n", *TOSVAR_v_bas_ad);
dprintf("phystop = %p\n", (void*)*TOSVARphystop);
dprintf("ramtop = %p\n", (void*)*TOSVARramtop);
cpu_init();
mmu_init();
spin(750000);
sBootOptions = check_for_boot_keys();
main(&args);
}