50 |
grub_ieee1275_phandle_t chosen; |
grub_ieee1275_phandle_t chosen; |
51 |
grub_size_t actual; |
grub_size_t actual; |
52 |
|
|
|
struct bi_rec |
|
|
{ |
|
|
unsigned long tag; |
|
|
unsigned long size; |
|
|
unsigned long data[0]; |
|
|
}; |
|
|
|
|
53 |
grub_ieee1275_finddevice ("/chosen", &chosen); |
grub_ieee1275_finddevice ("/chosen", &chosen); |
54 |
|
|
55 |
/* Set the command line arguments. */ |
/* Set the command line arguments. */ |
72 |
if (linux_addr && grub_ieee1275_release (linux_addr, linux_size)) |
if (linux_addr && grub_ieee1275_release (linux_addr, linux_size)) |
73 |
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory"); |
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory"); |
74 |
|
|
75 |
|
if (initrd_addr && grub_ieee1275_release (initrd_addr, initrd_size)) |
76 |
|
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory"); |
77 |
|
|
78 |
linux_addr = 0; |
linux_addr = 0; |
79 |
|
initrd_addr = 0; |
80 |
|
|
81 |
return GRUB_ERR_NONE; |
return GRUB_ERR_NONE; |
82 |
} |
} |
83 |
|
|
95 |
} |
} |
96 |
|
|
97 |
void |
void |
98 |
grub_load_linux (int argc, char *argv[]) |
grub_rescue_cmd_linux (int argc, char *argv[]) |
99 |
{ |
{ |
100 |
grub_file_t file = 0; |
grub_file_t file = 0; |
101 |
Elf32_Ehdr ehdr; |
Elf32_Ehdr ehdr; |
102 |
Elf32_Phdr *phdrs = 0; |
Elf32_Phdr *phdrs = 0; |
103 |
int i; |
int i; |
104 |
int offset = 0; |
int offset = 0; |
105 |
static grub_addr_t entry; |
grub_addr_t entry; |
106 |
|
int found_addr = 0; |
107 |
int size; |
int size; |
108 |
|
|
109 |
grub_dl_ref (my_mod); |
grub_dl_ref (my_mod); |
187 |
/* Reserve memory for the kernel. */ |
/* Reserve memory for the kernel. */ |
188 |
linux_size += 0x100000; |
linux_size += 0x100000; |
189 |
|
|
190 |
if (grub_claimmap (entry, linux_size) == -1) |
/* For some vmlinux kernels the address set above won't work. Just |
191 |
|
try some other addresses just like yaboot does. */ |
192 |
|
for (linux_addr = entry; linux_addr < entry + 200 * 0x100000; linux_addr += 0x100000) |
193 |
|
{ |
194 |
|
found_addr = grub_claimmap (linux_addr, linux_size); |
195 |
|
if (found_addr != -1) |
196 |
|
break; |
197 |
|
} |
198 |
|
|
199 |
|
if (found_addr == -1) |
200 |
{ |
{ |
201 |
grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory"); |
grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory"); |
202 |
goto fail; |
goto fail; |
203 |
} |
} |
204 |
linux_addr = entry; |
entry = linux_addr; |
205 |
|
|
206 |
/* Load every loadable segment in memory. */ |
/* Load every loadable segment in memory. */ |
207 |
for (i = 0; i < ehdr.e_phnum; i++) |
for (i = 0; i < ehdr.e_phnum; i++) |
208 |
{ |
{ |
265 |
return; |
return; |
266 |
} |
} |
267 |
|
|
268 |
|
void |
269 |
GRUB_MOD_INIT |
grub_rescue_cmd_initrd (int argc, char *argv[]) |
270 |
{ |
{ |
271 |
grub_rescue_register_command ("linux", grub_load_linux, |
grub_file_t file = 0; |
272 |
"load a linux kernel"); |
grub_ssize_t size; |
273 |
my_mod = mod; |
grub_addr_t addr; |
274 |
} |
|
275 |
|
if (argc == 0) |
276 |
|
{ |
277 |
|
grub_error (GRUB_ERR_BAD_ARGUMENT, "no initrd specified"); |
278 |
|
goto fail; |
279 |
|
} |
280 |
|
|
281 |
|
if (!loaded) |
282 |
|
{ |
283 |
|
grub_error (GRUB_ERR_BAD_ARGUMENT, "You need to load the kernel first."); |
284 |
|
goto fail; |
285 |
|
} |
286 |
|
|
287 |
GRUB_MOD_FINI |
file = grub_file_open (argv[0]); |
288 |
{ |
if (! file) |
289 |
grub_rescue_unregister_command ("linux"); |
goto fail; |
290 |
|
|
291 |
|
addr = linux_addr + linux_size; |
292 |
|
size = grub_file_size (file); |
293 |
|
|
294 |
|
if (grub_claimmap (addr, size) == -1) |
295 |
|
{ |
296 |
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory"); |
297 |
|
goto fail; |
298 |
|
} |
299 |
|
|
300 |
|
if (grub_file_read (file, (void *) addr, size) != size) |
301 |
|
{ |
302 |
|
grub_ieee1275_release (addr, size); |
303 |
|
grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file"); |
304 |
|
goto fail; |
305 |
|
} |
306 |
|
|
307 |
|
initrd_addr = addr; |
308 |
|
initrd_size = size; |
309 |
|
|
310 |
|
fail: |
311 |
|
if (file) |
312 |
|
grub_file_close (file); |
313 |
} |
} |
314 |
|
|
315 |
void |
|
316 |
grub_linux_init (void) |
|
317 |
|
GRUB_MOD_INIT |
318 |
{ |
{ |
319 |
grub_rescue_register_command ("linux", grub_load_linux, |
grub_rescue_register_command ("linux", grub_rescue_cmd_linux, |
320 |
"load a linux kernel"); |
"load a linux kernel"); |
321 |
|
grub_rescue_register_command ("initrd", grub_rescue_cmd_initrd, |
322 |
|
"load an initrd"); |
323 |
|
my_mod = mod; |
324 |
} |
} |
325 |
|
|
326 |
void |
GRUB_MOD_FINI |
|
grub_linux_fini (void) |
|
327 |
{ |
{ |
328 |
grub_rescue_unregister_command ("linux"); |
grub_rescue_unregister_command ("linux"); |
329 |
|
grub_rescue_unregister_command ("initrd"); |
330 |
} |
} |