2 * Creation Date: <2010/06/25 20:00:00 mcayland>
3 * Time-stamp: <2010/06/25 20:00:00 mcayland>
7 * C implementation of load
9 * Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk)
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
18 #include "kernel/kernel.h"
19 #include "libopenbios/bindings.h"
20 #include "libopenbios/sys_info.h"
21 #include "libopenbios/load.h"
23 #ifdef CONFIG_LOADER_ELF
24 #include "libopenbios/elf_load.h"
27 #ifdef CONFIG_LOADER_AOUT
28 #include "libopenbios/aout_load.h"
31 #ifdef CONFIG_LOADER_FCODE
32 #include "libopenbios/fcode_load.h"
35 #ifdef CONFIG_LOADER_FORTH
36 #include "libopenbios/forth_load.h"
39 #ifdef CONFIG_LOADER_BOOTCODE
40 #include "libopenbios/bootcode_load.h"
44 struct sys_info sys_info;
45 void *elf_boot_notes = NULL;
47 /* ( addr -- size ) */
49 void load(ihandle_t dev)
51 /* Invoke the loaders on the specified device */
55 /* TODO: Currently the internal loader APIs use load-base directly, so
59 #ifdef CONFIG_LOADER_ELF
61 /* Grab the boot arguments */
66 fword("get-package-property");
68 param = pop_fstr_copy();
70 elf_load(&sys_info, dev, param, &elf_boot_notes);
71 feval("state-valid @");
74 feval("saved-program-state >sps.file-size @");
79 #ifdef CONFIG_LOADER_AOUT
80 aout_load(&sys_info, dev);
81 feval("state-valid @");
84 feval("saved-program-state >sps.file-size @");
89 #ifdef CONFIG_LOADER_FCODE
91 feval("state-valid @");
94 feval("saved-program-state >sps.file-size @");
99 #ifdef CONFIG_LOADER_FORTH
101 feval("state-valid @");
104 feval("saved-program-state >sps.file-size @");
109 #ifdef CONFIG_LOADER_BOOTCODE
110 /* Check for a "raw" %BOOT bootcode payload */
112 feval("state-valid @");
115 feval("saved-program-state >sps.file-size @");
120 /* Didn't load anything, so return zero size */