Refactor copy_and_run so that it uses a single code base instead of
[coreboot.git] / src / cpu / x86 / car / copy_and_run.c
index 7a070ee6488c95429dc1e06242d8364356240bac..14fe83d667f42ae5f33faba7c2c70663f7d1b52d 100644 (file)
@@ -1,83 +1,23 @@
-/* by yhlu 6.2005 
-       moved from nrv2v.c and some lines from crt0.S
-   2006/05/02 - stepan: move nrv2b to an extra file.
+/* Copyright (C) 2009 coresystems GmbH
+   (Written by Patrick Georgi <patrick.georgi@coresystems.de> for coresystems GmbH
 */
 
-#if CONFIG_COMPRESS
-#define ENDIAN   0
-#define BITSIZE 32
-#include "lib/nrv2b.c"
-#endif
+void copy_and_run_core(u8 *src, u8 *dst, unsigned long ilen, unsigned ebp);
+
+extern u8 _liseg, _iseg, _eiseg;
 
 static void copy_and_run(unsigned cpu_reset)
 {
        uint8_t *src, *dst; 
-#if !CONFIG_COMPRESS
-       unsigned long dst_len;
-#endif
-        unsigned long ilen, olen;
-
-
-#if !CONFIG_COMPRESS 
-       print_debug("Copying coreboot to RAM.\r\n");
-       __asm__ volatile (
-               "leal _liseg, %0\n\t"
-               "leal _iseg, %1\n\t"
-               "leal _eiseg, %2\n\t"
-               "subl %1, %2\n\t"
-               : "=a" (src), "=b" (dst), "=c" (dst_len)
-       );
-       memcpy(src, dst, dst_len);
-#else 
-       print_debug("Uncompressing coreboot to RAM.\r\n");
-
-        __asm__ volatile (
-               "leal _liseg, %0\n\t"
-               "leal _iseg,  %1\n\t"
-                : "=a" (src) , "=b" (dst)
-        );
-
-#if CONFIG_USE_INIT            
-       printk_spew("src=%08x\r\n",src); 
-       printk_spew("dst=%08x\r\n",dst);
-#else
-        print_spew("src="); print_spew_hex32((uint32_t)src); print_spew("\r\n");
-        print_spew("dst="); print_spew_hex32((uint32_t)dst); print_spew("\r\n");
-#endif
-       
-//     dump_mem(src, src+0x100);
+        unsigned long ilen;
 
-       olen = unrv2b(src, dst, &ilen);
 
-#endif
-//     dump_mem(dst, dst+0x100);
-#if CONFIG_USE_INIT
-       printk_spew("coreboot_ram.bin length = %08x\r\n", olen);
-#else
-       print_spew("coreboot_ram.bin length = "); print_spew_hex32(olen); print_spew("\r\n");
-#endif
-#ifdef CONFIG_DEACTIVATE_CAR
-       print_debug("Deactivating CAR");
-#include CONFIG_DEACTIVATE_CAR_FILE
-       print_debug(" - Done.\r\n");
-#endif
-       print_debug("Jumping to coreboot.\r\n");
+       src = &_liseg;
+       dst = &_iseg;
+       ilen = &_eiseg - dst;
 
-       if(cpu_reset == 1 ) {
-               __asm__ volatile (
-                       "movl $0xffffffff, %ebp\n\t"
-               );
-       }
-       else {
-                __asm__ volatile (
-                        "xorl %ebp, %ebp\n\t"
-                );
-       }
-       
-       __asm__ volatile (
-               "cli\n\t"
-               "leal    _iseg, %edi\n\t"
-               "jmp     *%edi\n\t"
-       );
+       if (cpu_reset == 1) cpu_reset = -1;
+       else cpu_reset = 0;
 
+       copy_and_run_core(src, dst, ilen, cpu_reset);
 }