Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / libopenbios / load.c
1 /*
2  *   Creation Date: <2010/06/25 20:00:00 mcayland>
3  *   Time-stamp: <2010/06/25 20:00:00 mcayland>
4  *
5  *      <load.c>
6  *
7  *      C implementation of load
8  *
9  *   Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland@siriusit.co.uk)
10  *
11  *   This program is free software; you can redistribute it and/or
12  *   modify it under the terms of the GNU General Public License
13  *   version 2
14  *
15  */
16
17 #include "config.h"
18 #include "kernel/kernel.h"
19 #include "libopenbios/bindings.h"
20 #include "libopenbios/sys_info.h"
21 #include "libopenbios/load.h"
22
23 #ifdef CONFIG_LOADER_ELF
24 #include "libopenbios/elf_load.h"
25 #endif
26
27 #ifdef CONFIG_LOADER_AOUT
28 #include "libopenbios/aout_load.h"
29 #endif
30
31 #ifdef CONFIG_LOADER_FCODE
32 #include "libopenbios/fcode_load.h"
33 #endif
34
35 #ifdef CONFIG_LOADER_FORTH
36 #include "libopenbios/forth_load.h"
37 #endif
38
39 #ifdef CONFIG_LOADER_BOOTCODE
40 #include "libopenbios/bootcode_load.h"
41 #endif
42
43
44 struct sys_info sys_info;
45 void *elf_boot_notes = NULL;
46
47 /* ( addr -- size ) */
48
49 void load(ihandle_t dev)
50 {
51         /* Invoke the loaders on the specified device */
52         char *param;
53         ucell valid;
54
55         /* TODO: Currently the internal loader APIs use load-base directly, so
56            drop the address */
57         POP();
58
59 #ifdef CONFIG_LOADER_ELF
60
61         /* Grab the boot arguments */
62         push_str("bootargs");
63         push_str("/chosen");
64         fword("(find-dev)");
65         POP();
66         fword("get-package-property");
67         POP();
68         param = pop_fstr_copy();
69
70         elf_load(&sys_info, dev, param, &elf_boot_notes);
71         feval("state-valid @");
72         valid = POP();
73         if (valid) {
74                 feval("saved-program-state >sps.file-size @");
75                 return;
76         }
77 #endif
78
79 #ifdef CONFIG_LOADER_AOUT
80         aout_load(&sys_info, dev);
81         feval("state-valid @");
82         valid = POP();
83         if (valid) {
84                 feval("saved-program-state >sps.file-size @");
85                 return;
86         }
87 #endif
88
89 #ifdef CONFIG_LOADER_FCODE
90         fcode_load(dev);
91         feval("state-valid @");
92         valid = POP();
93         if (valid) {
94                 feval("saved-program-state >sps.file-size @");
95                 return;
96         }
97 #endif
98
99 #ifdef CONFIG_LOADER_FORTH
100         forth_load(dev);
101         feval("state-valid @");
102         valid = POP();
103         if (valid) {
104                 feval("saved-program-state >sps.file-size @");
105                 return;
106         }
107 #endif
108
109 #ifdef CONFIG_LOADER_BOOTCODE
110         /* Check for a "raw" %BOOT bootcode payload */
111         bootcode_load(dev);
112         feval("state-valid @");
113         valid = POP();
114         if (valid) {
115                 feval("saved-program-state >sps.file-size @");
116                 return;
117         }
118 #endif
119
120         /* Didn't load anything, so return zero size */
121         PUSH(0);
122 }