| /* |
| * 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(); |
| } |
| } |