.TITLE USR$SHARE .IDENT /1.0/ ; ; FUNCTION USR$SHARE (%STDESC DEVNAM : STRING ; ; %IMMED SHARE : INTEGER; ; %IMMED PIDNEW : INTEGER): INTEGER ; EXTERN ; ; ; DESCRIPTION: ; Make the named device shareable or non sharable. ; ; PARAMETERS: ; DEVNAM : The string descriptor of the device name. It must be ; in the format XXXN: where XXX is the controller name. ; SHARE : If 0 then make non shared, if 1 then make shared. ; PIDNEW : The owner pid to set (0 allows shared operation) ; $DDBDEF ;DEVICE DATA BLOCK EQUATES $UCBDEF ;UNIT CONTROL BLOCK DEFINITIONS $DIBDEF $DEVDEF .PSECT USR$SHARE_DATA PIC,NOSHR,NOEXE,LONG UNITNUM:.LONG 0 SETMSK: .LONG 0 DEVNAM: .QUAD 0 PIDNEW: .LONG 0 .PSECT USR$SHARE_CODE PIC,SHR,EXE,NOWRT,LONG .ENTRY USR$SHARE ^M CLRQ DEVNAM ;CLEAR THE NAME MOVL 4(AP),R2 ;GET THE STRING ADDRESS MOVL 4(R2),R2 ;GET THE ADDRESS OF THE CHARACTERS MOVB #3,DEVNAM ;MAKE <03>XXX MOVB 0(R2),DEVNAM+1 MOVB 1(R2),DEVNAM+2 MOVB 2(R2),DEVNAM+3 SUBB3 #48,3(R2),R3 ;GET THE UNIT NUMBER BLSS 10$ ;IF NEGATIVE THEN ERROR IN NAME MOVZBL R3,UNITNUM ;INTO UNIT NUMBER CMPW UNITNUM,#9 ;COMPARE TO MAX ALLOWED BGEQ 10$ ;IF TO BIG THEN SKIP MOVL 8(AP),SETMSK ;GET THE SET/RESET MASK MOVL 12(AP),PIDNEW ;GET THE NEW PID VALUE $CMKRNL_S ROUTIN=SHAREIT ;GO DO SHARE IN KERNAL MODE RET 10$: MOVL #SS$_NOSUCHDEV,R0 ;ERROR NO SUCH DEVICE RET SHAREIT:.WORD ^M MOVL IOC$GL_DEVLIST,R5 ;GET ADDRESS OF FIRST DDB 10$: CMPC3 #8,DEVNAM,DDB$T_NAME(R5) ;COMPARE TO CONTROLLER NAME BEQL 20$ ;IF EQUAL THEN FOUND MOVL DDB$L_LINK(R5),R5 ;GET THE NEXT DDB BNEQ 10$ ;LOOP AGAIN 15$: MOVL #SS$_NOSUCHDEV,R0 ;SET NOT FOUND ERROR RET 20$: MOVL DDB$L_UCB(R5),R5 ;GET THE FIRST UCB IN LIST BEQL 15$ ;IF NONE THEN ERROR 22$: CMPW UNITNUM,UCB$W_UNIT(R5) ;COMPARE TO NUMBER IN UCB BEQL 25$ ;IF EQUAL THEN FOUND MOVL UCB$L_LINK(R5),R5 ;GET THE NEXT IN THE LIST BEQL 15$ ;IF ZERO THEN NOT FOUND BRB 22$ ;ELSE KEEP LOOKING 25$: BLBS SETMSK,30$ ;IF SET THEN SET SHARE BBCC #DEV$V_SHR,UCB$L_DEVCHAR(R5),35$ ;ELSE SET NOT SHARED BRB 35$ 30$: BBSS #DEV$V_SHR,UCB$L_DEVCHAR(R5),35$ 35$: MOVL #SS$_NORMAL,R0 ;SET DONE OK MOVL PIDNEW,UCB$L_PID(R5) ;SET THE NEW PID RET ; ; FUNCTION USR$EXIT (%IMMED PROCEDURE EXITPROC ; ; VAR EXTBLK : EXITBLK ): INTEGER ; EXTERN ; ; ; DESCRIPTION: ; Define an exit handler procedure entry . ; ; PARAMETERS: ; EXITPROC : (IN) The procedure address of the exit handler. ; EXTBLK : (IN/OUT) The exit block associated with the ; exit condition. It must be of the following type. ; EXITBLK = RECORD ; FLINK : INTEGER ; ; EXTADR: INTEGER ; ; APREG : INTEGER ; ; RSNADR: ^INTEGER ; END; ; .PSECT USR$SHARE_CODE PIC,SHR,EXE,NOWRT,LONG .ENTRY USR$EXIT ^M MOVL 8(AP),R2 ;GET THE EXTBLK ADDRESS MOVL 4(AP),4(R2) ;PUT THE ADDRESS INTO THE EXTBLK CLRL (R2) ;CLEAR THE REST OF THE EXTBLK MOVL #1,8(R2) ;ONE ARGUMENT FOR EXIT PROCEDURE TSTL 12(R2) ;TEST THE REASON ADDRESS FOR POINTER BNEQ 10$ ;IF NON ZERO THEN OK MOVL #SS$_ACCVIO,R0 ;ELSE GIVE EARLT ACCESS VIOLATION RET 10$: $DCLEXH_S DESBLK=@8(AP) ;PUSH THE ADDRESS OF THE DESBLK RET .END