94 lines
2.8 KiB
C
94 lines
2.8 KiB
C
/*
|
|
* Creation Date: <2002/10/02 22:24:24 samuel>
|
|
* Time-stamp: <2004/03/27 01:57:55 samuel>
|
|
*
|
|
* <main.c>
|
|
*
|
|
*
|
|
*
|
|
* Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se)
|
|
*
|
|
* 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
|
|
*
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "libopenbios/bindings.h"
|
|
#include "libopenbios/elf_load.h"
|
|
#include "arch/common/nvram.h"
|
|
#include "packages/nvram.h"
|
|
#include "libc/diskio.h"
|
|
#include "libc/vsprintf.h"
|
|
#include "kernel.h"
|
|
#include "drivers/drivers.h"
|
|
#include "libopenbios/ofmem.h"
|
|
#include "libopenbios/initprogram.h"
|
|
#include "context.h"
|
|
#define NO_QEMU_PROTOS
|
|
#include "arch/common/fw_cfg.h"
|
|
|
|
//#define DEBUG_QEMU
|
|
|
|
#ifdef DEBUG_QEMU
|
|
#define SUBSYS_DPRINTF(subsys, fmt, args...) \
|
|
do { printk("%s - %s: " fmt, subsys, __func__ , ##args); } while (0)
|
|
#else
|
|
#define SUBSYS_DPRINTF(subsys, fmt, args...) \
|
|
do { } while (0)
|
|
#endif
|
|
#define CHRP_DPRINTF(fmt, args...) SUBSYS_DPRINTF("CHRP", fmt, ##args)
|
|
#define ELF_DPRINTF(fmt, args...) SUBSYS_DPRINTF("ELF", fmt, ##args)
|
|
#define NEWWORLD_DPRINTF(fmt, args...) SUBSYS_DPRINTF("NEWWORLD", fmt, ##args)
|
|
|
|
static void check_preloaded_kernel(void)
|
|
{
|
|
unsigned long kernel_image, kernel_size;
|
|
unsigned long initrd_image, initrd_size;
|
|
const char * kernel_cmdline;
|
|
volatile struct context *ctx = __context;
|
|
|
|
kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE);
|
|
if (kernel_size) {
|
|
kernel_image = fw_cfg_read_i32(FW_CFG_KERNEL_ADDR);
|
|
kernel_cmdline = (const char *)(uintptr_t) fw_cfg_read_i32(FW_CFG_KERNEL_CMDLINE);
|
|
initrd_image = fw_cfg_read_i32(FW_CFG_INITRD_ADDR);
|
|
initrd_size = fw_cfg_read_i32(FW_CFG_INITRD_SIZE);
|
|
printk("[ppc] Kernel already loaded (0x%8.8lx + 0x%8.8lx) "
|
|
"(initrd 0x%8.8lx + 0x%8.8lx)\n",
|
|
kernel_image, kernel_size, initrd_image, initrd_size);
|
|
if (kernel_cmdline) {
|
|
phandle_t ph;
|
|
printk("[ppc] Kernel command line: %s\n", kernel_cmdline);
|
|
ph = find_dev("/chosen");
|
|
set_property(ph, "bootargs", strdup(kernel_cmdline), strlen(kernel_cmdline) + 1);
|
|
}
|
|
|
|
arch_init_program();
|
|
ctx->regs[REG_R3] = initrd_image;
|
|
ctx->regs[REG_R4] = initrd_size;
|
|
ctx->pc = kernel_image;
|
|
|
|
start_elf();
|
|
}
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* entry */
|
|
/************************************************************************/
|
|
|
|
void
|
|
boot( void )
|
|
{
|
|
uint16_t boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
|
|
|
|
fword("update-chosen");
|
|
if (boot_device == 'm') {
|
|
check_preloaded_kernel();
|
|
}
|
|
|
|
if (is_apple()) {
|
|
update_nvram();
|
|
}
|
|
}
|