REDIT 1(103) COMPARE by user CRISPIN, 9-Sep-87 14:10:38 File 1: PS:<6-1-MONITOR>IPCF.MAC.1 File 2: PS:<6-1-MONITOR>IPCF.MAC.4 ***** CHANGE #1; PAGE 1, LINE 1; PAGE 1, LINE 1  --------------------------------- ;<6-1-MONITOR>IPCF.MAC.4, 9-Sep-87 14:03:53, Edit by CRISPIN ;<6-1-MONITOR>IPCF.MAC.3, 25-Aug-87 16:42:17, Edit by CRISPIN ;<6-1-MONITOR>IPCF.MAC.2, 25-Aug-87 16:20:52, Edit by CRISPIN ;PANDA changes to run with MIT domain software: ; [1] Fix bad test so paged mode works in extended addressing ; [2] Have setting [SYSTEM]INFO's pid with .MUSPT work right ; [3] Don't complain in VALAR1 if .IPCFL word contains garbage flags ; [4] Add PDWTCK and PDWTCL ; [5] Test PD%JWP, not (IP%JWP), at CREPD1:+2.  ***** CHANGE #2; PAGE 6, LINE 17; PAGE 6, LINE 17 .MRECV::MCENT ;ENTER SLOW CODE CALL VALARG ;VALIDATE THE CALLER'S ARGUMENT LIST RETERR ;SOMETHING WRONG, ERROR CODE IN T1 TRNN P1,IP%CFV ;PAGE MODE? JRST MRECV2 ;NO HRLI T1,.FHSLF ;YES, SEE IF PAGE EXISTS IN DEST PAGE  --------------------------------- .MRECV::MCENT ;ENTER SLOW CODE CALL VALARG ;VALIDATE THE CALLER'S ARGUMENT LIST RETERR ;SOMETHING WRONG, ERROR CODE IN T1 TRNN P1,IP%CFV ;PAGE MODE? JRST MRECV2 ;NO IFE STANSW,< ;[1] HRLI T1,.FHSLF ;YES, SEE IF PAGE EXISTS IN DEST PAGE  ***** CHANGE #3; PAGE 6, LINE 25; PAGE 6, LINE 26 TRNN P1,IP%EPN ;TREAT ARGUMENT AS AN EXTENDED PAGE NUMBER? TDZA T2,T2 ;NO, USE PC SECTION MOVX T2,PM%EPN ;YES, USE SECTION NUMBER SPECIFIED BY THE USER CALL FKHPTN ;... RETERR ;SHOULD NEVER HAPPEN... MOVE P5,T1 ;SAVE IDENTIFIER  --------------------------------- TRNN P1,IP%EPN ;TREAT ARGUMENT AS AN EXTENDED PAGE NUMBER? TDZA T2,T2 ;NO, USE PC SECTION MOVX T2,PM%EPN ;YES, USE SECTION NUMBER SPECIFIED BY THE USER CALL FKHPTN ;... RETERR ;SHOULD NEVER HAPPEN... >;IFE STANSW IFN STANSW,< ;[1] MOVEI T1,(P4) ;GET USER PAGE NUMBER LSH T1,^D9 ;MAKE IT A VIRTUAL ADDRESS TXNN P1,IP%INT ;INTERNAL CALL? TXO T1,TWUSR ;NO - SPECIFY USER CONTEXT CALL FPTA ;GET ID FOR THIS PAGE JUMPE T1,[RETERR (ARGX23)] ;SECTION TABLE NONEXISTANT >;IFN STANSW MOVE P5,T1 ;SAVE IDENTIFIER  ***** CHANGE #4; PAGE 31, LINE 4; PAGE 31, LINE 4 RETSKP ;ALL DONE ;MUTIL FUNCTION 23 - DEFINE PID OF [SYSTEM]INFO MUTDFI: SKIPE INFOPD ;ALREADY HAVE A PID FOR INFO? RETBAD (IPCF23) ;YES, THIS IS AN ERROR UMOVE T1,1(Q2) ;GET NEW PID CALL VALPID ;VALIDATE IT  --------------------------------- RETSKP ;ALL DONE ;MUTIL FUNCTION 23 - DEFINE PID OF [SYSTEM]INFO IFE STANSW,< ;[2] MUTDFI: SKIPE INFOPD ;ALREADY HAVE A PID FOR INFO? RETBAD (IPCF23) ;YES, THIS IS AN ERROR UMOVE T1,1(Q2) ;GET NEW PID >;IFE STANSW IFN STANSW,< ;[2] MUTDFI: UMOVE T1,1(Q2) ;GET NEW PID MUTDF1: SKIPE INFOPD ;ALREADY HAVE A PID FOR INFO? RETBAD (IPCF23) ;YES, THIS IS AN ERROR >;IFN STANSW CALL VALPID ;VALIDATE IT  ***** CHANGE #5; PAGE 31, LINE 23; PAGE 31, LINE 30 XCTU [HRRZ T2,1(Q2)] ;GET INDEX INTO TABLE CAIL T2,SPDTBL ;IS THIS A LEGAL INDEX VALUE? RETBAD (IPCF33) ;NO, GIVE ERROR RETURN CAIE Q3,.MUSSP ;IS THIS A SET REQUEST? JRST MUTSP1 ;NO MOVEM T1,SPIDTB(T2) ;YES, STORE NEW PID  --------------------------------- XCTU [HRRZ T2,1(Q2)] ;GET INDEX INTO TABLE CAIL T2,SPDTBL ;IS THIS A LEGAL INDEX VALUE? RETBAD (IPCF33) ;NO, GIVE ERROR RETURN CAIE Q3,.MUSSP ;IS THIS A SET REQUEST? JRST MUTSP1 ;NO IFN STANSW,< ;[2] CAIN T2,.SPINF ;SETTING [SYSTEM]INFO ? JRST MUTDF1 ;YES, DO IT RIGHT FOR THEM >;IFN STANSW MOVEM T1,SPIDTB(T2) ;YES, STORE NEW PID  ***** CHANGE #6; PAGE 33, LINE 19; PAGE 33, LINE 19 VALARG: XCTU [HRRZ Q1,1] ;GET LENGTH OF DESCRIPTOR BLOCK UMOVE Q2,2 ;GET POINTER TO DESCRIPTOR BLOCK CAIGE Q1,MINPHL ;LONG ENOUGH? RETBAD (IPCFX1) ;NO UMOVE P1,.IPCFL(Q2) ;GET FLAGS TXZ P1,IP%INT+IP%CFZ ;Clear impossible bits  --------------------------------- VALARG: XCTU [HRRZ Q1,1] ;GET LENGTH OF DESCRIPTOR BLOCK UMOVE Q2,2 ;GET POINTER TO DESCRIPTOR BLOCK CAIGE Q1,MINPHL ;LONG ENOUGH? RETBAD (IPCFX1) ;NO UMOVE P1,.IPCFL(Q2) ;GET FLAGS IFE STANSW,< ;[1] TXZ P1,IP%INT+IP%CFZ ;Clear impossible bits  ***** CHANGE #7; PAGE 33, LINE 26; PAGE 33, LINE 27 MOVE P2,KIMUFL ;GET THE PC FLAGS OF THE JSYS TXNE P2,PCU ;CHECK PREVIOUS CONTEXT USER BIT TXZ P1,IP%MON ;IF SO, CLEAR THE "BY MONITOR" BIT ;Note: This works for QUEUE% because ;the user can't set this bit via QUEUE% UMOVE P2,.IPCFS(Q2) ;GET SENDER'S PID  --------------------------------- MOVE P2,KIMUFL ;GET THE PC FLAGS OF THE JSYS TXNE P2,PCU ;CHECK PREVIOUS CONTEXT USER BIT TXZ P1,IP%MON ;IF SO, CLEAR THE "BY MONITOR" BIT ;Note: This works for QUEUE% because ;the user can't set this bit via QUEUE% >;IFE STANSW IFN STANSW,< ;[1] TXZ P1,IP%CFZ ;Clear impossible bit MOVE P2,KIMUFL ;GET THE PC FLAGS OF THE JSYS TXNE P2,PCU ;CHECK PREVIOUS CONTEXT USER BIT TXZ P1,IP%MON!IP%INT ;IF SO, CLEAR THE "BY MONITOR" BITS ;Note: This works for QUEUE% because ;the user can't set this bit via QUEUE% >;IFN STANSW UMOVE P2,.IPCFS(Q2) ;GET SENDER'S PID  ***** CHANGE #8; PAGE 33, LINE 50; PAGE 33, LINE 60 CAIE Q3,PGSIZ ;OTHERWISE, LENGTH MUST BE 1 PAGE RETBAD (IPCF24) ;NOT LEGAL SIZE VALAR1: CALL CHKPRV ;SEE IF CALLER IS PRIV'D SKIPA RETSKP ;YES TXNE P1,IP%CFP+IP%CFM ;USER ISN'T PRIV'D, SEE IF PRIV'D FUNCTION  --------------------------------- CAIE Q3,PGSIZ ;OTHERWISE, LENGTH MUST BE 1 PAGE RETBAD (IPCF24) ;NOT LEGAL SIZE VALAR1: CALL CHKPRV ;SEE IF CALLER IS PRIV'D SKIPA RETSKP ;YES IFE STANSW,< ;[3] TXNE P1,IP%CFP+IP%CFM ;USER ISN'T PRIV'D, SEE IF PRIV'D FUNCTION  ***** CHANGE #9; PAGE 33, LINE 58; PAGE 33, LINE 69 TXNN P1,IP%CFC ;NO FOR ABOVE BITS, ANYTHING IN IP%CFC ? RETSKP ;NO, PACKET IS FINE LOAD T1,IP%CFC,P1 ;GET THE SENDER CODE CAIE T1,.IPCCG ;QUEUE JSYS IS SENDER ? RET ;NO, GIVE ERROR RETURN RETSKP ;YES. THEN IT'S OK  --------------------------------- TXNN P1,IP%CFC ;NO FOR ABOVE BITS, ANYTHING IN IP%CFC ? RETSKP ;NO, PACKET IS FINE LOAD T1,IP%CFC,P1 ;GET THE SENDER CODE CAIE T1,.IPCCG ;QUEUE JSYS IS SENDER ? RET ;NO, GIVE ERROR RETURN >;IFE STANSW IFN STANSW,< ;[3] ;;; Don't use DEC's fix here, just zero the information that ;;;the user didn't bother to clean up. It is still a problem that ;;;the user could receive a message with IP%CFP on, send a message ;;;later with it still on, and get an error, but that is what is ;;;documented to happen. It doesn't say that the other fields ;;;return an error, just that you need privileges to set them. ;;; Perhaps it should say that IP%CFP will be ignored if set by ;;;non-privileged users, but that is for someone else to decide, ;;;this code just does what is documented in the nicest way ;;;possible. JXN P1,IP%CFP,R ;PRIVILEGED FUNCTION WAS REQUESTED TXZ P1,IP%CFE!IP%CFM ;ELSE TURN EXTRA FIELDS OFF JXE P1,IP%CFC,RSKP ;ANYTHING IN IP%CFC ? LOAD T1,IP%CFC,P1 ;GET THE SENDER CODE CAIE T1,.IPCCG ;QUEUE JSYS IS SENDER ? TXZ P1,IP%CFC ;NO, GIVE ERROR RETURN >;IFN STANSW RETSKP ;YES. THEN IT'S OK  ***** CHANGE #10; PAGE 36, LINE 42; PAGE 36, LINE 42 CAMN T3,FORKX ;THIS OUR FORK NUMBER? MOVEI T3,-1 ;YES, SET TO -1 TO MEAN NOBODY WAITING STOR T3,PIDFW,(T2) ;PUT BACK VALUE AOJA T1,ENDWT1 ;LOOP FOR ALL PIDS  --------------------------------- CAMN T3,FORKX ;THIS OUR FORK NUMBER? MOVEI T3,-1 ;YES, SET TO -1 TO MEAN NOBODY WAITING STOR T3,PIDFW,(T2) ;PUT BACK VALUE AOJA T1,ENDWT1 ;LOOP FOR ALL PIDS IFN STANSW,< ;[4] ;;; Accessory routine to allow external routines to dismiss with PDFKTB ;;;bit as (one of) their wakeup conditions. We can dismiss only if ;;;this PID is valid for this fork and this PID does not have any ;;;messages already pending. To avoid races, we have to hold the PID ;;;lock when we clear the PDFKTB bit. ; ;Accepts in AC1: PID ; CALL PDWTCK ;Returns +1: AC1 contains error code, or zero to indicate that ; PID already has message pending, don't dismiss. ; +2: No message pending, PDFKTB bit cleared, ok to dismiss, ; AC1 trashed. ; ;NB: If you change this routine, be sure locks are released on all exits. PDWTCK::SAVEAC ; Preserve all ACs except T1 CALL GTLCKS ; Snarf all locks we need CALL VALPDJ ; Check PID, can this job use it? IFSKP. ; Yes CALL CHKNOA ; Make sure this particular fork can use it ANSKP. ; It can CALL CHKPDW ; See if we are allowed to hang on this PID ANSKP. ; Yup SETZ T1, ; Set up flag for non-empty queue LOAD T3,PIDRC,(T2) ; Get receive count ANDE. T3 ; Any messages pending? MOVE T1,FORKX ; No, we can dismiss STOR T1,PIDFW,(T2) ; Say that we're going to be waiting CALL GETMSK ; Clear our bit in PDFKTB ANDCAM T2,PDFKTB(T1) AOS (P) ; Arrange for skip return ENDIF. ; All exits must unlock! UNLOKK PIDLKK ; Free locks in correct order OKINT CALL FUNLK RET ; Return, skipping if appropriate ;;; Companion routine to clean up. Does the cleanup operations MWAIT ;;;would do for us if we were using the normal IPCF scheduler test. ;;; I think there's a timing screw here, in that if we never execute ;;;this code we leave PIDFW set, which prevents an inferior fork from ;;;being able to hang on this PID. DEC's code has the same problem ;;;(see MWAIT). If anybody ever fixes this problem in MWAIT, the fix ;;;should be copied to this routine too. ; No arguments ; CALL PDWTCL ; Returns +1, always, preserving all ACs. PDWTCL::SAVEAC CALL GTLCKS ; Snarf locks CALL ENDWAT ; Clear PIDFW UNLOKK PIDLKK ; Free locks in correct order OKINT CALL FUNLK RET ; Done >;IFN STANSW  ***** CHANGE #11; PAGE 45, LINE 28; PAGE 45, LINE 28 CALL CHKPRV ;SEE IF PRIVILEGES SET RET ;NO, CREATING NOT ALLOWED MOVE T2,CREPDT ;GET BACK JOB NUMBER CREPD1: HRRZ T3,JOBPT(T2) ;GET TOP FORK OF JOB IN CASE JOB WIDE PID MOVE T4,CREPDF ;GET FLAGS OF PID TLNE T4,(IP%JWP) ;JOB WIDE PID WANTED? MOVEM T3,CREFKO ;YES, STORE FORK NUMBER OF TOP FORK  --------------------------------- CALL CHKPRV ;SEE IF PRIVILEGES SET RET ;NO, CREATING NOT ALLOWED MOVE T2,CREPDT ;GET BACK JOB NUMBER CREPD1: HRRZ T3,JOBPT(T2) ;GET TOP FORK OF JOB IN CASE JOB WIDE PID MOVE T4,CREPDF ;GET FLAGS OF PID IFE STANSW,< ;[5] TLNE T4,(IP%JWP) ;JOB WIDE PID WANTED? >;IFE STANSW IFN STANSW,< ;[5] TXNE T4,PD%JWP ;JOB WIDE PID WANTED? >;IFN STANSW MOVEM T3,CREFKO ;YES, STORE FORK NUMBER OF TOP FORK