diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-05-31 21:53:53 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-05-31 21:53:53 -0700 |
commit | 327c0dadf173e09348b967746925e995b2b6dfaf (patch) | |
tree | 2ff03fe2003d39c24fcbe87390ef17785cee0c73 | |
parent | 2f9949c8d0401557c9ca1679fb1d01948fb88b68 (diff) | |
parent | ba03136d0d40bf219b4923855a3a2b20c03babd7 (diff) | |
download | syslinux.git-327c0dadf173e09348b967746925e995b2b6dfaf.tar.gz syslinux.git-327c0dadf173e09348b967746925e995b2b6dfaf.tar.xz syslinux.git-327c0dadf173e09348b967746925e995b2b6dfaf.zip |
Merge branch 'syslinux-3.8x'
Conflicts:
NEWS
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | core/abort.inc | 1 | ||||
-rw-r--r-- | core/isolinux.asm | 41 | ||||
-rw-r--r-- | mbr/isohdpfx.S | 15 |
4 files changed, 40 insertions, 21 deletions
@@ -3,6 +3,10 @@ or EXTLINUX apply to that specific program only; other changes apply to all derivatives. Changes in 3.82: + * isohybrid: fix the -partok logic for loading from a partition. + * ISOLINUX: deal with systems which return from INT 13h with + interrupts disabled. + * Do not invoke the idle handler during large file loads. Changes in 3.81: * Shuffler: fix bug in real-mode entry. This affected a diff --git a/core/abort.inc b/core/abort.inc index d8cd7f24..5b16b9d9 100644 --- a/core/abort.inc +++ b/core/abort.inc @@ -34,6 +34,7 @@ dot_pause: ; abort_check: let the user abort with <ESC> or <Ctrl-C> ; abort_check: + call reset_idle ; Not idle despite pollchar call pollchar jz .ret1 pusha diff --git a/core/isolinux.asm b/core/isolinux.asm index 090999d2..2627c2df 100644 --- a/core/isolinux.asm +++ b/core/isolinux.asm @@ -108,20 +108,23 @@ GetlinsecPtr resw 1 ; The sector-read pointer BIOSName resw 1 ; Display string for BIOS type %define HAVE_BIOSNAME 1 BIOSType resw 1 -bsSecPerTrack resw 1 ; Used in hybrid mode -bsHeads resw 1 ; Used in hybrid mode DiskError resb 1 ; Error code for disk I/O DriveNumber resb 1 ; CD-ROM BIOS drive number ISOFlags resb 1 ; Flags for ISO directory search RetryCount resb 1 ; Used for disk access retries -_spec_start equ $ + alignb 8 +bsHidden resq 1 ; Used in hybrid mode +bsSecPerTrack resw 1 ; Used in hybrid mode +bsHeads resw 1 ; Used in hybrid mode + ; ; El Torito spec packet ; alignb 8 +_spec_start equ $ spec_packet: resb 1 ; Size of packet sp_media: resb 1 ; Media type sp_drive: resb 1 ; Drive number @@ -245,11 +248,15 @@ _start_hybrid: pop dx pop di pop es + xor eax,eax + xor ebx,ebx cmp sp,7C00h jae .nooffset - pop dword [cs:bsHidden] - pop dword [cs:bsHidden+4] + pop eax + pop ebx .nooffset: + mov [cs:bsHidden],eax + mov [cs:bsHidden+4],ebx mov si,bios_cbios jcxz _start_common @@ -703,20 +710,26 @@ writechr_simple: ret ; -; int13: save all the segment registers and call INT 13h -; Some CD-ROM BIOSes have been found to corrupt segment registers. +; int13: save all the segment registers and call INT 13h. +; Some CD-ROM BIOSes have been found to corrupt segment registers +; and/or disable interrupts. ; int13: - + pushf + push bp push ds push es push fs push gs int 13h + mov bp,sp + setc [bp+10] ; Propagate CF to the caller pop gs pop fs pop es pop ds + pop bp + popf ret ; @@ -778,8 +791,8 @@ getlinsec_ebios: push ds push ss pop ds ; DS <- SS - mov ah,42h ; Extended Read - int 13h + mov ah,42h ; Extended Read + call int13 pop ds popad lea sp,[si+16] ; Remove DAPA @@ -804,7 +817,7 @@ getlinsec_ebios: pushad ; Try resetting the device xor ax,ax mov dl,[DriveNumber] - int 13h + call int13 popad loop .retry ; CX-- and jump if not zero @@ -880,7 +893,7 @@ getlinsec_cbios: mov bp,retry_count .retry: pushad - int 13h + call int13 popad jc .error .resume: @@ -1060,9 +1073,7 @@ bios_cbios_str db 'CHDD', 0 bios_ebios_str db 'EHDD' ,0 %endif - alignz 8 -bsHidden dq 0 ; Used in hybrid mode - + alignz 4 bios_cdrom: dw getlinsec_cdrom, bios_cdrom_str %ifndef DEBUG_MESSAGES bios_cbios: dw getlinsec_cbios, bios_cbios_str diff --git a/mbr/isohdpfx.S b/mbr/isohdpfx.S index 375c846d..801115c3 100644 --- a/mbr/isohdpfx.S +++ b/mbr/isohdpfx.S @@ -48,9 +48,9 @@ isolinux_start_hybrid = 0x7c00+64+4 stack = 0x7c00 partoffset = (stack-8) driveno = (stack-14) -ebios_flag = (stack-16) +heads = (stack-16) sectors = (stack-18) -heads = (stack-20) +ebios_flag = (stack-20) secpercyl = (stack-24) BIOS_kbdflags = 0x417 @@ -138,18 +138,21 @@ next: jmp 1f 1: popw %dx - pushw %cx /* -16: Save EBIOS flag */ + pushw %cx /* EBIOS flag */ /* Get (C)HS geometry */ movb $0x08, %ah int $0x13 andw $0x3f, %cx /* Sector count */ - pushw %cx /* -18: Save sectors on the stack */ + popw %bx /* EBIOS flag */ + pushw %cx /* -16: Save sectors on the stack */ movzbw %dh, %ax /* dh = max head */ incw %ax /* From 0-based max to count */ - pushw %ax /* -20: Save heads on the stack */ + pushw %ax /* -18: Save heads on the stack */ mulw %cx /* Heads*sectors -> sectors per cylinder */ + pushw %bx /* -20: EBIOS flag */ + /* Save sectors/cylinder on the stack */ pushw %dx /* -22: High word */ pushw %ax /* -24: Low word */ @@ -177,7 +180,7 @@ next: jne bad_signature cli - movw $heads, %sp + movw $ebios_flag, %sp /* * Use a ljmpw here to work around a bug in some unknown version |