]> Joshua Wise's Git repositories - netwatch.git/blame - grubload/multiboot_c.c
Merge ELF loader.
[netwatch.git] / grubload / multiboot_c.c
CommitLineData
9b8c947b
JW
1#include "console.h"
2
c4a16564
JW
3extern char _binary_realmode_bin_start[];
4extern int _binary_realmode_bin_size;
5
9b8c947b 6struct mb_info
56553b73 7{
9b8c947b
JW
8 unsigned long flags;
9 unsigned long mem_lower, mem_upper;
10 unsigned long boot_dev;
11 char *cmdline;
12 unsigned long mod_cnt;
13 struct mod_info *mods;
14};
15
16struct mod_info
17{
18 void *mod_start;
19 void *mod_end;
20 char *mod_string;
21 void *reserved;
22};
23
24void c_start(unsigned int magic, struct mb_info *wee)
25{
26 unsigned short *grubptr = 0x7CFE;
27 int i;
28
c4a16564
JW
29 void (*realmode)() = 0x4000;
30
9b8c947b
JW
31 puts("Magic is: ");
32 puthex(magic);
33 puts("\nMultiboot header is: ");
34 puthex(wee);
35 puts("\n");
36 show_cursor();
37
38 puts("Grubptr is: ");
39 puthex(*grubptr);
40 puts("\n");
d56898ee 41
42
9b8c947b
JW
43 for (i = 0; i < wee->mod_cnt; i++)
44 {
45 puts("Module:\n");
46 puts(" Start: "); puthex(wee->mods[i].mod_start); puts("\n");
47 puts(" Size: "); puthex(wee->mods[i].mod_end - wee->mods[i].mod_start); puts("\n");
48 puts(" Name: "); puts(wee->mods[i].mod_string); puts("\n");
49 }
c4a16564 50
d56898ee 51 if ((wee->mod_cnt != 1) || (strcmp(wee->mods[0].mod_string, "aseg.elf")))
52 {
53 puts("Expected 1 module called aseg.elf.\n");
54 while(1) asm("hlt");
55 }
56
57 load_elf(wee->mods[0].mod_start, wee->mods[0].mod_end - wee->mods[0].mod_start);
58
c4a16564
JW
59 puts("Now returning to real mode.\n");
60 memcpy(0x4000, _binary_realmode_bin_start, (int)&_binary_realmode_bin_size);
86c89e89 61 realmode(); // goodbye!
56553b73 62}
This page took 0.02769 seconds and 4 git commands to generate.