9e8968510d36d4df28f759da3ea3cb57e778e15f
[coreboot.git] / src / arch / i386 / init / crt0.S.lb
1 /* -*- asm -*-
2  * $ $
3  *
4  */
5
6 /* 
7  * Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
8  *
9  * This file is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (at your option) any later version.
13  *
14  * Originally this code was part of ucl the data compression library
15  * for upx the ``Ultimate Packer of eXecutables''.
16  *
17  * - Converted to gas assembly, and refitted to work with etherboot.
18  *   Eric Biederman 20 Aug 2002
19  * - Merged the nrv2b decompressor into crt0.base of coreboot
20  *   Eric Biederman 26 Sept 2002
21  */
22
23
24 #include <arch/asm.h>
25 #include <arch/intel.h>
26 #include <console/loglevel.h>   
27
28 /*
29  * This is the entry code the code in .reset section
30  * jumps to this address.
31  *
32  */
33 .section ".rom.data", "a", @progbits
34 .section ".rom.text", "ax", @progbits
35
36         intel_chip_post_macro(0x01)             /* delay for chipsets */
37
38 #include "crt0_includes.h"
39
40 #if CONFIG_USE_DCACHE_RAM == 0
41 #ifndef CONSOLE_DEBUG_TX_STRING
42         /* uses:         esp, ebx, ax, dx */
43 # define __CRT_CONSOLE_TX_STRING(string) \
44         mov     string, %ebx    ; \
45         CALLSP(crt_console_tx_string)
46
47 # if defined(CONFIG_TTYS0_BASE) && (ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG)
48 #  define CONSOLE_DEBUG_TX_STRING(string)        __CRT_CONSOLE_TX_STRING(string)
49 # else
50 #  define CONSOLE_DEBUG_TX_STRING(string)
51 # endif
52 #endif
53
54         /* clear boot_complete flag */
55         xorl    %ebp, %ebp
56 __main:
57         CONSOLE_DEBUG_TX_STRING($str_copying_to_ram)
58
59         /*
60          *      Copy data into RAM and clear the BSS. Since these segments
61          *      isn\'t really that big we just copy/clear using bytes, not
62          *      double words.
63          */
64         intel_chip_post_macro(0x11)             /* post 11 */
65
66         cld                             /* clear direction flag */
67         
68         /* copy coreboot from it's initial load location to 
69          * the location it is compiled to run at.
70          * Normally this is copying from FLASH ROM to RAM.
71          */
72         movl    %ebp, %esi
73         /* FIXME: look for a proper place for the stack */
74         movl    $0x4000000, %esp
75         movl    %esp, %ebp
76         pushl %esi
77 #if CONFIG_CBFS == 1
78         pushl $str_coreboot_ram_name
79         call cbfs_and_run_core
80 #else
81         movl    $_liseg, %esi
82         movl    $_iseg,  %edi
83         movl    $_eiseg, %ecx
84         subl    %edi, %ecx
85         pushl %ecx
86         pushl %edi
87         pushl %esi
88         call copy_and_run_core
89 #endif
90
91 .Lhlt:  
92         intel_chip_post_macro(0xee)     /* post fe */
93         hlt
94         jmp     .Lhlt
95
96 #ifdef __CRT_CONSOLE_TX_STRING
97         /* Uses esp, ebx, ax, dx  */
98 crt_console_tx_string:
99         mov     (%ebx), %al
100         inc     %ebx
101         cmp     $0, %al
102         jne     9f
103         RETSP
104 9:
105 /* Base Address */
106 #ifndef CONFIG_TTYS0_BASE
107 #define CONFIG_TTYS0_BASE       0x3f8
108 #endif
109 /* Data */
110 #define TTYS0_RBR (CONFIG_TTYS0_BASE+0x00)
111
112 /* Control */
113 #define TTYS0_TBR TTYS0_RBR
114 #define TTYS0_IER (CONFIG_TTYS0_BASE+0x01)
115 #define TTYS0_IIR (CONFIG_TTYS0_BASE+0x02)
116 #define TTYS0_FCR TTYS0_IIR
117 #define TTYS0_LCR (CONFIG_TTYS0_BASE+0x03)
118 #define TTYS0_MCR (CONFIG_TTYS0_BASE+0x04)
119 #define TTYS0_DLL TTYS0_RBR
120 #define TTYS0_DLM TTYS0_IER
121
122 /* Status */
123 #define TTYS0_LSR (CONFIG_TTYS0_BASE+0x05)
124 #define TTYS0_MSR (CONFIG_TTYS0_BASE+0x06)
125 #define TTYS0_SCR (CONFIG_TTYS0_BASE+0x07)
126         
127         mov     %al, %ah
128 10:     mov     $TTYS0_LSR, %dx
129         inb     %dx, %al
130         test    $0x20, %al
131         je      10b
132         mov     $TTYS0_TBR, %dx
133         mov     %ah, %al
134         outb    %al, %dx
135
136         jmp crt_console_tx_string
137 #endif /* __CRT_CONSOLE_TX_STRING */
138
139 #if defined(CONSOLE_DEBUG_TX_STRING) && (ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG)
140 .section ".rom.data"
141 #if CONFIG_COMPRESS
142 str_copying_to_ram:  .string "Uncompressing coreboot to RAM.\r\n"
143 #else
144 str_copying_to_ram:  .string "Copying coreboot to RAM.\r\n"
145 #endif
146 str_pre_main:        .string "Jumping to coreboot.\r\n"
147 .previous
148
149 #endif /* ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG */
150
151 #if CONFIG_CBFS == 1
152 # if CONFIG_USE_FALLBACK_IMAGE == 1
153 str_coreboot_ram_name:  .string "fallback/coreboot_ram"
154 # else
155 str_coreboot_ram_name:  .string "normal/coreboot_ram"
156 # endif
157 #endif
158
159 #endif /* CONFIG_USE_DCACHE_RAM */