Merge commit 'syslinux-3.60-pre6' into gpxe-support
[profile/ivi/syslinux.git] / cpuinit.inc
1 ;; -----------------------------------------------------------------------
2 ;;
3 ;;   Copyright 1994-2002 H. Peter Anvin - All Rights Reserved
4 ;;
5 ;;   This program is free software; you can redistribute it and/or modify
6 ;;   it under the terms of the GNU General Public License as published by
7 ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
8 ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
9 ;;   (at your option) any later version; incorporated herein by reference.
10 ;;
11 ;; -----------------------------------------------------------------------
12
13 ;;
14 ;; cpuinit.inc
15 ;;
16 ;; CPU-dependent initialization and related checks.
17 ;;
18
19 check_escapes:
20                 mov ah,02h                      ; Check keyboard flags
21                 int 16h
22                 mov [KbdFlags],al               ; Save for boot prompt check
23                 test al,04h                     ; Ctrl->skip 386 check
24                 jnz skip_checks
25
26 ;
27 ; Now check that there is sufficient low (DOS) memory
28 ;
29 ; NOTE: Linux doesn't use all of real_mode_seg, but we use the same
30 ; segment for COMBOOT images, which can use all 64K
31 ;
32 dosram_k        equ (real_mode_seg+0x1000) >> 6 ; Minimum DOS memory (K)
33                 int 12h
34                 cmp ax,dosram_k
35                 jae enough_ram
36                 mov si,err_noram
37                 call writestr
38                 jmp kaboom
39 enough_ram:
40 skip_checks:
41
42 ;
43 ; Initialize the bcopy32 code in low memory
44 ;
45                 mov si,section..bcopy32.start
46                 mov di,__bcopy_start
47                 mov cx,__bcopy_size >> 2
48                 rep movsd
49
50 ;
51 ; Check if we're 386 (as opposed to 486+); if so we need to blank out
52 ; the WBINVD instruction
53 ;
54 ; We check for 486 by setting EFLAGS.AC
55 ;
56 %if DO_WBINVD
57                 pushfd                          ; Save the good flags
58                 pushfd
59                 pop eax
60                 mov ebx,eax
61                 xor eax,(1 << 18)               ; AC bit
62                 push eax
63                 popfd
64                 pushfd
65                 pop eax
66                 popfd                           ; Restore the original flags
67                 xor eax,ebx
68                 jnz is_486
69 ;
70 ; 386 - Looks like we better blot out the WBINVD instruction
71 ;
72                 mov byte [try_wbinvd],0c3h              ; Near RET
73 is_486:
74 %endif  ; DO_WBINVD
75
76                 section .data
77 err_noram       db 'It appears your computer has less than '
78                 asciidec dosram_k
79                 db 'K of low ("DOS")'
80                 db CR, LF
81                 db 'RAM.  Linux needs at least this amount to boot.  If you get'
82                 db CR, LF
83                 db 'this message in error, hold down the Ctrl key while'
84                 db CR, LF
85                 db 'booting, and I will take your word for it.', CR, LF, 0
86                 section .text