home *** CD-ROM | disk | FTP | other *** search
- ; >>> this is file LOADLINj.ASM
- ;============================================================================
- ; LOADLIN v1.6 (C) 1994..1996 Hans Lermen (lermen@elserv.ffm.fgan.de)
- ;
- ; 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; either version 2 of the License, or
- ; (at your option) any later version.
- ;
- ; This program is distributed in the hope that it will be useful,
- ; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ; GNU General Public License for more details.
- ;
- ; You should have received a copy of the GNU General Public License
- ; along with this program; if not, write to the Free Software
- ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ;
- ;----------------------------------------------------------------------------
- ; Comments and bug reports are welcome and may be sent to:
- ; E-Mail: lermen@elserv.ffm.fgan.de
- ; SnailMail: Hans Lermen
- ; Am Muehlenweg 38
- ; D53424 REMAGEN-Unkelbach
- ; GERMANY
- ;
- ;============================================================================
-
- check_VCPI_present proc near
- pushad
- push es
- push ds
- lea esp,[esp-4] ; local space
- @@stack struc
- @@handle dw ?
- dw ?
- @@ds dw ?
- @@es dw ?
- pushad_struc @@
- @@stack ends
- xor eax,eax ; check EMM_interrupt present
- mov [esp].@@eax,eax
- mov es,ax
- mov es,word ptr es:[emm_int*4+2]
- cmp Dword ptr es:[10+4],'0XXX'
- jne @@ex
- cmp dword ptr es:[10],'XMME'
- je @@ok
- cmp dword ptr es:[10],'QMME' ; this also works (as told by <J.S.Peatfield@damtp.cambridge.ac.uk>)
- jne @@ex
- @@ok:
- mov ax,4000h ; check emm menager status
- int emm_int
- or ah,ah
- jnz @@ex
- mov ax,_GET_VERSION*256 ; get version
- int emm_int
- cmp ax,40h ; version must be greater 4.0
- jb @@ex
-
- mov ax,_ALLOCATE_RAW_PAGES
- mov bx,4
- int emm_int
- cmp ah,0
- jnz @@ex
- mov word ptr [esp].@@handle,dx ; save handle
- mov ax,0DE00h ; check for VCPI present
- int emm_int
- cmp ah,0
- jne short @@notok
- mov byte ptr [esp].@@eax,1
- @@notok:
- mov dx,word ptr [esp].@@handle
- mov ax,_DEALLOCATE_PAGES*256
- int emm_int
- @@ex:
- lea esp,[esp+4] ; discar local space
- pop ds
- pop es
- popad
- or ax,ax
- ret
- check_VCPI_present endp
-
- get_VCPI_interface proc near
- push cs ;* buffer for server GDT entries
- push offset gdtvcpi_code ;*
- push cs ;* buffer for server page0
- push offset page0 ;*
- call get_protected_mode_interface
- ret
- get_VCPI_interface endp
-
-
- check_low_mem_mapping proc near
- call get_VCPI_interface
- xor edx,edx
- lea si,page0
- cld
- mov cx,(640/4)
- @@loop:
- lodsd
- and ax,0f000h
- cmp eax,edx
- jne @@ex_false
- add edx,1000h
- loop @@loop
- mov ax,1
- @@ex:
- or ax,ax
- ret
- @@ex_false:
- xor ax,ax
- jmp @@ex
- check_low_mem_mapping endp
-
-
- get_protected_mode_interface proc near
- ARG server_pagebuffer:dword,server_selectors:dword = returnpop
- push bp
- mov bp,sp
- push si
- push di
- push ds
- push es
-
- ; convert pagebuffer to linear address
- movzx eax,word ptr server_pagebuffer+2
- movzx ebx,word ptr server_pagebuffer
- shl eax,4
- add eax,ebx
- shr eax,4 ; make real mode address
-
- ;XXXXXXXXXX
- push ds
- mov es,ax ; ES = frame of server_pagebuf
- xor di,di ; ES:DI = >buffer for page0-table<
- lds si,server_selectors ; DS:DI = >3 GDT entries for VCPI
- ; calling VCPI server
- mov ax,0DE01h
- int emm_int
- pop ds
-
- ; save VCPI server entry for protected mode
- mov dword ptr server_vcpi_entry,ebx
- ; set the VCPI-Code selector
- mov word ptr server_vcpi_entry+4,g_vcpi_code
- ;XXXXXXXXXXX
-
-
-
- pop es
- pop ds
- pop di
- pop si
- pop bp
- ret returnpop
- get_protected_mode_interface endp
-
-
- try_biosintv proc near
- pushad
- mov ax,DOS_OPEN_FILE shl 8
- lea dx,@@fname
- DosInt
- jc @@ex_false
- mov bx,ax
- mov ax,4402h
- mov cx,size intv_buf
- lea dx,intv_buf
- DosInt
- pushf
- push ax
- DosCall DOS_CLOSE_FILE
- pop ax
- popf
- jc @@ex_false
- mov intv_size,ax
- mov ax,1
- @@ex:
- or ax,ax
- popad
- ret
- @@ex_false:
- xor ax,ax
- jmp @@ex
- @@fname db '$BIOSINT',0
- try_biosintv endp
-
- try_realbios proc near
- pushad
- mov ax,DOS_OPEN_FILE shl 8
- lea dx,@@fname_realbios
- DosInt
- jc @@ex_false
- mov bx,ax
- lea dx,intv_buf
- mov cx,realbios_end-intv_buf
- DosCall DOS_READ_FROM_HANDLE
- pushf
- push ax
- DosCall DOS_CLOSE_FILE
- pop ax
- popf
- jc @@ex_false
- cmp ax,realbios_end-intv_buf
- jne @@ex_false
- mov intv_size,ax
- cmp cs:option_rx,1
- je @@ex_true
- ; we now check the BIOS-revision to be sure
- ; that we have the right file
- push es
- mov ax,0ffffh
- mov es,ax
- mov eax,dword ptr es:[biosdate-reset_jmpop]
- cmp eax,dword ptr cs:biosdate
- jne @@ex_wrong_bios
- mov eax,dword ptr es:[(biosdate-reset_jmpop)+4]
- cmp eax,dword ptr cs:biosdate+4
- jne @@ex_wrong_bios
- ; we check the real_bios_magic
- cmp cs:real_bios_magic,0a5a5h
- jne @@ex_wrong_bios
- @@ex_true:
- mov ax,1
- pop es
- @@ex:
- or ax,ax
- popad
- ret
- @@ex_false:
- mov intv_size,0
- xor ax,ax
- jmp @@ex
- @@ex_wrong_bios:
- pop es
- mov wrong_realbios,1
- call force_error_verbose
- jmp @@ex_false
-
- @@fname_realbios db REALBIOS_FILE,0
- try_realbios endp
-
- get_default_bios_intvectors proc near
- cmp option_ja,0
- jnz @@first_javier
- cmp option_realbios,0
- jnz @@first_realbios
- call try_biosintv
- jnz @@ex
- call try_realbios
- @@ex:
- ret
- @@first_realbios:
- call try_realbios
- jnz @@ex
- call try_biosintv
- jmp @@ex
- @@first_javier:
- mov intv_size,0
- jmp @@ex
- get_default_bios_intvectors endp
-
-
- pmode_return_esp dd ? ; used to return from real-mode-switch
- real_IDTR dw 03ffh ;needed to load real intvector after switch
- dd 0
-
- pmode_task proc near
- ; We come here in protected mode via VCPI-CALL
- ; have only to set up all things to switch back to 386-realmode
- ;
- ; We follow the INTEL recomended procedure to do this
- ; (80386 Programmer's Reference Manual, Chapter 14.5)
- ;
- .386p
- CLI ; just to be sure
-
- ; 1. We know, that paging is enabled,
- ; that linear addresses have identical mapping
- ; so we can clear the PG bit
-
- mov eax,CR0
- and eax,07fffffffh
- mov CR0,eax ; paging is off
- xor eax,eax
- mov CR3,eax ; clear out paging cache
-
- ; 2. We must transfer control to segment with 64K limit
- ; we ARE on such a segment, no need to do it here
-
- ; 3. Load segment registers SS,DS,ES,FS,GS with a selector
- ; that points to a descriptor containing the the values:
- ; limit 64k = 0FFFFh
- ; byte granularity
- ; Expand up
- ; writable
- ; present
- ;
- ; We have that descriptor, its our gdt_data.
- mov ax,g_data
- mov ss,ax
- mov ds,ax
- mov es,ax
- mov fs,ax
- mov gs,ax
-
- ; 4. Disable Interrrupts
- ; ( we did that above )
- ; 5. Clear the PE bit in CR0
- mov eax,CR0
- and al,0feh
- mov CR0,eax ; we are go back to realmode
-
- ; 6. Flush the instruction queue and load CS with approritate value
- ;jmp far ptr @@here
- db 0EAh
- dw @@here
- reloc_hseg_1 dw High_Seg_
- @@here label far
-
- ; 7. Use LIDT instruction to load the base and limits of the
- ; real-mode interrupt vector table
- lidt fword ptr cs:real_IDTR
-
- .386
- ; 8. Enable interrupts (we are doing this later)
- ; 9. Load segment register
- mov ax,High_Seg_
- reloc_hseg_2 equ word ptr ($-2)
- mov ss,ax
- mov ds,ax
- mov es,ax
- mov fs,ax
- mov gs,ax
- mov esp,pmode_return_esp
- ; now we are in "real" real-mode
-
- call restore_bios_default_vectors
- @@ex:
- popad
- ret
- pmode_task endp
-
- iodelay macro
- jmp short $+2
- jmp short $+2
- endm
-
- get_mem_from_CMOS proc near
- pushf
- cli
- push bx
- mov al,18h
- out [070h],al
- dec al
- mov bl,al
- iodelay
- in al,[071h]
- mov ah,al
- mov al,bl
- iodelay
- out [070h],al
- iodelay
- in al,[071h] ; extended mem read from CMOS
- pop bx
- popf
- ret
- get_mem_from_CMOS endp
-
-
-
- restore_bios_default_vectors proc near
- push_ es,ds,ax,cx,si,di
- xor di,di
- mov es,di
- cmp cs:have_to_intercept_setup,0
- jz @@p2
- ; No REALBIOS or device driver
- cmp word ptr cs:intv_buf+(4*15h+2),0
- jne @@ex ; Only once
- mov eax,dword ptr es:[4*15h]
- mov dword ptr cs:intv_buf+(4*15h),eax
- call get_mem_from_CMOS
- mov cs:real_bios_int15,ax
- jmp @@p1
- @@p2:
- mov cx,cs:intv_size
- shr cx,2
- jcxz @@ex
- ; we now reset the intvector to bios-defaults
- push cs
- pop ds
- cmp cx,(size intv_buf)/4 ; have we REALBIOS
- jna @@1 ; no
- ; yes
- ; restoring BIOSdata also
- mov cx,(dummy_dos_data-intv_buf)/4
- @@1:
- lea si,intv_buf
- cld
- rep movsd
- cmp cs:intv_size,(size intv_buf) ; have we REALBIOS
- jna @@8 ; no
- ; yes, restoring BIOSscratch also
- mov di,09FC0h
- mov es,di
- xor di,di
- lea si,bios_scratch
- mov cx,(size bios_scratch)/4
- rep movsd
- ; now reprogram the PICs (8259A)
- ; (may be redirected by VCPI-client)
- mov al,11h ; enter programming mode
- out [20h],al ; master
- iodelay
- out [0A0h],al ; slave
- iodelay
- mov al,8 ; IRQ0..7 --> INT8..F
- out [21h],al ; master
- iodelay
- mov al,70h ; IRQ8..F --> INT70..77
- out [0A1h],al ; slave
- iodelay
- mov al,4 ; master bit
- out [21h],al ; master
- iodelay
- mov al,2 ; slave bit
- out [0A1h],al ; slave
- iodelay
- mov al,1 ; 8086 mode
- out [21h],al ; master
- iodelay
- out [0A1h],al ; slave
- iodelay
- mov al,cs:slaveIMR
- out [0A1h],al ; slave
- iodelay
- mov al,cs:masterIMR
- out [21h],al ; master
-
- @@p1: ; we hook on the INT15
- xor ax,ax
- mov es,ax
- mov word ptr es:[4*15h],offset our_int15
- mov word ptr es:[4*15h+2],cs
- ; now we must reinit the video controler
- ; to the values just set in the BIOS-data
- ; we do it by calling the appropriate INT 10h
- mov ax,3003h ; al = color mode
- and ah,byte ptr cs:bios_data+10h ; get EQUIPPEMENT-flags
- cmp ah,30h
- jne @@6
- mov al,7 ; al = mono mode
- @@6:
- xor ah,ah
- INT 10h
- @@8:
- push ds
- pop es
- @@ex:
- mov cs:intv_size,0 ; avoid second call
- pop_ es,ds,ax,cx,si,di
- ret
- restore_bios_default_vectors endp
-
-
- our_int15 proc near
- ; interrupt 15 hook, in case of realbios
- cmp ah,88h
- je @@we_do_it
- jmp dword ptr cs:intv_buf+(4*15H)
- @@we_do_it:
- mov ax,cs:real_bios_int15
- ;;;test mov ax,0c00h*4
- iret
- our_int15 endp
-
-
-
- switch_to_protected_mode_and_return_in_386realmode proc near
- ; NOTE: must have called get_VCPI_interface before this
- ;
- ; returns with interrpts disabled
- ; all registers preserved, all segment registers = "High_Seg"
- cmp cs:have_to_force_realmode,0
- jnz @@goon
- ret
- @@goon:
- mov cs:have_to_force_realmode,0
- pushad
- mov pmode_return_esp,esp
- lea ax,pmode_task
- movzx eax,ax
- mov dword ptr protected_mode_target,eax
- mov word ptr protected_mode_target+4,g_code
- movzx esi,High_Seg
- shl esi,4
- lea si,our_CR3[si]
- CLI
- mov ax,0DE0Ch
- int emm_int ; jumps to protected mode
- ; does NOT return here
- ; "pmode_task" does return directly to our caller
- switch_to_protected_mode_and_return_in_386realmode endp
-
-
- ; input:
- ; ES:DI pointer to string
- ; AL = terminating character
- ; output:
- ; AX= length of string, not counting terminating character
- ; all other registers preserved
- strlen proc near
- .8086
- push_ di,cx
- xor cx,cx
- dec cx
- cld
- repne scasb
- mov ax,di
- dec ax
- pop_ di,cx
- sub ax,di
- .386
- ret
- strlen endp
-
-
- get_kernel_version proc near
- ; Input:
- ; DS=CS
- ; Output:
- ; EAX= converted verion number as:
- ; 1.2.3 (root:pipapo) #4 ... ---> EAX= 01020304h
- ; 1.2.3 ---> EAX= 01020300h
- ; all other registers preserved
- xor eax,eax
- cmp have_to_intercept_setup,2
- jne @@ex
- cmp setup_header_version,0105h
- jb @@ex
- cmp kernel_version,0
- jz @@ex
- push_ esi,edx
- mov si,kernel_version
- lea si,setup_prog[si]
- call value_of
- mov edx,eax
- call value_of
- ror eax,8
- shld edx,eax,8
- call value_of
- ror eax,8
- shld edx,eax,8
- xor eax,eax
- cmp byte ptr [si-1],0 ; end of string ?
- je @@ex_
- cld
- @@loop:
- lodsb
- test ax,ax
- jz @@ex_
- cmp al,'#'
- jne @@loop
- call value_of
- ror eax,8
- @@ex_:
- shld edx,eax,8
- mov eax,edx
- pop_ esi,edx
- @@ex:
- ret
- get_kernel_version endp
-
- writechar proc near
- push_ eax,edx
- push eax
- mov byte ptr [esp+1],'$'
- mov dx,sp
- call print
- add sp,4
- pop_ eax,edx
- ret
- writechar endp
-
-
- writestring proc near
- cld
- @@1:
- lodsb
- test al,al
- jz @@ex
- call writechar
- loop @@1
- @@ex:
- ret
- writestring endp
-
- writehexdigit proc near
- push eax
- and al,0fh
- add al,'0'
- cmp al,'9'
- jna @@m1
- add al,'A'-('9'+1)
- @@m1:
- call writechar
- pop eax
- ret
- writehexdigit endp
-
- writehexbyte proc near
- push eax
- ror eax,4
- call writehexdigit
- rol eax,4
- call writehexdigit
- pop eax
- ret
- writehexbyte endp
-
-
- writehexword proc near
- push eax
- ror eax,8
- call writehexbyte
- rol eax,8
- call writehexbyte
- pop eax
- ret
- writehexword endp
-
-
- writehexdword proc near
- push eax
- ror eax,16
- call writehexword
- rol eax,16
- call writehexword
- pop eax
- ret
- writehexdword endp
-
-
- force_error_verbose proc near
- mov option_v,1
- mov option_t,1
- mov option_t_forced,1
- ret
- force_error_verbose endp
-
-
- get_effective_physmem proc near
- ; input: none
- ; output: EAX = number of total physical RAM in bytes
- ; (may be set by mem= param)
- cmp end_of_physmem,0
- jz @@continue
- mov eax,end_of_physmem
- ret
- @@continue:
- mov ah,88h
- cmp intv_size,15h*4
- jnb @@sim_int15
- cmp have_to_intercept_setup,0
- jz @@sim_int15_1
- call get_mem_from_CMOS
- jmp @@1
- ; we take int 15 as is, result may be wrong
- ; but Linux takes this as memory
- @@sim_int15_1:
- int 15h
- jmp @@1
- @@sim_int15:
- cmp wrong_realbios,0
- jne @@sim_int15_1
- cmp cs:real_bios_magic,0a5a5h ; have we a saved value
- jne @@sim_int15_2 ; no
- mov ax,cs:real_bios_int15 ; yes
- jmp @@1
- @@sim_int15_2:
- ; we take int 15 routine as saved by BIOSINTV
- ; hopefully this gets better result
- pushf
- cli
- push cs
- push offset @@1
- push dword ptr intv_buf+(15h*4)
- retf
- @@1:
- movzx eax,ax
- shl eax,10 ; now have extended mem in bytes
- add eax,100000h ; we add we 1Meg of conventional mem
- ret
- get_effective_physmem endp
-
-
-
- print_verbose proc near
- pushad
- push_ ds,es
-
- @@print macro tx
- lea dx,tx
- call print
- endm
- @@cr macro
- call print_crlf
- endm
- @@prints macro tx,count
- mov cx,count
- lea si,tx
- call writestring
- endm
- @@hexw macro v
- mov ax,v
- call writehexword
- endm
-
- @@print @@t1
- @@prints image_name,<size image_name>
- cmp have_to_intercept_setup,2
- jne @@m1
- cmp setup_header_version,0105h
- jb @@m1
- cmp kernel_version,0
- jz @@m1
- @@print @@t1_
- mov dx,kernel_version
- add dx,offset setup_prog
- call print
- @@m1:
- @@print @@t2
- @@hexw kernel_size
- cmp have_big_kernel,0
- jz @@m1_1
- @@print @@t2_big
- jmp @@m1_2
- @@m1_1:
- @@print @@t2_
- @@m1_2:
- @@hexw new_setup_size
- cmp setup_version,0201h
- jb @@m1_5
- test loadflags,CAN_USE_HEAP
- jz @@m1_5
- @@print @@t2_heap
- mov ax,heap_end_ptr
- sub ax,new_setup_size
- @@hexw ax
- @@m1_5:
- @@print @@v1
- @@hexw vga_mode
- @@print @@c2
- lea di,command_line
- xor ax,ax
- call strlen
- push ax
- call writehexword
- @@print @@c1
- pop cx
- @@prints command_line,cx
- @@cr
-
- @@verbose_stat:
- @@print @@t21
- mov eax,load_buffer_size
- call writehexdword
-
- movzx bx,high_mem_access
- shl bx,1
- mov dx,@@hmtable[bx]
- call print
-
- @@print @@t21_
- mov ax,maximum_setup_sects*512
- call writehexword
- cmp have_relocated_setup,0
- jz @@mmt22
- @@print @@t21_oc
- @@mmt22:
- cmp high_mem_access,0
- jz @@mmt23
- @@print @@t22low
- mov eax,heap_end
- sub eax,heap_ptr
- call writehexdword
- @@print @@t22low2
- @@mmt23:
- @@print @@t22
- call get_effective_physmem
- call writehexdword
-
-
- @@print @@t5
- lea dx,@@real_
- cmp cpu_type,cpu_386GE
- je @@3
- lea dx,@@real_p
- ja @@3
- lea dx,@@v86
- @@3:
- call print
- cmp wrong_realbios,0
- je @@3__
- @@print @@t6_
- lea dx,@@t6__
- jmp @@3_1
- @@3__:
- cmp intv_size,0
- jz @@3_1_
- lea dx,@@t6
- cmp intv_size,(size intv_buf) ; have we REALBIOS
- jna @@3_
- lea dx,@@t6_
- @@3_:
- call print
- lea dx,@@no
- cmp intv_size,0
- jz @@3_1
- lea dx,@@yes
- @@3_1:
- call print
- @@3_1_:
- @@print @@t7
- lea dx,@@no
- cmp have_to_intercept_setup,1
- jb @@3_2
- lea dx,@@setup_
- je @@3_2
- lea dx,@@setup
- call print
- mov ax,setup_version
- call writehexword
- jmp @@3_2_1
- @@3_2:
- call print
- @@3_2_1:
- @@print @@s
- mov bx,cpu_check_status
- mov dx,@@stable[bx]
- call print
- @@print @@cc2
- lea di,comline+1
- xor ax,ax
- call strlen
- push ax
- call writehexword
- @@print @@cc1
- pop cx
- @@prints comline+1,cx
- @@print @@started
- lea dx,@@rundos
- cmp can_exit_to_dos,0
- jnz @@4_1
- lea dx,@@runshell
- @@4_1:
- call print
-
- cmp cannot_load_because_of_windows,0
- jz @@5
- @@print @@sw
- @@5:
- cmp cpu_type,cpu_386GE_real_paging
- jne @@6
- @@print @@w1
- @@6:
-
- movzx eax,kernel_size
- shl eax,4
- cmp eax,load_buffer_size
- jb @@7
- @@print @@w2
- @@7:
- cmp new_setup_size,maximum_setup_sects*512
- jna @@8
- @@print @@w3
- @@8:
- cmp option_force,0
- jz @@8_1
- @@print @@w4
- @@8_1:
- pop_ ds,es
- popad
- ret
-
- @@t1 db 13,10,'Your current LINUX kernel boot configuration is:'
- db 13,10,' image file: $'
- @@t1_ db 13,10,' kernel version $'
- @@t2 db 13,10,' kernel size: 0x$'
- @@t2_ db '0 setup size: 0x$'
- @@t2_big db '0 (high loaded) setup size: 0x$'
- @@t2_heap db ', heap: 0x$'
-
- IF 0
- @@t3 db 13,10,' ram disk size: 0x$'
- @@t4 db 13,10,' root device: 0x$'
- @@tro db ' read only$'
- @@trw db ' read/write$'
- ENDIF
-
- @@v1 db 13,10,' VGA mode: 0x$'
- @@c2 db 13,10,' command line (size 0x$'
- @@c1 db '):'
- db 13,10,' $'
- @@t21 db 13,10,'Your current DOS/CPU configuration is:'
- db 13,10,' load buffer size: 0x$'
- @@hmtable dw @@lowtx,@@vcpitx,@@int15tx,@@xmstx
- @@lowtx db ' $'
- @@vcpitx db ' VCPI$'
- @@int15tx db ' EXT $'
- @@xmstx db ' XMS $'
- @@t21_ db ', setup buffer size: 0x$'
- @@t21_oc db ' (reloc setup)$'
- @@t22low db 13,10,' lowmem buffer: 0x$'
- @@t22low2 db ' (part of load buffer)$'
- @@t22 db 13,10,' total memory: 0x$'
- @@t5 db 13,10,' CPU is in $'
- @@t6 db ', BIOSINTV.SYS: $'
- @@t6_ db ', REALBIOS: $'
- @@t6__ db 'YES, but ROM-BIOS-DATE differs, must rerun REALBIOS.EXE$'
- @@t7 db 13,10,' SetupIntercept: $'
- @@yes db 'YES$'
- @@no db 'NO$'
- @@v86 db 'V86 mode$'
- @@real_ db 'REAL mode$'
- @@real_p db 'undocumented REAL PAGING mode, trying any way$'
- @@setup_ db 'YES, patching setup code$'
- @@setup db 'YES, legal intercept, setup header version $'
- @@s db 13,10,' stat$'
- @@s8 db '4: VCPI_present, physmap=logmap, all OK for switch to realmode$'
- @@s6 db '3: VCPI_present, but physmap != logmap (check aborted)$'
- @@s4 db '2: cpu_V86, but no VCPI available (check aborted)$'
- @@s2 db '1: cpu in real 386 mode, no need to backswitch$'
- @@s0 db '0: cpu < 386$'
- @@stable dw @@s0,@@s2,@@s4,@@s6,@@s8
- @@cc2 db 13,10,' input params (size 0x$'
- @@cc1 db '):'
- db 13,10,' $'
- @@started db 13,10,' LOADLIN started from $'
- @@rundos db 'DOS-prompt',13,10,'$'
- @@runshell db 'CONFIG.SYS (shell= ...)',13,10,'$'
- @@sw db ' You are running under MS-WINDOWS or Windows 95',13,10,'$'
- @@w1 db 'WARNING:',13,10
- db ' Your CPU is in realmode, but PAGING is enabled !',13,10
- db ' This is possible, but neither documented nor supported by INTEL.',13,10
- db " May be your motherboard's BIOS is mapping shadow ram this way,",13,10
- db ' or you are using one of those old and strange EMM managers,',13,10
- db ' but probably this is an indication of a not exactly compatible',13,10
- db ' 486 clone. If you are not using one of the older EMM-managers',13,10
- db ' you better should use the -clone switch to work around.',13,10,'$'
- @@w2 db 'WARNING: Not enough free memory (load buffer size)$',13,10
- @@w3 db 'WARNING: The setup buffer of LOADLIN is too small (must recompile)$',13,10
- @@w4 db 'WARNING: Option -f set, CPU-Check bypassed !$',13,10
-
- print_verbose_stat:
- pushad
- push_ ds,es
- jmp @@verbose_stat
- print_verbose endp
-
-
- close_debug_file proc near
- cmp debug_file_handle,0
- jz @@ex
- push_ ax,bx
- mov bx,debug_file_handle
- DosCall DOS_CLOSE_FILE
- mov debug_file_handle,0
- pop_ ax,bx
- @@ex:
- ret
- close_debug_file endp
-
-
- wait_and_reset_dsk proc near
- pushad
- push_ ds,es,fs,gs
- pushf
- sti
- cmp cs:option_dskreset,0
- jz @@wait
- mov ax,0
- mov dl,80h ; reset the whole disk system
- int 13h
- cmp cs:option_wait,0
- jnz @@wait
- mov cs:option_wait,9 ; wait at least 1/2 a second
- @@wait:
- cmp cs:option_wait,0
- jz @@ex
- cli
- mov ax,40h
- mov ds,ax
- movzx eax,cs:option_wait
- add eax,dword ptr ds:[6ch]
- sti
- nop
- @@loop:
- nop
- cli
- cmp eax,dword ptr ds:[6ch]
- sti
- ja @@loop
- @@ex:
- popf
- pop_ ds,es,fs,gs
- popad
- ret
- wait_and_reset_dsk endp
-
-
- ;=============================================================================
- logo_tx label byte
- IFDEF ALPHA
- INCLUDE LOADLINA.ASM
- ENDIF
- db 'LOADLIN v',LOADLIN_VERSION,' (C) 1994..1996 Hans Lermen <lermen@elserv.ffm.fgan.de>',13,10,'$'
- comspec_tx db 'comspec',0
- windows_tx db 'windir',0
- err_uppermem_tx db 'Not enough free memory between 90000h and 9ffffh,',13,10
- db 'may be you have some zombie programs, try to reboot.',13,10
- db "If this doesn't help, try to find out what driver occupies this space."
- newline_tx db 13,10,'$'
- enter_commandline_tx db 'Please enter name of kernel image file followed by optional ',13,10
- db 'command line parameters for Linux (e.g. root=XXXX)',13,10
- db 'or @file ( file = param file ) or "empty string" to abort:',13,10,'$'
- abort_tx db 'LOADLIN aborted by user',13,10,'$'
- err_file_notfound_tx db 'Image file not found,',13,10,'$'
- enter_file_tx db 'enter file name of Image:',13,10,'$'
- err_wrong_file_tx db 'not an Image file,',13,10,'$'
- err_wrong_setup_tx db 'Your current configuration needs interception of "setup.S,"',13,10
- db 'but the setup-code in your Image file is *very* old (or wrong)',13,10
- db 'Please use BIOSINTV/REALBIOS or try an other Image file',13,10,'$'
- err_setup_too_long_tx db 'Ooops..., size of "setup.S" has become too long for LOADLIN,',13,10
- db 'please E-mail this condition to lermen@elserv.ffm.fgan.de !',13,10,'$'
- err_kernel_to_big_tx db 'not enough memory below 90000h to load kernel',13,10,'$'
- err_io_tx db 'IO Error during load',13,10,'$'
- insert_floppy_tx db 'Insert floppy disk for loading into RAMDISK',13,10,'$'
- err_cpu_v86_tx db 13,10,'CPU is in V86-mode (may be WINDOWS, EMM386, QEMM, 386MAX, ...)',13,10
- db 'You need pure 386/486 real mode or a VCPI server to boot Linux',13,10
- db 'VCPI is supported by most EMS drivers (if EMS is enabled),',13,10
- db "but never under WINDOWS-3.1 or WINDOWS'95.",13,10
- db "(However, real DOS-Mode of WINDOWS'95 can have EMS driver with VCPI)",13,10
- db 'If loading via VCPI you also MUST have:',13,10
- db ' 1. An interceptable setup-code (see MANUAL.TXT)',13,10
- db ' 2. Identical Physical-to-Virtual mapping for the first 640 Kbytes',13,10,'$'
- err_wrong_cpu_tx db 'You need a 386 CPU at minimum, but you haven''t !',13,10,'$'
- err_comfile_tx db 'error on reading command line response file',13,10,'$'
- option_t_terminate_tx db 13,10,'Option -t set, Linux not loaded',13,10,'$'
- option_t_forced_tx db 13,10,'ERROR detected, Linux not loaded',13,10,'$'
- err_in_config_sys_tx db 13,10,'LOADLIN holding in idle loop (You must reboot)',13,10,'$'
- ;-----------------------------------------------------------------------------
- usage_tx db 13,10
- db 'USAGE:',13,10
- db ' LOADLIN @params',13,10
- db ' LOADLIN [zimage_file] [options] [boot_params]',13,10
- db ' without any params, LOADLIN displays this help message.',13,10
- db ' @params:',13,10
- db ' params is a DOS file containing all other options',13,10
- db ' zimage_file:',13,10
- db ' DOS file name of compressed Linux kernel image',13,10
- db ' options:',13,10
- db ' -v verbose, show information on params and configuration',13,10
- db ' -t test mode, do all but starting Linux, also sets -v',13,10
- db ' -d file debug mode, same as -t, but duplicates output to "file"',13,10
- db " -clone ( Please read MANUAL.TXT before using this switch! )",13,10
- db " -n no translation for root=/dev/...",13,10
- db " -txmode switch to textmode 80x25 on startup",13,10
- db " -noheap disable use of setup heap",13,10
- db " -wait=nn after loading wait nn (DOS)ticks before booting Linux",13,10
- db " -dskreset after loading reset all disks before booting Linux",13,10
- db ' boot_params:',13,10
- db ' root=xxx filesystem to be mounted by Linux as "/"',13,10
- db ' (string passed unchanged to the kernel)',13,10
- db ' xxx = hex number (e.g. root=201 for /dev/fd1)',13,10
- db ' = /dev/mmmn (e.g. root=/dev/hda2)',13,10
- db ' mmm = fd,hda,hdb,sda,sdb...',13,10
- db ' n = 1..10.. decimal',13,10
- db ' ro mount "/" readonly',13,10
- db ' rw mount "/" read/write',13,10
- db ' initrd=x (for kernels > 1.3.72) load file x into /dev/ram. If FS in x',13,10
- db ' contains /linuxrc, execute it, and then remount to root=xxx.',13,10
- db ' If root=/dev/ram, just load, bypass execution of /linuxrc',13,10,13,10
- db ' for more boot params see PARAMS.TXT or Paul Gortmakers HOWTO:',13,10
- db ' http://sunsite.unc.edu/mdw/HOWTO/BootPrompt-HOWTO.html',13,10
- db ' http://rsphy1.anu.edu/~gpg109/BootPrompt-HOWTO.html',13,10
- empty_tx db '$'
-
-