.TITLE ILLINS - ILLEGAL INSTRUCTION INSERTION TASK .IDENT /V1/ ; ; ; WRITTEN BY D.B.CURTIS ; SOFTWARE SUPPORT GROUP (R.S.) ; 11-JUN-79 ; FERMILAB ; ; ; VERSION 01 ; EDIT NUMBER = 0001 ; FILE = ILLINS.MAC ; EDITED BY: D.B.CURTIS 19 JUL 79 11:09 ; ; ; MODIFICATIONS: ; ;+ ; FILE DESCRIPTION ; THIS TASK INSERTS EXECUTIVE FUNCTIONS INTO THE POOL SPACE ; THE EXECUTIVE FUNCTIONS ARE INVOKED BY THE USE OF ILLEGAL ; INSTRUCTIONS. ; ; THE TASK RMF REMOVES FUNCTIONS ; THE CODE THAT IS INSERTED EXISTS IN A SHARABLE LIBRARY TASK IMAGE ; THE FOLLOWING RESTRICTIONS APPLY: ; ; 1) THE CODE MUST BE PIC ; 2) THE CODE MUST BE BUILT IN THE SAME MANNER AS A SHARABLE ; LIBRARY AND CANNOT BE LARGER THEN 4K WORDS ; 3) THE LIBRARY IS NAMED ILLINS.TSK: THE CURRENT UIC IS ; CHECKED AND THEN THE LB:[1,1] AREA FOR THIS FILE ; 4) IF CODE IS ALREADY ATTACHED TO THIS FUNCTION, NOTHING BUT ; AN ERROR MESSAGE OCCURS. THE CODE MUST BE FIRST REMOVED ; BY RUNNING RMF. ; ; ; ASSEMBLE USING: ; =[200,200]RSXMC/PA:1,[X,Y]ILLINS ; ;- ; ; .MCALL EXIT$S,SWSTK$,READ$,QIOW$,DIR$,GTSK$,CLOSE$,QIO$,FSRSZ$ .MCALL WAIT$,FDBK$R FSRSZ$ 0 ;READY FOR BLOCK IO .PAGE ;+ ; **-START-MAIN ROUTINE ; ; ; INPUTS: ; NONE ; ; OUTPUTS: ; NONE ; ; SIDE EFFECTS: ; ; MODIFIED EXTERNALS ; NONE ; ; OTHER SIDE EFFECTS ; CODE IS LOADED INTO THE DYNAMIC POOL, AND LINKED TO THE ; ILLEGAL INSTRUCTION VECTOR (ILV) ; ; STANDARD REGISTER USAGE ; ; THIS TASK DOES THE FOLLOWING: ; BEGIN ; IF NOT PRIVIDELGED THEN ERROR1; ; GET-LIBRARY-INFORMATION(,,,); ; IF STATUS NE OK THEN ERROR-ROUTINE; ; IF REQUIRED SPACE GT 4*1024 THEN ERROR2; ; SWITCH STACK ; ALLOCATE SPACE ; SWITCH TO USER STATE ; IF NO SPACE THEN ERROR3; ; SWITCH STACK ; IF ILL-CODE ALREADY LOADED ERROR5 ; FILL HEADER ; SWITCH TO USER ; READ CODE INTO SPACE; ; IF ERROR THEN ERROR4; ; IF XDT THEN FIX XDT; ; LINK ILLEGAL-INSTRUCTION-VECTOR TO SPACE; ; END ; ; THE INFORMATION IN THE POOL POINTED TO BY THE ILLEGAL INSTRUCTION ; TRAP VECTER IS OF THE FORM: ; ; --------------------------- ; | ILL (IN RAD50) | ; |-------------------------| ; | NUMBER OF BYTES IN AREA | ; |-------------------------| ; | ORIGINAL CONTENTS OF ILV| ; |-------------------------| ; ILV=> | NOP | ; --------------------------- ; ;- ; ; ROUTINES CALLED ; COMINF -- GET COMMON INFORMATION ; $ALOCB -- ALLOCATE POOL SPACE ; $DEACB -- DEALLOCATE POOL SPACE ; ; ; INTERNAL MACROS ; .MACRO MESSAG,AAA .NCHR S...Z, .WORD S...Z .ASCII /AAA/ .EVEN .ENDM MESSAG ; ; EQUATED SYMBOLS ; ILVEC=10 ;DEFINE ILLEGAL VECTOR ALC=1 ;BUFFER IS ALLOCATED LF=12 CR=15 BEL=7 XDTFIX=300 ;OFFSET BELOW (USED IN SUB) FROM $XDT TO ;PATCH VECTOR 10 ADDRESS ; ; LOCAL DATA ; ERPMSG: QIO$ IO.WVB,TT.LN,,,,, ; PRINT BELL AND CRLF ERRMSG: QIOW$ IO.WVB,TT.LN,TT.EV,,,,<0,0,40> ; PRINT MESSAGE STATF: .WORD 0 ;FLAG WORD ; T A S K P A R A M E T E R B L O C K TPREM: GTSK$ TPBUF TPBUF: .BLKW 16. ; C O M I N F C A L L I N G S E Q U E N C E PRM1: .WORD 7,NAM,STBF,SIZE,BLOCK1,LUN,-1,PIC NAM: .ASCII /ILLINS/ ;TASK IMAGE NAME STBF: .WORD 0,0 ; COMINF STATUS BUFFER SIZE: .WORD 0 ;SIZE BLOCK: .WORD 0 ;STARTING VERTUAL BLOCK BLOCK1: .WORD 0 ; DOUBLE WORD LUN: .WORD 0 ;RETURNED LUN NUMBER OF LUN USED PIC: .WORD 0 ;PIC FLAG ; S T O R A G E F O R B U F F E R P R A M A T E R S BSTAT: .WORD 0 ;STORAGE FOR BUFFER STATUS .WORD 0 ;STORAGE FOR BUFFER ADDRESS .WORD 0 ;STORAGE FOR BUFFER SIZE ; E R R O R M E S S A G E S ERPRE: .WORD 3 .ASCII .EVEN ER1: MESSAG ER2: MESSAG ER3: MESSAG ER4: MESSAG ER5: MESSAG FER1: MESSAG FER2: MESSAG FER3: MESSAG FER4: MESSAG .PAGE START:: ; IF NOT PRIVILEGED THEN ERROR1 DIR$ #TPREM ;GET TASK PARAMITERS BCC 1$ ;IF OK, CONTINUE IOT ;ELSE BURN 1$: CMPB #1,TPBUF+G.TSDU+1 ; CHECK FOR PRIVILEGED TASK BEQ 10$ ;IF EQ OK PRIVALAGED JMP ERROR1 ; ERROR 1 NOT PRIVILEGED TASK ; GET LIBRARY INFORMATION 10$: MOV #PRM1,R5 ;LOAD ARGUMENT LIST FOR FORTRAN CALL CALL COMINF ;GET COMMON INFORMATION CMP #1,STBF ;CHECK FOR SUCESS BEQ 20$ ;IF 1 ALL OK JMP ERRTBL ;ELSE PRINT ERRORS RELATEING TO COMMON ; IF STATUS NOT OK THEN ERROR-ROUTINE 20$: INC PIC ;CHECK IF COMMON IS PIC BEQ 21$ ;IF NOT EQUAL OK MOV #-3,STBF ;SET IN AN ERROR JMP ERRTBL ; IF REQUIRED SPACE GT 4*1024 THEN ERROR 21$: MOV SIZE,R1 ;GET THE SIZE IN 64. BYTE CHUNKS ASH #6,R1 ;MAKE BYTES CMP #<4*1024.>,R1 ;CHECK IF PAST LIMIT BGT 30$ ;IF GT NO JMP ERROR2 ; ELSE YES ; SWITCH STACK 30$: MOV R1,SIZE ;STORE BACK SIZE IN BYTES ADD #12,R1 ;ADD 5 WORDS (1 EXTRA FOR SAFTEY) ; TO REQUESTED SIZE SWSTK$ 50$ ;; GOTO SYSTEM STATE CALL $ALOCB ;; GET CODE CLR BSTAT ;; CLEAR STATUS WORD BCC 40$ ;; DID POOL ALLOCATION WORK DEC BSTAT ;; NO SET STATUS -1 40$: MOV R0,BSTAT+2 ;; LOAD ALLOCATED ADDRESS MOV R1,BSTAT+4 ;; AND SIZE RETURN ;; REACH USER STATE ; IF NO SPACE THEN ERROR3 50$: INC BSTAT ;CHECK IF ALLOCATION OK BNE 60$ ;IF NE BLOCK ALLOCATED JMP ERROR3 ;IF EQUAL ERROR ; SWITCH STACK ; IF ILL-CODE ALREADY ALLOCATED THEN ERROR 5 60$: BIS #ALC,STATF ;SHOW BUFFER IS ALLOCATED SWSTK$ 85$ ;; GO TO SYSTEM STATE AGAIN MOV @#ILVEC,R0 ;; GET POINTER TO ILL CODE CMP -6(R0),#^RILL ;; IS IT ALREAY ALLOCATED BEQ 70$ ;; IF EQ YES SO CLEAR OUT ; FILL HEADER MOV BSTAT+2,R1 ;; GET ADDRESS OF POOL STOREAGE MOV #^RILL,(R1)+ ;; LOAD IDENT MOV BSTAT+4,(R1)+ ;; LOAD SIZE MOV R0,(R1)+ ;; GET ORIGINAL VECTOR ADDRESS MOV #RTI,(R1) ;; SET TEMPERY ILLEGAL INS RETURN MOV R1,BSTAT+2 ;; SAVE ADDRESS ADD #2,BSTAT+2 ;; POINT TO FIRST WORD OF DATA MOV #$XDT,R2 ;; CHECK IF XDT EXISTS BEQ 80$ ;; IF EQ NO ; IF XDT NEED TO MODIFY VECTOR INITALIZATION TABLE SUB #XDTFIX,R2 ;; POINT TO VECTOR INITALIZATION TABLE CMP R0,(R2) ;; DOES IT HOLD EXPECTED VALUE? BNE 80$ ;; NO DO NOT MODIFY MOV R1,(R2) ;; YES MODIFY XDT NOLONGER RESETS ILLINS BR 80$ ; DEALLOCATE BUFFER AND INDICATE ERROR 70$: BIC #ALC,STATF ;; SHOW BUFFER NO LONGER ALLOCATED MOV BSTAT+2,R0 ;; GET ADDRESS OF POOL MOV BSTAT+4,R1 ;; AND SIZE CALL $DEACB ;; REMOVE BUFFER CLR BSTAT+2 ;; SHOW ERROR BR 81$ 80$: MOV R1,@#ILVEC ;; SET VECTOR 81$: RETURN ; CHECK FOR ERROR 85$: TST BSTAT+2 ;CHECK IF ERROR BNE 90$ ;IF EQ ERROR JMP ERROR5 ;DISPLAY ERROR ; READ CODE INTO SPACE 90$: FDBK$R #COMFDB,BSTAT+2,SIZE,#BLOCK ;SETUP FOR DATA READ READ$ R0 ;READ WAIT$ R0 BCC 100$ ;IF CC ALL OK JMP ERROR4 ;ELSE ERROR ; TURN ON THE NEWLY LOADED CODE 100$: MOV BSTAT+2,R0 ;GET ADDRESS OF CODE SUB #2,R0 ;MAKE ADDRESS OF VECTOR MOV #NOP,(R0) ;NOP THE RTI INSTRUCTION END: CLOSE$ #COMFDB ;CLOSE THE INPUT FILE EXIT$S ;AND EXIT THE SYSTEM IOT ;IF CANNOT EXIT CRASH EXIT ERROR1: MOV #ER1,R0 ;POINT TO ERROR MESSAGE BR PER ;PRINT ERROR ERROR2: MOV #ER2,R0 ;SAME AS ABOVE AND CONTINUING BR PER ERROR3: MOV #ER3,R0 BR PER ERROR4: SWSTK$ 20$ ;; BUFFER ALLOCATED AND LINKED MOV BSTAT+2,R0 ;; GET ILLEGAL INST ADDRESS SUB #2,R0 MOV #$XDT,R1 ;; SEE IF XDT EXITS BEQ 1$ ;; IF EQ NO SUB #XDTFIX,R1 ;; ADJUST TO POINT TO TABLE CMP R0,(R1) ;; ARE THEY THE SAME BNE 1$ ;; IF NOT DONOT UPDATE TABLE MOV -2(R0),(R1) ;; RESET XDT 1$: MOV -(R0),@#ILVEC ;; RESET THE VECTOR MOV -(R0),R1 ;; GET THE SIZE OF THE BUFFER CLR -(R0) ;; REMOVE CHECK CODE CALL $DEACB ;; DEALLOCATE THE BUFFER 10$: RETURN ;; RETURN TO USER STATE 20$: MOV #ER4,R0 ;LOAD ERROR MESSAGE ADDRESS BR PER ;PRINT IT ERROR5: MOV #ER5,R0 BR PER ; COMMON CODE FOR PRINTING ERROR MESSAGE PER: DIR$ #ERPMSG ;PRINT ERROR PRELOG MOV (R0)+,ERRMSG+Q.IOPL+2 ;LOAD THE MESSAGE SIZE MOV R0,ERRMSG+Q.IOPL ;AND THE MESSAGE ADDRESS DIR$ #ERRMSG ;PRINT MESSAGE BCC 1$ ;IF CC ALL OK IOT ;ELSE CRASH 1$: JMP END ;EXIT ; ROUTINE TO DECODE COMMON ERROR INFORMATION ERRTBL: ;ENTRY FOR COMMON ERROR CODE CMP #-1,STBF ;ERROR -1? BNE 1$ ;NO MOV #FER1,R0 ;YES LOAD ERROR BR PER ;AND PRINT IT 1$: CMP #-2,STBF ;ERROR -2? BNE 2$ MOV #FER2,R0 BR PER 2$: CMP #-3,STBF ;ERROR -3? BNE 3$ MOV #FER3,R0 BR PER 3$: MOV #FER4,R0 ;ALL OTHER ERRORS ARE -4 BR PER .END START