[syslinux:master] FAT: generate EOF depending on exceeding the number of clusters
syslinux-bot for H. Peter Anvin
hpa at zytor.com
Mon Jan 25 09:45:19 PST 2010
Commit-ID: 9ce3e9ca7775032be2bad8ce80fd72eb60af7d69
Gitweb: http://syslinux.zytor.com/commit/9ce3e9ca7775032be2bad8ce80fd72eb60af7d69
Author: H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 25 Jan 2010 09:41:53 -0800
Committer: H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 25 Jan 2010 09:41:53 -0800
FAT: generate EOF depending on exceeding the number of clusters
Generate EOF by comparing to the actual number of clusters. We have
to compute the number of clusters in the filesystem anyway during
setup, so save the number and use it for the EOF computation.
Signed-off-by: H. Peter Anvin <hpa at zytor.com>
---
core/ldlinux.asm | 32 ++++++++++++++++++++------------
1 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/core/ldlinux.asm b/core/ldlinux.asm
index 70f9c71..0808e6e 100644
--- a/core/ldlinux.asm
+++ b/core/ldlinux.asm
@@ -116,6 +116,7 @@ RootDirSize resd 1 ; Root dir size in sectors
TotalSectors resd 1 ; Total number of sectors
ClustSize resd 1 ; Bytes/cluster
ClustMask resd 1 ; Sectors/cluster - 1
+Clusters resd 1 ; Total number of clusters
CopySuper resb 1 ; Distinguish .bs versus .bss
DriveNumber resb 1 ; BIOS drive number
ClustShift resb 1 ; Shift count for sectors/cluster
@@ -183,24 +184,31 @@ getfattype:
sub eax,[DataArea]
shr eax,cl ; cl == ClustShift
mov cl,nextcluster_fat12-(nextcluster+2)
- cmp eax,4085 ; FAT12 limit
- jb .setsize
+ cmp eax,0xFF4 ; FAT12 limit
+ jbe .setsize
mov cl,nextcluster_fat16-(nextcluster+2)
- cmp eax,65525 ; FAT16 limit
- jb .setsize
+ cmp eax,0xFFF4 ; FAT16 limit
+ jbe .setsize
;
; FAT32, root directory is a cluster chain
;
+ mov ecx,0x0FFFFFF4 ; Max possible cluster count
+ cmp eax,ecx
+ jb .oksize
+ mov eax,ecx
+.oksize:
+
mov cl,[ClustShift]
- mov eax,[bootsec+44] ; Root directory cluster
- sub eax,2
- shl eax,cl
- add eax,[DataArea]
- mov [RootDir],eax
+ mov edx,[bootsec+44] ; Root directory cluster
+ sub edx,2
+ shl edx,cl
+ add edx,[DataArea]
+ mov [RootDir],edx
mov cl,nextcluster_fat28-(nextcluster+2)
mov byte [SuperSize],superblock_len_fat32
.setsize:
mov byte [nextcluster+1],cl
+ mov [Clusters],eax ; Total clusters
;
; Common initialization code
@@ -1243,7 +1251,7 @@ nextcluster_fat12:
.even: and cx,0FFFh
movzx edi,cx
lea ax,[di-2]
- cmp ax,0FF5h
+ cmp ax,[Clusters]
pop si
pop cx
pop bx
@@ -1266,7 +1274,7 @@ nextcluster_fat16:
and bx,1FEh
movzx edi,word [gs:si+bx]
lea ax,[di-2]
- cmp ax,0FFF5h
+ cmp ax,[Clusters]
pop bx
pop si
pop eax
@@ -1288,7 +1296,7 @@ nextcluster_fat28:
mov edi,dword [gs:si+bx]
and edi,0FFFFFFFh ; 28 bits only
lea eax,[edi-2]
- cmp eax,0FFFFFF5h
+ cmp eax,[Clusters]
pop bx
pop si
pop eax
More information about the Syslinux-commits
mailing list