sys7.1-doc-wip/Internal/Asm/DiskCachePriv.a
2019-07-27 22:37:48 +08:00

346 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; 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. -- <KSCT #12>
;; 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