text: /*
   *   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"
  #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;
  
      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);
          }
          call_elf(initrd_image, initrd_size, kernel_image);
      }
  }
  
  /************************************************************************/
  /*	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();
  	}
  }
  