d .TITLE LOADMREG - LOAD MBA AND UBA MAP REGISTERS .IDENT /01/ , ; ; COPYRIGHT (C) 1977 X; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY L; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE ; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ; AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND x; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; @; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. l; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS 4; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; D. N. CUTLER 1-NOV-77 ` ; ; LOAD MBA AND UBA MAP REGISTERS ( ; ; MACRO LIBRARY CALLS ; T $CRBDEF ;DEFINE CRB OFFSETS  $MBADEF ;DEFINE MBA REGISTER OFFSET DEFINITIONS $PTEDEF ;DEFINE PAGE TABLE ENTRY FIELDS $UBADEF ;DEFINE UCB OFFSETS H $UCBDEF ;DEFINE UCB OFFSETS $VECDEF ;DEFINE CRB TRANSFER VECTOR OFFSETS  .PAGE t .SBTTL LOAD MASSBUS ADAPTER MAP REGISTERS ;+ <; IOC$LOADMBAMAP - LOAD MASSBUS ADAPTER MAP REGISTERS ; ; THIS ROUTINE IS CALLED TO LOAD THE MASSBUS ADAPTER MAP REGISTERS, THE h; BYTE COUNT REGISTER, AND THE VIRTUAL ADDRESS REGISTER. ; 0; INPUTS: ; ; R4 = ADDRESS OF MBA CONFIGURATION STATUS REGISTER. \; R5 = UCB ADDRESS OF UNIT TRANSFER IS TO OCCUR ON. ; $; OUTPUTS: ; ; THE TRANSFER BYTE COUNT, STARTING PAGE OFFSET, AND ADDRESS OF THE P; PAGE TABLE ENTIRES THAT DESCRIBE THE TRANSFER ARE RETRIEVED FROM ; THE SPECIFED UCB AND USED TO LOAD THE MBA BYTE COUNT, VIRTUAL ADDRESS, ; AND MAP REGISTERS. ONE ADDITIONAL MAP REGISTER IS LOADED AS INVALID |; TO STOP THE TRANSFER IF A HARDWARE FAILURE SHOULD OCCUR. ; D; R3 IS PRESERVED ACROSS CALL. ;-  p .PSECT WIONONPAGED IOC$LOADMBAMAP:: ;LOAD MASSBUS ADAPTER MAP REGISTERS 8 PUSHL R3 ;SAVE REGISTERS  MOVZWL UCB$W_BCNT(R5),R2 ;GET TRANSFER BYTE COUNT  MNEGL R2,MBA$L_BCR(R4) ;LOAD BYTE COUNT REGISTER d MOVZWL UCB$W_BOFF(R5),R1 ;GET BYTE OFFSET IN PAGE  MOVL R1,MBA$L_VAR(R4) ;LOAD STARTING VIRTUAL ADDRESS , MOVL R1,MBA$L_VAR(R4) ;*****TEMP UNTIL MBA ECO ******  MOVAB ^X1FF(R2)[R1],R2 ;CALCULATE HIGHEST RELATIVE BYTE AND ROUND  ASHL #-9,R2,R2 ;CALCULATE NUMBER OF MAP REGISTERS TO LOAD X MOVAL MBA$L_MAP(R4),R1 ;GET ADDRESS OF MBA MAP REGISTERS  MOVL UCB$L_SVAPTE(R5),R0 ;GET ADDRESS OF PAGE TABLE 10$: MOVL (R0)+,(R1)+ ;LOAD MAP REGISTER  BGEQ 30$ ;IF GEQ PTE INVALID 20$: SOBGTR R2,10$ ;ANY MORE TO LOAD? L CLRL (R1) ;LOAD INVALID MAP ENTRY  MOVL (SP)+,R3 ;RESTORE REGISTER  RSB ; x30$: MOVL -4(R0),R3 ;GET THE PTE (NOT FROM MAP REGISTER!)  BSBW IOC$PTETOPFN ;GET PFN FROM INVALID PTE @ BISL3 #^X80000000,R3,-4(R1) ;AND LOAD THE MAP REGISTER  BRB 20$ ;  .PAGE l .SBTTL LOAD UNIBUS ADAPTER MAP REGISTERS ;+ 4!; IOC$LOADUBAMAP - LOAD UNIBUS ADAPTER MAP REGISTERS !; !; THIS ROUTINE IS CALLED TO LOAD THE UNIBUS ADAPTER MAP REGISTERS. `"; "; INPUTS: (#; #; R5 = UCB ADDRESS OF UNIT TRANSFER IS TO OCCUR ON. #; T$; IT IS ASSUMED THAT THE DATAPATH AND MAP REGISTERS HAVE BEEN PREVIOUSLY $; ASSIGNED. %; %; OUTPUTS: %; H&; EACH MAP REGISTER IS LOADED WITH THE APPROPRIATE PAGE FRAME NUMBER &; MERGED WITH THE DATAPATH DESIGNATOR AND BYTE OFFSET BIT. ONE ADDITIONAL '; MAP REGISTER IS LOADED AS INVALID TO STOP THE TRANSFER IF A HARDWARE t'; FAILURE SHOULD OCCUR. '; <(; R3 IS PRESERVED ACROSS CALL. (;- ) h)IOC$LOADUBAMAP:: ;LOAD UNIBUS ADAPTER MAP REGISTERS ) MOVQ R3,-(SP) ;SAVE REGISTERS 0* MOVZWL UCB$W_BOFF(R5),R1 ;GET BYTE OFFSET IN PAGE * MOVZWL UCB$W_BCNT(R5),R2 ;GET TRANSFER BYTE COUNT * MOVL UCB$L_CRB(R5),R3 ;GET ADDRESS OF CRB \+ MOVZBL CRB$L_INTD+VEC$B_DATAPATH(R3),R4 ;GET DATAPATH DESIGNATOR + BLBC R1,10$ ;IF LBC WORD ALIGNED TRANSFER $, BISB #^X10,R4 ;SET BYTE OFFSET BIT ,10$: BISW #^X400,R4 ;MERGE VALID WITH BYTE OFFSET AND DATAPATH , MOVAB ^X1FF(R2)[R1],R2 ;CALCULATE HIGHEST RELATIVE BYTE AND ROUND P- ASHL #-9,R2,R2 ;CALCULATE NUMBER OF MAP REGISTERS TO LOAD - CMPB R2,CRB$L_INTD+VEC$B_NUMREG(R3) ;ENOUGH MAP REGISTERS ASSIGNED? . BGEQU 40$ ;IF GEQU NO |. MOVL @CRB$L_INTD+VEC$L_ADP(R3),R1 ;GET ADDRESS OF CONFIGURATION REGISTER . EXTZV #0,#VEC$V_MAPLOCK,CRB$L_INTD+VEC$W_MAPREG(R3),R0 ;GET STARTING REGISTER D/ MOVAL UBA$L_MAP(R1)[R0],R1 ;GET ADDRESS OF FIRST MAP REGISTER TO LOAD / MOVL UCB$L_SVAPTE(R5),R0 ;GET ADDRESS OF PAGE TABLE 020$: MOVL (R0)+,R3 ;GET NEXT PAGE TABLE ENTRY p0 BLSS 30$ ;IF LSS VALID PAGE TABLE ENTRY 0 BSBB IOC$PTETOPFN ;GET PFN FROM INVALID PTE 8130$: INSV R4,#21,#11,R3 ;INSERT VALID, BYTE OFFSET, AND DATAPATH 1 MOVL R3,(R1)+ ;LOAD UBA MAP REGISTER 2 SOBGTR R2,20$ ;ANY MORE TO LOAD? d2 CLRL (R1) ;LOAD INVALID MAP ENTRY 2 MOVQ (SP)+,R3 ;RESTORE REGISTERS ,3 RSB ; 340$: BUG_CHECK UBMAPEXCED,FATAL ;UNIBUS MAP REGISTER ALLOCATION EXCEEDED 3 .PAGE X4 .SBTTL GET PFN FROM INVALID PTE 4;+ 5; IOC$PTETOPFN - GET PFN FROM INVALID PTE 5; 5; THIS ROUTINE IS CALLED TO RETURN THE PAGE FRAME NUMBER FROM A L6; PAGE TABLE ENTRY WHICH HAS ALREADY BEEN DETERMINED TO BE NOT VALID. 6; 7; INPUTS: x7; 7; R3 = PAGE TABLE ENTRY @8; 8; OUTPUTS: 9; l9; R3 = PAGE FRAME NUMBER AND MAY INCLUDE THE FOLLOWING FIELDS 9; VALID BIT, MODIFY BIT, PROTECTION FIELD, OWNER FIELD 4:; :; ALL OTHER REGISTERS PRESERVED :;- `; ; .ENABL LSB ( PTE$M_GPTX>,R3 ;AND GPTX/PFN > BBS #PTE$V_TYP1,R3,20$ ;BRANCH IF BAD PTE FOR I/O > BBSC #PTE$V_TYP0,R3,GLOBAL ;BRANCH IF GLOBAL PAGE H?10$: RSB ?20$: BUG_CHECK INVPTEFMT,FATAL ;INVALID PAGE TABLE ENTRY FORMAT @ .DSABL LSB t@ @ .END