]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/x86/lib/zimage.c
Merge branch 'u-boot-samsung/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / arch / x86 / lib / zimage.c
index 238ed614e862ba5674d394296305728c5d7e44ce..b54cf1261f71b35eb074bf50f3b9bc3f33dd369c 100644 (file)
 #include <asm/io.h>
 #include <asm/ptrace.h>
 #include <asm/zimage.h>
-#include <asm/realmode.h>
 #include <asm/byteorder.h>
 #include <asm/bootparam.h>
 #ifdef CONFIG_SYS_COREBOOT
 #include <asm/arch/timestamp.h>
 #endif
+#include <linux/compiler.h>
 
 /*
  * Memory lay-out:
@@ -174,16 +174,9 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size,
        else
                *load_address = (void *)ZIMAGE_LOAD_ADDR;
 
-#if (defined CONFIG_ZBOOT_32 || defined CONFIG_X86_NO_REAL_MODE)
        printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
        memset(setup_base, 0, sizeof(*setup_base));
        setup_base->hdr = params->hdr;
-#else
-       /* load setup */
-       printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
-              (ulong)setup_base, setup_size);
-       memmove(setup_base, image, setup_size);
-#endif
 
        if (bootproto >= 0x0204)
                kernel_size = hdr->syssize * 16;
@@ -240,10 +233,8 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
        struct setup_header *hdr = &setup_base->hdr;
        int bootproto = get_boot_protocol(hdr);
 
-#if (defined CONFIG_ZBOOT_32 || defined CONFIG_X86_NO_REAL_MODE)
        setup_base->e820_entries = install_e820_map(
                ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
-#endif
 
        if (bootproto == 0x0100) {
                setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
@@ -282,14 +273,30 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
        return 0;
 }
 
+/*
+ * Implement a weak default function for boards that optionally
+ * need to clean up the system before jumping to the kernel.
+ */
+__weak void board_final_cleanup(void)
+{
+}
+
 void boot_zimage(void *setup_base, void *load_address)
 {
+       debug("## Transferring control to Linux (at address %08x) ...\n",
+             (u32)setup_base);
+
+       bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
+#ifdef CONFIG_BOOTSTAGE_REPORT
+       bootstage_report();
+#endif
+       board_final_cleanup();
+
        printf("\nStarting kernel ...\n\n");
 
 #ifdef CONFIG_SYS_COREBOOT
        timestamp_add_now(TS_U_BOOT_START_KERNEL);
 #endif
-#if defined CONFIG_ZBOOT_32
        /*
         * Set %ebx, %ebp, and %edi to 0, %esi to point to the boot_params
         * structure, and then jump to the kernel. We assume that %cs is
@@ -298,26 +305,14 @@ void boot_zimage(void *setup_base, void *load_address)
         * itself in arch/i386/cpu/cpu.c.
         */
        __asm__ __volatile__ (
-       "movl $0, %%ebp         \n"
-       "cli                    \n"
-       "jmp %[kernel_entry]    \n"
+       "movl $0, %%ebp\n"
+       "cli\n"
+       "jmp *%[kernel_entry]\n"
        :: [kernel_entry]"a"(load_address),
           [boot_params] "S"(setup_base),
           "b"(0), "D"(0)
        :  "%ebp"
        );
-#else
-       struct pt_regs regs;
-
-       memset(&regs, 0, sizeof(struct pt_regs));
-       regs.xds = (u32)setup_base >> 4;
-       regs.xes = regs.xds;
-       regs.xss = regs.xds;
-       regs.esp = 0x9000;
-       regs.eflags = 0;
-       enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
-                      &regs, &regs);
-#endif
 }
 
 void setup_pcat_compatibility(void)
@@ -375,10 +370,6 @@ int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
                return -1;
        }
 
-       printf("## Transferring control to Linux "
-              "(at address %08x) ...\n",
-              (u32)base_ptr);
-
        /* we assume that the kernel is in place */
        boot_zimage(base_ptr, load_address);
        /* does not return */