]> git.sur5r.net Git - u-boot/blobdiff - arch/x86/lib/bootm.c
x86: Correct a few progress message nits
[u-boot] / arch / x86 / lib / bootm.c
index b90ca653fdf8fc3727ad09e7a98275b1f3eb847d..86030cf52aab1c3994d805d47d16c17e27178f05 100644 (file)
@@ -15,6 +15,7 @@
 #include <image.h>
 #include <u-boot/zlib.h>
 #include <asm/bootparam.h>
+#include <asm/cpu.h>
 #include <asm/byteorder.h>
 #include <asm/zimage.h>
 #ifdef CONFIG_SYS_COREBOOT
@@ -120,7 +121,7 @@ static int boot_prep_linux(bootm_headers_t *images)
        } else if (images->ep) {
                cmd_line_dest = (void *)images->ep + COMMAND_LINE_OFFSET;
        } else {
-               printf("## Kernel loading failed (no setup) ...\n");
+               printf("## Kernel loading failed (missing x86 kernel setup) ...\n");
                goto error;
        }
 
@@ -148,7 +149,11 @@ int boot_linux_kernel(ulong setup_base, ulong load_address, bool image_64bit)
        timestamp_add_now(TS_U_BOOT_START_KERNEL);
 #endif
        if (image_64bit) {
-               /* TODO(boot 64-bit kernel) */
+               if (!cpu_has_64bit()) {
+                       puts("Cannot boot 64-bit kernel on 32-bit machine\n");
+                       return -EFAULT;
+               }
+               return cpu_jump_to_64bit(setup_base, load_address);
        } else {
                /*
                * Set %ebx, %ebp, and %edi to 0, %esi to point to the
@@ -178,7 +183,8 @@ static int boot_jump_linux(bootm_headers_t *images)
        debug("## Transferring control to Linux (at address %08lx, kernel %08lx) ...\n",
              images->ep, images->os.load);
 
-       return boot_linux_kernel(images->ep, images->os.load, false);
+       return boot_linux_kernel(images->ep, images->os.load,
+                                images->os.arch == IH_ARCH_X86_64);
 }
 
 int do_bootm_linux(int flag, int argc, char * const argv[],