summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/arch/i386/core/multiboot_loader.c208
1 files changed, 0 insertions, 208 deletions
diff --git a/src/arch/i386/core/multiboot_loader.c b/src/arch/i386/core/multiboot_loader.c
deleted file mode 100644
index 562252427..000000000
--- a/src/arch/i386/core/multiboot_loader.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* Multiboot support
- *
- * 2003-07-02 mmap fix and header probe by SONE Takeshi
- */
-
-struct multiboot_mods {
- unsigned mod_start;
- unsigned mod_end;
- unsigned char *string;
- unsigned reserved;
-};
-
-struct multiboot_mmap {
- unsigned int size;
- unsigned int base_addr_low;
- unsigned int base_addr_high;
- unsigned int length_low;
- unsigned int length_high;
- unsigned int type;
-};
-
-/* The structure of a Multiboot 0.6 parameter block. */
-struct multiboot_info {
- unsigned int flags;
-#define MULTIBOOT_MEM_VALID 0x01
-#define MULTIBOOT_BOOT_DEV_VALID 0x02
-#define MULTIBOOT_CMDLINE_VALID 0x04
-#define MULTIBOOT_MODS_VALID 0x08
-#define MULTIBOOT_AOUT_SYMS_VALID 0x10
-#define MULTIBOOT_ELF_SYMS_VALID 0x20
-#define MULTIBOOT_MMAP_VALID 0x40
- unsigned int memlower;
- unsigned int memupper;
- unsigned int bootdev;
- unsigned int cmdline; /* physical address of the command line */
- unsigned mods_count;
- struct multiboot_mods *mods_addr;
- unsigned syms_num;
- unsigned syms_size;
- unsigned syms_addr;
- unsigned syms_shndx;
- unsigned mmap_length;
- unsigned mmap_addr;
- /* The structure actually ends here, so I might as well put
- * the ugly e820 parameters here...
- */
- struct multiboot_mmap mmap[E820MAX];
-};
-
-/* Multiboot image header (minimal part) */
-struct multiboot_header {
- unsigned int magic;
-#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
- unsigned int flags;
- unsigned int checksum;
-};
-
-static struct multiboot_header *mbheader;
-static unsigned int mbimgoffset, mboffset;
-static unsigned char mbbuffer[12];
-
-static struct multiboot_info mbinfo;
-
-static void multiboot_init(void)
-{
- mbheader = NULL;
- mbimgoffset = 0;
- mboffset = 0;
-}
-
-/* Remember this probing function is actually different from the usual probing
- * functions, since the Multiboot header is somewhere in the first 8KB of the
- * image and it is byte aligned, but there is not much more known about how to
- * find it. In the Etherboot context the most complicated issue is that the
- * image has to be processed block-by-block, with unknown block size and no
- * guarantees about block alignment with respect to the image. */
-static void multiboot_peek(unsigned char *data, int len)
-{
- struct multiboot_header *h;
-
- /* If we have already searched the first 8KB of the image or if we have
- * already found a valid Multiboot header, skip this code. */
- if ((mboffset == 12) || (mbimgoffset >= 8192))
- return;
-
- if (mbimgoffset + len >= 8192)
- len = 8192 - mbimgoffset;
-
- /* This piece of code is pretty stupid, since it always copies data, even
- * if it is word aligned. This shouldn't matter too much on platforms that
- * use the Multiboot spec, since the processors are usually reasonably fast
- * and this code is only executed for the first 8KB of the image. Feel
- * free to improve it, but be prepared to write quite a lot of code that
- * deals with non-aligned data with respect to the image to load. */
- while (len > 0) {
- mbimgoffset++;
- memcpy(mbbuffer + mboffset, data, 1);
- mboffset++;
- data++;
- len--;
- if (mboffset == 4) {
- /* Accumulated a word into the buffer. */
- h = (struct multiboot_header *)mbbuffer;
- if (h->magic != MULTIBOOT_HEADER_MAGIC) {
- /* Wrong magic, this cannot be the start of the header. */
- mboffset = 0;
- }
- } else if (mboffset == 12) {
- /* Accumulated the minimum header data into the buffer. */
- h = (struct multiboot_header *)mbbuffer;
- if (h->magic + h->flags + h->checksum != 0) {
- /* Checksum error, not a valid header. Check for a possible
- * header starting in the current flag/checksum field. */
- if (h->flags == MULTIBOOT_HEADER_MAGIC) {
- mboffset -= 4;
- memmove(mbbuffer, mbbuffer + 4, mboffset);
- } else if (h->checksum == MULTIBOOT_HEADER_MAGIC) {
- mboffset -= 8;
- memmove(mbbuffer, mbbuffer + 8, mboffset);
- } else {
- mboffset = 0;
- }
- } else {
- printf("Multiboot... ");
- mbheader = h;
- if ((h->flags & 0xfffc) != 0) {
- printf("\nERROR: Unsupported Multiboot requirements flags\n");
- longjmp(restart_etherboot, -2);
- }
- break;
- }
- }
- }
- mbimgoffset += len;
-}
-
-static inline void multiboot_boot(unsigned long entry)
-{
- unsigned char cmdline[512], *c;
- int i;
- if (!mbheader)
- return;
- /* Etherboot limits the command line to the kernel name,
- * default parameters and user prompted parameters. All of
- * them are shorter than 256 bytes. As the kernel name and
- * the default parameters come from the same BOOTP/DHCP entry
- * (or if they don't, the parameters are empty), only two
- * strings of the maximum size are possible. Note this buffer
- * can overrun if a stupid file name is chosen. Oh well. */
- c = cmdline;
- for (i = 0; KERNEL_BUF[i] != '\0'; i++) {
- switch (KERNEL_BUF[i]) {
- case ' ':
- case '\\':
- case '"':
- *c++ = '\\';
- break;
- default:
- break;
- }
- *c++ = KERNEL_BUF[i];
- }
- if (addparam != NULL) {
- *c++ = ' ';
- memcpy(c, addparam, addparamlen);
- c += addparamlen;
- }
- (void)sprintf(c, " -retaddr %#lX", virt_to_phys(xend32));
-
- mbinfo.flags = MULTIBOOT_MMAP_VALID | MULTIBOOT_MEM_VALID |MULTIBOOT_CMDLINE_VALID;
- mbinfo.memlower = meminfo.basememsize;
- mbinfo.memupper = meminfo.memsize;
- mbinfo.bootdev = 0; /* not booted from disk */
- mbinfo.cmdline = virt_to_phys(cmdline);
- for (i = 0; i < (int) meminfo.map_count; i++) {
- mbinfo.mmap[i].size = sizeof(struct multiboot_mmap)
- - sizeof(unsigned int);
- mbinfo.mmap[i].base_addr_low =
- (unsigned int) meminfo.map[i].addr;
- mbinfo.mmap[i].base_addr_high =
- (unsigned int) (meminfo.map[i].addr >> 32);
- mbinfo.mmap[i].length_low =
- (unsigned int) meminfo.map[i].size;
- mbinfo.mmap[i].length_high =
- (unsigned int) (meminfo.map[i].size >> 32);
- mbinfo.mmap[i].type = meminfo.map[i].type;
- }
- mbinfo.mmap_length = meminfo.map_count * sizeof(struct multiboot_mmap);
- mbinfo.mmap_addr = virt_to_phys(mbinfo.mmap);
-
- /* The Multiboot 0.6 spec requires all segment registers to be
- * loaded with an unrestricted, writeable segment.
- * xstart32 does this for us.
- */
-
- /* Start the kernel, passing the Multiboot information record
- * and the magic number. */
- os_regs.eax = 0x2BADB002;
- os_regs.ebx = virt_to_phys(&mbinfo);
- xstart32(entry);
- /* A Multiboot kernel by default never returns - there is nothing in the
- * specification about what happens to the boot loader after the kernel has
- * been started. Thus if the kernel returns it is definitely aware of the
- * semantics involved (i.e. the "-retaddr" parameter). Do not treat this
- * as an error, but restart with a fresh DHCP request in order to activate
- * the menu again in case one is used. */
- longjmp(restart_etherboot, 2);
-}