diff options
author | Jonathan Maw <jonathan.maw@codethink.co.uk> | 2012-11-29 10:15:17 +0000 |
---|---|---|
committer | Jonathan Maw <jonathan.maw@codethink.co.uk> | 2012-11-29 10:15:17 +0000 |
commit | ede8500d7c710e4ddf650f1a1ef3ccf2a89e5313 (patch) | |
tree | 9ad9a12392d6011d384182008cccb0665748cff0 /core | |
parent | 38dcca25c8855c95649e3f0b5b09fae862ed5c7a (diff) | |
parent | a0ded54115637b7d239867a79095d20781bb0014 (diff) | |
download | syslinux-ede8500d7c710e4ddf650f1a1ef3ccf2a89e5313.tar.gz |
Merge tag 'syslinux-4.05' into ct/genivi/morph
syslinux-4.05
Diffstat (limited to 'core')
-rw-r--r-- | core/Makefile | 5 | ||||
-rw-r--r-- | core/diskboot.inc | 2 | ||||
-rw-r--r-- | core/diskfs.inc | 4 | ||||
-rw-r--r-- | core/diskstart.inc | 40 | ||||
-rw-r--r-- | core/head.inc | 4 | ||||
-rw-r--r-- | core/init.inc | 24 | ||||
-rw-r--r-- | core/isolinux.asm | 173 | ||||
-rw-r--r-- | core/ui.inc | 7 |
8 files changed, 52 insertions, 207 deletions
diff --git a/core/Makefile b/core/Makefile index 33ad7e95..112fe3a8 100644 --- a/core/Makefile +++ b/core/Makefile @@ -20,7 +20,8 @@ MAKEFLAGS += -r MAKE += -r topdir = .. -include $(topdir)/MCONFIG.embedded +MAKEDIR = $(topdir)/mk +include $(MAKEDIR)/embedded.mk -include $(topdir)/version.mk OPTFLAGS = @@ -109,7 +110,7 @@ ldlinux.bss: ldlinux.bin dd if=$< of=$@ bs=512 count=1 ldlinux.sys: ldlinux.bin - dd if=$< of=$@ bs=512 skip=1 + dd if=$< of=$@ bs=512 skip=2 codepage.cp: ../codepage/$(CODEPAGE).cp cp -f $< $@ diff --git a/core/diskboot.inc b/core/diskboot.inc index 68672e4a..141986e8 100644 --- a/core/diskboot.inc +++ b/core/diskboot.inc @@ -278,7 +278,7 @@ Sect1Ptr1 equ $-4 cmp dword [ldlinux_magic+4],LDLINUX_MAGIC^HEXDATE jne kaboom - ; Go for it! This also normalizes CS:IP. + ; Go for it! jmp ldlinux_ent ; diff --git a/core/diskfs.inc b/core/diskfs.inc index fc80a153..41391e7f 100644 --- a/core/diskfs.inc +++ b/core/diskfs.inc @@ -30,8 +30,8 @@ LDLINUX_MAGIC equ 0x3eb202fe ; A random number to identify ourselves with ; This indicates the general format of the last few bytes in the boot sector BS_MAGIC_VER equ 0x1b << 9 -SECTOR_SHIFT equ 9 -SECTOR_SIZE equ (1 << SECTOR_SHIFT) +MIN_SECTOR_SHIFT equ 9 +MIN_SECTOR_SIZE equ (1 << MIN_SECTOR_SHIFT) ; ; The following structure is used for "virtual kernels"; i.e. LILO-style diff --git a/core/diskstart.inc b/core/diskstart.inc index 02505a6b..b2ef2b63 100644 --- a/core/diskstart.inc +++ b/core/diskstart.inc @@ -23,6 +23,14 @@ Sect1Ptr1_VAL equ 0xfeedface %include "diskboot.inc" ; =========================================================================== +; Padding after the (minimum) 512-byte boot sector so that the rest of +; the file has aligned sectors, even if they are larger than 512 bytes. +; =========================================================================== + + section .init +align_pad zb 512 + +; =========================================================================== ; Start of LDLINUX.SYS ; =========================================================================== @@ -110,13 +118,15 @@ ldlinux_ent: ; Checksum data thus far ; mov si,ldlinux_sys - mov cx,SECTOR_SIZE >> 2 + mov cx,[bsBytesPerSec] + shr cx,2 mov edx,-LDLINUX_MAGIC .checksum: lodsd add edx,eax loop .checksum mov [CheckSum],edx ; Save intermediate result + movzx ebx,si ; Start of the next sector ; ; Tell the user if we're using EBIOS or CBIOS @@ -132,6 +142,7 @@ print_bios: call writestr_early section .earlybss + alignb 2 %define HAVE_BIOSNAME 1 BIOSName resw 1 @@ -140,8 +151,9 @@ BIOSName resw 1 ; Now we read the rest of LDLINUX.SYS. ; load_rest: + push bx ; LSW of load address + lea esi,[SectorPtrs] - mov ebx,TEXT_START+2*SECTOR_SIZE ; Where we start loading mov cx,[DataSectors] dec cx ; Minus this sector @@ -157,7 +169,7 @@ load_rest: xor bx,bx call getlinsec pop ebx - shl ebp,SECTOR_SHIFT + imul bp,[bsBytesPerSec] ; Will be < 64K add ebx,ebp add si,10 jmp .get_chunk @@ -170,9 +182,11 @@ load_rest: ; by the time we get to the end it should all cancel out. ; verify_checksum: - mov si,ldlinux_sys + SECTOR_SIZE - mov ecx,[LDLDwords] - sub ecx,SECTOR_SIZE >> 2 + pop si ; LSW of load address + movzx eax,word [bsBytesPerSec] + shr ax,2 + mov ecx,[LDLDwords] ; Total dwords + sub ecx,eax ; ... minus one sector mov eax,[CheckSum] .checksum: add eax,[si] @@ -260,7 +274,7 @@ getlinsec_ebios: add eax,edi ; Advance sector pointer adc edx,0 sub bp,di ; Sectors left - shl di,SECTOR_SHIFT ; 512-byte sectors + imul di,[bsBytesPerSec] add bx,di ; Advance buffer pointer and bp,bp jnz .loop @@ -350,7 +364,7 @@ getlinsec_cbios: jc .error .resume: movzx ecx,al ; ECX <- sectors transferred - shl ax,SECTOR_SHIFT ; Convert sectors in AL to bytes in AX + imul ax,[bsBytesPerSec] ; Convert sectors in AL to bytes in AX pop bx add bx,ax pop bp @@ -418,10 +432,10 @@ safedumpregs: rl_checkpt equ $ ; Must be <= 8000h -rl_checkpt_off equ ($-$$) +rl_checkpt_off equ $-ldlinux_sys %ifndef DEPEND - %if rl_checkpt_off > 3F6h ; Need one extent - %assign rl_checkpt_overflow rl_checkpt_off - 3F6h + %if rl_checkpt_off > 512-10 ; Need minimum one extent + %assign rl_checkpt_overflow rl_checkpt_off - (512-10) %error Sector 1 overflow by rl_checkpt_overflow bytes %endif %endif @@ -434,8 +448,8 @@ rl_checkpt_off equ ($-$$) ; alignz 2 MaxInitDataSize equ 96 << 10 -MaxLMA equ TEXT_START+SECTOR_SIZE+MaxInitDataSize -SectorPtrs zb 10*(MaxInitDataSize >> SECTOR_SHIFT) +MaxLMA equ LDLINUX_SYS+MaxInitDataSize +SectorPtrs zb 10*(MaxInitDataSize >> MIN_SECTOR_SHIFT) SectorPtrsEnd equ $ ; ---------------------------------------------------------------------------- diff --git a/core/head.inc b/core/head.inc index 18ce132c..71eb5744 100644 --- a/core/head.inc +++ b/core/head.inc @@ -20,8 +20,8 @@ %ifndef _HEAD_INC %define _HEAD_INC -%if __NASM_MAJOR__ < 2 - %error "NASM 2.00 or later required to compile correctly" +%if __NASM_MAJOR__ < 2 || (__NASM_MAJOR__ == 2 && __NASM_MINOR__ < 3) + %error "NASM 2.03 or later required to compile correctly" %endif %include "macros.inc" diff --git a/core/init.inc b/core/init.inc index e06ca96f..8c6a178f 100644 --- a/core/init.inc +++ b/core/init.inc @@ -69,9 +69,15 @@ check_escapes: shr edx,10 cmp ax,dx jae enough_ram - mov ax,dx 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 @@ -83,15 +89,15 @@ enough_ram: skip_checks: section .data16 -err_noram db 'It appears your computer has less than ' +err_noram db 'It appears your computer has only ' .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 + 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 ; diff --git a/core/isolinux.asm b/core/isolinux.asm index ca8ee3a3..7a871f0e 100644 --- a/core/isolinux.asm +++ b/core/isolinux.asm @@ -52,22 +52,6 @@ vk_append: resb max_cmd_len+1 ; Command line vk_end: equ $ ; Should be <= vk_size endstruc -; -; File structure. This holds the information for each currently open file. -; - struc open_file_t -file_sector resd 1 ; Sector pointer (0 = structure free) -file_bytesleft resd 1 ; Number of bytes left -file_left resd 1 ; Number of sectors left - resd 1 ; Unused - endstruc - -%ifndef DEPEND -%if (open_file_t_size & (open_file_t_size-1)) -%error "open_file_t is not a power of 2" -%endif -%endif - ; --------------------------------------------------------------------------- ; BEGIN CODE ; --------------------------------------------------------------------------- @@ -1195,138 +1179,6 @@ ROOT_FS_OPS: ; %include "ui.inc" -; -; Enable disk emulation. The kind of disk we emulate is dependent on the -; size of the file: 1200K, 1440K or 2880K floppy, otherwise harddisk. -; -is_disk_image: - TRACER CR - TRACER LF - TRACER 'D' - TRACER ':' - - mov edx,eax ; File size - mov di,img_table - mov cx,img_table_count - mov eax,[si+file_sector] ; Starting LBA of file - mov [dsp_lba],eax ; Location of file - mov byte [dsp_drive], 0 ; 00h floppy, 80h hard disk -.search_table: - TRACER 't' - mov eax,[di+4] - cmp edx,[di] - je .type_found - add di,8 - loop .search_table - - ; Hard disk image. Need to examine the partition table - ; in order to deduce the C/H/S geometry. Sigh. -.hard_disk_image: - TRACER 'h' - cmp edx,512 - jb .bad_image - - mov bx,trackbuf - mov cx,1 ; Load 1 sector - pm_call getfssec - - cmp word [trackbuf+510],0aa55h ; Boot signature - jne .bad_image ; Image not bootable - - mov cx,4 ; 4 partition entries - mov di,trackbuf+446 ; Start of partition table - - xor ax,ax ; Highest sector(al) head(ah) - -.part_scan: - cmp byte [di+4], 0 - jz .part_loop - lea si,[di+1] - call .hs_check - add si,byte 4 - call .hs_check -.part_loop: - add di,byte 16 - loop .part_scan - - push eax ; H/S - push edx ; File size - mov bl,ah - xor bh,bh - inc bx ; # of heads in BX - xor ah,ah ; # of sectors in AX - cwde ; EAX[31:16] <- 0 - mul bx - shl eax,9 ; Convert to bytes - ; Now eax contains the number of bytes per cylinder - pop ebx ; File size - xor edx,edx - div ebx - and edx,edx - jz .no_remainder - inc eax ; Fractional cylinder... - ; Now (e)ax contains the number of cylinders -.no_remainder: cmp eax,1024 - jna .ok_cyl - mov ax,1024 ; Max possible # -.ok_cyl: dec ax ; Convert to max cylinder no - pop ebx ; S(bl) H(bh) - shl ah,6 - or bl,ah - xchg ax,bx - shl eax,16 - mov ah,bl - mov al,4 ; Hard disk boot - mov byte [dsp_drive], 80h ; Drive 80h = hard disk - -.type_found: - TRACER 'T' - mov bl,[sp_media] - and bl,0F0h ; Copy controller info bits - or al,bl - mov [dsp_media],al ; Emulation type - shr eax,8 - mov [dsp_chs],eax ; C/H/S geometry - mov ax,[sp_devspec] ; Copy device spec - mov [dsp_devspec],ax - mov al,[sp_controller] ; Copy controller index - mov [dsp_controller],al - - TRACER 'V' - call vgaclearmode ; Reset video - - mov ax,4C00h ; Enable emulation and boot - mov si,dspec_packet - mov dl,[DriveNumber] - lss sp,[InitStack] - TRACER 'X' - - call int13 - - ; If this returns, we have problems -.bad_image: - mov si,err_disk_image - call writestr - jmp enter_command - -; -; Look for the highest seen H/S geometry -; We compute cylinders separately -; -.hs_check: - mov bl,[si] ; Head # - cmp bl,ah - jna .done_track - mov ah,bl ; New highest head # -.done_track: mov bl,[si+1] - and bl,3Fh ; Sector # - cmp bl,al - jna .done_sector - mov al,bl -.done_sector: ret - - - ; ----------------------------------------------------------------------------- ; Common modules ; ----------------------------------------------------------------------------- @@ -1352,33 +1204,8 @@ err_disk_image db 'Cannot load disk image (invalid file)?', CR, LF, 0 ; alignz 4 exten_table: db '.cbt' ; COMBOOT (specific) - db '.img' ; Disk image db '.bin' ; CD boot sector db '.com' ; COMBOOT (same as DOS) db '.c32' ; COM32 exten_table_end: dd 0, 0 ; Need 8 null bytes here - -; -; Floppy image table -; - alignz 4 -img_table_count equ 3 -img_table: - dd 1200*1024 ; 1200K floppy - db 1 ; Emulation type - db 80-1 ; Max cylinder - db 15 ; Max sector - db 2-1 ; Max head - - dd 1440*1024 ; 1440K floppy - db 2 ; Emulation type - db 80-1 ; Max cylinder - db 18 ; Max sector - db 2-1 ; Max head - - dd 2880*1024 ; 2880K floppy - db 3 ; Emulation type - db 80-1 ; Max cylinder - db 36 ; Max sector - db 2-1 ; Max head diff --git a/core/ui.inc b/core/ui.inc index 0a4bb569..631860f8 100644 --- a/core/ui.inc +++ b/core/ui.inc @@ -681,11 +681,8 @@ is_bad_image: %else is_bss_sector equ is_bad_image %endif -%if IS_ISOLINUX - ; ok -%else -is_disk_image equ is_bad_image -%endif + +is_disk_image equ is_bad_image ; No longer supported section .data16 boot_prompt db 'boot: ', 0 |