Google
 

Trailing-Edge - PDP-10 Archives - BB-D351B-SM - sources/stgman.p11
There are 30 other files named stgman.p11 in the archive. Click here to see a list.
.SBTTL	STORAGE MANAGEMENT
;
; THIS SET OF SUBROUTINES GETS AND FREES CHUNKS AND MESSAGES.
;  ALSO INCLUDED IN THIS SECTION ARE SUBROUTINES TO GET
;  AND FREE TASK CONTROL BLOCKS.
;
.REPT 0


                          COPYRIGHT (c) 1980, 1979
            DIGITAL EQUIPMENT CORPORATION, maynard, mass.

THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
TRANSFERRED.

THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
CORPORATION.

DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.

.ENDR
;
;
;
;		REVISION HISTORY
;
;
; 4(001) BS	ADDED EDIT NUMBERS
;
;
;
VSTGMN=001
;
VEDIT=VEDIT+VSTGMN
;
;
;
; SUBROUTINE TO GET A TASK CONTROL BLOCK.
;
; ON RETURN:
;
;	R0 = POINTER TO TCB.  CALLER MUST FILL IN INITIAL
;	   ADDRESS AND PUT IN A TASK LIST.
;
; ON SUCCESS, C IS CLEAR.  ON FAILURE, C IS SET.
;
GETTCB:	MOV	#TCSIZE,R0	;LENGTH OF A TCB
	JSR	PC,GETSTG	;GET CORE FOR IT
	BCS	12$		;NOT AVAILABLE
	MOV	R0,-(SP)	;SAVE POINTER
	MOV	#STKLEN,R0	;GET LENGTH OF TASK STACK
	JSR	PC,GETSTG	;GET STACK SPACE
	BCS	11$		;NOT AVAILABLE
	MOV	(SP)+,R1	;GET TCB BACK
	MOV	R0,TCSPT(R1)	;STORE POINTER TO STACK BASE
	ADD	#STKLEN,R0	;POINT TO END OF STACK
	MOV	R0,TCSP(R1)	;INITIALIZE STACK POINTER
	MOV	R1,R0		;PUT TCB POINTER IN R0
.IIF NE,FTRACE,MOV TRCFLG,TCPS(R0) ;SET TRACE BIT IF REQUESTED
	CLC			;FLAG SUCCESS
	RTS	PC		; AND RETURN.
;
; HERE IF THERE IS NOT SPACE FOR THE STACK.  FREE THE TCB
;  AND GIVE THE ERROR RETURN.
;
11$:	MOV	(SP)+,R0	;GET POINTER TO TCB
	JSR	PC,FRESTG	;FREE IT
;
; HERE TO GIVE ERROR RETURN.
;
12$:	SEC			;FLAG ERROR
	RTS	PC		; AND RETURN.
;
; SUBROUTINE TO FREE A TCB.  R0 POINTS TO THE TCB.
;
FRETCB:	MOV	R0,-(SP)	;SAVE TCB POINTER
	MOV	TCSPT(R0),R0	;POINT TO STACK
	JSR	PC,FRESTG	;FREE IT
	MOV	(SP)+,R0	;GET BACK TCB POINTER
	JSR	PC,FRESTG	;FREE IT
	RTS	PC		; AND RETURN.
;
.SBTTL	CHUNK PROCESSING
;
; SUBROUTINE TO GET A CONTINUOUS BLOCK FROM FREE STORAGE.
;  IT GETS ENOUGH CONTIGUOUS CHUNKS TO MAKE UP THE
;  NECESSARY AMOUNT.
;
;	R0 CONTAINS THE NUMBER OF BYTES TO GET
;	R5 POINTS TO THE TASK CONTROL BLOCK, OR 0 FOR
;	  INITIALIZATION.
;
; ON RETURN:
;
;	R0 POINTS TO THE STORAGE, IF IT WAS AVAILABLE.
;
;	  C IS SET ON FAILURE, CLEAR ON SUCCESS
;
GETSTG:	ADD	#3,R0		;INCREASE AMOUNT BY TWO...
	BIC	#1,R0		; AND ROUND UP TO NEAREST WORD.
	CLR	-(SP)		; 10(SP) = TEMP CELL FOR LAST CHUNK WE TRIED FOR
	MOV	R0,-(SP)	; 6(SP) = FUDGED LENGTH
	MOV	R2,-(SP)	; 4(SP) = SAVED R2
	CLR	-(SP)		; 2(SP) = LIST OF CHUNKS GOTTEN ALREADY
	CLR	-(SP)		; (SP) = TEMP CELL FOR # BYTES TO GET
	TST	R5		;ARE WE INITIALIZING?
	BEQ	11$		;YES.
	MOV	#10.,TCGMC(R5)	;NO, SET ERROR COUNTER.
11$:	MOV	CHHGH,R0	;GET ADDRESS OF HIGHEST CHUNK
	MOV	R0,10(SP)	;REMEMBER LAST CHUNK WE TRIED FOR
	JSR	PC,14$		;SEE IF CHUNK ON THE FREE LIST
	BCS	18$		;IT ISN'T.
	JSR	PC,GETCHK	;IT IS, TRY TO GET THE CHUNK
	BCS	18$		;BRANCH IF WE FAILED.
12$:	MOV	R0,2(SP)	;WE GOT IT, SAVE IT.
	MOV	6(SP),(SP)	;SET NUMBER OF BYTES TO GET
13$:	SUB	#CHSIZE,(SP)	;NOTE WE GOT CHSIZE BYTES
	BLE	21$		;BRANCH IF WE HAVE ENOUGH
	SUB	#CHSIZE,R0	;CALC ADDR OF PREV CHUNK IF ADJACENT
	MOV	R0,10(SP)	;SAVE ADDRESS OF LAST CHUNK WE TRIED FOR
	JSR	PC,14$		;IS THIS CHUNK ON THE FREE LIST?
	BCS	18$		;NO, HOLE IN THE FREE LIST
	JSR	PC,GETCHK	;YES, TRY TO GET IT.
	BCS	18$		;IT'S NOT THERE
	MOV	2(SP),(R0)	;GOT IT, PUT ON FRONT OF LIST
	MOV	R0,2(SP)	;STORE LONGER LIST
	BR	13$		;SEE IF THAT IS ENOUGH YET.
;
;
; SUBROUTINE TO VERIFY THAT THE DESIRED CHUNK IS ACTUALLY ON
;  THE FREE LIST.
;
; R0 = POINTER TO CHUNK TO TEST
;
; ON RETURN:
;
;	R0 STILL CONTAINS THE POINTER TO THE CHUNK
;	C SET -- CHUNK IS NOT ON FREE LIST
;	 C CLEAR -- CHUNK IS ON FREE LIST.
;
14$:	MOV	CHFST,R1	;GET POINTER TO FIRST CHUNK
	BEQ	16$		;NONE--NO FREE LIST(?)
15$:	CMP	R1,R0		;IS IT THIS CHUNK?
	BEQ	17$		;YES, TRY TO GET IT.
	MOV	(R1),R1		;NO, POINT TO NEXT CHUNK
	BIT	#1,R1		;IS IT FREE?
	BEQ	14$		;NO, SEARCH THE LIST AGAIN
	BIC	#1,R1		;YES, CLEAR "FREE" BIT
	BNE	15$		;IF NOT END OF LIST, CHECK THIS CHUNK
16$:	SEC			;THIS CHUNK IS NOT ON THE FREE LIST
	RTS	PC		;GIVE ERROR RETURN.
;
; HERE IF THE CHUNK IS ON THE FREE LIST
;
17$:	CLC			;OK RETURN
	RTS	PC		;RETURN.
;
;
; HERE WHEN WE HIT A HOLE IN THE FREE LIST.  RELEASE WHAT WE'VE
;  GOT AND TRY AGAIN.
;
18$:	MOV	2(SP),R0	;POINT TO LAST CHUNK WE GOT
	BEQ	19$		;NO MORE.
	MOV	(R0),2(SP)	;PICK OFF FRONT ITEM ON LIST
	JSR	PC,FRECHK	;FREE THIS CHUNK
	BR	18$		;FREE THE REST.
;
19$:	TST	R5		;ARE WE INITIALIZING?
	BEQ	25$		;YES.
	JSR	PC,IDLTTM	;GETTING BEHIND?
	BCC	25$		;NO, DONT WAIT
	MOV	#2,TCTIM(R5) 	;YES, WAIT 2 TICKS ONLY
	MOV	#EBTIME!EBWAIT,(R5) ;MARK WAITING
	MOV	R4,-(SP)	;SAVE R4
	JSR	PC,WAIT		;DO WAITING
	MOV	(SP)+,R4	;RESTORE R4
25$:
	MOV	10(SP),R0	;POINT TO LAST CHUNK WE TRIED FOR
	SUB	#CHSIZE,R0	;COMPUTE ADDRESS OF ADJACENT CHUNK
	CMP	R0,#FIRZER	;BEYOND END OF CHUNKS?
	BLO	20$		;YES, QUIT.
	MOV	R0,10(SP)	;NO, SAVE CHUNK ADDRESS
	JSR	PC,14$		;SEE IF THIS CHUNK IS ON THE FREE LIST
	BCS	19$		;IT ISN'T.  TRY NEXT.
	JSR	PC,GETCHK	;IT IS, TRY TO GET IT
	BCS	19$		;FAILED, TRY FOR ADJACENT CHUNK
	BR	12$		;SUCCESS, TRY TO GET SPACE FROM HERE.
;
; HERE WHEN WE HAVE RUN ALL THE WAY DOWN TO THE END OF THE
;  FREE LIST WITHOUT FINDING ENOUGH SPACE.  GIVE OTHER TASKS
;  SOME CPU TIME AND TRY AGAIN FROM THE BEGINNING.
;
20$:	TST	R5		;ARE WE INITIALIZING?
	BEQ	23$		;YES, FATAL ERROR.
	MOV	#2,TCTIM(R5)	;TIME TO WAIT
	DEC	TCGMC(R5)	;DECREMENT LOOP COUNTER
	BEQ	23$		;DONE IT ENOUGH, GIVE ERROR RETURN.
	MOV	#EBTIME!EBWAIT,(R5) ;MARK WAITING FOR TIME TO PASS
	JSR	PC,WAIT		;DO THE WAITING
	BR	11$		;IN 1-2 JIFFIES, TRY AGAIN.
;
;
; HERE WHEN WE FIND ENOUGH SPACE
;
21$:	MOV	(SP)+,R2	;DELETE TEMP CELL FROM STACK
	MOV	(SP)+,R0	;ADDRESS OF AREA GOTTEN
	MOV	2(SP),R2	;GET LENGTH IN BYTES (FUDGED)
	MOV	R2,(R0)+	;STORE LENGTH AT -2 FROM AREA
	SUB	#2,R2		;DECREMENT COUNT
	ASR	R2		;MAKE WORD COUNT
	MOV	R0,R1		;COPY ADDRESS
22$:	CLR	(R1)+		;CLEAR A WORD IN THE AREA
	SOB	R2,22$		; AND ALL THE REST
	CLC			;CLEAR C TO INDICATE SUCCESS
	BR	GETST4		;ALL DONE.
;
; HERE WHEN WE HAVE TRIED TOO OFTEN AND FAILED TO GET THE
;  SPACE.  CLEAR R0 AND SET C AS FLAGS.
;
23$:	MOV	(SP)+,R2	;FIX THE STACK
	MOV	(SP)+,R2
	SEC			;C FLAGS ERROR
;
; HERE WHEN IT IS TIME TO EXIT FROM GETSTG.  REGISTER
;  R0 CONTAINS EITHER THE AREA ADDRESS (WITH THE LENGTH WORD
;  IN -2(R0) FOR FRESTG) OR A ZERO IF THE AREA IS NOT AVAILABLE.
;
GETST4:	MOV	(SP)+,R2	;RESTORE R2
	MOV	(SP)+,R1	;THROW AWAY LENGTH
	MOV	(SP)+,R1	;THROW AWAY ADDRESS OF LAST CHUNK WE TRIED FOR
	RTS	PC		;RETURN FROM SUBROUTINE.
;
;
; SUBROUTINE TO RETURN AN AREA OF CORE TO FREE STORAGE.
; AT -2 OFFSET FROM THE START OF THE BLOCK IS THE LENGTH, FUDGED UP
;  BY GETSTG.  THE AREA IS DIVIDED INTO CHUNKS
;  AND THE CHUNKS ARE RETURNED TO THE FREE LIST.
;
;	R0 POINTS TO THE AREA TO BE FREED
;
FRESTG:	MOV	R1,-(SP)	;SAVE R1
	TST	-(R0)		;BACK UP ADDRESS TO COVER WHOLE AREA
	MOV	R0,-(SP)	;SAVE R0
	MOV	R2,-(SP)	;SAVE R2
	MOV	(R0),-(SP)	;NUMBER OF BYTES TO FREE
11$:	MOV	4(SP),R0	;CURRENT ADDRESS
	JSR	PC,FRECHK	;FREE THAT CHUNK
	ADD	#CHSIZE,4(SP)	;INCREMENT BASE ADDRESS
	SUB	#CHSIZE,0(SP)	;DECREMENT COUNT
	BGT	11$		;BRANCH IF MORE TO FREE
	MOV	(SP)+,R2	;DISCARD TEMP CELL
	MOV	(SP)+,R2	;RESTORE R2
	MOV	(SP)+,R0	;DISCARD AREA ADDRESS
	MOV	(SP)+,R1	;RESTORE R1
	RTS	PC		;RETURN TO CALLER
;
;
; SUBROUTINE TO REMOVE A CHUNK FROM THE FREE LIST
;
;	R0 POINTS TO THE CHUNK TO BE REMOVED
;
; ON RETURN:
;
;	R0 POINTS TO THE CHUNK OBTAINED, OR 0 IF THAT CHUNK
;	  WAS NOT AVAILABLE.  C IS SET FOR FAILURE AND 
;	  CLEARED FOR SUCCESS.
;
GETCHK:	MFPS	-(SP)		;SAVE INTERRUPT STATUS
	MTPS	#BR7		;DISABLE INTERRUPTS
	MOV	CHFST,R2	;POINTER TO FIRST CHUNK
	CMP	R2,CHLST	;IS IT ALSO LAST?
	BEQ	13$		;YES, DONT USE LAST CHUNK.
	BIT	#1,(R0)		;IS CHUNK STILL ON FREE LIST?
	BEQ	13$		;NO.
	MOV	2(R0),R2	;YES, GET PREDECESSOR
	BEQ	15$		;THERE IS NONE.
	MOV	(R0),(R2)	;THERE IS, POINT PRED AROUND OUR CHUNK
11$:	MOV	(R0),R2		;GET SUCCESSOR
	BIC	#1,R2		;CLEAR "FREE" BIT
	BEQ	14$		;NO SUCCESSOR, FIX UP CHLST.
	MOV	2(R0),2(R2)	;THERE IS, POINT SUCC AROUND OUR CHUNK
12$:	CLR	(R0)		;CLEAR FORWARD POINTER AND FREE BIT
	MTPS	(SP)+		;ENABLE INTERRUPTS
	CLR	2(R0)		;CLEAR OUT CHUNK
	DEC	CHFREC		;DECREMENT COUNT OF FREE CHUNKS
	TRACE	TRCCNK,R0	;TRACE EXIT FROM "GET A CHUNK"
.IF NE,CHOWNR
	MOV	R1,-(SP)	;SAVE R1
	MOV	2(SP),R1	;CHUNK ID IS CALLER OF GETCHK
	JSR	PC,CHOWNG	;RECORD CHUNK'S OWNER
	MOV	(SP)+,R1	;RESTORE R1
.ENDC ;.IF NE,CHOWNR
	CLC			;FLAG SUCCESS
	RTS	PC		;RETURN TO CALLER
;
;
; HERE WHEN THE CHUNK HAS BEEN SWIPED OFF THE FREE LIST BY
;  INTERRUPT LEVEL, OR IF THE FREE LIST IS DOWN TO ONE
;  CHUNK.
;
13$:	MTPS	(SP)+		;ENABLE INTERRUPTS
	CLR	R0		;CLEAR R0 AS A FLAG
	TRACE	TRCCNK,CHFREC	;TRACE UNSUCCESSFUL EXIT
	SEC			; AND SET C
	RTS	PC		;GIVE ERROR RETURN TO CALLER
;
; HERE IF THE CHUNK IS LAST ON THE FREE LIST.  WE MUST FIX UP
;  CHLST.
;
14$:	MOV	2(R0),CHLST	;POINT CHLST AROUND THE CHUNK
	BR	12$		; AND CONTINUE.
;
; HERE IF THE CHUNK IS FIRST ON THE FREE LIST.  WE MUST FIX UP
;  CHFST.
;
15$:	MOV	(R0),CHFST	;POINT CHFST AROUND THE CHUNK
	BIC	#1,CHFST	;CLEAR "FREE" BIT
	BR	11$		; AND CONTINUE.
;
;
; SUBROUTINE TO RETURN A CHUNK TO THE FREE LIST.
;
;	R0 POINTS TO THE CHUNK
;
FRECHK:	TRACE	TRCCNK,R0	;TRACE ENTRY TO "FREE A CHUNK"
.IIF NE,CHOWNR,JSR PC,CHOWNF	;MARK CHUNK FREE IN OWNER TABLE
	MOV	#CHSIZE/2,R2	;LENGTH OF A CHUNK IN WORDS
	MOV	R0,R1		;COPY THE ADDRESS
.IF NE,FT.CHK
	CMP	R0,#FIRZER	;ABOVE END OF PROGRAM?
	BHIS	11$		;YES.
	STOPCD	BAF		;NO, BAD ADDRESS IN FRECHK
11$:	CMP	R0,PHYLIM	;ABOVE END OF CORE?
	BLO	12$		;NO, ALL OK.
	STOPCD	BAF		;YES, BAD ADDRESS IN FRECHK
12$:
.ENDC ;.IF NE,FT.CHK
13$:	CLR	(R1)+		;CLEAR A WORD OF THE CHUNK
	SOB	R2,13$		;CLEAR ALL THE WORDS
14$:	MFPS	-(SP)		;SAVE INTERRUPT LEVEL
	MTPS	#BR7		;DISABLE INTERRUPTS
	MOV	CHFST,R1	;GET FIRST CHUNK ON LIST
	MOV	R0,CHFST	;MAKE OUR CHUNK FIRST
	MOV	R1,(R0)		;POINT TO REST OF LIST
	BIS	#1,(R0)		;SET "FREE" FLAG
	MOV	R0,2(R1)	;STORE US IN BACK POINTER
	INC	CHFREC		;INCREMENT COUNT OF FREE CHUNKS
	MTPS	(SP)+		;RESTORE INTERRUPT LEVEL
	RTS	PC		;RETURN TO CALLER.
;