syslinux-3.08-2 sources from FC4
[bootcd.git] / syslinux / cache.inc
1 ; -*- fundamental -*- ---------------------------------------------------
2 ;   
3 ;   Copyright 2004 H. Peter Anvin - All Rights Reserved
4 ;
5 ;   This program is free software; you can redistribute it and/or modify
6 ;   it under the terms of the GNU General Public License as published by
7 ;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
8 ;   Boston MA 02111-1307, USA; either version 2 of the License, or
9 ;   (at your option) any later version; incorporated herein by reference.
10 ;
11 ; -----------------------------------------------------------------------
12 ; $Id: cache.inc,v 1.3 2005/01/25 07:15:21 hpa Exp $
13
14                 section .text
15 ;
16 ; initcache: Initialize the cache data structures
17 ;
18 initcache:
19                 xor eax,eax                     ; We don't care about sector 0
20                 mov di,CachePtrs
21                 mov cx,65536/SECTOR_SIZE
22                 rep stosd
23                 ret
24
25
26 ;
27 ; getcachesector: Check for a particular sector (EAX) in the sector cache,
28 ;                 and if it is already there, return a pointer in GS:SI
29 ;                 otherwise load it and return said pointer.
30 ;
31 ;               Assumes CS == DS.
32 ;
33 getcachesector:
34                 push cx
35                 mov si,cache_seg
36                 mov gs,si
37                 mov si,CachePtrs        ; Sector cache pointers
38                 mov cx,65536/SECTOR_SIZE
39 .search:
40                 cmp eax,[si]
41                 jz .hit
42                 add si,4
43                 loop .search
44
45 .miss:
46                 TRACER 'M'
47                 ; Need to load it.  Highly inefficient cache replacement
48                 ; algorithm: Least Recently Written (LRW)
49                 push bx
50                 push es
51                 push gs
52                 pop es
53                 mov bx,[NextCacheSlot]
54                 inc bx
55                 and bx,(1 << (16-SECTOR_SHIFT))-1
56                 mov [NextCacheSlot],bx
57                 shl bx,2
58                 mov [CachePtrs+bx],eax
59                 shl bx,SECTOR_SHIFT-2
60                 mov si,bx
61                 pushad
62 %if IS_EXTLINUX
63                 call getonesec_ext
64 %else
65                 call getonesec
66 %endif
67                 popad
68                 pop es
69                 pop bx
70                 pop cx
71                 ret
72
73 .hit:           ; We have it; get the pointer
74                 TRACER 'H'
75                 sub si,CachePtrs
76                 shl si,SECTOR_SHIFT-2
77                 pop cx
78                 ret
79
80                 section .bss
81                 alignb 4
82 CachePtrs       resd 65536/SECTOR_SIZE  ; Cached sector pointers
83 NextCacheSlot   resw 1                  ; Next cache slot to occupy