CORAL.MAC;2/AU/-BF=CORAL.MAC;1 \ -2,2,/;BENCH/ .IDENT /BENCH/ -11,11,/;BENCH/ ; ; CORE BUFFER ALLOCATION ROUTINES ; ; BENCHMARKING VERSION -20,34,/;BENCH/ ; ******* THIS VERSION IS NOT INTENDED FOR PERMANENT INSTALLATION ; ******* IN THE OPERATING SYSTEM....IT IS INTENDED FOR BENCHMARKING ; ******* PURPOSES ONLY! BUYER BEWARE! ; ; DANIEL STEINBERG ; SRI INTERNATIONAL ; (415) 326-6200 EXT.5539 ; ; THE ROUTINES AT $ALOCB AND $DEACB HAVE BEEN MODIFIED SO THAT THE BIT ; OFFSETS IN THE WORD AT $AFLG$ (DEFINED GLOBALLY) HAVE THE FOLLOWING ; IMPLICATIONS: ; ; BIT MEANING ; ; AB IF SET, BIT 0 OF LOCATION $AMRK$ IS TURNED ON WHENEVER $ALOCB ; IS CALLED. THE BIT IS TURNED OFF WHEN A 'RETURN' IS EXECUTED. ; ; A1 IF SET, BIT 0 OF $AMRK$ IS TURNED ON WHENEVER $ALOC1 IS CALLED. ; ; AE0 IF SET, BIT 0 OF $AMRK$ IS LEFT ON WHEN ON ALLOCATION FAILURE. ; ; AE1 IF SET, BIT 1 OF $AMRK$ IS TURNED ON AT ALLOCATION FAILURE. ; ; ABK IF SET, LARGE CHUNKS OF POOL ARE USED BY ALLOCATING FROM THE ; BACK END OF THE CHUNK...IF CLEAR, ALLOCATE FROM FRONT ; ; ARV IF SET, USE ROVING ALLOCATION ALGORITHM ; IF CLEAR, USE THE OLD STANDARD FIRST FIT ; ; APV IF SET, (AND ARV) ROVING ALLOCATION SEARCH STARTS AT PREVIOUSLY ; FRAGMENTED CHUNK......IF CLEAR, START AT NEXT CHUNK ; % -42,42,/;BENCH/ -47,49,/;BENCH/ \ ; THIS ROUTINE IS CALLED TO ALLOCATE AN EXEC CORE BUFFER. THE ORIGINAL ; ALGORITHM IS FIRST FIT AND BLOCKS ARE ALLOCATED IN MULTIPLES OF FOUR ; BYTES. THE NEW ALGORITHM (SELECTED IF BIT 'ARV' OF $AFLG$ IS SET) USES ; A ROVING ALLOCATION POINTER ($ROVER) WHICH SPECIFIES THE FIRST FREE ; CHUNK TO START THE ALLOCATION SEARCH (A LA KNUTH). $ROVER IS UPDATED ; EITHER TO START THE NEXT SEARCH AT THE BLOCK FOLLOWING THE LAST ; ALLOCATION (KNUTH'S WAY), OR AT THE BLOCK MOST RECENTLY ALLOCATED ; FROM (GENERALLY CAUSING FAST ALLOCATIONS). ; ; *** NOTE THAT $DEAC1 *MUST* BE MODIFIED IF $ROVER IS USED *** ; *** SEE THE NOTE UNDER $DEACB DOCUMENTATION BELOW *** % -64,69,/;BENCH/ $AMRK$==167774 ;*** DR11-K OUTPUT REGISTER ADDRESS *** ;THE 1ST BIT OF THE DR11-K OUTPUT REG WILL BE MONITORED ;TO COLLECT DATA ON ALLOCATION TIME, FREQUENCY, ETC. ; $AFLG$ BIT OFFSETS: AB=1 A1=2 AE0=4 AE1=10 ABK=20 ARV=40 APV=100 ;*** TO SPECIFY PARTICULAR STARTUP CONDITIONS, YOU MAY WANT TO ; ENTER A GLBPAT IN THE TASK BUILD COMMAND FILE FOR $AFLG$ ;*** IF $AFLG$ IS ZERO, THE ORIGINAL RSX V3.2 ALGORITHM WILL ; BE IN USE AT THE INITIAL SYSTEM BOOT. .IIF DF,DS$ROV .ERROR ;MULTIPLE DEFINITION OF $ROVER IN SYSCM $AFLG$:: .WORD 0 ;BENCHMARKING FLAG WORD $ROVER:: .WORD 0 ;ROVING ALLOCATION POINTER .ENABL LSB $ALOCB:: BIT #AB,$AFLG$ ;FLAG $ALOCB ENTRY? BEQ 500$ ; NO BIS #1,@#$AMRK$ ; YES...SET BIT 0 500$: MOV #$CRAVL-2,R0 ;POINT TO ALLOCATION MASK WORD .IF DF,Q$$OPT -80,120,/;BENCH/ BIC #3,@#$AMRK$ ; CLEAR ALLOCATION ERROR BITS RETURN ; 4$: MOV #$CRAVL-2,R0 ;POINT BACK TO ALLOCATION MASK WORD .ENDC ;DF,Q$$OPT $ALOC1::ADD (R0),R1 ;ROUND TO NEXT BOUNDARY BIC (R0)+,R1 ;CLEAR EXCESS 5$: SEC ;ASSUME ZERO LENGTH REQUEST BEQ ARET ;IF EQ, ZERO LENGTH REQUEST BIT #A1,$AFLG$ ;FLAG $ALOC1 ENTRY? BEQ 505$ ; NO BIS #1,@#$AMRK$ ; YES...SET BIT 0 505$: .IF DF,R$$DER MOV R0,-(SP) ;SAVE ADDRESS OF LISTHEAD .ENDC ;DF,R$$DER BIT #ARV,$AFLG$ ;NEW ALLOCATION? BEQ OLDAL1 ; NO...USE OLD ROUTINE NEWAL1: CMP R0,#$CRAVL ;ALLOCATING FROM EXEC POOL? BNE 120$ ; NO....DON'T USE $ROVER MOV $ROVER,R0 ; YES...GET PREVIOUSLY UPDATED PTR BEQ 105$ ;IF ZERO, START AT LISTHEAD CALL ALLOC ;CHECK POOL FROM $ROVER TO END BCC 508$ ; SUCCESS 105$: MOV #$CRAVL,R0 ;EITHER LAST SEARCH FAILED OR $ROVER=0 CALL ALLOC ;TRY FROM TOP OF EXEC POOL TO END BCS 115$ ; FAILURE 508$: MOV R2,$ROVER ;SAVE PREVIOUS PTR BIT #APV,$AFLG$ ;IS THAT RIGHT? BNE 510$ ; YES MOV (R2),$ROVER ; NO...SAVE NEXT BLOCK ADDRESS 510$: AOUT: .IF DF,R$$DER INC (SP)+ ;CLEAN STACK W/O AFFECTING C-BIT .ENDC ;DF,R$$DER BCC 520$ ;SUCCESSFUL ALLOCATION BIT #AE1,$AFLG$ ; FAILURE...SET BIT 1? BEQ 515$ ; NO BIS #2,@#$AMRK$ ; YES 515$: BIT #AE0,$AFLG$ ; FAILURE...LEAVE BIT 0 SET? BEQ ARET ; NO RETURN ; YES 520$: BIC #3,@#$AMRK$ ;SUCCESS...CLEAR ERROR BITS ARET: BIC #1,@#$AMRK$ ; CLEAR ONLY BIT 0 RETURN 115$: MOV #0,$ROVER ;ALLOCATION FAILURE, LEAVE C-SET BR AOUT ;CLEAN UP AND EXIT 120$: CALL ALLOC ;SEARCH LINKED LIST (NOT EXEC POOL) BR AOUT ;CLEAN UP AND EXIT OLDAL1: CALL ALLOC ;USE RSX V3.2 ALLOCATION ALGORITHM BR AOUT ;MERGE WITH BIT CHECKS ALLOC: SEC ;ASSUME FAILURE (HOW OPTIMISTIC!) 10$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT BLOCK MOV (R2),R0 ;GET ADDRESS OF NEXT BLOCK BEQ 35$ ;IF EQ END OF CHAIN .IF DF,R$$DER CMP R0,R2 ;BACKWARD REFERENCE? BLO 40$ ;IF LE YES CMP #$CRAVL,2(SP) ;ALLOCATION IN EXEC'S POOL? BNE 15$ ;IF NE, NO CMP R0,#$POOL ;ALLOCATION BEFORE EXEC POOL? BLO 40$ ;IF LO YES CMP R0,$EXSIZ ;ALLOCATION PAST END OF POOL? BHI 40$ ;IF HI YES 15$: ;REF LABEL .ENDC ;DF,R$$DER CMP 2(R0),R1 ;BLOCK BIG ENOUGH? BLO 10$ ;IF LO NO BEQ 20$ ;IF EQ BLOCK IS EXACT SIZE BIT #ABK,$AFLG$ ;ALLOCATE FROM BACK OF CHUNK? BEQ AFRONT ; NO, FROM FRONT (RSX V3.2 WAY) ABACK: SUB R1,2(R0) ;CALCULATE SIZE REMAINING ADD 2(R0),R0 ;POINT TO BLOCK TO ALLOCATE RETURN ;DONE AFRONT: TST (R0)+ ;POINT TO SIZE OF FREE BLOCK -128,146,/;BENCH/ 35$: RETURN .IF DF,R$$DER 40$: CRASH ;POOL CLOBBERED .ENDC ;DF,R$$DER .DSABL LSB -223,223,/;BENCH/ \ ;FALL THRU TO $DEACB % -232,,/;BENCH/ \ ; *** NOTE: THE FOLLOWING CHANGE TO $DEACB HAS BEEN MADE: ; IF $ROVER IS POINTING TO A BLOCK WHICH IS MERGED INTO THE ; PREVIOUS BLOCK, $ROVER IS CLEARED SO THAT THE NEXT ALLOCATION ; SEARCH STARTS AT THE TOP OF THE FREE LIST. ; -242,249,/;BENCH/ ; ADDRESS AND IS AGLOMERATED IF NECESSARY WITH ADJACENT BLOCKS. ;- $DEACB::MOV #$CRAVL-2,R3 ;POINT TO ALLOCATION MASK WORD .IF DF,Q$$OPT -262,264,/;BENCH/ .ENDC ;DF,Q$$OPT -270,276,/;BENCH/ .IF DF,R$$DER MOV R3,-(SP) ;SAVE ADDRESS OF LISTHEAD .ENDC ;DF,R$$DER -287,288,/;BENCH/ .IF DF,R$$DER -297,308,/;BENCH/ % .ENDC ;DF,R$$DER CMP R3,(SP)+ ;EQUAL TO NEXT IN CHAIN? .IF DF,R$$DER BLO 90$ ;IF LO, DEALLOCATION OVERLAPS .ENDC ;DF,R$$DER BNE 60$ ;IF NE NO CMP R3,$ROVER ;ABOUT TO MERGE AWAY ROVER BLOCK? BNE 202$ ; NO...OK CLR $ROVER ; YES..START NEXT SEARCH AT $CRAVL 202$: ;REFERENCE LABEL \ -316,317,/;BENCH/ .IF DF,R$$DER -322,323,/;BENCH/ .ENDC ;DF,R$$DER -331,346,/;BENCH/ .IF DF,R$$DER TST (SP)+ ;POP ADDRESS OF LISTHEAD .ENDC ;DF,R$$DER 80$: RETURN ; .IF DF,R$$DER 90$: TST R3 ;INSERT AT END OF LIST? BEQ 60$ ;IF EQ YES, OK 100$: CRASH ;CRASH SYSTEM, BAD CORE DEALLOCATION .ENDC ;DF,R$$DER /