-- ControlDefs.Mesa Edited by Sandman on July 1, 1980 8:57 AM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
PrincOps USING [
AllocationVector, AllocationVectorSize, AllocTag, ATPreg, AV, BYTE, BytePC,
EntryInfo, EPIndex, EPRange, FieldDescriptor, FrameClass, FrameCodeBase,
FrameVec, LargeReturnSlot, LastAVSlot, MainBodyIndex, MaxFrameSize, MaxNGfi,
MaxNLinks, MaxParamsInStack, MaxSmallFrameIndex, MDSreg, OTPreg, PDAreg,
PrefixHeader, PrefixInfo, PTCreg, SpecialReturnSlot, StateVector, SVPointer,
WDCreg, XTPreg, XTSreg];
ControlDefs: DEFINITIONS =
BEGIN
BYTE: TYPE = PrincOps.BYTE;
-- control link definitions
ControlLinkTag: TYPE = {frame, procedure, indirect, unbound};
ControlLink: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID ControlLinkTag FROM
frame => [frame: FrameHandle],
procedure => [gfi: GFTIndex, ep: EPIndex, tag: ControlLinkTag],
indirect => [
SELECT OVERLAID * FROM
port => [port: PortHandle],
link => [link: POINTER TO ControlLink],
ENDCASE],
ENDCASE];
ProcDesc, SignalDesc: TYPE = procedure ControlLink;
TrapLink, NullLink: ControlLink = ControlLink[frame[NullFrame]];
UnboundLink: ControlLink = ControlLink[
procedure[gfi: 0, ep: 0, tag: procedure]];
PortHandle: TYPE = POINTER TO Port;
Port: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID * FROM
representation => [in, out: UNSPECIFIED],
links => [frame: FrameHandle, dest: ControlLink],
ENDCASE];
-- frame definitions
MaxFrameSize: CARDINAL = PrincOps.MaxFrameSize;
MaxSmallFrameIndex: CARDINAL = PrincOps.MaxSmallFrameIndex;
FrameVec: ARRAY [0..LastAVSlot] OF [0..MaxFrameSize] = PrincOps.FrameVec;
FrameClass: TYPE = PrincOps.FrameClass;
Frame: TYPE = MACHINE DEPENDENT RECORD [
accesslink: GlobalFrameHandle,
pc: WordPC,
returnlink: ControlLink,
extensions:
SELECT OVERLAID FrameClass FROM
local => [unused: UNSPECIFIED, local: ARRAY [0..0) OF UNSPECIFIED],
signal => [mark: BOOLEAN, unused: [0..77777B]],
catch => [
unused: UNSPECIFIED, staticlink: FrameHandle, messageval: UNSPECIFIED],
dying => [state: {dead, alive}, unused: [0..77777B]],
ENDCASE];
FrameHandle: TYPE = POINTER TO Frame;
NullFrame: FrameHandle = LOOPHOLE[0];
GlobalFrame: TYPE = MACHINE DEPENDENT RECORD [
gfi: GFTIndex,
unused: [0..1], -- reserved for future gfi expansion
copied, alloced, shared, started: BOOLEAN,
trapxfers, codelinks: BOOLEAN,
code: FrameCodeBase,
global: ARRAY [0..0) OF UNSPECIFIED];
FrameCodeBase: TYPE = PrincOps.FrameCodeBase;
GlobalFrameHandle: TYPE = POINTER TO GlobalFrame;
NullGlobalFrame: GlobalFrameHandle = LOOPHOLE[0];
-- The following offsets are used by the compiler and MUST
-- reflect the field offsets in the definitions of Frame
-- local frames
accessOffset: CARDINAL = 0;
pcOffset: CARDINAL = 1;
returnOffset: CARDINAL = 2;
-- global frames
gfiOffset: CARDINAL = 0;
codebaseOffset: CARDINAL = 1;
-- efficiently addressable portion of frames
globalbase: CARDINAL = SIZE[GlobalFrame];
localbase: CARDINAL = SIZE[local Frame];
framelink: CARDINAL = localbase;
-- code segments
WordPC: TYPE = RECORD [INTEGER];
BytePC: TYPE = PrincOps.BytePC;
InstWord: TYPE = MACHINE DEPENDENT RECORD [oddbyte, evenbyte: BYTE];
FieldDescriptor: TYPE = PrincOps.FieldDescriptor;
EPRange: CARDINAL = PrincOps.EPRange;
EPIndex: TYPE = PrincOps.EPIndex;
-- Global frame size preceeds body zero
CSegPrefix: TYPE = MACHINE DEPENDENT RECORD [
header: PrefixHeader, entry: ARRAY [0..0) OF EntryVectorItem];
PrefixHandle: TYPE = POINTER TO CSegPrefix;
PrefixHeader: TYPE = PrincOps.PrefixHeader;
PrefixInfo: TYPE = PrincOps.PrefixInfo;
EntryVectorItem: TYPE = MACHINE DEPENDENT RECORD [
initialpc: WordPC, info: EntryInfo];
EntryInfo: TYPE = PrincOps.EntryInfo;
MaxNLinks: CARDINAL = PrincOps.MaxNLinks;
MainBodyIndex: CARDINAL = PrincOps.MainBodyIndex;
-- Global Frame Table definitions
MaxNGfi: CARDINAL = PrincOps.MaxNGfi;
GFTHandle: TYPE = POINTER TO ARRAY [0..0) OF GFTItem;
GFT: GFTHandle = LOOPHOLE[1400B];
GFTItem: TYPE = MACHINE DEPENDENT RECORD [
frame: GlobalFrameHandle, epbase: CARDINAL];
GFTIndex: TYPE = [0..777B];
GFTNull: GFTIndex = 0;
NullEpBase: CARDINAL = LAST[CARDINAL];
MaxGFTSize: CARDINAL = (LAST[GFTIndex] + 1)*SIZE[GFTItem];
-- system frame allocation vector
AllocTag: TYPE = PrincOps.AllocTag;
AVItem: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID * FROM
data => [fsi: [0..37777B], tag: AllocTag],
link => [link: POINTER TO AVItem],
frame => [frame: FrameHandle],
ENDCASE];
AllocationVectorSize: CARDINAL = PrincOps.AllocationVectorSize;
LastAVSlot: CARDINAL = PrincOps.LastAVSlot;
AllocationVector: TYPE = ARRAY [0..AllocationVectorSize) OF AVItem;
AVHandle: TYPE = POINTER TO AllocationVector;
AV: AVHandle = LOOPHOLE[PrincOps.AV];
LargeReturnSlot: CARDINAL = PrincOps.LargeReturnSlot;
SpecialReturnSlot: CARDINAL = PrincOps.SpecialReturnSlot;
-- control module stuff
ControlModule: TYPE = MACHINE DEPENDENT RECORD [
SELECT OVERLAID * FROM
frame => [frame: GlobalFrameHandle],
list => [list: POINTER TO FrameList],
tag => [fill: [0..77777B], multiple: BOOLEAN],
ENDCASE];
FrameList: TYPE = MACHINE DEPENDENT RECORD [
nModules: CARDINAL, frames: ARRAY [0..0) OF GlobalFrameHandle];
NullControl: ControlModule = [frame[NullGlobalFrame]];
-- control registers
-- known by the microcode
WDCreg: CARDINAL = PrincOps.WDCreg; -- wakeup disable counter
XTSreg: CARDINAL = PrincOps.XTSreg; -- xfer trap status
XTPreg: CARDINAL = PrincOps.XTPreg; -- xfer trap parameter
ATPreg: CARDINAL = PrincOps.ATPreg; -- alloc trap parameter
OTPreg: CARDINAL = PrincOps.OTPreg; -- other trap parameter
MDSreg: CARDINAL = PrincOps.MDSreg; -- main data space
PDAreg: CARDINAL = PrincOps.PDAreg; -- process data area
PTCreg: CARDINAL = PrincOps.PTCreg; -- process tick count
SVPointer: TYPE = PrincOps.SVPointer;
StateVector: TYPE = PrincOps.StateVector;
MaxParamsInStack: CARDINAL = PrincOps.MaxParamsInStack;
-- Xfer Trap Stuff
TrapReason: TYPE = {other, localCall, return};
TrapState: TYPE = {off, on, pending};
TrapStatus: TYPE = MACHINE DEPENDENT RECORD [
fill1: [0..177B], reason: TrapReason, fill2: [0..37B], state: TrapState];
TrapParameter: TYPE = RECORD [
SELECT OVERLAID TrapReason FROM
other => [link: ControlLink],
localCall => [ep: CARDINAL], -- Actually 2*ep+2
return => [frame: FrameHandle], -- Actually frame+6
ENDCASE];
NullReason: TrapReason = LOOPHOLE[0];
TraceOff: TrapStatus = [0, NullReason, 0, off];
TraceNext: TrapStatus = [0, NullReason, 0, pending];
END.