6 #include "libopenbios/bindings.h"
7 #include "arch/common/nvram.h"
8 #include "drivers/drivers.h"
9 #include "libc/diskio.h"
10 #include "libc/vsprintf.h"
11 #include "libopenbios/sys_info.h"
12 #include "libopenbios/elf_load.h"
13 #include "libopenbios/aout_load.h"
17 struct sys_info sys_info
;
18 uint32_t kernel_image
;
20 uint32_t qemu_cmdline
;
21 uint32_t cmdline_size
;
23 static int (*entry
)(const void *romvec_ptr
, int p2
, int p3
, int p4
, int p5
);
25 static int try_path(const char *path
, char *param
, const void *romvec
)
27 void *boot_notes
= NULL
;
28 ucell valid
, address
, type
, size
;
32 fword("pathres-resolve-aliases");
33 bootpath
= pop_fstr_copy();
34 printk("Trying %s (%s)\n", path
, bootpath
);
37 elf_load(&sys_info
, path
, param
, &boot_notes
);
38 feval("state-valid @");
43 /* Linux loader (not using Forth) */
44 linux_load(&sys_info
, path
, param
);
47 aout_load(&sys_info
, path
);
48 feval("state-valid @");
57 /* Get the entry point and the type (see forth/debugging/client.fs) */
58 feval("saved-program-state >sps.entry @");
60 feval("saved-program-state >sps.file-type @");
62 feval("saved-program-state >sps.file-size @");
65 printk("Jumping to entry point " FMT_ucellx
" for type " FMT_ucellx
"...\n", address
, type
);
69 /* Start ELF boot image */
70 entry
= (void *) address
;
71 image_retval
= entry(romvec
, 0, 0, 0, 0);
76 /* Start a.out image */
77 entry
= (void *) address
;
78 image_retval
= entry(romvec
, 0, 0, 0, 0);
83 printk("Image returned with return value %#x\n", image_retval
);
91 char *path
= pop_fstr_copy(), *param
, altpath
[256];
92 const char *oldpath
= path
;
98 push_str("boot-device");
102 fword("get-package-property");
104 path
= pop_fstr_copy();
106 switch (boot_device
) {
108 path
= strdup("/obio/SUNW,fdtwo");
112 path
= strdup("disk");
113 oldpath
= "sd(0,0,0):d";
117 path
= strdup("cdrom");
118 // FIXME: hardcoding this looks almost definitely wrong.
119 // With sd(0,2,0):b we get to see the solaris kernel though
120 //oldpath = "sd(0,2,0):d";
121 oldpath
= "sd(0,2,0):b";
125 path
= strdup("net");
132 obp_arg
.boot_dev_ctrl
= 0;
133 obp_arg
.boot_dev_unit
= unit
;
134 obp_arg
.dev_partition
= 0;
135 obp_arg
.boot_dev
[0] = oldpath
[0];
136 obp_arg
.boot_dev
[1] = oldpath
[1];
137 obp_arg
.argv
[0] = oldpath
;
138 obp_arg
.argv
[1] = (void *)(long)qemu_cmdline
;
140 param
= strchr(path
, ' ');
144 } else if (cmdline_size
) {
145 param
= (char *)qemu_cmdline
;
147 push_str("boot-args");
148 push_str("/options");
151 fword("get-package-property");
153 param
= pop_fstr_copy();
154 obp_arg
.argv
[1] = param
;
157 romvec
= init_openprom();
160 printk("[sparc] Kernel already loaded\n");
161 entry
= (void *) kernel_image
;
162 entry(romvec
, 0, 0, 0, 0);
165 printk("[sparc] Booting file '%s' ", path
);
167 printk("with parameters '%s'\n", param
);
169 printk("without parameters.\n");
171 result
= try_path(path
, param
, romvec
);
176 snprintf(altpath
, sizeof(altpath
), "%s:d", pop_fstr_copy());
180 try_path(altpath
, param
, romvec
);
183 printk("Unsupported image format\n");