-- File: DiskIOPrivate.mesa -- Last edited by Levin: 11-May-81 14:38:34 DIRECTORY AltoDefs USING [BYTE], AltoHardware USING [DA, DC, DFS, DH, DL, DS, InvalidDA], DiskIODefs USING [DISK, CompletionProcedure, CompletionStatus, RequestID, vDA, vDC], Mopcodes USING [zAND]; DiskIOPrivate: DEFINITIONS = BEGIN -- Types and Related Constants -- DA: TYPE = AltoHardware.DA; DC: TYPE = AltoHardware.DC; DH: TYPE = AltoHardware.DH; DL: TYPE = AltoHardware.DL; DS: TYPE = AltoHardware.DS; DFS: TYPE = AltoHardware.DFS; DISK: TYPE = DiskIODefs.DISK; CompletionProcedure: TYPE = DiskIODefs.CompletionProcedure; RequestID: TYPE = DiskIODefs.RequestID; CB: TYPE = MACHINE DEPENDENT RECORD [ nextCB: CBPtr, status: DS, command: DC, headerAddress: POINTER TO DH, labelAddress: POINTER TO DL, dataAddress: POINTER, normalWakeups: WORD, errorWakeups: WORD, header: DH, label: DL, nextOnQueue: CBPtr, requestID: RequestID, postProc: CompletionProcedure, omitRestore: BOOLEAN, fill: [0..77777B]]; CBPtr: TYPE = POINTER TO CB; CBQueueTail: TYPE = POINTER TO CBPtr; vDC: TYPE = DiskIODefs.vDC; DCs: ARRAY vDC OF DC = [ DC[DCseal, DiskRead, DiskRead, DiskRead, 0, 0], -- ReadHLD DC[DCseal, DiskCheck, DiskRead, DiskRead, 0, 0], -- ReadLD DC[DCseal, DiskCheck, DiskCheck, DiskRead, 0, 0], -- ReadD DC[DCseal, DiskWrite, DiskWrite, DiskWrite, 0, 0], -- WriteHLD DC[DCseal, DiskCheck, DiskWrite, DiskWrite, 0, 0], -- WriteLD DC[DCseal, DiskCheck, DiskCheck, DiskWrite, 0, 0], -- WriteD DC[DCseal, DiskCheck, DiskCheck, DiskCheck, 1, 0], -- SeekOnly DC[DCseal, DiskCheck, DiskCheck, DiskCheck, 0, 0]]; -- DoNothing DiskSeal: TYPE = AltoDefs.BYTE; DCseal: DiskSeal = 110B; DCunseal: DiskSeal = 0B; DSfree: CARDINAL = 1; DSfake: CARDINAL = 3; DSdone: CARDINAL = 17B; DSmaskStatus: DS = DS[0, DSdone, 1, 0, 1, 1, 0, 1, LAST[DFS]]; DSgoodStatus: DS = DS[0, DSdone, 0, 0, 0, 0, 0, 0, CommandComplete]; DSfakeStatus: DS = DS[0, DSfake, 0, 0, 0, 0, 0, 0, CommandComplete]; InvalidDA: DA = AltoHardware.InvalidDA; nDisks: CARDINAL = 1; nHeads: CARDINAL = 2; nTracks: CARDINAL = 203; nSectors: CARDINAL = 12; standardDisk: DISK = [nDisks, nTracks, nHeads, nSectors]; nSafetyDCBs: CARDINAL = 2 + 1; -- two for skip chaining, one for xfer chaining IOSynch: TYPE = POINTER TO SynchRecord; SynchRecord: TYPE = MONITORED RECORD [ status: DiskIODefs.CompletionStatus, lastDone: CONDITION]; diskInterruptLevel: CARDINAL = 13; -- Procedures, Variables, and Signals -- sysDisk: DISK; GetCBs: PROCEDURE [n: CARDINAL, wait: BOOLEAN] RETURNS [cb: CBPtr]; -- allocates 'n' CBs and initializes them. If the requested number of CBs is not -- available and 'wait' is TRUE, GetCBs will wait until the request can be satisfied. -- If 'wait' is FALSE, GetCBs will return NIL. The CBs will be circularly linked -- together through their 'nextOnQueue' field. FreeCB: PROCEDURE [cb: CBPtr]; -- frees the argument CB. EnqueueCB: PROCEDURE [tail: CBQueueTail, cb: CBPtr]; -- adds the argument CB to the end of the list identified by 'tail'. The client is -- responsible for appropriate mutual exclusion of EnqueueCB and DequeueCB. DequeueCB: PROCEDURE [tail: CBQueueTail] RETURNS [cb: CBPtr]; -- removes the front CB from the list identified by tail and returns it. The client -- is responsible for appropriate mutual exclusion of EnqueueCB and DequeueCB. SpliceLists: PROCEDURE [first, second: CBQueueTail]; -- appends the second list to the first. The client is responsible for the -- appropriate mutual exclusion. EnqueueForDisk: PROCEDURE [cbList: CBQueueTail]; -- enters the argument list of CBs on the list of current tasks. It is assumed that -- the 'nextCB' fields have already been filled in, and thus the blocks are linearly -- linked through 'nextCB'. SimulateCompletion: PROCEDURE [cbList: CBQueueTail]; -- causes the CBs on the specified list to be fed to the completion mechanism. The -- status passed to the CompletionProcedure for such CBs will be 'neverStarted'. VirtualDA: PROCEDURE [da: DA] RETURNS [DiskIODefs.vDA]; -- transforms a real disk address to a virtual one. RealDA: PROCEDURE [v: DiskIODefs.vDA] RETURNS [da: DA]; -- transforms a virtual disk address to a real one. TransformStatus: PROCEDURE [status: DS] RETURNS [DiskIODefs.CompletionStatus]; -- maps hardware status information to a simpler form for completion procedures to -- handle. MaskDS: PROCEDURE [a, b: DS] RETURNS [DS] = MACHINE CODE {Mopcodes.zAND}; WriteErrorToLog: PROCEDURE [cb:CBPtr]; -- records a (possibly recoverable) error on secondary storage. DiskInterruptHandler: PROCEDURE; -- the low-level interrupt handling procedure. FinalizeInterruptHandler: PROCEDURE; -- cleans up the interrupt handling process. Completer: PROCEDURE; -- the caller of completion procedures. FinalizeCompleter: PROCEDURE; -- cleans up the completer process. scratchPage: POINTER; -- general purpose bit bucket. maxOps: CARDINAL; -- maximum permitted operations in a single command chain. loggingEnabled: BOOLEAN; -- indicates whether statistics logging is enabled. diskReads, diskWrites: LONG CARDINAL; -- counts of actual operations for statistical purposes. END.