Since some people disapprove of white space cleanups mixed in regular commits
[coreboot.git] / src / arch / i386 / boot / boot.c
index edba2d1c3d415fadabedde8e391dfcd44387c17a..d9cb02e776c4f58d7b25f8c63e728334cc793aaa 100644 (file)
@@ -3,6 +3,7 @@
 #include <boot/elf.h>
 #include <boot/elf_boot.h>
 #include <string.h>
+#include <cpu/x86/multiboot.h>
 
 
 #ifndef CMD_LINE
@@ -62,37 +63,35 @@ int elf_check_arch(Elf_ehdr *ehdr)
        return (
                ((ehdr->e_machine == EM_386) || (ehdr->e_machine == EM_486)) &&
                (ehdr->e_ident[EI_CLASS] == ELFCLASS32) &&
-               (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) 
+               (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
                );
-       
+
 }
 
-void jmp_to_elf_entry(void *entry, unsigned long buffer)
+void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size)
 {
        extern unsigned char _ram_seg, _eram_seg;
        unsigned long lb_start, lb_size;
        unsigned long adjust, adjusted_boot_notes;
-       unsigned long type;
 
-       elf_boot_notes.hdr.b_checksum = 
+       elf_boot_notes.hdr.b_checksum =
                compute_ip_checksum(&elf_boot_notes, sizeof(elf_boot_notes));
 
-       type = 0x0E1FB007;
        lb_start = (unsigned long)&_ram_seg;
        lb_size = (unsigned long)(&_eram_seg - &_ram_seg);
-       adjust = buffer + lb_size - lb_start;
+       adjust = buffer +  size - lb_start;
 
        adjusted_boot_notes = (unsigned long)&elf_boot_notes;
-       adjusted_boot_notes += adjust; 
-
-       printk_spew("entry    = 0x%08lx\n", (unsigned long)entry);
-       printk_spew("lb_start = 0x%08lx\n", lb_start);
-       printk_spew("lb_size  = 0x%08lx\n", lb_size);
-       printk_spew("adjust   = 0x%08lx\n", adjust);
-       printk_spew("buffer   = 0x%08lx\n", buffer);
-       printk_spew("     elf_boot_notes = 0x%08lx\n", (unsigned long)&elf_boot_notes);
-       printk_spew("adjusted_boot_notes = 0x%08lx\n", adjusted_boot_notes);
-       
+       adjusted_boot_notes += adjust;
+
+       printk(BIOS_SPEW, "entry    = 0x%08lx\n", (unsigned long)entry);
+       printk(BIOS_SPEW, "lb_start = 0x%08lx\n", lb_start);
+       printk(BIOS_SPEW, "lb_size  = 0x%08lx\n", lb_size);
+       printk(BIOS_SPEW, "adjust   = 0x%08lx\n", adjust);
+       printk(BIOS_SPEW, "buffer   = 0x%08lx\n", buffer);
+       printk(BIOS_SPEW, "     elf_boot_notes = 0x%08lx\n", (unsigned long)&elf_boot_notes);
+       printk(BIOS_SPEW, "adjusted_boot_notes = 0x%08lx\n", adjusted_boot_notes);
+
        /* Jump to kernel */
        __asm__ __volatile__(
                "       cld     \n\t"
@@ -113,7 +112,7 @@ void jmp_to_elf_entry(void *entry, unsigned long buffer)
                "       addl    12(%%esp), %%eax\n\t"
                "       addl     8(%%esp), %%eax\n\t"
                "       movl    %%eax, 20(%%esp)\n\t"
-               /* Place a copy of coreboot in it's new location */
+               /* Place a copy of coreboot in its new location */
                /* Move ``longs'' the coreboot size is 4 byte aligned */
                "       movl    12(%%esp), %%edi\n\t"
                "       addl     8(%%esp), %%edi\n\t"
@@ -139,7 +138,7 @@ void jmp_to_elf_entry(void *entry, unsigned long buffer)
                "       rep     movsl\n\t"
 
                /* Now jump to the loaded image */
-               "       movl    $0x0E1FB007, %%eax\n\t"
+               "       movl    %5, %%eax\n\t"
                "       movl     0(%%esp), %%ebx\n\t"
                "       call    *4(%%esp)\n\t"
 
@@ -173,9 +172,14 @@ void jmp_to_elf_entry(void *entry, unsigned long buffer)
                "       popl    %%edi\n\t"
                "       popl    %%esi\n\t"
 
-               :: 
-               "g" (lb_start), "g" (buffer), "g" (lb_size),
-               "g" (entry), "g"(adjusted_boot_notes)
+               ::
+               "ri" (lb_start), "ri" (buffer), "ri" (lb_size),
+               "ri" (entry),
+#if CONFIG_MULTIBOOT
+               "ri"(mbi), "ri" (MB_MAGIC2)
+#else
+               "ri"(adjusted_boot_notes), "ri" (0x0E1FB007)
+#endif
                );
 }