Start code I'll work on tomorrow^Wtoday.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23381 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2006, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
|
||||||
|
#define HEAP_SIZE 65536
|
||||||
|
|
||||||
|
// GCC defined globals
|
||||||
|
extern void (*__ctor_list)(void);
|
||||||
|
extern void (*__ctor_end)(void);
|
||||||
|
extern uint8 __bss_start;
|
||||||
|
extern uint8 _end;
|
||||||
|
|
||||||
|
extern int main(stage2_args *args);
|
||||||
|
void _start(void);
|
||||||
|
|
||||||
|
|
||||||
|
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)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
platform_boot_options(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (!gKernelArgs.fb.enabled)
|
||||||
|
sBootOptions |= check_for_boot_keys();
|
||||||
|
#endif
|
||||||
|
return sBootOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
platform_start_kernel(void)
|
||||||
|
{
|
||||||
|
static struct kernel_args *args = &gKernelArgs;
|
||||||
|
// something goes wrong when we pass &gKernelArgs directly
|
||||||
|
// to the assembler inline below - might be a bug in GCC
|
||||||
|
// or I don't see something important...
|
||||||
|
addr_t stackTop = gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size;
|
||||||
|
|
||||||
|
smp_init_other_cpus();
|
||||||
|
serial_cleanup();
|
||||||
|
mmu_init_for_kernel();
|
||||||
|
smp_boot_other_cpus();
|
||||||
|
|
||||||
|
dprintf("kernel entry at %lx\n", gKernelArgs.kernel_image.elf_header.e_entry);
|
||||||
|
|
||||||
|
asm("movl %0, %%eax; " // move stack out of way
|
||||||
|
"movl %%eax, %%esp; "
|
||||||
|
: : "m" (stackTop));
|
||||||
|
asm("pushl $0x0; " // we're the BSP cpu (0)
|
||||||
|
"pushl %0; " // kernel args
|
||||||
|
"pushl $0x0;" // dummy retval for call to main
|
||||||
|
"pushl %1; " // this is the start address
|
||||||
|
"ret; " // jump.
|
||||||
|
: : "g" (args), "g" (gKernelArgs.kernel_image.elf_header.e_entry));
|
||||||
|
|
||||||
|
panic("kernel returned!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
platform_exit(void)
|
||||||
|
{
|
||||||
|
// reset the system using the keyboard controller
|
||||||
|
out8(0xfe, 0x64);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_start(void)
|
||||||
|
{
|
||||||
|
stage2_args args;
|
||||||
|
|
||||||
|
asm("cld"); // Ain't nothing but a GCC thang.
|
||||||
|
asm("fninit"); // initialize floating point unit
|
||||||
|
|
||||||
|
clear_bss();
|
||||||
|
call_ctors();
|
||||||
|
// call C++ constructors before doing anything else
|
||||||
|
|
||||||
|
args.heap_size = HEAP_SIZE;
|
||||||
|
|
||||||
|
//serial_init();
|
||||||
|
console_init();
|
||||||
|
cpu_init();
|
||||||
|
mmu_init();
|
||||||
|
|
||||||
|
// wait a bit to give the user the opportunity to press a key
|
||||||
|
spin(750000);
|
||||||
|
|
||||||
|
// reading the keyboard doesn't seem to work in graphics mode (maybe a bochs problem)
|
||||||
|
sBootOptions = check_for_boot_keys();
|
||||||
|
//if (sBootOptions & BOOT_OPTION_DEBUG_OUTPUT)
|
||||||
|
serial_enable();
|
||||||
|
|
||||||
|
//apm_init();
|
||||||
|
//smp_init();
|
||||||
|
main(&args);
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user