7 * Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer
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.
14 * Originally this code was part of ucl the data compression library
15 * for upx the ``Ultimate Packer of eXecutables''.
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 LinuxBIOS
20 * Eric Biederman 26 Sept 2002
25 #include <arch/intel.h>
26 #include <console/loglevel.h>
29 * This is the entry code the code in .reset section
30 * jumps to this address.
33 .section ".rom.data", "a", @progbits
34 .section ".rom.text", "ax", @progbits
36 intel_chip_post_macro(0x01) /* delay for chipsets */
38 #include "crt0_includes.h"
40 /* uses: esp, ebx, ax, dx */
41 #define __CONSOLE_TX_STRING(string) \
43 CALLSP(console_tx_string)
45 #if ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG
46 #define CONSOLE_DEBUG_TX_STRING(string) __CONSOLE_TX_STRING(string)
48 #define CONSOLE_DEBUG_TX_STRING(string)
51 /* clear boot_complete flag */
54 CONSOLE_DEBUG_TX_STRING($str_copying_to_ram)
57 * Copy data into RAM and clear the BSS. Since these segments
58 * isn\'t really that big we just copy/clear using bytes, not
61 intel_chip_post_macro(0x11) /* post 11 */
63 cld /* clear direction flag */
65 /* copy linuxBIOS from it's initial load location to
66 * the location it is compiled to run at.
67 * Normally this is copying from FLASH ROM to RAM.
78 movl %ebp, %esp /* preserve %ebp */
79 movl $-1, %ebp /* last_m_off = -1 */
82 /* ------------- DECOMPRESSION -------------
101 subl $-4, %esi /* sets carry flag */
106 decompr_literals_n2b:
115 jc decompr_literals_n2b
117 incl %eax /* m_off = 1 */
120 adcl %eax, %eax /* m_off = m_off*2 + getbit() */
122 jnc loop1_n2b /* while(!getbit()) */
125 jb decompr_ebpeax_n2b /* if (m_off == 2) goto decompr_ebpeax_n2b ? */
127 movb (%esi), %al /* m_off = (m_off - 3)*256 + src[ilen++] */
130 jz decompr_end_n2b /* if (m_off == 0xffffffff) goto decomp_end_n2b */
131 movl %eax, %ebp /* last_m_off = m_off ?*/
134 adcl %ecx, %ecx /* m_len = getbit() */
136 adcl %ecx, %ecx /* m_len = m_len*2 + getbit()) */
137 jnz decompr_got_mlen_n2b /* if (m_len == 0) goto decompr_got_mlen_n2b */
138 incl %ecx /* m_len++ */
141 adcl %ecx, %ecx /* m_len = m_len*2 + getbit() */
143 jnc loop2_n2b /* while(!getbit()) */
145 incl %ecx /* m_len += 2 */
146 decompr_got_mlen_n2b:
148 adcl $1, %ecx /* m_len = m_len + 1 + (last_m_off > 0xd00) */
150 leal (%edi,%ebp), %esi /* m_pos = dst + olen + -m_off */
152 movsb /* dst[olen++] = *m_pos++ while(m_len > 0) */
156 intel_chip_post_macro(0x12) /* post 12 */
161 CONSOLE_DEBUG_TX_STRING($str_pre_main)
166 intel_chip_post_macro(0xee) /* post fe */
170 #if ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG
171 /* Uses esp, ebx, ax, dx */
181 #define TTYS0_BASE 0x3f8
184 #define TTYS0_RBR (TTYS0_BASE+0x00)
187 #define TTYS0_TBR TTYS0_RBR
188 #define TTYS0_IER (TTYS0_BASE+0x01)
189 #define TTYS0_IIR (TTYS0_BASE+0x02)
190 #define TTYS0_FCR TTYS0_IIR
191 #define TTYS0_LCR (TTYS0_BASE+0x03)
192 #define TTYS0_MCR (TTYS0_BASE+0x04)
193 #define TTYS0_DLL TTYS0_RBR
194 #define TTYS0_DLM TTYS0_IER
197 #define TTYS0_LSR (TTYS0_BASE+0x05)
198 #define TTYS0_MSR (TTYS0_BASE+0x06)
199 #define TTYS0_SCR (TTYS0_BASE+0x07)
202 10: mov $TTYS0_LSR, %dx
210 jmp console_tx_string
213 str_copying_to_ram: .string "Copying LinuxBIOS to ram.\r\n"
214 str_pre_main: .string "Jumping to LinuxBIOS.\r\n"
217 #endif /* ASM_CONSOLE_LOGLEVEL > BIOS_DEBUG */