DIRECTORY Basics USING [DIVMOD], LupineRuntime USING [CheckPktLength, Words], PrincOpsUtils USING [LongCOPY], RPCLupine USING [DataLength, maxDataLength, ReceiveExtraPkt, RejectUnbound, RPCPkt, SendPrelimPkt ], RPC USING [CallFailed, Zones], SafeStorage USING [GetSystemZone], UnsafeStorage USING [GetSystemUZone]; LupineRuntimeImpl: PROGRAM IMPORTS Basics, Lupine: LupineRuntime, PrincOpsUtils, RpcPrivate: RPCLupine, RpcPublic: RPC, SafeStorage, UnsafeStorage EXPORTS LupineRuntime = BEGIN Words: TYPE = LupineRuntime.Words; TranslationError: PUBLIC ERROR = CODE; BindingError: PUBLIC ERROR = CODE; RuntimeError: PUBLIC ERROR = CODE; MarshalingError: PUBLIC PROCEDURE = {ERROR}; MarshalingExprError: PUBLIC PROCEDURE RETURNS [never: UNSPECIFIED] = {RETURN[ERROR]}; UnmarshalingError: PUBLIC PROCEDURE = {ERROR RpcPublic.CallFailed[why: stubProtocol]}; UnmarshalingExprError: PUBLIC PROCEDURE RETURNS [never: UNSPECIFIED] = {ERROR RpcPublic.CallFailed[why: stubProtocol]}; DispatchingError: PUBLIC PROCEDURE RETURNS [never: UNSPECIFIED] = {ERROR RpcPrivate.RejectUnbound}; defaultZones: PUBLIC RPC.Zones _ [ gc: SafeStorage.GetSystemZone[], heap: UnsafeStorage.GetSystemUZone[], mds: NIL--??-- ]; Checking: BOOLEAN _ TRUE; FinishThisPkt: PUBLIC PROCEDURE [ pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength ] RETURNS [--zeroPktLength:-- RpcPrivate.DataLength] = BEGIN Lupine.CheckPktLength[pkt: pkt, lastPkt: FALSE, pktLength: pktLength]; [] _ RpcPrivate.ReceiveExtraPkt[prevPkt: pkt]; RETURN[0]; END; StartNextPkt: PUBLIC PROCEDURE [ pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength ] RETURNS [--zeroPktLength:-- RpcPrivate.DataLength] = BEGIN RpcPrivate.SendPrelimPkt[pkt: pkt, length: pktLength]; RETURN[0]; END; CopyToMultiplePkts: PUBLIC PROCEDURE [ pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength, dataAdr: LONG POINTER, dataLength: Words ] RETURNS [--newPktLength:-- RpcPrivate.DataLength] = BEGIN initialWords: Words = RpcPrivate.maxDataLength - pktLength; wholePkts: CARDINAL _ NULL; finalWords: Words _ NULL; IF Checking AND NOT ( pktLength IN [0..RpcPrivate.maxDataLength] AND dataLength > 0 AND pktLength+dataLength > RpcPrivate.maxDataLength ) THEN ERROR; [quotient: wholePkts, remainder: finalWords] _ Basics.DIVMOD[ num: dataLength-initialWords, ------------------------ den: RpcPrivate.maxDataLength ]; PrincOpsUtils.LongCOPY[ from: dataAdr, to: @pkt.data[pktLength], nwords: initialWords]; dataAdr _ dataAdr + initialWords; THROUGH [0..wholePkts) DO RpcPrivate.SendPrelimPkt[pkt: pkt, length: RpcPrivate.maxDataLength]; PrincOpsUtils.LongCOPY[ from: dataAdr, to: @pkt.data[0], nwords: RpcPrivate.maxDataLength]; dataAdr _ dataAdr + RpcPrivate.maxDataLength; ENDLOOP; IF finalWords > 0 THEN BEGIN RpcPrivate.SendPrelimPkt[pkt: pkt, length: RpcPrivate.maxDataLength]; PrincOpsUtils.LongCOPY[from: dataAdr, to: @pkt.data[0], nwords: finalWords]; RETURN[finalWords]; END ELSE RETURN[RpcPrivate.maxDataLength]; END; CopyFromMultiplePkts: PUBLIC PROCEDURE [ pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength, dataAdr: LONG POINTER, dataLength: Words ] RETURNS [--newPktLength:-- RpcPrivate.DataLength] = BEGIN firstDataAdr: LONG POINTER = dataAdr; BEGIN ENABLE UNWIND => IF dataLength > 0 THEN BEGIN firstDataAdr^ _ 0; PrincOpsUtils.LongCOPY[ from: firstDataAdr, to: firstDataAdr+1, nwords: dataLength-1 ]; END; initialWords: Words = RpcPrivate.maxDataLength - pktLength; wholePkts: CARDINAL _ NULL; finalWords: Words _ NULL; IF Checking AND NOT ( pktLength IN [0..RpcPrivate.maxDataLength] AND dataLength > 0 AND pktLength+dataLength > RpcPrivate.maxDataLength ) THEN ERROR; [quotient: wholePkts, remainder: finalWords] _ Basics.DIVMOD[ num: dataLength-initialWords, ------------------------ den: RpcPrivate.maxDataLength ]; PrincOpsUtils.LongCOPY[ to: dataAdr, from: @pkt.data[pktLength], nwords: initialWords]; dataAdr _ dataAdr + initialWords; THROUGH [0..wholePkts) DO Lupine.CheckPktLength[ pkt: pkt, lastPkt: FALSE, pktLength: RpcPrivate.maxDataLength ]; [] _ RpcPrivate.ReceiveExtraPkt[prevPkt: pkt]; PrincOpsUtils.LongCOPY[ to: dataAdr, from: @pkt.data[0], nwords: RpcPrivate.maxDataLength]; dataAdr _ dataAdr + RpcPrivate.maxDataLength; ENDLOOP; IF finalWords > 0 THEN BEGIN Lupine.CheckPktLength[ pkt: pkt, lastPkt: FALSE, pktLength: RpcPrivate.maxDataLength ]; [] _ RpcPrivate.ReceiveExtraPkt[prevPkt: pkt]; PrincOpsUtils.LongCOPY[to: dataAdr, from: @pkt.data[0], nwords: finalWords]; RETURN[finalWords]; END ELSE RETURN[RpcPrivate.maxDataLength]; END; -- ENABLE UNWIND. END; IF NIL # LOOPHOLE[0, POINTER] THEN ERROR; END. -- LupineRuntimeImpl. ÒFile [Ivy]Lupine>LupineRuntimeImpl.mesa. Last edited by BZM on 12-May-82 19:17:55. This module is used at runtime for marshaling and other common functions. Last Edited by: Birrell, September 12, 1983 2:07 pm Lupine's errors. These procedures map into ERRORs (for now). These procedures map into RpcRuntime ERRORs. Default parameter storage zones. Parameter marshaling routines. Turning this off is okay; critical runtime checks are always on. Preconditions: Put initial data at the end of the current pkt. Put intermediate data into whole pkts. Put final data at the beginning of a fresh pkt. If there's a fault, zero everything. This ensures that any REF-containing fields are NIL and not chaos-causing garbage. Preconditions: Get initial data from the end of the current pkt. Get intermediate data from whole pkts. Get final data from the beginning of a fresh pkt. Module initialization. CopyTo/FromMultiplePkts assume that zero is the representation of NIL. �ʘJšœ0™0Jšœ)™)JšœI™IJ™3šÏk ˜ Jšœ�œ�œ˜Jšœ�œ˜,Jšœ�œ ˜Jšœ �œU˜dJš�œ�œ˜Jšœ �œ˜"Jšœ�œ˜%J˜—šœ�˜Jš�œQ�œ˜wJš�œ˜Jš�˜J˜Jšœ�œ˜"J˜—Jšœ™˜Jšœ�œ�œ�œ˜&Jšœ�œ�œ�œ˜"Jšœ�œ�œ�œ˜"J˜—Jšœ+™+˜JšÏnœ�œ� œ�œ˜,J˜š žœ�œ� œ�œ � œ˜DJšœ�œ�œ˜J˜J˜——Jšœ,™,˜šžœ�œ� œ˜%Jšœ�œ*˜0J˜—š žœ�œ� œ�œ � œ˜FJšœ�œ*˜0J˜—š žœ�œ� œ�œ � œ˜AJšœ�œ˜!J˜J˜——Jšœ ™ ˜šœ�œ�œ ˜"Jšœ ˜ Jšœ%˜%Jšœ�Ïc˜Jšœ˜—J˜J˜—Jšœ™J˜˜šœ �œ�œ˜Jšœ@™@J˜J˜—šž œ�œ� œ˜!J˜J˜"Jš�œŸœ˜4Jš�˜Jšœ)�œ˜FJ˜.Jš�œ˜ Jš�œ˜J˜—šž œ�œ� œ˜ J˜J˜"Jš�œŸœ˜4Jš�˜J˜6Jš�œ˜ Jš�œ˜J˜J˜—šžœ�œ� œ˜&J˜J˜!Jšœ �œ�œ˜J˜Jš�œŸœ˜3Jš�˜J˜;Jšœ �œ�œ˜Jšœ�œ˜š�œ �œ�œ˜Jšœ™Jšœ �œ�˜.Jšœ�˜J˜1Jš�œ�œ˜ —šœ6�œ˜=˜JšŸ˜—J˜ —Jšœ/™/˜J˜?—J˜!Jšœ&™&š�œ�˜J˜E˜J˜C—J˜-Jš�œ˜—Jšœ/™/š�œ˜š�œ�˜ J˜EJ˜LJš�œ ˜Jš�˜—Jš�œ�œ˜&—Jš�œ˜J˜J˜—šžœ�œ� œ˜(J˜J˜!Jšœ �œ�œ˜J˜Jš�œŸœ˜3Jš�˜Jšœ�œ�œ ˜%š�œ�œ�œ˜Jšœ;™;Jšœ<™<š�œ�œ�˜J˜˜J˜?—Jš�œ˜——J˜;Jšœ �œ�œ˜Jšœ�œ˜š�œ �œ�œ˜Jšœ™Jšœ �œ�˜.Jšœ�˜J˜1Jš�œ�œ˜ —šœ6�œ˜=˜JšŸ˜—J˜ —Jšœ1™1˜J˜?—J˜!Jšœ&™&š�œ�˜˜Jšœ�œ(˜@—J˜.˜J˜C—J˜-Jš�œ˜—Jšœ1™1š�œ˜š�œ�˜ ˜Jšœ�œ(˜@—J˜.J˜LJš�œ ˜Jš�˜—Jš�œ�œ˜&—Jš�œŸ˜Jš�œ˜J˜J˜——Jšœ™˜JšœF™FJš �œ�œ�œ�œ�œ�œ˜)J˜—Jš�œŸ˜J˜—…—