[syslinux:pathbased] isolinux: drop dependency on core_xfer_buf in self-loader
syslinux-bot for H. Peter Anvin
hpa at zytor.com
Wed Feb 24 18:30:09 PST 2010
Commit-ID: 11c612b178da3b07c8cb6fb4f88d0c030ab67627
Gitweb: http://syslinux.zytor.com/commit/11c612b178da3b07c8cb6fb4f88d0c030ab67627
Author: H. Peter Anvin <hpa at zytor.com>
AuthorDate: Wed, 24 Feb 2010 18:27:29 -0800
Committer: H. Peter Anvin <hpa at zytor.com>
CommitDate: Wed, 24 Feb 2010 18:27:29 -0800
isolinux: drop dependency on core_xfer_buf in self-loader
Drop the dependency on core_xfer_buf in the self-loader, and instead
load the data aligned to an offset, and then bulk-move it into place.
diskstart.inc will need to do something similar if/when support is
added for > 1K sectors on BIOS.
Signed-off-by: H. Peter Anvin <hpa at zytor.com>
---
core/isolinux.asm | 83 ++++++++++++++++++++++++++++------------------------
1 files changed, 45 insertions(+), 38 deletions(-)
diff --git a/core/isolinux.asm b/core/isolinux.asm
index 4a029c4..837c619 100644
--- a/core/isolinux.asm
+++ b/core/isolinux.asm
@@ -411,66 +411,73 @@ found_file:
; Load the rest of the file. However, just in case there
; are still BIOSes with 64K wraparound problems, we have to
; take some extra precautions. Since the normal load
- ; address (7C00h) is *not* 2K-sector-aligned, the safest
- ; way to deal with this is to load into the xfer_buf_seg
- ; and then copy the data in place.
-MaxLMA equ core_xfer_buf
+ ; address (7C00h) is *not* 2K-sector-aligned, we round
+ ; the target address upward to a sector boundary,
+ ; and then move the entire thing down as a unit.
+MaxLMA equ 384*1024 ; Reasonable limit (384K)
- mov bx,(7C00h+SECTOR_SIZE) >> 4
+ mov bx,((7C00h+2*SECTOR_SIZE-1) & ~(SECTOR_SIZE-1)) >> 4
mov bp,[ImageSectors]
+ push bx ; Load segment address
.more:
- push bx
- push bp
- mov dx,xfer_buf_seg
- mov es,dx
- mov fs,dx
- xor bx,bx
-
- cmp bp,0x10000 >> SECTOR_SHIFT
+ push bx ; Segment address
+ push bp ; Sector count
+ mov es,bx
+ mov cx,0xfff
+ and bx,cx
+ inc cx
+ sub cx,bx
+ shr cx,SECTOR_SHIFT - 4
+ jnz .notaligned
+ mov cx,0x10000 >> SECTOR_SHIFT ; Full 64K segment possible
+.notaligned:
+ cmp bp,cx
jbe .ok
- mov bp,0x10000 >> SECTOR_SHIFT
+ mov bp,cx
.ok:
+ xor bx,bx
push bp
call getlinsec
- pop dx
+ pop cx
+ mov dx,cx
pop bp
pop bx
- mov es,bx
- xor si,si
- xor di,di
- mov cx,dx
- shl cx,SECTOR_SHIFT-2
- fs rep movsd
-
- mov cx,dx
- shl cx,SECTOR_SHIFT-4
+ shl cx,SECTOR_SHIFT - 4
add bx,cx
sub bp,dx
jnz .more
- push ds
- pop es
-
- ; Verify the checksum on the loaded image.
-verify_image:
- mov si,7C00h+SECTOR_SIZE
- mov bx,es
+ ; Move the image into place, and also verify the
+ ; checksum
+ pop ax ; Load segment address
+ mov bx,(7C00h + SECTOR_SIZE) >> 4
mov ecx,[ImageDwords]
mov edi,[FirstSecSum] ; First sector checksum
-.loop es lodsd
- add edi,eax
+ xor si,si
+
+move_verify_image:
+.setseg:
+ mov ds,ax
+ mov es,bx
+.loop:
+ mov edx,[si]
+ add edi,edx
dec ecx
+ mov [es:si],edx
jz .done
- and si,si
+ add si,4
jnz .loop
- ; SI wrapped around, advance ES
+ add ax,1000h
add bx,1000h
- mov es,bx
- jmp short .loop
-.done: mov ax,ds
+ jmp .setseg
+.done:
+ mov ax,cs
+ mov ds,ax
mov es,ax
+
+ ; Verify the checksum on the loaded image.
cmp [bi_csum],edi
je integrity_ok
More information about the Syslinux-commits
mailing list