// SwatSysInOut.bcpl - save/restore Swatee // Copyright Xerox Corporation 1979, 1982 // Last Modified May 6, 1982 3:40 PM by Taft get "Swat.decl" get "streams.d" external [ // outgoing procedures SysOut; SysIn // incoming procedures from Swat ReportFail; SetFailPt; UnSetFailPt SymSysIn; ResidentSysIn; BreakSysIn; StackSysIn SymSysOut; ResidentSysOut; BreakSysOut; StackSysOut StopSpy; ResidentSwapIn; VMCache; ReadString; SymReset // incoming procedures from OS Allocate; Free; Ws; Zero; Usc OpenFile; Closes; Gets; Puts ReadBlock; WriteBlock; FileLength ReadDiskDescriptor; WriteDiskDescriptor // incoming statics swatVersion; sysZone; vm ] //---------------------------------------------------------------------------- let SysOut() be //---------------------------------------------------------------------------- [ let name = ReadString("SysOut file name: ") if name eq 0 return ReadDiskDescriptor() let sysOut = OpenFile(name) Free(sysZone, name) let swatee = OpenFile("Swatee", ksTypeReadOnly) let buf = 0 SetFailPt(so) [ StopSpy() VMCache(vm, vmFlush) let lenBuf = 77777b buf = Allocate(sysZone, lenBuf, lv lenBuf) repeatuntil buf ne 0 let toDo = 377b*400b //copy 377b pages from sysIn file to swatee while toDo ne 0 do [ let read = ReadBlock(swatee, buf, Usc(lenBuf, toDo) le 0? lenBuf, toDo) WriteBlock(sysOut, buf, read) toDo = toDo - read ] Free(sysZone, buf); buf = 0 // version number of Swat tells format of internal state that follows Puts(sysOut, 31415) Puts(sysOut, swatVersion) Puts(sysOut, 21718) // Dump the internal state of swat. ResidentSysOut(sysOut) BreakSysOut(sysOut) StackSysOut(sysOut) SymSysOut(sysOut) UnSetFailPt() ] so: if buf ne 0 then Free(sysZone, buf) Closes(sysOut) Closes(swatee) WriteDiskDescriptor() ] //---------------------------------------------------------------------------- and SysIn() be //---------------------------------------------------------------------------- [ let name = ReadString("SysIn file name: ") if name eq 0 return let sysIn = OpenFile(name, ksTypeReadOnly) if sysIn eq 0 then [ Free(sysZone, name); ReportFail("File not found") ] let swatee = OpenFile("Swatee") let buf = 0 SetFailPt(si) [ StopSpy() SymReset() VMCache(vm, vmFlushReset) let lenBuf = 77777b buf = Allocate(sysZone, lenBuf, lv lenBuf) repeatuntil buf ne 0 let toDo = 377b*400b //copy 377b pages from swatee to sysOut file while toDo ne 0 do [ let read = ReadBlock(sysIn, buf, Usc(lenBuf, toDo) le 0? lenBuf, toDo) WriteBlock(swatee, buf, read) toDo = toDo - read ] Free(sysZone, buf); buf = 0 // See if internal state format is compatible with this Swat let vers = vec 2; ReadBlock(sysIn, vers, 3) if vers!0 ne 31415 % vers!1 ls sysInOutVersion % vers!2 ne 21718 then [ Ws("The SysIn file is incompatible with this version of Swat.*N") Ws("The core image is ok, but symbols, breakpoints etc are lost.*N") FileLength(sysIn) ] ResidentSysIn(sysIn) BreakSysIn(sysIn) StackSysIn(sysIn) SymSysIn(sysIn, name) UnSetFailPt() ] si: Free(sysZone, name) ResidentSwapIn() if buf ne 0 then Free(sysZone, buf) Closes(sysIn) Closes(swatee) ]