blob: 8c6a178f12a75b4c8fe766ceee256151e0c01acc [file] [log] [blame]
; -*- fundamental -*-
; -----------------------------------------------------------------------
;
; Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
; Copyright 2009 Intel Corporation; author: H. Peter Anvin
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
; Boston MA 02111-1307, USA; either version 2 of the License, or
; (at your option) any later version; incorporated herein by reference.
;
; -----------------------------------------------------------------------
;
; init.inc
;
; Common initialization code (inline)
;
section .text16
common_init:
; Initialize PM invocation framework
call pm_init
; Decompress PM code to its target location
pm_call pm_decompress
cmp eax,__pm_code_len
jne kaboom
;
; Initialize timer
;
call timer_init
;
; Initialize configuration information
;
call reset_config
;
; Set up the COMBOOT APIs
;
call comboot_setup_api
;
; Now set up screen parameters
;
call adjust_screen
;
; CPU-dependent initialization and related checks.
;
check_escapes:
mov ah,02h ; Check keyboard flags
int 16h
mov [KbdFlags],al ; Save for boot prompt check
test al,04h ; Ctrl->skip 386 check
jnz skip_checks
;
; Now check that there is sufficient low (DOS) memory
;
; NOTE: Linux doesn't use all of real_mode_seg, but we use the same
; segment for COMBOOT images, which can use all 64K
;
int 12h
mov edx,__lowmem_heap + min_lowmem_heap + 1023
shr edx,10
cmp ax,dx
jae enough_ram
mov si,err_noram
mov cl,10
push dx
div cl
add [si+err_noram.need-err_noram+2],ah
cbw
div cl
add [si+err_noram.need-err_noram],ax
pop ax
div cl
add [si+err_noram.size-err_noram+2],ah
cbw
div cl
add [si+err_noram.size-err_noram],ax
call writestr_early
jmp kaboom
enough_ram:
skip_checks:
section .data16
err_noram db 'It appears your computer has only '
.size db '000'
db 'K of low ("DOS") RAM.', CR, LF
db 'This version of Syslinux needs '
.need db '000'
db 'K to boot. If you get this', CR, LF
db 'message in error, hold down the Ctrl key while'
db 'booting, and I', CR, LF
db 'will take your word for it.', CR, LF, 0
section .text16
;
; The code to decompress the PM code and initialize other segments.
;
extern _lzo1x_decompress_asm_fast
section .textnr
bits 32
pm_decompress:
push 0 ; Space for decompressed size
push esp ; Pointer to previous word
push __pm_code_start ; Target address
push dword [lzo_data_size] ; Compressed size
push dword __pm_code_lma
call _lzo1x_decompress_asm_fast
add esp,16
pop RM_EAX ; Decompressed size
; Zero bss sections (but not .earlybss, since it may
; contain already-live data.)
xor eax,eax
mov edi,__bss_start
mov ecx,__bss_dwords
rep stosd
mov edi,__bss16_start
mov ecx,__bss16_dwords
rep stosd
mov edi,__high_clear_start ; .uibss, .auxseg, .lowmem
mov ecx,__high_clear_dwords
rep stosd
ret
section .data16
lzo_data_size dd 0 ; filled in by compressor
section .text16
bits 16