From: SMTP%"DSJ@WKUVX1.WKU.EDU" 21-DEC-1993 10:58:30.74 To: EVERHART CC: Subj: AUGUST93.IMDTIM X-FileServer: Digital Systems Journal File Server Date: Tue, 21 Dec 1993 09:54:42 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST93.IMDTIM To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : IMDTIM $! By : Hunter Goatley $! Date : 12-AUG-1993 12:13:53.89 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. BUILD_IMMEDTIM.COM;1 $! 2. BUILD_TEST.COM;1 $! 3. IMDTIM.DESC;1 $! 4. IMMEDTEST.C;1 $! 5. IMMEDTIM.MAR;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X$`20!`09BUILD_IMMEDTIM.COM`20-`20build`20and`20install`20user-written`20system V`20service X$ X$`09on`20warning`20then`20exit X$`09macro`20immedtim X$`09link`20/protect/nosysshr/share=immedtim/map=immedtim`20 Xsys$input/options Xcluster=transter_vector,,,sys$disk:`5B`5Dimmedtim.obj Xgsmatch=lequal,1,1 X$ X$`09libfile`20=`20"SYS$COMMON:`5BSYSLIB`5DIMMEDTIM.EXE" X$`09install`20=`20"$install/command_mode" X$`09if`20f$search(libfile)`20.nes.`20"" X$`09then X$`09`09if`20f$file_attributes(libfile,"KNOWN")`20- X`09`09`09then`20install`20remove`20'libfile' X$`09endif X$`09copy`20immedtim.exe`20'libfile' X$`09install`20add`20'libfile'/open/header_resident/shareable/protected X$ X$`20!`09end`20BUILD_IMMEDTIM.COM $ call unpack BUILD_IMMEDTIM.COM;1 39919012 "" 2 1 5 $! $ create 'f' X$`20!`09build_test.com`20-`20compile`20and`20link`20test_immedtim.c X$ X$`20on`20warning`20then`20exit X$ X$`20cc`20test_immedtim X$`20link`20test_immedtim+sys$input/options Xsys$share:vaxcrtl/share Xsys$share:immedtim/share X$`20exit`201 X$ X$`20!`09end`20build_test.com $ call unpack BUILD_TEST.COM;1 1409947868 "" 1 2 5 $! $ create 'f' XThis`20file`20offers`20code`20originally`20published`20in`20the`20July/August V`201993`20issue`20of XDigital`20Systems`20Journal.`20`20It`20was`20first`20run`20as`20part`20of`20Ja Vmie`20Hanrahan`20and XJerrold`20Leichter's`20article`20"OpenVMS`20Kernels:`20Writing`20Correct`20Mul Vtithreaded XCode,"`20found`20on`20page`2035.`20`20This`20article`20ran`20as`20part`20of`20 Va`20three-part`20series Xin`20which`20the`20authors`20present`20solutions`20to`20an`20alarm`20clock`20p Vrogram`20that`20works Xunreliably.`20`20Here`20they`20present`20on`20a`20user-written`20system`20serv Vice`20that`20will Xcancel`20timer`20queue`20entries`20by`20changing`20their`20due`20time`20so`20t Vhat`20they`20come`20out Xreliably. $ call unpack IMDTIM.DESC;1 1903305962 "" 2 3 5 $! $ create 'f' X/* X`20*`09immedtest.c`20-`20test`20"immedtim"`20system`20service X`20*/ X X#include`20descrip X X#define`20ASCTIM_MAX`2023 X#define`20TIME_ONLY`201 X Xvoid`20timedast(unsigned`20long`20reqid);`09/*`20declare`20forward-ref'd`20 Xfunctions`20*/ Xchar`20*gettime(unsigned`20long`20cvtflg); X Xmain() X`7B X`09$DESCRIPTOR(tensec_dsc,`20"0`200:0:10"); X`09unsigned`20long`20duetime`5B2`5D; X X`09SYS$BINTIM(`26tensec_dsc,`20duetime); X X`09printf("%s`20main():`20queueing`20first`20$SETIMR`5Cn",`20 Xgettime(TIME_ONLY)); X X`09/*`20request`20an`20AST`20ten`20seconds`20from`20now`20*/ X`09SYS$SETIMR(0,`20duetime,`20timedast,`201,`200); X X`09/*`20allow`20it`20to`20happen`20(demonstrate`20that`20timer`20works`20norma Vlly`20*/ X`09SYS$HIBER(); X X`09printf("%s`20main():`20queueing`20second`20$SETIMR`5Cn",`20 Xgettime(TIME_ONLY)); X X`09/*`20request`20another`20AST`20ten`20seconds`20from`20now`20*/ X`09SYS$SETIMR(0,`20duetime,`20timedast,`202,`200); X X`09/*`20make`20it`20happen`20immediately`20*/ X`09immedtim(2,`200); X X`09/*`20allow`20it`20to`20happen`20*/ X`09SYS$HIBER(); X X`09printf("%s`20main():`20exiting`5Cn",`20gettime(TIME_ONLY)); X`7D X Xvoid`20timedast(unsigned`20long`20reqid) X`7B X`09printf("%s`20timedast():`20reqid`20is`20%d`5Cn",`20gettime(TIME_ONLY),`20 Xreqid); X`09SYS$WAKE(0,0); X`7D X X/*`20 X`20*`20gettim()`20 X`20*`20returns`20pointer`20to`20local`20static`20buffer`20containing`20current V`20time X`20*`20Arguments:`09cvtflg`20-`20passed`20to`20$ASCTIM.`20`20If`201,`20return V`20only`20 XHH:MM:SS.CC X`20*`09`09`09`09`09`20`20`20`20`20If`200,`20return`20date+time X`20*/ X Xchar`20*gettime(unsigned`20long`20cvtflg) X`7B X`09static`20char`20thetime`5BASCTIM_MAX+1`5D; X`09$DESCRIPTOR(thetime_dsc,`20thetime); X`09unsigned`20short`20timlen; X X`09SYS$ASCTIM(`26timlen,`20`26thetime_dsc,`200,`20cvtflg); X`09thetime`5Btimlen`5D`20=`20'`5C0'; X X`09return`20thetime; X`7D X X/*`20end`20of`20immedtest.c`20*/ $ call unpack IMMEDTEST.C;1 356676408 "" 3 4 5 $! $ create 'f' X`09.TITLE`09IMMEDTIM`20-`20Force`20immediate`20TQE`20expiration X`09.IDENT`09'X001-000' X X;++ X;`20IMMEDTIM`20-`20Force`20immediate`20TQE`20expiration X; X;`20Revision`20History: X; X;`09X001-000`09Jamie`20Hanrahan`20and`20Jerry`20Leichter`09 X15-Apr-1993 X; X;`09First`20version.`20`20Based`20on`20SYS$EXAMPLES:USSDISP.MAR,`20version`20X V-3. X;-- X X`09.PAGE X`09.SBTTL`09Declarations`20and`20Equates X X`09.LIBRARY`20"SYS$LIBRARY:LIB.MLB"`09;`20system`20structure`20definitions X`09.LINK`09"SYS$SYSTEM:SYS.STB"`20/SELECTIVE_SEARCH X X`09$PLVDEF`09`09`09`09;`20`20PLV`20offsets`20and`20values X`09$PCBDEF`09`09`09`09;`20`20symbols`20for`20process`20control`20 Xblock X`09$SSDEF`09`09`09`09;`20`20system`20status`20codes X`09$TQEDEF`09`09`09`09;`20`20symbols`20for`20timer`20queue`20 Xelements X X;++ X;`09Macro`20Definitions X; X;`09DEFINE_SERVICE`20-`20A`20macro`20to`20make`20the`20appropriate`20entries V`20in`20 Xseveral X;`09`09`09`20different`20PSECTs`20required`20to`20define`20an`20EXEC`20or`20 XKERNEL X;`09`09`09`20mode`20service.`20`20These`20include`20the`20transfer`20 Xvector, X;`09`09`09`20the`20case`20table`20for`20dispatching,`20and`20a`20table`20 Xcontaining X;`09`09`09`20the`20number`20of`20required`20arguments. X; X;`09DEFINE_SERVICE`20Name,Number_of_Arguments,Mode X;-- X X`09.MACRO`09DEFINE_SERVICE,NAME,NARG=0,MODE=KERNEL X`09.PSECT`09$$$TRANSFER_VECTOR,PAGE,NOWRT,EXE,PIC X`09.ALIGN`09QUAD`09`09`09;`20Align`20entry`20points`20for`20speed`20 Xand`20style X`09.TRANSFER`09NAME`09`09;`20Define`20name`20as`20universal`20 Xsymbol`20for`20entry X`09`09`09`09`09;`20****`20`20Note`201`20`20**** X`09.MASK`09NAME,`5EM`09`09;`20Use`20entry`20mask`20defined`20in`20main`20 V Xroutine X`09.IF`09IDN`20MODE,KERNEL X`09CHMK`09#`20;`20Change`20to`20kernel`20mode`20and V`20 Xexecute X`09RET`09`09`09`09;`20Return X`09KERNEL_COUNTER=KERNEL_COUNTER+1`09;`20Advance`20counter X X`09.PSECT`09KERNEL_NARG,BYTE,NOWRT,EXE,PIC X`09.BYTE`09NARG`09`09`09;`20Define`20number`20of`20required`20 Xarguments X X`09.PSECT`09USER_KERNEL_DISP1,BYTE,NOWRT,EXE,PIC X`09.SIGNED_WORD`092+NAME-KCASE_BASE`09;`20Make`20entry`20in`20kernel`20 Xmode`20CASE`20table X X`09.IFF X`09CHME`09#`20;`20Change`20to`20executive`20mode`20 Xand`20execute X`09RET`09`09`09`09;`20Return X`09EXEC_COUNTER=EXEC_COUNTER+1`09;`20Advance`20counter X X`09.PSECT`09EXEC_NARG,BYTE,NOWRT,EXE,PIC X`09.BYTE`09NARG`09`09`09;`20Define`20number`20of`20required`20 Xarguments X X`09.PSECT`09USER_EXEC_DISP1,BYTE,NOWRT,EXE,PIC X`09.SIGNED_WORD`092+NAME-ECASE_BASE`09;`20Make`20entry`20in`20exec`20 Xmode`20CASE`20table X`09.ENDC`09`09`09`09; X`09.ENDM`09DEFINE_SERVICE`09`09; X X;+ X;`09Equated`20Symbols X;- X X;`09Initialize`20counters`20for`20change`20mode`20dispatching`20codes X XKERNEL_COUNTER=0`09`09`09;`20Kernel`20code`20counter XEXEC_COUNTER=0`09`09`09`09;`20Exec`20code`20counter X X;`09Own`20Storage X; X`09.PSECT`09KERNEL_NARG,BYTE,NOWRT,EXE,PIC XKERNEL_NARG:`09`09`09`09;`20Base`20of`20byte`20table`20containing`20 Xthe X`09`09`09`09`09;`20`20number`20of`20required`20arguments. X`09.PSECT`09EXEC_NARG,BYTE,NOWRT,EXE,PIC XEXEC_NARG:`09`09`09`09;`20Base`20of`20byte`20table`20containing`20 Xthe X`09`09`09`09`09;`20`20number`20of`20required`20arguments. X X`09.PAGE X`09.SBTTL`09Transfer`20Vector`20and`20Service`20Definitions X;++ X;`20The`20use`20of`20transfer`20vectors`20to`20effect`20entry`20to`20the`20use Vr`20written`20system`20 Xservices X;`20enables`20some`20updating`20of`20the`20shareable`20image`20containing`20th Vem`20without`20 Xnecessitating X;`20a`20re-link`20of`20all`20programs`20that`20call`20them.`20`20The`20PSECT V`20containinng`20the`20 Xtransfer X;`20vector`20will`20be`20positioned`20at`20the`20lowest`20virtual`20address`20 Vin`20the`20 Xshareable`20image X;`20and`20so`20long`20as`20the`20transfer`20vector`20is`20not`20re-ordered,`20 Vprograms`20linked`20 Xwith X;`20one`20version`20of`20the`20shareable`20image`20will`20continue`20to`20work V`20with`20the`20 Xnext. X; X;`20Thus`20as`20additional`20services`20are`20added`20to`20a`20privileged`20sh Vareable`20image,`20 Xtheir X;`20definitions`20should`20be`20added`20to`20the`20end`20of`20the`20following V`20list`20to`20ensure`20 Xthat X;`20programs`20using`20previous`20versions`20of`20it`20will`20not`20need`20to V`20be`20re-linked. X;`20To`20completely`20avoid`20relinking`20existing`20programs`20the`20size`20o Vf`20the`20 Xprivileged X;`20shareable`20image`20must`20not`20change`20so`20some`20padding`20will`20be V`20required`20to`20 Xprovide X;`20the`20opportunity`20for`20future`20growth. X;-- X X`09;`20Force`20$SETIMR`20requests`20to`20complete`20now`20***`20Note`202`20*** V X`09DEFINE_SERVICE`09IMMEDTIM,2,KERNEL`20 X X;`20The`20base`20values`20used`20to`20generate`20the`20dispatching`20codes`20s Vhould`20be`20 Xnegative`20for X;`20user`20services`20and`20must`20be`20chosen`20to`20avoid`20overlap`20with V`20any`20other`20 Xprivileged X;`20shareable`20images`20that`20will`20be`20used`20concurrently.`20`20Their`20 Vdefinition`20is X;`20deferred`20to`20this`20point`20in`20the`20assembly`20to`20cause`20their`20 Vuse`20in`20the`20 Xpreceding X;`20macro`20calls`20to`20be`20forward`20references`20that`20guarantee`20the`20 Vsize`20of`20the`20 Xchange X;`20mode`20instructions`20to`20be`20four`20bytes.`20`20This`20satisfies`20an V`20assumption`20that`20 Xis X;`20made`20by`20for`20services`20that`20have`20to`20wait`20and`20be`20retried. V`20`20The`20PC`20for`20 Xretrying X;`20the`20change`20mode`20instruction`20that`20invokes`20the`20service`20is`20 Vassumed`20to`20be`20 X4`20bytes`20 X;`20less`20than`20that`20saved`20in`20the`20change`20mode`20exception`20frame. V`20`20Of`20course,`20 Xthe`20particular`20 X;`20service`20routine`20determines`20whether`20this`20is`20possible. X XKCODE_BASE=-1024`09`09`09;`20Base`20CHMK`20code`20value`20for`20these`20 Xservices XECODE_BASE=-1024`09`09`09;`20Base`20CHME`20code`20value`20for`20these`20 Xservices X X`09.PAGE X`09.SBTTL`09Change`20Mode`20Dispatcher`20Vector`20Block X X;++ X;`20This`20vector`20is`20used`20by`20the`20image`20activator`20to`20connect`20 Vthe`20privileged`20 Xshareable X;`20image`20to`20the`20VMS`20change`20mode`20dispatcher.`20`20The`20offsets`20 Vin`20the`20vector`20 Xare`20self- X;`20relative`20to`20enable`20the`20construction`20of`20position`20independent V`20images.`20`20 XThe`20system X;`20version`20number`20will`20be`20used`20by`20the`20image`20activator`20to`20 Vverify`20that`20this`20 Xshareable X;`20image`20was`20linked`20with`20the`20symbol`20table`20for`20the`20current V`20system. X; X;`09`09`09Change`20Mode`20Vector`20Format`09`09 X; X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20Vector`20Type`20Code`20 V`20`20`20`20`20`20`20`20`20`20`20`20!`20`20`20PLV$L_TYPE X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20(PLV$C_TYP_CMOD)`20`20`20 V`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Reserved`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20Kernel`20Mode`20Dispatcher`20Offset`20`20`20 V`20`20`20`20!`20`20`20PLV$L_KERNEL X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20Exec`20Mode`20Entry`20Offset`20`20`20 V`20`20`20`20`20`20`20`20!`20`20`20PLV$L_EXEC X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`09`20`20`20User`20Rundown`20Service`20Offset`20`20`20`20`20`20 V`20`20!`20`20`20PLV$L_USRUNDWN X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20Reserved`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20RMS`20Dispatcher`20Offset`20`20`20 V`20`20`20`20`20`20`20`20!`20`20`20PLV$L_RMS`20`20 X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20Address`20Check`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20!`20`20`20PLV$L_CHECK X;`09`20`20`20!`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20! X;`09`20`20`20+------------------------------------------+ X; X;-- X X`09.PSECT`09USER_SERVICES,PAGE,VEC,PIC,NOWRT,EXE X X`09.LONG`09PLV$C_TYP_CMOD`09`09;`20Set`20type`20of`20vector`20to`20change`20 Xmode`20dispatcher X`09.LONG`090`09`09`09;`20Reserved X`09.LONG`09KERNEL_DISPATCH-.`09;`20Offset`20to`20kernel`20mode`20 Xdispatcher X`09.LONG`09EXEC_DISPATCH-.`09`09;`20Offset`20to`20executive`20mode`20 Xdispatcher X`09.LONG`09USER_RUNDOWN-.`09`09;`20Offset`20to`20user`20rundown`20service X`09.LONG`090`09`09`09;`20Reserved. X`09.LONG`090`09`09`09;`20No`20RMS`20dispatcher X`09.LONG`090`09`09`09;`20Address`20check`20-`20PIC`20image X X`09.PAGE X`09.SBTTL`09Kernel`20Mode`20Dispatcher X;++ X;`20Input`20Parameters: X; X;`09(SP)`20-`20Return`20address`20if`20bad`20change`20mode`20value X; X;`09`20R0`20`20-`20Change`20mode`20argument`20value. X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X;`09`20R4`20`20-`20Current`20PCB`20Address.`20(Therefore`20R4`20must`20be`20sp Vecified`20in`20 Xall X;`09`09`20register`20save`20masks`20for`20kernel`20routines.) X; X;`09`20AP`20`20-`20Argument`20pointer`20existing`20when`20the`20change X;`09`20`20`20`20`20`20`20mode`20instruction`20was`20executed. X; X;`09`20FP`20`20-`20Address`20of`20minimal`20call`20frame`20to`20exit X;`09`20`20`20`20`20`20`20the`20change`20mode`20dispatcher`20and`20return`20to V X;`09`20`20`20`20`20`20`20the`20original`20mode. X;-- X`09.PSECT`09USER_KERNEL_DISP0,BYTE,NOWRT,EXE,PIC XKACCVIO:`09`09`09`09;`20Kernel`20access`20violation X`09MOVZWL`09#SS$_ACCVIO,R0`09`09;`20Set`20access`20violation`20status`20 Xcode X`09RET`09`09`09`09;`20`20and`20return XKINSFARG:`09`09`09`09;`20Kernel`20insufficient`20arguments. X`09MOVZWL`09#SS$_INSFARG,R0`09`09;`20Set`20status`20code`20and X`09RET`09`09`09`09;`20`20return XKNOTME:`09RSB`09`09`09`09;`20RSB`20to`20forward`20request X XKERNEL_DISPATCH::`09`09`09;`20Entry`20to`20dispatcher X`09MOVAB`09W`5E-KCODE_BASE(R0),R1`09;`20Normalize`20dispatch`20code`20value X`09BLSS`09KNOTME`09`09`09;`20Branch`20if`20code`20value`20too`20low X`09CMPW`09R1,#KERNEL_COUNTER`09;`20Check`20high`20limit X`09BGEQU`09KNOTME`09`09`09;`20Branch`20if`20out`20of`20range X; X;`20The`20dispatch`20code`20has`20now`20been`20verified`20as`20being`20handled V`20by`20this`20 Xdispatcher, X;`20now`20the`20argument`20list`20will`20be`20probed`20and`20the`20required`20 Vnumber`20of`20 Xarguments X;`20verified. X; X`09MOVZBL`09W`5EKERNEL_NARG`5BR1`5D,R1`09;`20Get`20required`20argument`20count V X`09MOVAL`09@#4`5BR1`5D,R1`09`09;`20Compute`20byte`20count`20including`20 Xarg`20count X`09IFNORD`09R1,(AP),KACCVIO`09`09;`20Branch`20if`20arglist`20not`20readable X`09CMPB`09(AP),W`5E`5BR0`5D`20;`20Check`20for`20requir Ved`20 Xnumber X`09BLSSU`09KINSFARG`09`09;`20`20of`20arguments X`09MOVL`09FP,SP`09`09`09;`20Reset`20stack`20for`20service`20 Xroutine X`09CASEW`09R0,-`09`09`09;`20Case`20on`20change`20mode X`09`09-`09`09`09;`20argument`20value X`09`09#KCODE_BASE,-`09`09;`20Base`20value X`09`09#`09;`20Limit`20value`20(number`20of`20 Xentries) XKCASE_BASE:`09`09`09`09;`20Case`20table`20base`20address`20for`20 XDEFINE_SERVICE X; X;`09Case`20table`20entries`20are`20made`20in`20the`20PSECT`20USER_KERNEL_DISP1 V`20by X;`09invocations`20of`20the`20DEFINE_SERVICE`20macro.`20`20The`20three`20PSECTS V,`20 X;`09USER_KERNEL_DISP0,1,2`20will`20be`20abutted`20in`20lexical`20order`20at`20 V Xlink-time. X; X`09.PSECT`09USER_KERNEL_DISP2,BYTE,NOWRT,EXE,PIC X`09BUG_CHECK`20IVSSRVRQST,FATAL`09;`20Since`20the`20change`20mode`20code`20is V`20 Xvalidated X`09`09`09`09`09;`20above,`20we`20should`20never`20get`20 Xhere X`09.PAGE X`09.SBTTL`09Executive`20Mode`20Dispatcher X;++ X;`20Input`20Parameters: X; X;`09(SP)`20-`20Return`20address`20if`20bad`20change`20mode`20value X; X;`09`20R0`20`20-`20Change`20mode`20argument`20value. X; X;`09`20AP`20`20-`20Argument`20pointer`20existing`20when`20the`20change X;`09`20`20`20`20`20`20`20mode`20instruction`20was`20executed. X; X;`09`20FP`20`20-`20Address`20of`20minimal`20call`20frame`20to`20exit X;`09`20`20`20`20`20`20`20the`20change`20mode`20dispatcher`20and`20return`20to V X;`09`20`20`20`20`20`20`20the`20original`20mode. X;-- X`09.PSECT`09USER_EXEC_DISP0,BYTE,NOWRT,EXE,PIC XEACCVIO:`09`09`09`09;`20Exec`20access`20violation X`09MOVZWL`09#SS$_ACCVIO,R0`09`09;`20Set`20access`20violation`20status`20 Xcode X`09RET`09`09`09`09;`20`20and`20return XEINSFARG:`09`09`09`09;`20Exec`20insufficient`20arguments. X`09MOVZWL`09#SS$_INSFARG,R0`09`09;`20Set`20status`20code`20and X`09RET`09`09`09`09;`20`20return XENOTME:`09RSB`09`09`09`09;`20RSB`20to`20forward`20request X XEXEC_DISPATCH::`09`09`09`09;`20Entry`20to`20dispatcher X`09MOVAB`09W`5E-ECODE_BASE(R0),R1`09;`20Normalize`20dispatch`20code`20value X`09BLSS`09ENOTME`09`09`09;`20Branch`20if`20code`20value`20too`20low X`09CMPW`09R1,#EXEC_COUNTER`09;`20Check`20high`20limit X`09BGEQU`09ENOTME`09`09`09;`20Branch`20if`20out`20of`20range X; X;`20The`20dispatch`20code`20has`20now`20been`20verified`20as`20being`20handled V`20by`20this`20 Xdispatcher, X;`20now`20the`20argument`20list`20will`20be`20probed`20and`20the`20required`20 Vnumber`20of`20 Xarguments X;`20verified. X; X`09MOVZBL`09W`5EEXEC_NARG`5BR1`5D,R1`09;`20Get`20required`20argument`20count X`09MOVAL`09@#4`5BR1`5D,R1`09`09;`20Compute`20byte`20count`20including`20 Xarg`20count X`09IFNORD`09R1,(AP),EACCVIO`09`09;`20Branch`20if`20arglist`20not`20readable X`09CMPB`09(AP),W`5E`5BR0`5D`20;`20Check`20for`20required V`20 Xnumber X`09BLSSU`09EINSFARG`09`09;`20`20of`20arguments X`09MOVL`09FP,SP`09`09`09;`20Reset`20stack`20for`20service`20 Xroutine X`09CASEW`09R0,-`09`09`09;`20Case`20on`20change`20mode X`09`09-`09`09`09;`20argument`20value X`09`09#ECODE_BASE,-`09`09;`20Base`20value X`09`09#`09;`20Limit`20value`20(number`20of`20 Xentries) XECASE_BASE:`09`09`09`09;`20Case`20table`20base`20address`20for`20 XDEFINE_SERVICE X; X;`09Case`20table`20entries`20are`20made`20in`20the`20PSECT`20USER_EXEC_DISP1 V`20by X;`09invocations`20of`20the`20DEFINE_SERVICE`20macro.`20`20The`20three`20PSECTS V,`20 X;`09USER_EXEC_DISP0,1,2`20will`20be`20abutted`20in`20lexical`20order`20at`20 Xlink-time. X; X`09.PSECT`09USER_EXEC_DISP2,BYTE,NOWRT,EXE,PIC X`09BUG_CHECK`20IVSSRVRQST,FATAL`09;`20Since`20the`20change`20mode`20code`20is V`20 Xvalidated X`09`09`09`09`09;`20above,`20we`20should`20never`20get`20 Xhere X`09.PAGE X`09.SBTTL`09User`20Rundown`20Service X;++ X;`20Functional`20description: X;`09This`20service`20is`20invoked`20from`20within`20the`20kernel`20mode`20syst Vem`20 Xservice X;`09that`20performs`20image`20rundown.`20`20It`20is`20invoked`20before`20any V`20system X;`09rundown`20functions`20(i.e.`20deassign`20channels,`20release`20memory)`20a Vre X;`09performed.`20`20User`20code`20should`20not`20invoked`20any`20RMS`20service Vs`20or`20RTL X;`09routines,`20must`20not`20signal`20any`20exceptions.`20`20User`20code`20can V`20invoke X;`09most`20system`20services`20execpt`20those`20that`20use`20RMS`20(e.g.`20$PU VTMSG). X; X;`20Calling`20sequence: X;`09JSB`09USER_RUNDOWN X;`09Entered`20at`20IPL=0`20and`20must`20leave`20at`20IPL=0. X; X;`20Input`20Parameters: X;`09`20R4`20`20-`20Current`20PCB`20Address.`20(Therefore`20R4`20must`20be`20sp Vecified`20in`20 Xall X;`09`09`20register`20save`20masks`20for`20kernel`20routines.) X; X;`09`20R7`20`20-`20Access`20mode`20parameter`20to`20$RUNDWN`20maximized`20with V`20previous`20 Xmode X; X;`09`20AP`20`20-`20Argument`20pointer`20existing`20when`20the`20$RUNDWN`20syst Vem X;`09`09service`20was`20invoked. X; X;`09`204(AP)`20-`20Access`20mode`20parameter`20to`20$RUNDWN X; X;-- X`09.PSECT`09USER_CODE,BYTE,NOWRT,EXE,PIC X X`09;`20****`20Note`203`20**** XUSER_RUNDOWN::`09`09`09`09;`20Entry`20point`20for`20service X`09RSB X X`09.PAGE X`09.SBTTL`09IMMEDTIM`20-`20Force`20immediate`20TQE`20expiration X X;++ X;`20Functional`20Description: X;`09This`20routine`20takes`20the`20same`20arguments`20as`20SYS$CANTIM,`20 X;`09but`20rather`20than`20removing`20matching`20timer`20queue`20elements,`20it V`20sets X;`09their`20DUETIM`20to`20the`20current`20time`20and`20moves`20them`20to`20the V`20head`20of`20 Xthe X;`09system`20TQE`20queue.`20 X; X;`20Input`20Parameters: X;`0904(AP)`20-`20reqidt`09-`20request`20id`20of`20timer`20requests`20to`20be V`20modified. X;`09`09If`200,`20all`20timer`20requests`20are`20modified.`20`20 X;`09`09Longword,`20passed`20by`20value. X;`0908(AP)`20-`20acmode`20-`20access`20mode`20of`20the`20requests`20to`20be`20 Vcancelled X;`09`09(PSL$C_KERNEL,`20_EXEC,`20_SUPER,`20or`20_USER).`20`20 X;`09`09Longword,`20passed`20by`20value. X; X;`20Output`20Parameters: X;`09R0`20-`20Completion`20Status`20Code.`20`20Always`200 X;-- X XREQIDT=4`09`09`09`09;`20argument`20offsets`20from`20AP XACMODE=8 X X`09.ENTRY`09IMMEDTIM,`5EM X X`09;`20part`201`20-`20collect`20arguments`20and`20other`20info`20 X X`09SUBL2`09#8,`20SP`09`09`09;`20allocate`20scratch`20space`20on`20the`20 Xstack X`09MOVL`09SP,`20R11`09`09`09;`20save`20address`20of`20stack`20scratch`20 Xspace XSYSTIME=0`09`09`09`09;`20offsets`20from`20R11 X X`09EXTZV`09#0,#2,ACMODE(AP),`20R0`09;`20get`20requested`20access`20mode X`09JSB`09G`5EEXE$MAXACMODE`09`09;`20maximize`20(numerically)`20with`20 Xcaller's X`09MOVL`09R0,`20R3`09`09`09;`20move`20to`20a`20less`20volatile`20 Xregister X X`09MOVL`09PCB$L_PID(R4),`20R4`09;`20get`20process`20ID X`09MOVL`09REQIDT(AP),`20R2`09`09;`20get`20request`20id X`09CLRQ`09R9`09`09`09;`20init`20counter`20and`20insert`20point`20 Xflag X X`09MOVAL`09G`5EEXE$GL_TQFL,`20R5`09;`20get`20address`20of`20timer`20queue`20 Xheader X`09`09`09`09`09;`20get`20exclusive`20access`20to`20TQE`20 Xqueue X`09LOCK`09LOCKNAME=TIMER,`20SAVIPL=-(SP),`20PRESERVE=NO X`09READ_SYSTIME`09SYSTIME(R11)`09;`20get`20the`20current`20quadword`20 Xbinary`20time X X`09;`20part`202`20-`20walk`20the`20TQE`20queue X X`09MOVL`09R5,`20R8`09`09`09;`20init`20the`20insert`20point X`09MOVL`09(R5),`20R6`09`09;`20set`20up`20for`20loop`20-`20addr`20of`20 X"next"`20TQE XTQE_LOOP: X`09CMPL`09R6,`20R5`09`09`09;`20are`20we`20back`20at`20the`20head? X`09BEQLU`09TQE_LOOP_END`09`09;`20`20br`20if`20yes X`09MOVL`09R6,`20R7`09`09`09;`20get`20address`20of`20next`20TQE X`09MOVL`09TQE$L_TQFL(R7),`20R6`09;`20save`20address`20of`20next`20TQE X X`09;`20find`20the`20correct`20insert`20point,`20if`20haven't`20already. X X`09BLBS`09R9,`2020$`09`09`09;`20br`20if`20already`20done X`09CMPL`09SYSTIME(R11),`20TQE$Q_TIME(R7)`09;`20is`20this`20TQE`20due`20now? X`09BNEQ`0910$`09`09`09`09;`20br`20if`20no, X`09CMPL`09SYSTIME+4(R11),`20TQE$Q_TIME+4(R7)`20;`20is`20it`20due`20now? X`09BNEQ`0910$`09`09`09`09;`20definitely`20no X`09MOVL`09R7,`20R8`09`09`09`09;`20update`20insert`20point X`09BRB`09TQE_LOOP X10$:`09INCL`09R9`09`09`09;`20note`20that`20we`20did`20this X X20$:`09;`20we`20have`20a`20TQE`20that`20isn't`20already`20due`20now, X`09;`20see`20if`20it's`20one`20we`20want`20to`20promote X X`09CMPZV`09#0,`20#2,`20TQE$B_RQTYPE(R7),`20#TQE$C_TMSNGL`09;`20is`20it`20a`20 V X$SETIMR`20TQE? X`09BNEQU`09TQE_LOOP`09`09;`20`20br`20if`20no X`09CMPL`09R4,`20TQE$L_PID(R7)`09;`20correct`20PID? X`09BNEQU`09TQE_LOOP`09`09;`20`20br`20if`20no X`09CMPZV`09#0,`20#2,`20TQE$B_RMOD(R7),`20R3`20`09;`20access`20mode`20check X`09BLSS`09TQE_LOOP`09`09;`20br`20if`20no X`09TSTL`09R2`09`09`09;`20are`20we`20checking`20reqidt's? X`09BEQLU`09TQE_MATCH`09`09;`20`20br`20if`20no`20--`20we`20found`20a`20match X`09CMPL`09R2,`20TQE$L_ASTPRM(R7)`09;`20reqidt`20match? X`09BNEQU`09TQE_LOOP`09`09;`20`20br`20if`20no XTQE_MATCH: X X`09;`20if`20we`20get`20here,`20we`20found`20a`20TQE`20to`20be`20"promoted" X X`09REMQUE`09(R7),`20R0`09`09;`20pull`20the`20entry`20out`20of`20the`20 Xqueue X`09MOVQ`09SYSTIME(R11),`20TQE$Q_TIME(R7)`09;`20make`20it`20due`20now X`09INSQUE`09(R7),`20(R8)`09`09;`20insert`20at`20the`20right`20place X`09MOVL`09R7,`20R8`09`09`09;`20update`20the`20insert`20point X`09INCL`09R10`09`09`09;`20note`20that`20we`20did`20it X`09BRB`09TQE_LOOP`09`09;`20go`20look`20at`20the`20next`20one X X`09;`20part`203`20-`20cleanup`20and`20exit X XTQE_LOOP_END: X`09TSTL`09R10`09`09`09;`20did`20we`20move`20any`20TQEs? X`09BEQL`0930$`09`09`09;`20br`20if`20no X`09`09`09`09`09;`20else`20update`20the`20"first`20due`20 Xtime"`20field X`09LOCK`09LOCKNAME=HWCLK,`20SAVIPL=-(SP),`20PRESERVE=NO X`09MOVQ`09SYSTIME(R11),`20G`5EEXE$GQ_1ST_TIME X`09UNLOCK`09LOCKNAME=HWCLK,`20NEWIPL=(SP)+,`20PRESERVE=NO X X30$:`09UNLOCK`09LOCKNAME=TIMER,`20NEWIPL=(SP)+,`20PRESERVE=NO X X`09MOVL`09#SS$_NORMAL,R0`09`09;`20Set`20normal`20completion`20status X`09RET`09`09`09`09;`20`20and`20return X X`09.END $ call unpack IMMEDTIM.MAR;1 1046414788 "" 30 5 5 $ v=f$verify(v) $ exit