-- XDSwap.Mesa Edited by:
-- Bruce on October 8, 1980 6:56 PM
-- Sandman on July 23, 1980 10:30 AM
DIRECTORY
AltoDefs USING [MaxMDSPage],
AltoHardware USING [BankRegister, BankRegisters],
BcplOps USING [BcplInLd, BcplJSR, BcplOutLd],
BP USING [Validate],
Commands USING [Go],
ControlDefs USING [SVPointer, TraceOff, TrapStatus],
CoreSwapDefs USING [
ExternalStateVector, PuntInfo, PuntTable, SVPointer, SwapReason, VersionID],
DebugOps USING [Abort, ShortCopyREAD, ShortREAD],
DHeap USING [Zero],
DPsb USING [State],
Dump USING [UserText],
FrameDefs USING [UnlockCode],
FrameOps USING [MyGlobalFrame, MyLocalFrame],
Gf USING [NewLink],
ImageDefs USING [StopMesa, UserCleanupProc],
Init USING [
Break, CoreSwapMsg, Debug, FlushCaches, GetUserMessage, NewLoadState, UCSHandler,
usermessage, warning, bootLoaded],
InitXD USING [ourBitmapSeg],
Inline USING [LowHalf],
OsStaticDefs USING [OsStaticRecord, OsStatics],
Pc USING [EvalStackEmpty],
PrincOps USING [SignalDesc],
ProcessDefs USING [DisableInterrupts, EnableInterrupts],
ProcessOps USING [ReadWDC, WriteWDC],
Region USING [Handle, Index],
SDDefs USING [SD, sXferTrap],
SegmentDefs USING [
DataSegmentHandle, DeleteDataSegment, memConfig, ObjectHandle, SwapOut],
State USING [GetGS, GSHandle],
SwapperOps USING [DisableBank, EnumerateObjects, mdsIndex, regions, SwapOutCodeSeg],
TrapOps USING [ReadXTS, WriteXTS],
TajoMisc USING [SetState],
UserTerminalOps USING [SetBitmapSpace];
XDSwap: PROGRAM
IMPORTS BcplOps, BP, Commands, DebugOps, DHeap, DPsb, Dump,
FrameDefs, FrameOps, Gf, ImageDefs, Init, InitXD, Inline,
Pc, ProcessDefs, ProcessOps, SegmentDefs, SwapperOps,
State, TrapOps, TajoMisc, UserTerminalOps
EXPORTS Init, InitXD
SHARES SegmentDefs =
BEGIN OPEN Init, PrincOps;
data: State.GSHandle ← State.GetGS[];
saveDWT: AltoHardware.BankRegister ← AltoHardware.BankRegisters[Emulator];
AbandonHyperspace: PUBLIC PROCEDURE =
BEGIN OPEN SegmentDefs, SwapperOps;
UpdateSegs: PROC [object: ObjectHandle] RETURNS [BOOLEAN] = {
WITH o: object SELECT FROM
segment => IF o.VMpage > AltoDefs.MaxMDSPage THEN
WITH s: o SELECT FROM
file =>
IF s.class = code THEN SwapOutCodeSeg[@s] ELSE SwapOut[@s];
data => DeleteDataSegment[@s];
ENDCASE;
ENDCASE;
RETURN[FALSE]};
r: Region.Handle;
IF InitXD.ourBitmapSeg # NIL THEN {
DeleteDataSegment[InitXD.ourBitmapSeg]; InitXD.ourBitmapSeg ← NIL};
FOR i: Region.Index IN Region.Index DO
IF i = mdsIndex THEN LOOP;
IF (r ← regions[i]) # NIL THEN r.disable[TRUE];
ENDLOOP;
[] ← EnumerateObjects[segment, UpdateSegs];
FOR i: Region.Index IN Region.Index DO
IF i = mdsIndex THEN LOOP;
IF regions[i] # NIL THEN DisableBank[i];
ENDLOOP;
FrameDefs.UnlockCode[FrameOps.MyGlobalFrame[]];
END;
CoreSwap: PUBLIC PROCEDURE [why: CoreSwapDefs.SwapReason] =
BEGIN OPEN BcplOps, ControlDefs, SDDefs;
ourDWT: AltoHardware.BankRegister;
wdc: CARDINAL;
xferTrapStatus: TrapStatus;
xferTrapHandler: UNSPECIFIED;
e: CoreSwapDefs.ExternalStateVector ← data.ESV;
alto2xm: BOOLEAN ← SegmentDefs.memConfig.AltoType = AltoIIXM;
flag: [0..2];
IF Init.bootLoaded THEN
BEGIN
IF why = quit OR why = kill THEN ImageDefs.StopMesa[];
CoreSwapMsg[cantSwap];
SIGNAL DebugOps.Abort;
END;
DO
e.reason ← why;
FlushCaches[IF why = kill THEN abortSession ELSE resumeDebuggee];
IF why = install THEN {
[] ← TajoMisc.SetState[disconnected]; UserTerminalOps.SetBitmapSpace[NIL,0]}
ELSE [] ← TajoMisc.SetState[off];
ImageDefs.UserCleanupProc[OutLd];
data.worryEntry ← FALSE;
ProcessDefs.DisableInterrupts[];
xferTrapHandler ← SD[sXferTrap];
SD[sXferTrap] ← FrameOps.MyLocalFrame[];
xferTrapStatus ← TrapOps.ReadXTS[];
TrapOps.WriteXTS[TraceOff];
wdc ← ProcessOps.ReadWDC[];
IF alto2xm THEN ourDWT ← AltoHardware.BankRegisters[DWT];
flag ← BcplOutLd[OutLd, @data.selfFP, @e];
ProcessOps.WriteWDC[wdc];
SD[sXferTrap] ← xferTrapHandler;
ProcessDefs.EnableInterrupts[];
IF flag = 0 THEN -- just completed OutLd
BEGIN
IF why = install THEN ImageDefs.StopMesa[];
IF alto2xm THEN AltoHardware.BankRegisters[DWT] ← saveDWT;
IF why = cleanmaplog THEN RETURN;
e.level ← data.level;
BcplInLd[InLd,@data.debuggeeFP,@e];
END;
IF alto2xm THEN
BEGIN
saveDWT ← AltoHardware.BankRegisters[DWT];
AltoHardware.BankRegisters[DWT] ← ourDWT;
END;
TrapOps.WriteXTS[xferTrapStatus];
IF e.level # data.level THEN AbandonHyperspace[];
ImageDefs.UserCleanupProc[InLd];
[] ← TajoMisc.SetState[disconnected];
data.ESV ← e;
data.StatePtr ← e.state;
data.signal ← LOOPHOLE[0];
data.breakFrame ← NIL;
usermessage ← NIL;
warning ← none;
SELECT flag FROM
1 => -- just started by InLd
BEGIN
SetDebugeeType[];
Init.bootLoaded ← FALSE;
SELECT e.reason FROM
breakpoint, worrybreak, interrupt =>
BEGIN
IF e.reason = worrybreak THEN data.worryEntry ← TRUE;
IF ~BP.Validate[e.state] OR e.reason = interrupt THEN
BEGIN
IF ~Pc.EvalStackEmpty[] THEN warning ← evalstack;
IF e.level # data.level THEN
BEGIN
data.restartMsg ← interrupt;
NewLoadState[debug];
END;
FlushCaches[resumeSession];
CoreSwapMsg[interrupt];
Commands.Go[];
END
ELSE {FlushCaches[resumeSession]; Break[]};
why ← proceed;
END;
explicitcall, worrycall =>
BEGIN
GetUserMessage[];
IF e.reason = worrycall THEN data.worryEntry ← TRUE;
IF e.level # data.level THEN NewLoadState[debug];
FlushCaches[resumeSession];
IF usermessage # NIL THEN Dump.UserText[usermessage];
Commands.Go[];
why ← proceed;
END;
uncaughtsignal =>
BEGIN
data.signal ←
LOOPHOLE[Gf.NewLink[DebugOps.ShortREAD[@e.state.stk[1]]]];
IF e.level # data.level THEN NewLoadState[ucs];
FlushCaches[resumeSession];
UCSHandler[];
why ← resume;
END;
punt =>
BEGIN
data.restartMsg ← punt;
Init.bootLoaded ← TRUE;
data.StatePtr ← data.ESV.state ← Inline.LowHalf[DPsb.State[]];
NewLoadState[debug];
END;
return => {FlushCaches[resumeSession]; EXIT};
ENDCASE => InvalidMessage[];
END;
2 => -- just booted
BEGIN OPEN CoreSwapDefs;
punt: POINTER TO PuntTable = DebugOps.ShortREAD[PuntInfo];
Init.bootLoaded ← TRUE;
SetDebugeeType[]; --so data can be intialized before READs
data.restartMsg ← bootloaded;
IF punt # NIL THEN DebugOps.ShortCopyREAD[
from: @punt.puntESV, to: @data.ESV, nwords: SIZE[ExternalStateVector]]
ELSE DHeap.Zero[@data.ESV, SIZE[ExternalStateVector]];
data.ESV.bitmap ← NIL;
data.StatePtr ← data.ESV.state ← Inline.LowHalf[DPsb.State[]];
NewLoadState[debug];
END;
ENDCASE;
ENDLOOP;
data.ESV ← e;
RETURN
END;
SetDebugeeType: PROCEDURE =
BEGIN OPEN OsStaticDefs, BcplOps;
vers: ARRAY [0..1] OF WORD ← [61014B, 1400B];
OsStatics.AltoVersion ← BcplJSR[JSR, @vers, 0];
data.mds ← 0;
IF data.ESV.versionident = CoreSwapDefs.VersionID OR Init.bootLoaded THEN RETURN;
InvalidMessage[];
END;
InvalidMessage: PROCEDURE =
BEGIN
data.restartMsg ← invalid;
SIGNAL Debug;
END;
END.