diff options
Diffstat (limited to 'contrib/syslinux-4.02/core/init.inc')
-rw-r--r-- | contrib/syslinux-4.02/core/init.inc | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/core/init.inc b/contrib/syslinux-4.02/core/init.inc new file mode 100644 index 0000000..e06ca96 --- /dev/null +++ b/contrib/syslinux-4.02/core/init.inc @@ -0,0 +1,133 @@ +; -*- 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 ax,dx + mov si,err_noram + mov cl,10 + 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 less than ' +.size db '000' + db 'K of low ("DOS")' + db CR, LF + db 'RAM. Syslinux needs at least this amount to boot. If you get' + db CR, LF + db 'this message in error, hold down the Ctrl key while' + db CR, LF + db 'booting, and I 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 |