oops! Slap me on the head for this one. Quick fix for ward until
[coreboot.git] / src / cpu / amd / car / copy_and_run.c
1 /* by yhlu 6.2005 
2         moved from nrv2v.c and some lines from crt0.S
3    2006/05/02 - stepan: move nrv2b to an extra file.
4 */
5
6 #if CONFIG_COMPRESS 
7 #include "lib/nrv2b.c"
8 #endif
9
10 static inline void print_debug_cp_run(const char *strval, uint32_t val)
11 {
12 #if CONFIG_USE_INIT
13         printk_debug("%s%08x\r\n", strval, val);
14 #else
15         print_debug(strval); print_debug_hex32(val); print_debug("\r\n");
16 #endif
17 }
18
19 static void copy_and_run(void)
20 {
21         uint8_t *src, *dst; 
22         unsigned long ilen = 0, olen = 0, last_m_off =  1;
23         uint32_t bb = 0;
24         unsigned bc = 0;
25
26         print_debug("Copying LinuxBIOS to ram.\r\n");
27
28 #if !CONFIG_COMPRESS 
29         __asm__ volatile (
30                 "leal _liseg, %0\n\t"
31                 "leal _iseg, %1\n\t"
32                 "leal _eiseg, %2\n\t"
33                 "subl %1, %2\n\t"
34                 : "=a" (src), "=b" (dst), "=c" (olen)
35         );
36         memcpy(dst, src, olen);
37 #else 
38
39         __asm__ volatile (
40                 "leal _liseg, %0\n\t"
41                 "leal _iseg,  %1\n\t"
42                 : "=a" (src) , "=b" (dst)
43         );
44
45         print_debug_cp_run("src=",(uint32_t)src); 
46         print_debug_cp_run("dst=",(uint32_t)dst);
47
48         unrv2b(src, dst);
49 #endif
50
51         print_debug_cp_run("linxbios_ram.bin length = ", olen);
52
53         print_debug("Jumping to LinuxBIOS.\r\n");
54
55         __asm__ volatile (
56                 "xorl %ebp, %ebp\n\t" /* cpu_reset for hardwaremain dummy */
57                 "cli\n\t"
58                 "leal    _iseg, %edi\n\t"
59                 "jmp     *%edi\n\t"
60         );
61
62 }