blob: 2534f138d9dec3d3d12479a1eefb924fa6196b42 [file] [log] [blame]
/*
*
*/
#undef BOOTSTRAP
#include "config.h"
#include "libopenbios/bindings.h"
#include "arch/common/nvram.h"
#include "libc/diskio.h"
#include "libc/vsprintf.h"
#include "libopenbios/initprogram.h"
#include "libopenbios/sys_info.h"
#include "boot.h"
uint64_t kernel_image;
uint64_t kernel_size;
uint64_t initrd_image;
uint64_t initrd_size;
uint64_t qemu_cmdline;
uint64_t cmdline_size;
char *boot_device;
extern int sparc64_of_client_interface( int *params );
/* ( path len -- path len ) */
void boot(void)
{
char *path, *param;
/* Copy the incoming path */
fword("2dup");
path = pop_fstr_copy();
/* Boot preloaded kernel */
if (kernel_size) {
void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3,
unsigned long p4, unsigned long p5);
printk("[sparc64] Kernel already loaded\n");
entry = (void *) (unsigned long)(IMAGE_VIRT_ADDR + 0x4000);
entry(0, 0, 0, 0, (unsigned long)&sparc64_of_client_interface);
}
/* Invoke Linux directly -- probably not supported */
if(!path) {
/* No path specified, so grab defaults from /chosen */
push_str("bootpath");
push_str("/chosen");
fword("(find-dev)");
POP();
fword("get-package-property");
POP();
/* Update our local copy of path as well as the one on the stack */
fword("2dup");
path = pop_fstr_copy();
}
if (path) {
param = strchr(path, ' ');
if(param) {
*param = '\0';
param++;
} else if (cmdline_size) {
param = (char *)qemu_cmdline;
} else {
push_str("boot-args");
push_str("/options");
fword("(find-dev)");
POP();
fword("get-package-property");
POP();
param = pop_fstr_copy();
}
/* Invoke platform-specific Linux loader */
linux_load(&sys_info, path, param);
free(path);
}
}