mirror of
https://github.com/elliotnunn/boot3.git
synced 2024-11-17 09:09:03 +00:00
5b0f0cc134
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
377 lines
14 KiB
C
377 lines
14 KiB
C
/*
|
|
File: XPTpriv.h
|
|
|
|
Contains: private header stuff for XPT
|
|
|
|
Written by: Paul Wolf
|
|
|
|
Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<SM21> 1/31/94 DCB Added a second version number for the SCSI Busy patch
|
|
<SM20> 1/25/94 DCB Added a version number for the SCSI Busy patch.
|
|
<ML3> 1/9/94 pdw Added busyPatchVers field.
|
|
<ML2> 1/5/94 pdw Changed SCSIGlobals constant to actually mean something. Added
|
|
SCSIBusy stuff. Added a bunch of fields at end of
|
|
SCSIGlobalsRec.
|
|
<SM18> 12/19/93 DCB Added a couple of function prototypes
|
|
<SM17> 11/22/93 pdw Rolling in from <MCxx>.
|
|
<MC7> 11/11/93 pdw Got rid of inDebugger field from XPT globals structure since it
|
|
wasn't the one being used.
|
|
<MC6> 11/9/93 pdw Added include of XPT.h.
|
|
<MC5> 11/5/93 pdw Series of attempts and re-attempts to fix various VM/FileShare
|
|
problems.
|
|
<SMG2> 9/29/93 chp Include some prerequisite headers if necessary.
|
|
<SM15> 10/29/93 DCB <MC> roll-in.
|
|
<MC4> 10/28/93 pdw Got rid of unused variable and changed InitRecorder prototype.
|
|
<SM14> 10/14/93 pdw <MC> roll-in.
|
|
<MC3> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
|
Machine, message handling etc.
|
|
<MC2> 9/26/93 pdw Added some debugging bits for BootItt.
|
|
<SM13> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
|
stuff.
|
|
<SM12> 7/17/93 pdw Pulled jvSelected out of here and put in HALglobals where it
|
|
belongs.
|
|
<SM11> 7/8/93 pdw Added InitRecorder prototype.
|
|
<SM10> 5/29/93 PW Moving Include_Debugger_Names to SCSIDebug.h.
|
|
<SM9> 5/25/93 DCB Adding definition of IfDebugStr so we can turn Debugger Traps
|
|
off. Also added
|
|
<LW8> 5/20/93 DCB Adding two fields to the XPT globals to support turning off
|
|
deferred completion routines from inside debuggers.
|
|
<LW7> 5/20/93 PW Adding jump vector for target mode.
|
|
<SM8> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
|
from Ludwig stuff.
|
|
<LW5> 4/14/93 DCB Added a copy of the C0C^ SCSIGlobals from the old SCSI Manager.
|
|
We are stealing these since we replace the old SCSI Manager.
|
|
<LW4> 3/26/93 PW Added deferred task record for deferring completion routines.
|
|
<SM5> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
|
(will update Ludwig with these as needed myself).
|
|
<LW3> 1/30/93 PW Added glue code for calling completion routines (saving
|
|
registers that were getting trashed by File Manager).
|
|
<LW2> 1/27/93 PW Changed bogus to syncUnsafeCount.
|
|
<SM4> 12/5/92 PW Added nextInterleave field.
|
|
<SM3> 11/20/92 PW Removed Includes and unused fields in BusInfo. Changed MaxBuses
|
|
to 16. Removed hiBusNum and rearranged XPTgs.
|
|
<SM2> 10/30/92 DCB Changes to reflect new ACAM.h
|
|
<1> 10/8/92 PW first checked in
|
|
|
|
*/
|
|
|
|
#ifndef __XPTPRIV__
|
|
#define __XPTPRIV__
|
|
|
|
#ifndef __OSUTILS__
|
|
#include <OSUtils.h>
|
|
#endif
|
|
|
|
#ifndef __SCSISTANDARD__
|
|
#include <SCSIStandard.h>
|
|
#endif
|
|
|
|
#ifndef __XPT__
|
|
#include "XPT.h"
|
|
#endif
|
|
|
|
|
|
/******** BusInfo ********/
|
|
|
|
struct BusInfo {
|
|
SIMinitInfo initInfo;
|
|
};
|
|
|
|
typedef struct BusInfo BusInfo;
|
|
|
|
|
|
|
|
/****** XPT Globals *********/
|
|
|
|
#define kMaxBuses 16 // should handle most everyone's needs
|
|
#define kNumBusInfos 3
|
|
|
|
typedef struct {
|
|
DeviceIdent DevID; /* The device ID associated with a particular DRefNum */
|
|
short DRefNum; /* The driver associated with this device ID */
|
|
short unused; /* Keep everything long aligned */
|
|
} RefInfo;
|
|
|
|
typedef struct {
|
|
ulong DrvrCnt; /* The number of drivers registered with the XPT */
|
|
RefInfo Drvr[]; /* A list of the drivers */
|
|
} DrvrList;
|
|
|
|
typedef struct {
|
|
BusInfo * BusInfoPtr[kMaxBuses]; // pointers to BusInfos (handles 99.99965% of cases)
|
|
long OldSyncWait;
|
|
short numBuses;
|
|
short syncUnsafeCount;
|
|
uchar flags;
|
|
uchar unusedC2; //
|
|
uchar unusedC0;
|
|
uchar unusedC1;
|
|
Ptr debugPatch; // address of our _DebugUtil Patch
|
|
short oldIDBusNumber[8]; // one for each SCSI ID
|
|
OldCallStates oldAPIstate;
|
|
SCSIphase latestOldCallPhase;
|
|
short unusedX;
|
|
ushort nextInterleave;
|
|
SCSI_IO * xptIOptr;
|
|
ushort xptIOpbSize; // size of currently allocated SCSI_IO (for old API)
|
|
ushort maxIOpbSize; // size of largest required SCSI_IO (for all SIMs)
|
|
DrvrList * Drivers; // A list of drivers
|
|
Ptr BootStorage; // used by the boot code
|
|
BusInfo TopBusInfos[kNumBusInfos]; // start with room for 3 BusInfo elements
|
|
DeferredTask completionDT;
|
|
} XPTglobals;
|
|
|
|
|
|
// scsXPTprivate is defined in ACAM.h but we'll be more specific for our code
|
|
#define savedA5 scsiXPTprivate
|
|
|
|
|
|
//****** For XPTg.flags field ********
|
|
|
|
#define kbOldAPIBusy 0
|
|
#define kbInOldCall 1
|
|
|
|
#define kbCSOD 4
|
|
#define kbCSODatBoot 5
|
|
#define kbCSODatScan 6
|
|
|
|
#define kbResetFromSync 7
|
|
|
|
//***** For XPTprivateFlags field *******
|
|
|
|
#define kbTIB 0
|
|
#define kmTIB 1
|
|
|
|
|
|
/******** SCSIStat word bit equates ********/
|
|
|
|
#define kmStatATN 0x0200
|
|
#define kmStatACK 0x0100
|
|
|
|
#define kmStatRST 0x0080
|
|
#define kmStatBSY 0x0040
|
|
#define kmStatREQ 0x0020
|
|
#define kmStatMSG 0x0010
|
|
|
|
#define kmStatC_D 0x0008
|
|
#define kmStatI_O 0x0004
|
|
#define kmStatSEL 0x0002
|
|
#define kmStatDBP 0x0001
|
|
|
|
|
|
/******** Function Prototypes ********/
|
|
|
|
#define GetXPTg() (*(XPTglobals **)(*((Ptr *)0xC0C)+0x1B4))
|
|
|
|
//#pragma parameter __D0 getCurrentA5() /* move.l A5, D0 */
|
|
//Ptr getCurrentA5(void) = {0x2005};
|
|
|
|
long SCSIAtomic(void);
|
|
|
|
BusInfo * GetBusInfo( ushort busID, XPTglobals *XPTg);
|
|
void SetXPTg( XPTglobals *XPTg);
|
|
void SetTempXPTg( XPTglobals *XPTg);
|
|
OSErr SCSITrap( short scsiSelector, SCSI_PB *pbPtr);
|
|
void CheckInterrupts ( XPTglobals *XPTg);
|
|
void Clear( void * where, short len);
|
|
void aack_XPT( ushort val);
|
|
OSErr CallSIMaction( void * pbPtr, XPTglobals * XPTg);
|
|
void GetVirtualIDInfo( SCSIGetVirtualIDInfoPB *pbPtr, XPTglobals *XPTg);
|
|
Ptr getCurrentA5();
|
|
void restoreCurrentA5( Ptr );
|
|
Ptr ciDebuggerPatch( Ptr );
|
|
Ptr ciBusyPatch( Ptr );
|
|
|
|
void DispatchISR ( void);
|
|
void Init_SCSIXlate( void);
|
|
void InitXPTAsm( void);
|
|
OSErr NewXPTioPB( ulong pbSize, XPTglobals *XPTg);
|
|
void XlateOldSCSIGlobals( XPTglobals *XPTg);
|
|
void InitSyncWait( XPTglobals *XPTg);
|
|
void InitCompletionStuff( XPTglobals *XPTg);
|
|
void RemoveSyncWait( XPTglobals *XPTg);
|
|
void CallCompRoutineGlue( void *fn, void *ioPtr);
|
|
ushort SetIntsAt2( void);
|
|
ushort InterruptLevel( void);
|
|
void RestoreInts( ushort );
|
|
void InitRecorder( void);
|
|
|
|
#define SCSIDebugStr(a) //DebugStr(a)
|
|
|
|
#define UNIMPTRAP 0x9F
|
|
#define SCSIATOM 0x89
|
|
|
|
#define SCSIGlobals (*((SCSIGlobalsRec **)0x0C0C)) /* (long) ptr for SCSI mgr locals*/
|
|
|
|
#define kbusyPatchVers 'cb' // WAY WAY important! If you change the busyPatch code change this value!
|
|
|
|
// I'm not sure that this belongs here - but here it is.
|
|
// It is here as a reference and to access those
|
|
// fields we co-opted.
|
|
|
|
typedef struct { // <SM7> \/
|
|
|
|
// Leftovers from the old SCSI Manager
|
|
|
|
ulong jvReset; // SCSIReset vector
|
|
ulong jvGet; // SCSIGet vector
|
|
ulong jvSelect; // SCSISelect vector
|
|
ulong jvCmd; // SCSICmd vector
|
|
ulong jvComplete; // SCSIComplete vector
|
|
ulong jvRead; // SCSIRead vector
|
|
ulong jvWrite; // SCSIWrite vector
|
|
ulong jvInstall; // SCSI installation vector (for debugging purposes)
|
|
ulong jvRBlind; // SCSIRBlind vector
|
|
ulong jvWBlind; // SCSIWBlind vector
|
|
ulong jvStat; // SCSIStat vector
|
|
ulong jvSelAtn; // SCSISelAtn vector
|
|
ulong jvSMsgIn; // SCSIMsgIn vector
|
|
ulong jvSMsgOut; // SCSIMsgOut vector
|
|
ulong firstPrivate; // Ptr to SCSI Mgr private storage record circularly linked list
|
|
ulong nextPrivate; // Ptr to next available SCSI Mgr private storage record
|
|
ulong base5380; // SCSI read base address
|
|
ulong pdma5380; // SCSI pseudo-DMA read base addr
|
|
ulong hhsk5380; // SCSI hardware-handshaked read base addr
|
|
ushort wrOffset; // write offset relative to "base5380"
|
|
ushort scsiQFlags; // flags for SCSI request queue
|
|
ulong scsiQHead; // Ptr to head of SCSI request queue
|
|
ulong scsiQTail; // Ptr to tail of SCSI request queue
|
|
ulong activeReq; // Ptr to currently active SCSI request
|
|
ulong timeout; // next timeout should occur at this time
|
|
uchar G_ID; // initiator's SCSI ID mask
|
|
uchar G_State; // SCSI Mgr state (free/busy)
|
|
ushort G_Async; // unused - $62
|
|
ulong G_Reserved0; // box number in high byte. HW flags in low bytes
|
|
ulong G_Reserved1; // used for storing timer value
|
|
ulong G_Reserved2; // machine-specific storage
|
|
|
|
// Cool stuff for the new SCSI Manager
|
|
|
|
Ptr unused0; // 70:
|
|
|
|
Ptr berr_halg0; // 74: Saved HAL globals for internal bus (used by the Bus Error Handler)
|
|
Ptr berr_halg1; // 78: Ditto for external bus. (I know, its a hack but justifiable because
|
|
// we are the only ones with xfer routines that cause bus errors.)
|
|
ulong jvUnusedXL1; // 7c: jv called when we're selected as target
|
|
|
|
uchar numBEHs; // 80: Number of Bus Error Handlers installed
|
|
uchar inDebugger; // 81:
|
|
uchar unused1[2]; // 82:
|
|
|
|
XPTglobals * tempXPTGGlobals; // 84: Used for "transitioning" from one XPT to another <SM8>
|
|
ulong tempXPTGInUse; // 88: Set to 'xptg' if we have two XPTs active <SM8>
|
|
|
|
ulong unused2; // 8c:
|
|
|
|
ulong recordBreak0; // 90: gets checked for match against all events recorded
|
|
ulong recordBreak4; // 94:
|
|
|
|
ulong busyPatch; // 98:
|
|
uchar ciBusyPending; // 9c: Used by the ciSCSIBusy patch to keep track of deferred jvSCSIFreeHook Calls
|
|
uchar unused3; // 9d:
|
|
ushort busyPatchVers; // 9e:
|
|
|
|
ulong recCurrent; // a0: debugging event recorder - current pointer
|
|
ulong recSize; // a4: debugging event recorder - size of buffer
|
|
ulong recStartLog; // a8: logical start of buffer
|
|
ulong recStartPhys; // ac: physical start of buffer
|
|
|
|
ushort newBusyPatchVers; //
|
|
ushort completionQHdr; // b2: high byte = flag indicating deferred task is enqd
|
|
ulong completionQHead; // b4: Q used to call completion routines from our
|
|
ulong completionQTail; // b8: deferred task (XPT.a).
|
|
|
|
// ÑÑÑÊOLD ÑÑÑ
|
|
|
|
ushort unusedW2; //
|
|
QHdr privDTQueue; // used for the private deferred task manager
|
|
Ptr oldjDisptch; // the old jDisptch vector we patched out
|
|
ulong ci_jDisptchVers; // version tag for our patch
|
|
|
|
ulong jvVFWO; // virtual fast writes (hhsk)
|
|
ulong jvCSO; // virtual slow compare ("p" bit redefined to mean "compare")
|
|
ulong jvUnused3; // unused
|
|
ulong jvCFO; // virtual fast compare ("p" bit redefined to mean "compare")
|
|
ulong jvUnused4; // unused
|
|
ulong jvInvalidIn; // Invalid Message In
|
|
ulong jvIdentifyIn; // Identify Message In
|
|
ulong jvCmdComplete; // Command Complete
|
|
ulong jvExtendedMsg; // Extended Message
|
|
ulong jvSaveDataPtr; // Save Data Pointer
|
|
ulong jvRestorePtrs; // Restore Pointers
|
|
ulong jvDisconnect; // Disconnect
|
|
ulong jvMsgRejIn; // Message Reject In
|
|
ulong jvLCCF; // Linked Command Complete with (or without) flag
|
|
ulong sdmStack; // SCSIDiskMode stack global for DB Lite
|
|
ulong base5380_1; // SCSI read base address (internal)
|
|
ulong pdma5380_1; // SCSI pseudo-DMA read base addr (internal)
|
|
ulong hhsk5380_1; // SCSI hardware-handshaked read base addr (internal)
|
|
ulong base5380_2; // SCSI read base address (external)
|
|
ulong pdma5380_2; // SCSI pseudo-DMA read base addr (external)
|
|
ulong hhsk5380_2; // SCSI hardware-handshaked read base addr (external)
|
|
ulong jvIdentifyOut; // Identify Message Out
|
|
ulong jvMsgRejOut; // Message Reject Out
|
|
ulong jvInvalidOut; // Invalid Message Out
|
|
ulong jvKillIO; // Kill I/O
|
|
ulong jvNoOp; // No Operation
|
|
ulong jvBusDevRstOut; // Bus Device Reset Out <v1.3>
|
|
ulong G_SCSIDREQ; // SCSI DREQ base address
|
|
ulong G_TargetID; // Target ID
|
|
ulong G_FakeStat; // Fake state
|
|
ulong G_OldTrapAdrs; // contains the old SCSIMgr address
|
|
ulong G_OldIntHnd; // contains old intrp level 2 handler
|
|
ulong G_IntrpCount; // counts total # of intrps
|
|
ulong G_IntrpStat; // Status read by Intrp routine
|
|
ulong GxState96; // Bits to make c96 backwards compatible
|
|
ulong BootCfgFlags; // copy of d2 passed to InitHW_SCSI96 at boot (used by jvInitHW)
|
|
uchar G_bitDREQ; // Bit position at DREQ location
|
|
uchar jvUnused32; // Future expansion
|
|
ushort jvUnused33; // Future expansion
|
|
ulong jvIntHnd; // 24-entry jump table -- interrupt handler
|
|
ulong jvMessage; // Send a message to the deferred task
|
|
ulong jvClearIRQ; // Clear the SCSI interrupt (and VIA, if necessary)
|
|
ulong jvDisEnable; // Enable/disable interrupts routine
|
|
ulong jvLogError; // Record error for the PB
|
|
ulong jvSCSIDT; // Deferred Task for all other interrupts
|
|
ulong jvFind; // Find a request to process
|
|
ulong jvSetup; // Setup active request
|
|
ulong jvPreflight; // Preflight the parameter block
|
|
ulong jvEnDequeue; // Enqueue/dequeue a parameter block
|
|
ulong jvArb; // Arbitrate for the SCSI bus
|
|
ulong jvSel; // Select a SCSI device
|
|
ulong jvDelay22; // Delay 2.2 microseconds
|
|
ulong jvClearState; // Remove the current request
|
|
ulong jvTransfer; // Transfer data using the primitive routines
|
|
ulong jvSetTimer; // Set the timer
|
|
ulong jvResetBus; // Reset SCSI bus and kill all requests
|
|
ulong jvClearBus; // Clear the SCSI bus
|
|
ulong jvBusErr; // Bus error handler
|
|
ulong jvDataDMA; // DMA-related data-chaining interpreter
|
|
|
|
// ÑÑÑÊNEW ÑÑÑ
|
|
ulong xptGlobals; // 1b4: pointer to Cousin Itt's XPT globals
|
|
|
|
// ÑÑÑÊOLD ÑÑÑ
|
|
ulong blindBusTO; // 1b8: number of ticks to wait for blind transfer bytes (after 1st byte)
|
|
ushort transferType; // 1bc: Type of data transfer to perform (used in Transfer_96, BusError)
|
|
uchar lastINTread; // 1be: Value of rINT at last valid interrupt read
|
|
uchar lastSTAread; // 1bf: Value of rSTA at last valid interrupt read
|
|
// ÑÑÑÊNEW and OLD ÑÑÑ
|
|
ulong yeOldeBusErrVct; // 1c0: temp storage while we insert our buserr handler <T10> pdw
|
|
ulong base539x0; // 1c4: 539x base address, bus0 <T3><T4>
|
|
ulong base539x1; // 1c8: 539x base address, bus1 <T3><T4>
|
|
uchar G_SCSIDevMap0; // 1cc: Device Map for the Internal SCSI Bus <T3>
|
|
uchar fill1[3];
|
|
uchar G_SCSIDevMap1; // 1d0: Device Map for the External SCSI Bus <T3>
|
|
uchar fill2[3];
|
|
|
|
} SCSIGlobalsRec;
|
|
|
|
|
|
#define tempXPT 'xptg' // value for tempXPTGInUse
|
|
|
|
|
|
#endif //__XPTPRIV__
|