aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-05-31 21:55:09 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-05-31 21:55:09 -0700
commitf502c307fcace74e8c99774112016150e8a7a01a (patch)
treebb653df246d37ae1f630f43be21bfe087186ab3b
parent651fc2a11d8a95e8d8f9e5aa6f788c2b030499f4 (diff)
parent327c0dadf173e09348b967746925e995b2b6dfaf (diff)
downloadsyslinux-f502c307fcace74e8c99774112016150e8a7a01a.tar.gz
syslinux-f502c307fcace74e8c99774112016150e8a7a01a.tar.xz
syslinux-f502c307fcace74e8c99774112016150e8a7a01a.zip
Merge branch 'master' into core32
Conflicts: core/isolinux.asm
-rw-r--r--NEWS4
-rw-r--r--core/abort.inc1
-rw-r--r--core/isolinux.asm35
-rw-r--r--mbr/isohdpfx.S15
4 files changed, 37 insertions, 18 deletions
diff --git a/NEWS b/NEWS
index d0453c01..70563f72 100644
--- a/NEWS
+++ b/NEWS
@@ -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 d8a18883..9b181363 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 ab0b6109..37c14744 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
@@ -247,11 +250,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
@@ -721,20 +728,26 @@ writechr:
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
;
@@ -796,7 +809,7 @@ getlinsec_ebios:
push ds
push ss
pop ds ; DS <- SS
- mov ah,42h ; Extended Read
+ mov ah,42h ; Extended Read
call int13
pop ds
popad
@@ -1076,9 +1089,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