[syslinux:dynamic-sector] disk: Make the sector size dynamic

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Mon Apr 4 17:45:02 PDT 2011


Commit-ID:  851b968489f2d31b0dd0dd07055656e59fa92404
Gitweb:     http://syslinux.zytor.com/commit/851b968489f2d31b0dd0dd07055656e59fa92404
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Mon, 4 Apr 2011 17:26:59 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Mon, 4 Apr 2011 17:26:59 -0700

disk: Make the sector size dynamic

Make the sector size dynamic in anticipation of disks with
non-512-byte logical sectors.

With this change, bsBytesPerSec *must* be correct; this still needs to
be added to the installers to enforce.  Furthermore, the number of
sectors in one extent can still only be < 64K.

Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>


---
 core/diskfs.inc    |    4 ++--
 core/diskstart.inc |   26 ++++++++++++++++----------
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/core/diskfs.inc b/core/diskfs.inc
index fc80a15..41391e7 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 d2154d9..db4955f 100644
--- a/core/diskstart.inc
+++ b/core/diskstart.inc
@@ -105,13 +105,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
+		mov ebx,edi			; Start of the next sector
 
 ;
 ; Tell the user if we're using EBIOS or CBIOS
@@ -127,6 +129,7 @@ print_bios:
 		call writestr_early
 
 		section .earlybss
+		alignb 2
 %define	HAVE_BIOSNAME 1
 BIOSName	resw 1
 
@@ -135,8 +138,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
 
@@ -152,7 +156,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
@@ -165,9 +169,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]
@@ -255,7 +261,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
@@ -345,7 +351,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
@@ -429,8 +435,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 $
 
 ; ----------------------------------------------------------------------------



More information about the Syslinux-commits mailing list