.TITLE ENV_KNL_AST .IDENT /1.0/ ;.begin.doc ************************** begin.doc ; ; .c ;MODULE ; .c ;^&ENV_KNL_AST\& ; .nf ; .x ENV_KNL_AST>Defined ; Source:ENV_KNL_AST.MOD ; TO BECOME PART OF LIBRARY:INLAND ; Designer :EARL LAKIA ; Author :EARL LAKIA ; Inland Steel ; Process Automation Department ; 3210 Watling St. MS 2-465 ; East Chicago, IN 46312 ; ; Date of last update:29-JUL-1986 16:38:31.60 ; Revision level :1.0 ; ; .C ;Formal Parameter List ; Receives: ; ; ASTBLK STRUCTURE ; ARRAY OF ACB ADDRESS, PID (MODIFIED) OF PROCESS, ; AND AST PENDING FLAG ; ; Returns: ; ; ENV_KNL_AST INTEGER*4 ; STATUS ; ; Accesses common(s): ; ; Accesses file(s): ; ; Other modules referenced: ; ; .X SCH$QAST>Referenced ; SCH$QAST QUEUE AN AST TO PROCESS WHOSE PID IS SPECIFIED IN ; THE ACBBLK ; (found in library:VMS) ; .SK ; .fill ; .SK ; Description: ; .sk ; This subroutine is called to envoke the kernal ast as setup ; by the subroutine INIT_KNL_AST. The array ASTBLK should ; contain the address of the ACB in nonpaged pool, the ; PID of the process that the AST is to be delivered to, and ; a flag denoting that an AST is pending. ; CALLING SEQUENCE: ; SYS_STATUS=ENV_KNL_AST(ASTBLK) ; POSSIBLE ERRORS: ; .LIST 1,' ' ; .LE;SS$_INTERLOCK- AST PENDING ALREADY ; .LE;SS$_INSFRAME- ADDRESS FOR ACB IS NOT IN NON PAGED POOL ; .LE;SS$_NOPRIV- USER DOES NOT HAVE CHANGE MODE TO KERNAL PRIVELEGE ; .ELS ; ; Note: this subroutine must be assembled as follows: ; MAC ENV_KNL_AST+SYS$LIBRARY:LIB/LIB ; and will require linkage with the system symbol table. ; end.doc ****************************** end.doc ; $PRIDEF $IPLDEF .PAGE ; ; COPY THE CALLING PARAMETERS AND CHANGE MODE TO KERNAL ; .ENTRY ENV_KNL_AST,^M<> PUSHL 4(AP) PUSHL #1 $CMKRNL_S ROUTIN=10$,- ARGLST=(SP) CMPL (SP)+,(SP)+ RET ; ; KERNAL CODE, CALL THE AST ; 10$: .WORD ^M SETIPL #IPL$_ASTDEL ; DON'T ALLOW DELETE OR CONTEXT CHANGE ; WHILE LOOKING AT THE FLAG MOVL 4(AP),R1 ; GET ACB BLOCK ; 0= ACB ADDRESS ; 4= AST ADDRESS ; 8= AST IN PROGRESS FLAG TSTL 8(R1) ; IS AST ALREADY IN PROGRESS BEQL 15$ ; NO, THEN OK MOVL #SS$_INTERLOCK,R0 ; RETURN ERROR CODE SETIPL #0 ; RESTORE IPL RET 15$: TSTL (R1) ; MAKE SURE ACB IS NEGATIVE (IN NON PAGED POOL) BLSS 20$ ; OK MOVL #SS$_INSFRAME,R0 ; INVALID ADDRESS, ERROR SETIPL #0 ; RESTORE IPL RET 20$: MOVL #1,8(R1) ; MARK ACB BLOCK AS AST IN PROGRESS MOVL (R1),R5 ; ACB ADDRESS MOVL #PRI$_TICOM,R2 ; BOOST PRIORITY JSB G^SCH$QAST ; SCHEDULE AN AST SETIPL #0 RET ; R0= STATUS OF THE QUEUE .END