[syslinux] [PATCH 1/1] CORE/cache: add cache priority parameter

Gene Cumm gene.cumm at gmail.com
Mon Mar 30 19:31:51 PDT 2009


From: Gene Cumm <gene.cumm at gmail.com>

CORE/cache: add cache priority parameter; Passing in DX=0 forces the
cache entry to stay at the least recently used spot.  Any other value
allows it to continue on previous behavior of most recently used
position in the list.  Change ldlinux.asm and extlinux.asm (the only 2
users of cache) to pass in DX=1.  Push/Pop DX unless it's definitely
safe to clobber.

Signed-off-by: Gene Cumm <gene.cumm at gmail.com>

---

This patch allows functions to request a sector as cache but it will
only be available as cached until a cache miss.

Inspired by a discussion in the last few days.


diff --git a/core/cache.inc b/core/cache.inc
index 5975557..b8eda9f 100644
--- a/core/cache.inc
+++ b/core/cache.inc
@@ -43,6 +43,8 @@ initcache:
 ;		  and if it is already there, return a pointer in GS:SI
 ;		  otherwise load it and return said pointer.
 ;
+;	DX	Cache priority; 0 -> store as least recently used
+;
 ;		Assumes CS == DS.
 ;
 getcachesector:
@@ -82,6 +84,10 @@ getcachesector:
 		; Update LRU, then compute buffer address
 		TRACER 'H'

+		; Skip LRU update if DX == 0
+		and dx,dx	; Set ZF
+		jz .hit_no_lru
+
 		; Remove from current position in the list
 		mov bx,[si+cptr.prev]
 		mov di,[si+cptr.next]
@@ -95,6 +101,8 @@ getcachesector:
 		mov [CachePtrs+cptr.prev],si
 		mov word [si+cptr.next],CachePtrs

+.hit_no_lru:
+		and ax,ax	; Clear ZF
 		sub si,CachePtrs+cptr_size
 		shl si,SECTOR_SHIFT-cptr_size_lg2	; Buffer address

diff --git a/core/extlinux.asm b/core/extlinux.asm
index 9684c8a..59d460d 100644
--- a/core/extlinux.asm
+++ b/core/extlinux.asm
@@ -966,7 +966,10 @@ open_inode:
 		add eax,edx
 		pop edx
 		and dx,SECTOR_SIZE-1
+		push dx
+		mov dx,1
 		call getcachesector		; Get the group descriptor
+		pop dx
 		add si,dx
 		mov esi,[gs:si+bg_inode_table]	; Get inode table block #
 		pop eax				; Get inode within group
@@ -985,7 +988,10 @@ open_inode:
 		and dx,SECTOR_SIZE-1
 		mov [bx+file_in_off],dx

+		push dx
+		mov dx,1
 		call getcachesector
+		pop dx
 		add si,dx
 		mov cx,EXT2_GOOD_OLD_INODE_SIZE >> 2
 		mov di,ThisInode
@@ -1351,6 +1357,7 @@ linsector:
 		push eax
 		mov eax,[si+file_in_sec]
 		mov bx,si
+		mov dx,1
 		call getcachesector	; Get inode
 		add si,[bx+file_in_off]	; Get *our* inode
 		pop eax
@@ -1382,7 +1389,10 @@ linsector:
 		mov ebp,[gs:si+bx]
 		shl ebp,cl
 		add eax,ebp
+		push dx
+		mov dx,1
 		call getcachesector
+		pop dx
 		pop bx
 		and bx,(SECTOR_SIZE >> 2)-1
 		shl bx,2
@@ -1400,7 +1410,10 @@ linsector:
 		mov ebp,[gs:si+bx]
 		shl ebp,cl
 		add eax,ebp
+		push dx
+		mov dx,1
 		call getcachesector
+		pop dx
 		pop bx
 		and bx,(SECTOR_SIZE >> 2)-1
 		shl bx,2
@@ -1415,6 +1428,7 @@ linsector:
 		mov ebp,[gs:si+bx]
 		shl ebp,cl
 		add eax,ebp
+		mov dx,1
 		call getcachesector
 		pop bx
 		and bx,(SECTOR_SIZE >> 2)-1
diff --git a/core/ldlinux.asm b/core/ldlinux.asm
index b98cd92..9cbf428 100644
--- a/core/ldlinux.asm
+++ b/core/ldlinux.asm
@@ -1058,6 +1058,7 @@ search_dos_dir:

 .scansector:
 		; EAX <- directory sector to scan
+		mov dx,1
 		call getcachesector
 		; GS:SI now points to this sector

@@ -1411,6 +1412,7 @@ readdir:
 		and eax,eax
 		jz .fail
 .fetch_cache:
+		mov dx,1
 		call getcachesector
 .move_current:
 		add si,bx	; Resume last position in sector
@@ -2025,7 +2027,11 @@ nextsector:
 ;
 getfatsector:
 		add eax,[FAT]		; FAT starting address
-		jmp getcachesector
+		push dx
+		mov dx,1
+		call getcachesector
+		pop dx
+		ret

 ; -----------------------------------------------------------------------------
 ;  Common modules




More information about the Syslinux mailing list