(2006-08-06) rescue-bootcd
This commit is contained in:
83
extra/syslinux-3.09/cache.inc
Normal file
83
extra/syslinux-3.09/cache.inc
Normal file
@@ -0,0 +1,83 @@
|
||||
; -*- fundamental -*- ---------------------------------------------------
|
||||
;
|
||||
; Copyright 2004 H. Peter Anvin - All Rights Reserved
|
||||
;
|
||||
; This program is free software; you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
|
||||
; Boston MA 02111-1307, USA; either version 2 of the License, or
|
||||
; (at your option) any later version; incorporated herein by reference.
|
||||
;
|
||||
; -----------------------------------------------------------------------
|
||||
; $Id: cache.inc,v 1.3 2005/01/25 07:15:21 hpa Exp $
|
||||
|
||||
section .text
|
||||
;
|
||||
; initcache: Initialize the cache data structures
|
||||
;
|
||||
initcache:
|
||||
xor eax,eax ; We don't care about sector 0
|
||||
mov di,CachePtrs
|
||||
mov cx,65536/SECTOR_SIZE
|
||||
rep stosd
|
||||
ret
|
||||
|
||||
|
||||
;
|
||||
; getcachesector: Check for a particular sector (EAX) in the sector cache,
|
||||
; and if it is already there, return a pointer in GS:SI
|
||||
; otherwise load it and return said pointer.
|
||||
;
|
||||
; Assumes CS == DS.
|
||||
;
|
||||
getcachesector:
|
||||
push cx
|
||||
mov si,cache_seg
|
||||
mov gs,si
|
||||
mov si,CachePtrs ; Sector cache pointers
|
||||
mov cx,65536/SECTOR_SIZE
|
||||
.search:
|
||||
cmp eax,[si]
|
||||
jz .hit
|
||||
add si,4
|
||||
loop .search
|
||||
|
||||
.miss:
|
||||
TRACER 'M'
|
||||
; Need to load it. Highly inefficient cache replacement
|
||||
; algorithm: Least Recently Written (LRW)
|
||||
push bx
|
||||
push es
|
||||
push gs
|
||||
pop es
|
||||
mov bx,[NextCacheSlot]
|
||||
inc bx
|
||||
and bx,(1 << (16-SECTOR_SHIFT))-1
|
||||
mov [NextCacheSlot],bx
|
||||
shl bx,2
|
||||
mov [CachePtrs+bx],eax
|
||||
shl bx,SECTOR_SHIFT-2
|
||||
mov si,bx
|
||||
pushad
|
||||
%if IS_EXTLINUX
|
||||
call getonesec_ext
|
||||
%else
|
||||
call getonesec
|
||||
%endif
|
||||
popad
|
||||
pop es
|
||||
pop bx
|
||||
pop cx
|
||||
ret
|
||||
|
||||
.hit: ; We have it; get the pointer
|
||||
TRACER 'H'
|
||||
sub si,CachePtrs
|
||||
shl si,SECTOR_SHIFT-2
|
||||
pop cx
|
||||
ret
|
||||
|
||||
section .bss
|
||||
alignb 4
|
||||
CachePtrs resd 65536/SECTOR_SIZE ; Cached sector pointers
|
||||
NextCacheSlot resw 1 ; Next cache slot to occupy
|
||||
Reference in New Issue
Block a user