; ; File: DiskCachePriv.a ; ; Contains: Private equates for the RAM cache ; ; Written by: Kenny SC. Tung ; ; Copyright: © 1985-1992 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; <2> 3/3/92 kc Remove ForROM code because we now use the new cache. ; <12> 12/3/91 KST Added some documentation. ; <11> 8/21/91 JSM Clean up header. ; <10> 7/8/91 JSM Remove obsolete SysVers conditionals. ; <9> 1/30/91 gbm sab, #38: Change the ‘already including this file’ variable to ; all uppercase (for security reasons) ; <8> 1/2/91 KST Adding some new defs. ; <7> 10/29/90 KST Set minimum number of buckets of the device hash table to be 16. ; <6> 8/27/90 KST Move some equates to fsPrivate.a ; <5> 8/7/90 KST Changed number of file queues from 40 to 50. And made this file ; works for ROM build. ; <4> 8/6/90 KST Major rewrite for 7.0. Changing and adding lots of new equates. ; <3> 7/26/90 gbm can't use dirtyBit... changing it to cacheDirtyBit ; <1.0> 3/20/89 CCH Adding to EASE from System build. ; 11/20/87 JB Added cache var 'CacheMinZn' which functionally replaces the ; constant 'minApplZone'. Parameter is now settable via cache ; control trap. ; 9/14/87 JB Changed minApplZone to 384k to allow more application space on 1 ; megabyte systems. (S272) ; 12/2/86 LAK Added equate for CacheRegs (regs saved over cache adjust). ; Changed TFSDebug to new CacheDebug message with message. ; 8/4/86 DLD Added macro definiton for _AssumeEq, _TFSDebug, and and ; TFSDebug. ; 7/23/86 DLD Converted source to MPW. ; 12/4/85 LAK Added global age field, and age field to cache buffer headers. ; Added FHBufMax, FHAttrib, FHExtra, FHFlType, FHParDID, FHRWIPMax ; fields to file queue headers for better cache control, and to ; allow writing of blocks belonging to a closed file. Added ; CacheCom, noRWIPBit equates for external control of cache. Moved ; CacheVars, CacheCom, noRWIPBit equates to TFSEQU. ; 11/29/85 LAK New today. ; IF &TYPE('__INCLUDINGDISKCACHEPRIV__') = 'UNDEFINED' THEN __INCLUDINGDISKCACHEPRIV__ SET 1 if &type('ktDebugCache') = 'UNDEFINED' then ktDebugCache equ 0 endif ;_______________________________________; ; ; MACRO definitions ;_______________________________________; BLANKS ON STRING ASIS MACRO ; replace a jump vector InstJV PEA &Syslst[1] MOVE.L (SP)+,&Syslst[2] ENDM CacheRegs REG D0-D7/A0-A2/A4-A6 ;<02Dec86> save all but A3 AllRegs REG D0-D7/A0-A6 ;<02Dec86> save all minCache EQU $8000 ;<02Dec86> use 32K min cache minApplZone EQU $60000 ;<14Sep87> use 384K min appl zone ;_______________________________________; ; ; Additional global equates ;_______________________________________; FKeepOK EQU $90E ; 'OK' when FKeepIn is valid FKeepIn EQU $90C ; positive when Keeper is installed SwitchVars EQU $282 ; positive when Switcher is installed CacheConfig EQU $20A ; size configuration byte CacheEnable EQU $20B ; bit 5=1 when enabled FileQHdr EQU SysVolCPtr ; use old 2-block vol cache for ; cache queue headers FreeQHdr EQU SysBMCPtr ; use old bitmap cache for free queue ;_______________________________________; ; ; Cache Locals Definitions ($394) ;_______________________________________; CacheVCnt EQU 8 ; 8 cache vectors to replace SegVectSave EQU 0 ; (long) previous SegLoader vector OldBufPtr EQU 4 ; (long) set to pre-cache value of BufPtr NewBufPtr EQU 8 ; (long) set to bottom of cache BufStart EQU $C ; (long) CBHdrStart EQU $10 ; (long) <20Apr90> TotalBufN EQU $14 ; (word) <20Apr90> CurConfig EQU $16 ; (byte) equal to CacheConfig, last adjust CurEnable EQU $17 ; (byte) $FF if enabled, $00 otherwise CacheByteLim EQU $18 ; (long) bytesize max of requests to cache CacheAge EQU $1C ; (long) starts at -1, counts down CacheMinZn EQU $20 ; (long) min application zone size <20Nov87> INITSegVect EQU $24 ; (long) CacheIOBlk EQU $28 ; (long) ptr to I/O blk used to sync with fs CacheRoutine EQU $2C ; (long) routine to call after sync'ing SavedHook EQU $30 ; (long) saved ExtFS hook LcDevHTPtr EQU $34 ; (long) device hash table ptr <24May90> LcReserved1 EQU $38 ; (byte) TrashVBlks counter (called 3 times) LcReserved2 EQU $39 ; (byte) not used LcGBinCache EQU $3A ; (word) set if buffer is not newly allocated, ; ie., found in the cache. Used by cacheRdIP LcGBinFQueue EQU $3A ; (byte) set if the block is found in file queue LcGBinDHTable EQU $3B ; (byte) set if the block is found in free queue LcXCacheKey EQU $3C ; (long) translation cache key (buffer) LcXCacheData EQU $40 ; (long) translation cache data (header) LcFreeMemSize EQU $44 ; (word) free memory above OldBufPtr CacheLclLen EQU LcFreeMemSize+2 ; end of locals ; The story w.r.t. BufPtr, NewBufPtr, and OldBufPtr is as follows: ; ; (1) OldBufPtr ≥ NewBufPtr ≥ BufPtr, always. ; (2) OldBufPtr - NewBufPtr = buffer space currently owned by the cache. ; (3) If NewBufPtr = BufPtr, cache space is at bottom of buffer and may be ; adjusted (if neither Switcher nor FinderKeeper are installed). ; (4) OldBufPtr, NewBufPtr are initialized to BufPtr when the cache is ; installed. NewBufPtr is then lowered by the amount specified ; in parameter RAM at the first launch. FLink EQU 0 ; generic queue forward link offset BLink EQU 4 ; generic queue backward link offset QCount EQU 8 ; generic queue element count (hdr only) ; File Queue Header (top cache data structure). ; ; This is the queue header for all the file headers. FQHFlink EQU 0 ; (long) CQ forward link pointer FQHBlink EQU 4 ; (long) CQ backward link pointer FQHFileCnt EQU 8 ; (word) number of file headers FQHExtra EQU 10 ; (word) extra FQHlength EQU 12 ; length of FQH fileHdrCnt EQU 50 ; support up to 40 files for now ; try 50 for now ; Free Queue Header (free blocks). ; ; The Free Block Queue is where trashed blocks go (and where all ; blocks are initially put). These blocks are recycled before any ; other blocks. FreeQFlink EQU 0 ; (long) free queue forward link FreeQBlink EQU 4 ; (long) free queue backward link FreeQBufCnt EQU 8 ; (word) free queue buffer count TotalBufCnt EQU 10 ; (word) total number of buffers in cache FreeQHlen EQU 12 ; length of FQH ; File Header (one per file fork with blocks cached). ; ; There is also one queue per volume with volume blocks cached. For TFS ; volumes, only the MDB and volume map blocks would be found in the volume ; queue. For MDS volumes, directory blocks would also go into the volume ; queue. FHFlink EQU 0 ; (long) File Queue forward link FHBlink EQU 4 ; (long) File Queue backward link FHMQHFlink EQU 8 ; (long) Cache Buffer Queue forward link FHMQHBlink EQU 12 ; (long) Cache Buffer Queue backward link FHBufCnt EQU 16 ; (word) cache buffer count FHBufMax EQU 18 ; (word) max buffer cnt for this file (not yet used) FHFlags EQU 20 ; (byte) flags noFlushBit EQU 7 ; 1=avoid intermediate flushes mruSrchBit EQU 6 ; 1=use mru order for GetBlock search fqDirtyBit EQU 5 ; 1=a buffer in the FILE queue is dirty <25Apr90> FHFkType EQU 21 ; (byte) $00 = data fork (or vol blk) ; $FF = resource fork FHAttrib EQU 22 ; (byte) copied from attributes (used for tags) FHExtra EQU 23 ; (byte) reserved for future use FHFlType EQU 24 ; (long) file type (TFS files) for HD20 file tags FHVCBPtr EQU 28 ; (long) VCB pointer (0 if free) <30May90> FHDQHFLink EQU 32 ; (long) Disk Queue forward link <30May90> FHDQHBLink EQU 36 ; (long) Disk Queue backward link <30May90> FHFlNum EQU 40 ; (long) file number (0 for vol blks) <30May90> FHParDID EQU 44 ; (long) parent Dir ID (TFS files) for HD20 file tags FHlength EQU 48 ; length of File Header (HT = 256-48=208/8=26 buckets) ; File Header as MRU Queue Header MQHFlink EQU 0 ; (long) Cache Buffer Queue forward link MQHBlink EQU 4 ; (long) Cache Buffer Queue backward link MQHBufCnt EQU 8 ; (word) cache buffer count MQHBufMax EQU 10 ; (word) max buffer cnt for this file (not yet used) MQHFlags EQU 12 ; (byte) flags MQHFkType EQU 13 ; (byte) $00 = data fork (or vol blk) ; $FF = resource fork MQHAttrib EQU 14 ; (byte) copied from attributes (used for tags) MQHExtra EQU 15 ; (byte) reserved for future use MQHFlType EQU 16 ; (long) file type (TFS files) for HD20 file tags MQHVCBPtr EQU 20 ; (long) VCB pointer (0 if free) MQHDQHFLink EQU 24 ; (long) Disk Queue forward link MQHDQHBLink EQU 28 ; (long) Disk Queue backward link MQHFlNum EQU 32 ; (long) file number (0 for vol blks) MQHParDID EQU 36 ; (long) parent Dir ID (TFS files) for HD20 file tags ;MQHashTbl EQU 40 ; (long) hash table start <12Jun90> ; File Header as File-ordered Queue Header (used to be Disk-ordered, ergo the 'D') DQHMQHFlink EQU -24 ; (long) Cache Buffer Queue forward link DQHMQHBlink EQU -20 ; (long) Cache Buffer Queue backward link DQHBufCnt EQU -16 ; (word) cache buffer count DQHBufMax EQU -14 ; (word) max buffer cnt for this file (not yet used) DQHFlags EQU -12 ; (byte) flags DQHFkType EQU -11 ; (byte) $00 = data fork (or vol blk) ; $FF = resource fork DQHAttrib EQU -10 ; (byte) copied from attributes (used for tags) DQHExtra EQU -9 ; (byte) reserved for future use DQHFlType EQU -8 ; (long) file type (TFS files) for HD20 file tags DQHVCBPtr EQU -4 ; (long) VCB pointer (0 if free) DQHFLink EQU 0 ; (long) Disk Queue forward link DQHBLink EQU 4 ; (long) Disk Queue backward link DQHFlNum EQU 8 ; (long) file number (0 for vol blks) DQHParDID EQU 12 ; (long) parent Dir ID (TFS files) for HD20 file tags ;DQHashTbl EQU 16 ; (long) hash table start <12Jun90> ; Cache Block Header (one per cache block). ; ; Since the File Cache Header contains VCB, File Number, and fork ; type information, this is omitted for the cache block header. ; This may need to be expanded for multiblock r/w support. ; MRU-ordered Cache Block Header MCBFlink EQU 0 ; (long) Cache Buffer Queue forward link MCBBlink EQU 4 ; (long) Cache Buffer Queue backward link MCBHashqFlink EQU 8 ; (long) hash queue forword link <30May90> MCBHashqBlink EQU 12 ; (long) hash queue backword link <30May90> MCBFlags EQU 16 ; (byte) flags MCBExtra EQU 17 ; (byte) extra (not used) MCBFkType EQU MCBExtra ; (byte) resource type <11Jun90> MCBRefNum EQU 18 ; (word) last refnum used (debug use only?) =>cbHqVRfn MCBAge EQU 20 ; (long) used for aging this block =>cbHqDevNum MCBDQFlink EQU 24 ; (long) CBQ flink, in file order MCBDQBlink EQU 28 ; (long) CBQ blink, in file order MCBDBlk EQU 32 ; (long) disk blk num =>cbHqDevBlk MCBFlBlk EQU 36 ; (long) file blk num (=MCBDBlk for volblks)=>cbHqFilBlk MCBFQPtr EQU 40 ; (long) ptr to queue header MCBFileNum EQU 44 ; (long) file number used by hash<11Jun90> =>cbHqFilNum MCBDataPtr EQU 48 ; (long) pointer to data MCBHLength EQU 52 ; length of cache block header <30May90> cacheDirtyBit EQU 7 ; ...buffer dirty flag inuseBit EQU 6 ; ...buffer in use flag emptyBit EQU 5 ; ...buffer is empty DCBFlags EQU -8 ; (byte) flags DCBExtra EQU -7 ; (byte) extra DCBRefNum EQU -6 ; (word) last refnum used DCDAge EQU -4 ; (long) used for aging this block DCBFlink EQU 0 ; (long) CBQ flink, in file order DCBBlink EQU 4 ; (long) CBQ blink, in file order DCBDBlk EQU 8 ; (long) disk blk num DCBFlBlk EQU 12 ; (long) file blk num (=MCBDBlk for vol blks) DCBFQPtr EQU 16 ; (long) ptr to queue header DCBFileNum EQU 20 ; (long) file number <11Jun90> DCBData EQU 24 ; start of data (or pointer) <30May90> ; fortunately, this is not used <30May90> IF &Type('CacheDebug')='Undefined' THEN CacheDebug EQU 0 ; default debug code out ENDIF ; MACRO ; _AssumeEq ; IF &EVAL(&SysList[1]) <> &EVAL(&SysList[2]) THEN ; ERR ; Invalid statement - will cause error ; ENDIF ; ENDM MACRO _CacheDebug &msg IF CacheDebug THEN PEA &msg ; pass string255 DC.W $ABFF ; invoke Macsbug ENDIF ENDM MACRO _CodeCheck IF CacheDebug THEN DC.W $A9FF ; invoke Macsbug ENDIF ENDM Byteto32K EQU 15 ; convert to 32K multiple <8> kMinBootSize EQU 16*1024 ; at least 16K to boot <8> n32K EQU 32*1024 ; 32K constant <8> n256K EQU 256*1024 ; 256K constant <8> log2Bsize EQU 9 ; log2 of 512 when BufSiz = 512 <20Apr90> kMinCacheSize EQU $8000 ; current minimum is 32K if DiskCache is not enabled on 7.0 ;; hash table structure: htKeyMask EQU 0 ; (word) key mask (# of buckets - 1) htCount EQU 2 ; (word) # of elements in the hash table htReserved EQU 4 ; (long) unused (# of buckets for debugging only) htStart EQU 8 ; table starts htEntrysize EQU 8 ; each entry is 8 bytes htEntryLog2 EQU 3 ; log 2 of htEntrysize DevHTsize EQU 3 ; log2 of device hash table size (= bufcount/8) maxDHTnum EQU 512 ; max = 512 buckets for DHT minDHTnum EQU 16 ; min = 16 buckets for DHT SaveinHash EQU 'haSh' ; flag to keep buffer in DHT fromWriteIP EQU 'WrIP' ; called from writeIP ;; •• The usage of MCBAge: MCBDevNum = cbHqDevNum = MCBAge. -- ;; When a buffer is in the file queue, MCBAge = age stamp, ;; When a buffer is in the free queue and is empty, MCBDevNum = MCBAge = 0, ;; When a buffer is in the free queue but is not empty, MCBDevNum = MCBAge = Vol RefNum. ;; In the last case, the buffer is also added in the hash table. MCBDevNum EQU MCBAge ; (word) device number (was MCBAge) MCBHashKey EQU MCBAge+2 ; (word) bucket number (for debugging) ;; Block header points at hashqFlink on the hash queue: cbHqVRfn EQU MCBRefNum - MCBHashqFlink ; volume refnum cbHqDevBlk EQU MCBDBlk - MCBHashqFlink ; dev. block cbHqFilBlk EQU MCBFlBlk - MCBHashqFlink ; file block cbHqFilNum EQU MCBFileNum - MCBHashqFlink ; file number cbHqDevNum EQU MCBDevNum - MCBHashqFlink ; MCBage ENDIF ; ...already included