1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 SUBTTL CORE ALLOCATOR - USER ROUTINES
22 ; USER ROUTINES (TO COMMUNICATE WITH CORE JOB)
24 UACORE: ;U HAS INDEX CORE REQUEST IS FOR
27 MOVE Q,U ;USER TO MAKE CORE FOR
36 ;EXCESSIVE CORE REQUEST CHECK
40 \f;CORTYP SYSTEM CALL.
41 ;IF 2 ARGS,1ST ARG IS JOB SPEC, LIKE CORBLK'S 2ND AND 4TH ARGS.
42 ;2ND ARG IS PAGE NUMBER IN THAT JOB.
43 ;IF ONLY 1 ARG, IT IS THE PAGE NUMBER IN THE EXECUTING JOB.
46 ; %CBWRT ;4.9 PAGE IS WRITEABLE
47 ; %CBRED ;4.8 PAGE IS READABLE (EXISTS)
48 ; %CBPUB ;4.6 PAGE IS PUBLIC
49 ; %CBLOK ;4.2 PAGE IS LOCKED IN CORE
50 ; %CBSLO ;3.9 PAGE IS IN SLOW MEMORY
51 ; FOR NON EX PAGE, ALL THE REST ARE 0.
52 ;2ND IS 0 => PAGE IS ABSOLUTE, -1 => UNSHARED,
53 ; ELSE IS JOB NUMBER OF NEXT JOB IN CIRCULAR LIST.
54 ;3RD IF ABSOLUTE PAGE, HAS PAGE NUMBER.
55 ; IF PAGE IS SHARED, HAS PAGE NUMBER IN THE JOB
56 ; WHOSE NUMBER IS THE 2ND VALUE. ELSE, 0.
57 ;4TH BIT 4.9 => PAGE IS IN CORE.
58 ; RH IS NUMBER OF TIMES PAGE IS SHARED
59 ; (WILL BE 0 FOR ABS PAGE OR IF NO PAGE,
60 ; OTHERWISE WILL BE >= 1)
62 NCORTY: PUSHJ P,SWTL ;DON'T LET PAGE MAPS CHANGE.
64 SOSG W ;IF 1 ARG, USE -1 (SELF) FOR JOB SPEC.
66 EXCH A,B ;ELSE 1ST ARG IS JOB SPEC.
68 JSP T,NCRUI2 ;DECODE THE JOB SPEC IN J,
69 JFCL ;RETURNS USR IDX IN J.
71 JRST OPNL33 ;BAD PAGE NUM.
72 PUSHJ P,NCORT0 ;DO THE ACTUAL WORK.
73 PUSHJ P,LSWPOP ;UNLOCK CIRPSW,
74 JRST POPJ1 ;GIVE VALUES TO USER, SKIP.
76 ;CALL HERE FROM AUSET5 (ALWAYS COMES WITH CIRPSW LOCKED)
80 JRST [ SETZB B,D ;DON'T CALL UPLC IF PDP6, WOULD CRASH SYSTEM
87 MOVEI U,(J) ;UPLC USES USER IN U.
88 PUSHJ P,UPLC ;NOTE PAGE NUM IS IN A.
89 LDB J,T ;GET PAGE'S HARDWARE HALFWD,
90 LDB C,Q ;GET CIRC. LIST POINTER.
91 JUMPE C,NCORTE ;J IF NO PAGE THERE.
93 TRNE A,600000 ;GET ACCESS INTO A 1.1-1.2
95 CAIN A,2 ;CHANGE READ-WRITE-FIRST TO READ-WRITE.
97 ROT A,-2 ;SHIFT INTO 4.8-4.9
99 JRST NCORTA ;J IF ABSOLUTE PAGE(CIRC PTR -1)
100 PUSHJ P,CHACK ;PG MUST HAVE REAL CIRC LIST, TRACE IT.
101 EXCH C,D ;D HAD MMP IDX; C HAD IN-CORE,,LIST LENGTH.
103 SKIPGE C,(C) .SEE MMPPUB
109 SUBI D,1 ;LIST LENGTH COUNTS THE MMP ENTRY,
111 SUBI D,1 ;COUNTS THE MEMBLT ENTRY IF PAGE IN CORE.
112 TRNN D,-2 ;RH NOW HAS # SHARERS,
113 JRST NCORTS ;ONLY 1 => PAGE NOT SHARED.
116 PUSHJ P,UCPRL ;>1 SHARER => FIND NEXT SHARER,
118 MOVE P,B ;UN-SCREW STACK (UCPRL PUSHJ'D BACK)
120 MOVE C,I ;2ND, 3RD VALUES USR NUM & PAGE NUM
121 JRST POPUJ ;OF THE NEXT SHARER.
123 ;COME HERE IF NO PAGE WITH THAT PAGE NUM.
125 SETZB C,D ;RETURN ALL ZEROS.
128 ;COME HERE IF ABS PAGE, ACCESS ALREADY IN A.
129 NCORTA: SETZB B,D ;JOB # 0 (SYS JOB) FOR ABS PAGE.
130 LDB C,[PMRCAD,,J] ;GET ABS PAGE NUM FROM HARDWARE HALFWD.
133 ;COME HERE IF UNSHARED NORMAL PAGE.
134 ;ACCESS ALREADY IN A, 4TH VALUE IN D.
135 NCORTS: SETO B, ;2ND VALUE -1 FOR UNSHARED.
140 ;1ST ARG FLAG BITS: (RH XOR'D INTO LH BEFORE DECODING)
143 %CBWRT==400000 ; 4.9 GET WRITE ACCESS IF OK, DON'T FAIL IF NOT.
144 %CBRED==200000 ; 4.8 GET READ ACCESS
145 %CBNDW==100000 ; 4.7 GET WRITE ACCESS, FAIL IF CAN'T.
146 %CBPUB==40000 ; 4.6 MAKE PAGE PUBLIC
147 %CBPRV==20000 ; 4.5 MAKE IT PRIVATE (BOTH FAIL IF COULDN'T GET WRITE ACCESS)
148 %CBNDR==10000 ; 4.4 FAIL IF CAN'T GET READ ACCESS.(COPYING NONEXISTANT PAGE)
149 %CBCPY==4000 ; 4.3 MAKE COPY (CURRENTLY ONLY IMPLEMENTED FOR PAGE OF FILE)
150 %CBLOK==2000 ; 4.2 LOCK PAGE IN CORE.
151 %CBULK==1000 ; 4.1 UNLOCK PAGE (ALLOW SWAP-OUT)
152 %CBSLO==400 ; 3.9 MAY ONLY RESIDE IN SLOWEST MEMORY
153 %CBUSL==200 ; 3.8 ALLOWS USE OF ANY MEMORY.
156 %CBNWP==563600 ;BITS THAT NEED WRITE-PERMISSION.
158 ;2ND ARG SPECIFIES JOB TO PUT PAGE IN
159 ; IS EITHER CHNL NUM, -1 FOR SELF, OR 400000+USRNUM
160 ;JOB SPECIFIED MUST BE CURRENT JOB OR INFERIOR.
162 ;3RD ARG RH. IS PAGE NUM. IN IT.
163 ; LH. IF NEGATIVE, BLOCK MODE, REPEAT THAT MANY TIMES,
164 ; INCREMENTING BOTH PAGE NUMS EACH TIME.
165 ;IN BLOCK MODE, REWRITES 3RD AND 5TH ARGS EACH TIME.
167 ;4TH ARG IS SOURCE OF PAGE,
168 ; A DISK CHANNEL NUMBER (GET N'TH PAGE IN FILE), OR
170 ; A USR, JOB, BOJ, OR STY CHANNEL NUMBER
171 ; OR ONE OF THE FOLLOWING SPECIAL CODES:
173 %JSNUM==400000 ;400000+JOB NUMBER => THAT JOB
174 %JSSUP==400377 ;CURRENT JOB'S SUPERIOR
176 %JSTVB==,,-2 ;TV11 VIDEO BUFFER IN FIRST 8 PAGES, 1ST WD OF 9TH PG IS CONSOLE REG
177 %JSNUL==,,-3 ;NULL JOB (NOT VALID FOR CORBLK)
178 %JSALL==,,-4 ;ALL JOBS (NOT VALID FOR CORBLK)
179 %JSNEW==,,-5 ;FRESH PAGE
180 %JSABS==,,-6 ;ABSOLUTE PAGE (PHYSICAL MEMORY)
181 ; JOB 0 = SYSTEM JOB = EXEC VIRTUAL ADDRESS SPACE
182 ; JOB 1 = CORE JOB = FRESH PAGE (OBSOLESCENT, USE %JSNEW, EVENTUALLY WILL GO AWAY)
183 ;IF NO 4TH ARG, SAME AS 2ND
185 ;5TH ARG IS PAGE NUM IN SOURCE (IGNORED FOR FRESH PAGE)
186 ;IF NO 5TH ARG, SAME AS 3RD IF 4TH ARG SPECIFIES JOB.
188 ;IF 4TH ARG SPECS FILE, USE CURRENT ACCESS PNTR
189 ;IF INSERTING DISK PAGES, THE ACCESS PTR WILL BE
190 ;POSITIONED AT THE BEGINNING OF THE PAGE AFTER THE LAST PAGE INSERTED.
192 ;BITS IN REGS R AND I:
193 NCOR$P==400000 ;SOURCE USER ISN'T WRITEABLE. PAGES ARE, IFF PUBLIC.
194 NCOR$Q==200000 ;SOURCE IS A DISK FILE.
196 ;CORBLK - COMMENTS ON PRECEDING PAGE.
197 NCORBL: TSC A,CTLBTS(U)
198 TLC A,(A) ;WIN FOR IMMEDIATE FIRST ARG
199 HRRZM C,SRN3(U) ;SAVE PTRS TO 3RD, 5TH ARGS IN SRN3, SRN4 RESPECTIVELY
203 SKIPGE C ;IF WILL REWRITE,CHECK FOR PURE
204 XCTR XRW,[MOVES @SRN3(U)]
206 CAIGE W,5 ;BUT IF NO 5TH ARG, SAY SO & USE 3RD.
207 JRST NCORB1 ;DEFAULT E TO C,SETOM SRN4
208 TLNN E,1000 ;IMMEDIATE 5TH ARG LEGAL
210 JUMPGE C,NCORB7 ;ONLY IF WON'T HAVE TO REWRITE IT
213 NCORB1: SETOM SRN4(U)
219 XCTR XRW,[MOVES @SRN4(U)]
222 JSP T,NCRUI1 ;GET USER INDEX OF TARGET.
223 JRST NCORB0 ;IF DOESN'T SKIP, CAN CERTAINLY WRITE.
224 CAIE J,-1 ;CAN'T STICK PAGE IN 6.
225 JSP T,NCORWR ;ELSE CHECK.
226 JRST OPNL31 ;CANT WRITE SO CANT STICK PAGE IN
227 NCORB0: MOVEI TT,(J) ;SAVE DEST. USER IDX.
228 CAIN TT,(U) ;IF NOT ACTING ON SELF, PCLSR TARGET JOB.
232 PUSHJ P,LSWPOP ;SOS DIELOK(A)
234 MOVSI T,BSSTP ;BUT LEAVE BSSTP SET INSTEAD OF RH
236 SOS USTP(A) ;BECAUSE CORE JOB WANTS RH TO BE CLEAR
238 PUSHJ P,LOSSET ;UNDO SETTING OF BSSTP IF WE PCLSR OR FAIL
241 NCORC1: PUSHJ P,LSWPOP ;SOS DIELOK(TT)
244 ;DROPS THROUGH. ALSO COME HERE FROM ACBLK.
245 ;TARGET DECODED AND STOPPED IF NEC.; USER IDX IN TT.
246 ; NOW DECODE SOURCE IF NEC.
249 TLNE A,%CBNDW ;FORCE WRITE => WRITE.
251 JUMPE A,NCORD ;0 ACCESS WANTED => DELETE PAGES.
252 TLO A,%CBRED ;NOT DELETE, WANT AT LEAST READ ACCESS.
253 CAIGE W,4 ;IF HAD 4TH ARG, DECODE,
254 JRST NCORC2 ;ELSE USE DECODED 2ND (STILL IN J).
258 JRST NCORC2 ;SPECIAL NON-JOB SOURCE, SKIP DECODE
261 JRST [ SKIPN TEN11F ;TV11 SOURCE
263 JRST OPNL10 ;DEVICE NOT AVAIL
267 JSP T,NCRUI1 ;GET SOURCE USR IDX
270 TLNN H,%CLSQ ;COME HERE IF ARG IS RANDOM IO CHANNEL.
271 JRST OPNL34 ;NOT DSK => NO GOOD.
272 MOVE R,J ;2 SKIPS => DISK CHNL; PUT ITS # IN R.
273 TLO R,NCOR$Q ;INDICATE DISK CHNL
275 TDNE T,QSRAC(R) ;INSURE THAT %QAACC WILL BE ON IF OUR
277 IORM T,QSRAC(R) ;CALL TO QFNTR FINDS EOF.
278 MOVE T,QFBLNO(R) ;IF %QAACC WAS 0, THEN QRADAD ISN'T SET UP.
280 NCORQD: SETOM NCORQC ;1ST TIME THRU NCORL LOOP COMING UP.
283 MOVE T,E ;DON'T SMASH E, WILL BE WRITTEN BACK TO USER
284 LSH T,10. ;5TH ARG GIVES PAGE ADDRESS IN FILE FOR DISK CHNL
286 MOVEM T,QRADAD(R) ;SET ACCESS PTR OF DSK CHNL -> SPEC'D PAGE.
289 NCORC0: TLNN A,%CBNWP ;IF REQUIRE ALTERATION,
291 JSP T,NCORW1 ;IF CAN'T WRITE THAT JOB,
292 HRLI J,NCOR$P ;SET FLAG TO CHECK FOR PUBLIC.
293 NCORB2: CAIE J,-1 ;IF NOT PDP6,
294 PUSHJ P,LSWPOP ;SOS DIELOK(J)
295 CAIN J,LUBLK ;IF SOURCE IS CORE JOB (EVENTUALLY DELETE THESE TWO LINES)
296 MOVEI J,%JSNEW ; THAT MEANS GET FRESH PAGE
298 CAIN R,%JSNEW ;FRESH PAGE IMPLIES WRITING
305 ;NOW HAVE TARGET IDX IN TT, SOURCE IN R (USER INDEX, -1 FOR
306 ; PDP6, %JSTVB, %JSNEW, OR %JSABS).
307 ;TARGET PAGNUM IN C; SOURCE IN E (MAYBE INVALID).
308 ;R 4.9 => WRITE REQUIRES PUBLIC PAGE.
309 ;R 4.8 => R HAS DISK CHNL (AND NCORQC IS -1 THE 1ST TIME AROUND)
310 ;DECIDE WHAT KIND PAGE WANTED AND FIND IT.
311 ;CIRPSW MUST BE ON TOP OF LSWPR. IT WILL BE
312 ;UNLOCKED EVENTUALLY (AND ALSO 1 MORE UNDERNEATH IT
313 ;IF THE TARGET JOB ISN'T US). FAILURE DOES A LSWCLR.
314 NCORL: MOVEI I,(R) ;I WILL HAVE USR IDX FOR ACTUAL PAGE.
315 HLRS A ;RH OF A WILL GET ACCESS TO BE GRANTED.
316 TRNE C,-400 ;CHECK DEST PAGE NUM IN RANGE.
322 JRST NCORQ1 ;DISK FILE
325 JRST NCORE4 ;-1 => PDP6 PAGE.
332 JRST NCORF0 ;FRESH PAGE.
334 JRST NCORE1 ;ABSOLUTE PAGE.
336 JRST NCORE7 ;ELSE SOURCE PAGNUM MUST BE < 400
337 MOVEI U,(R) ;SOURCE IS A USER
338 NCORF2: EXCH E,A ;GET SOURCE PAGNUM IN A
339 PUSHJ P,UPLC;(A,U) ;FIND THE PAGE WANTED.
341 LDB J,Q ;UPLC RETURNS IN T,Q.
342 JUMPE J,NCORE6 ;FAIL OR DELETE IF HE HAS NO PAGE THERE.
344 JRST NCORE5 ;IF THAT PAGE IS ABS,CHANGE TO ABS REQ.
345 PUSHJ P,CHACK ;A REAL PAGE, FIND MMP, PREV. PTR.
348 MOVEI I,(R) ;CHACK CLOBBERS I
349 TLNN A,%CBNDW+%CBWRT ;IF WANTED ALTERATION, CHECK LEGAL.
351 LDB J,T ;1ST OF ALL, SOURCE MUST HAVE WRITE PERM.
358 NCORF4: CONO PI,UTCOFF ;DSK XFER COULD COMPLETE, CHANGING INTRANSIT BIT
359 MOVE J,(D) ; HE HAS WRITE PERM.; GET MMP IN J.
360 TLNE R,NCOR$P ; CAN'T ALTER IF NEEDED PUBLIC BUT IT ISN'T.
361 JUMPGE J,[ CONO PI,UTCON .SEE MMPPUB
363 TLNE A,%CBPUB ;WE CAN ALTER; CHANGE PUBLIC IF REQ.
379 NCORF0: MOVEI U,(TT) ;WHEN CREATING A FRESH PAGE, HAVE TO RE-USE A PREVIOUSLY
380 MOVEI E,(C) ;EXISTING PAGE IF POSSIBLE, BECAUSE AFTER THE FRESH PAGE
381 JRST NCORF2 ;IS GIVEN, USER WILL BE PCLSR'ED AND WILL COME IN AGAIN
382 ;LOOKING FOR A FRESH PAGE. CURRENTLY THIS CAUSES A BUG
383 ;THAT A "FRESH PAGE" IS NOT ALWAYS ZERO.
385 NCORF3: CAIE C,2 ;WANT FRESH PAGE
388 JRST NCORD0 ;SHARED PAGE CAN'T SERVE AS FRESH PAGE
392 ;COME HERE IF REQ WRITE ON REAL PAGE BUT CAN'T GRANT.
393 NCORB5: CAIN R,%JSNEW
394 JRST NCORD0 ;JUST REPLACE WITH FRESH PAGE
395 TLNE A,%CBNDW+%CBPUB+%CBPRV+%CBSLO+%CBUSL+%CBLOK+%CBULK ;IF HE INSISTED, FAIL.
397 TRZ A,%CBWRT ;ELSE GIVE HIM ONLY READ PERM.
398 ;COME HERE IF PAGE EXISTS TO GIVE ACCESS AS IN A 2.8,2.9
400 CAIN TT,(I) ;ARE WE REPLACING PAGE BY ITSELF?
402 JRST NCORD0 ;NO, DELETE OLD, INSERT NEW.
403 LDB J,T ;REPLACING PG W/ SELF, SET ACCESS & EXIT.
406 TRNN J,400000 ;CHANGE READ TO RWF
422 JRST NCORX ;TO END OF LOOP.
428 AOSN NCORQC ;THE 1ST TIME AROUND LOOP?
429 JRST NCORQ0 ;YES, ACCESS TO 1ST PAGE TO BE INSERTED.
430 PUSHJ P,QFNTN ;NO, JUST MOVE FORWARD 1 PAGE
431 JRST NCORE8 ;REACHED EOF, CAN'T INSERT PAGE
435 MOVE I,R ;FOUND THE PAGE, GO INSERT IT.
438 NCORQ0: MOVE Q,QRADAD(A)
441 PUSHJ P,QUDULK ;QFNTR LEAVES IT LOCKED
442 AOS QSLGL(A) ;DON'T BE FOOLED BY QFNTR'S TRICK
443 SOS QSBI(A) ;ON THE DISK PI RTNS.
449 NCORE6: CAIN R,%JSNEW ;COPY NONEXISTANT PAGE
450 JRST NCORD0 ;JUST PUT IN A FRESH PAGE
451 HRRI A,0 ;CHANGE TO DELETE RQ.
452 TLNN A,%CBNDR+%CBNDW+%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
453 JRST NCORD0 ;IF INSIST ON ACCESS, FAIL.
454 NCORE0: PUSHJ P,OPNL32 ;CAN'T GRANT ACCESS OPNL.
455 POPCUJ: POP P,C ;FAIL OUT OF CALL.
460 NCORE4: CAIL E,LPDP6M
461 JRST NCORE7 ;OUT OF RANGE.
462 MOVEI B,PDP6BM_<-10.>(E)
463 JRST NCORE3 ;CONVERT TO ABS REQ, WRITE OK
470 SKIPL TVCREG(TT) ;IF CONSOLE REGISTER NOT ALREADY SET UP
472 MOVE B,TVVBN(TT) ;INITIALIZE IT FROM BLINKER
475 MOVEM B,400000+TTR10*2000 ;INITIALIZE HARDWARE CONSOLE REGISTER.
476 NCORV2: LDB B,TTCRT(E) ;GET MAP ENTRY OUT OF EXEUMP
477 ANDI B,PMRCM ;MASK TO PAGE #
478 JRST NCORE3 ;CONVERT TO ABS REQ, WRITE OK
483 JRST NCORE2 ;ACCESS AVAILABLE, READ ONLY
484 JRST NCORE6 ;CAN'T GET ACCESS TO PAGE.
486 NCORE7: PUSHJ P,OPNL33 ;BAD ARG OPNL.
489 ;PAGE TO COPY WAS AN ABS PAGE.
490 NCORE5: CAIN R,%JSNEW
491 JRST NCORD0 ;SUBSTITUTE A FRESH PAGE
492 LDB B,T ;GET ABS PAGE NUM.
493 TRZE B,400000 ;IF HE HASN'T WRITE PERM.
494 JUMPGE R,NCORE3 ;OR WE CAN'T WRITE IN HIM,
495 NCORE2: TRZ A,%CBWRT ;CAN'T GET WRITE,
496 TLNN A,%CBNDW ;FAIL IF INSIST.
497 NCORE3: TLNE A,%CBPUB+%CBPRV+%CBLOK+%CBULK+%CBSLO+%CBUSL
498 JRST NCORE0 ;OR IF TRYING TO CHANGE PUBLICNESS.
499 MOVE D,B ;GET JUST THE PAGE # (NOT THE ACCESS CODE)
500 ANDI D,PMRCM ;TO INDEX INTO TABLES WITH.
502 LDB I,[.BP <PMRCM-377> D] ;GET MOBY #
506 SUBI Q,<T11CPA_-18.>_8
510 JRST 4,. ;SHOULDNT HAVE ABS PNTR TO NOT SET UP PAGE
511 AOJE I,NCOREA ;CONFLICT PAGE
512 LDB I,[350500,,T11MP(Q)]
514 JRST NCOREA ;USAGE COUNT FULL
516 DPB I,[350500,,T11MP(Q)]
520 CAIL D,PDP6BM_-10. ;IS ABS PAGE # WITHIN RANGE OF PDP6 PAGES?
521 CAIL D,PDP6BM_-10.+LPDP6M
523 SKIPL PDP6UP ;IF SO, ALLOW PAGE COPYING, IFF PDP6 IS UP.
529 JRST NCORE6 ;DONT ALLOW POINTER TO PAGE ABOVE TOTAL SYSTEM MEMORY
530 LDB I,[MUR,,MEMBLT(D)]
531 CAIN I,MUHOLE ;DON'T GIVE ABS PAGE THAT IS NXM.
533 NCOREA: MOVEI I,%JSABS ;INDICATE ABS REQ.
537 NCORQC: 0 ;COUNTS PASSES THRU NCORL, IF SOURCE IS DISK FILE.
538 ;FORCES COMPLETE REPOSITIONING IN FILE THE 1ST TIME THRU.
541 ;THIS IS FOR DELETE RQS WHAT NCORL IS FOR INSERTS.
542 .SEE NCORL ;ABOUT CIRPSW, ACS, ETC.
543 ;ALSO SEE COMMENTS HALFWAY DOWN THIS PAGE.
545 JRST OPNL33 ;PAGE NUM. OUT OF RANGE.
548 NCORD0: PUSH P,A ;COME IN HERE ON VALID INSERT RQ.
553 PUSHJ P,UPLC ;SAVE TIME BY CHECKING WHETHER PAGE EXISTS.
556 PUSHJ P,PAGERT ;IT EXISTS; DELETE IT.
560 POP P,C ;TARGET PAGNUM
562 TRNN A,%CBRED+%CBWRT ;IF NO ACCESS REQ, IS DELETE, THRU.
564 ;RH. OF A HAS ACCESS TO GRANT. LH(A) HAS ORIGINAL CONTROL BITS.
565 ;IF I=%JSABS, ABS PAGE, NUM. IN B.
566 ;IF I=%JSNEW, FRESH PAGE.
567 ;IF 4.8 IN I SET, DISK PAGE POINTED TO BY CHNL IN I
568 ;ELSE OLD PAGE, B IS BP -> CIRC LIST, T -> OLD ACCESS.
574 JRST NCORQ2 ;INSERT PAGE FROM FILE
576 JRST NCORA ;GO INSERT ABS PAGE
578 JRST NCORR ;GO INSERT REAL PAGE.
580 LSH C,9 ;INSERT FRESH PAGE.
581 MOVEI Q,(TT) ;TARGET JOB
582 IDIVI TT,LUBLK ;CLOBBERS I.
585 TLNE A,%CBPUB ;MAYBE RQ PUBLIC
587 PUSHJ P,NACRFL ;PUT IN CORE RQ (FREES CIRPSW)
592 HRRZ E,-3(P) ;GET TARGET PAGE NUM
596 JRST OPNL37 ;NO CORE OPNL.
598 ;COME HERE IF NEED TO WAIT FOR CORE AVAILABLE FOR NEW MMP PAGE.
599 NCORQW: PUSHJ P,LSWPOP ;UNLOCK TUT.
600 PUSHJ P,LSWPOP ;AND CIRPSW, SO CORE JOB CAN OPERATE.
601 MOVEI T,3 ;WAIT TILL MEM HAS BEEN FREED BY CORE JOB.
604 PUSHJ P,SWTL ;RE-LOCK CIRPSW
607 JRST NCORQB ;THEN RETRY, RELOCKING TUT.
608 \f;FIND OR CREATE MMP ENTRY FOR BLOCK <- DISK CHNL IN I.
609 ;ACCESS TO GRANT IS IN A.
610 ;RETURNS STUFF IN B,T ACCORDING TO COMMENT
611 ;AFTER NCORD1 (IF NEW MMP, IT POINT TO SELF AND B -> IT)
613 PUSH P,[NCORR3] ;RETURN TO NCORR3, SKIPPING UNLESS MMP FULL
616 NCORQ7: PUSH P,TT ;ENTRY FROM NLOAD
617 NCORQB: MOVE I,QDSKN(A)
621 TRNE TT,%CBCPY ;SPECIFIED COPY-ON-WRITE?
622 JRST NCORQ6 ;GET FRESH COPY OF PAGE
623 MOVE B,W ;ELSE TRY TO SHARE EXISTING COPY OF PAGE
624 IDIVI B,SHRHSL ;LOOK UP IN SHAREABLE-PAGE HASH TABLE
626 NCORQ5: HRRZ B,1(B) ;THREAD TO NEXT MMP ENTRY IN BUCKET
627 JUMPE B,NCORQ6 ;END OF LIST, DESIRED PAGE NOT FOUND
628 HLRZ C,1(B) ;GET DISK ADDRESS OF THIS PAGE
632 JRST NCORQ5 ;NOT THE ONE WE WANT
633 MOVEI R,(B) ;SET UP MMP IDX IN R
634 SUB R,MMPEAD ;AS GMMPP RETURNS IT.
635 PUSHJ P,QTULK ;TUT ALREADY AOS'ED.
638 JRST [ MOVSI T,MMPTMP ;MMP ENTRY GOING AWAY.
639 TDNE T,(B) ;IF DISK TRANSFER ALSO IN PROGRESS,
640 JRST NCRMMW ; GO WAIT FOR THINGS TO SETTLE WITH CIRPSW FREE.
642 PUSHJ P,RETMM4 ;CLEAR PENDING FREEAGE
644 JRST NCORQB ] ;AND TRY AGAIN
646 HRRZ T,(B) ;GET CIRC PNTR OUT OF MMP ENTRY.
647 CAIL T,600000 ;SKIP IF DOESN'T POINT TO MEMORY
648 TDNE C,MMSWP-600000(T) ;SKIP IF IT'S A LOOSE PAGE
650 HRRZ C,MEMPNT-600000(T)
651 CAIE C,400000(R) ;SKIP IF NO USERS IN CIRCULAR LIST
652 JRST NCORQ8 ;NOT REALLY LOOSE, USERS LINKED BUT NOT CONNECTED
653 MOVEI C,0 ;REMOVE FROM LOOSE PAGE LIST
655 NCORQ3: MOVE TT,C ;TT PREDECESSOR
656 SKIPN C,W ;W SUCCESSOR
657 JRST 4,. ;NOT IN LOOSE PAGE LIST?
658 LDB W,[MLO,,MEMBLT(C)]
662 DPB W,[MLO,,MEMBLT(TT)]
669 JRST 4,. ;NLOOSP WAS TOO SMALL?
671 NCORQ6: SOSGE MMPFR ;NEED TO CREATE NEW MMP ENTRY; COMMIT ONE
672 JRST [ AOS MMPFR ;MMP FULL
673 JRST POPTTJ ] ;TAKE ERROR RETURN
674 PUSHJ P,GMMPP ;GET FREE MMP ENTRY (CAN'T PCLSR AFTER THIS SUCCEEDS)
675 JRST NCORQW ;WAIT FOR MORE MEM
676 PUSHJ P,QTAOS1 ;AOS TUT FOR BLOCK (TUT ALREADY LOCKED)
677 HRLZM W,1(TT) ;STORE DISK ADR
679 IOR D,[MMPOUT+MMPWOD,,400000] ;SWAPPED OUT, MMP POINTING TO SELF
683 TLCA D,MMPWOD+MMPISW ;COPYING, SO SET INITIAL-SWAPIN
684 JRST [ MOVE B,W ;NO COPYING, SO
685 IDIVI B,SHRHSL ;STICK INTO SHAREABLE-PAGE HASH TABLE
689 TLO D,MMPSHR ;FLAG MMP ENTRY AS IN SHRHSH TABLE
694 NCORQ8: MOVE T,[300,,[3]]
696 AOS -1(P) ;SUCCESS RETURN
700 MOVE U,TT ;INSERT ABS PAGE.
701 PUSHJ P,UPLC ;FIND TARGET PAGE
702 IOR B,(P) ;COMBINE ACCESS W/ PAGE NUM.
703 TRZ B,PMAGEM\PMUNSD\PMCSHM
705 TRNE B,PMRCM ;PAGE 0 NOT CACHED
709 TRZ D,PMAGEM ;TURN OFF REMNANT AGE BITS
710 JUMPN D,[JRST 4,.] ;SHOULD HAVE DELETED PAGE ALREADY
712 MOVNI B,1 ;CIRC. PTR. IS -1.
717 ;VIRTUAL PUSHJ AT NCORQ2
718 NCORR3: JRST [ SUB P,[5,,5] ;MMP WAS FULL
720 POP P,R ;COME HERE FOR DSK PG, AFTER FINDING MMP.
721 MOVE C,QRADAD(A) ;MOVE ACCESS POINTER OF FILE TO
722 IDIVI C,@QSBYTE(A) ;NEXT PAGE BOUNDARY, BEING CAREFUL
723 IORI C,1777 ;ABOUT BYTES.
725 IMULI C,@QSBYTE(A) ;NEXT USE OF FILE WILL GET
726 MOVEM C,QRADAD(A) ;WHAT FOLLOWS PAGES MAPPED.
727 MOVSI C,%QAACC ;INDICATE ACCESS PTR CHANGED.
729 ;COME HERE TO INSERT PG FROM OTHER USER.
730 NCORR: HRRZ E,-3(P) ;TARGET PAGE # C
731 HRRZ U,-1(P) ;TARGET JOB TT
732 HRRZ TT,(P) ;ACCESS (WRITE BIT IN 2.9)
733 PUSHJ P,NCORR1 ;ACTUALLY MUNG MAP.
734 NCORR2: PUSHJ P,GHUSRA ;TARGET PAGE NUM MUST BE IN E
739 ;COME HERE AFTER HANDLING 1 PAGE.
742 JUMPGE C,NCORX1 ;IF LH POS, DON'T REWRITE.
746 SKIPL SRN4(U) ;REWRITE 5TH ARG ONLY IF WAS GIVEN.
750 JRST NCORD ;LOOP AROUND FOR DELETE RQ
751 JRST NCORL ;FOR INSERT RQ.
754 NCORX0: PUSHJ P,LSWPOP ;FREE CIRPSW
755 NCORX2: CAIN TT,(U) ;IF NOT ACTING ON SELF,
757 JRST LSWPOP ;CAN'T FALL THRU SINCE MIGHT BE NULSET.
759 ;THIS IS A LOSSET ROUTINE TO CLEAR THE BSSTP BIT OF THE JOB
760 ;WHOSE INDEX IS IN THE SRN5 OF THE RUNNING JOB.
761 NCORFS: MOVE A,SRN5(U)
765 \f;JSP T,NCORUI WITH JOB-SPEC IN J, RETURNS USER IDX IN J (OR ,,-1 FOR PDP6)
768 ; -1 OR ,,-1 FOR SELF.
769 ; <CHNL-NUM> (MUST BE USR, STY, JOB OR BOJ DEVICE ELSE OPNL34)
770 ; 400000+<USR NUM> JOB WITH THAT NUMBER (OPNL35 IF NONE)
771 ; ( -1,,<USR NUM> ALSO WORKS)
772 ;IF THIS JOB IS CERTAINLY ALLOWED TO MODIFY SPEC'D JOB, DOESN'T SKIP.
773 ;IF SKIPS ONCE, MUST CHECK FARTHER. IN EITHER CASE, DIELOK OF JOB HAS BEEN AOS'D
774 ;AND SOSSET'ED, UNLESS ENTRY POINT WAS NCRUI2, OR JOB IS PDP6.
775 ;2 SKIPS => ARG IS RANDOM I-O CHANNEL; CLSTB ENTRY IN H.
776 ;IN THAT CASE, NO SOSSET WAS DONE. RANDOM CHANNELS ALLOWED ONLY IF ENTRY POINT IS NCRUI1.
778 NCRUI2: HRLI T,200000 ;ENTRY TO SUPPRESS AOS'ING OF DIELOK, AND SOSSET'ING.
781 NCRUI1: TLOA T,400000 ;ENTRY FOR RANDOM CHNLS OK (SKIP TWICE IF SO)
782 NCORUI: TLZ T,400000 ;RANDOM DEVS NOT OK
784 NCRUI3: TRZE J,400000
787 CAIL J,NIOCHN ;>0 => CHNL NUM.
793 JRST NCORU4 ;IF INFERIOR, CAN WRITE.
794 TLNE H,%CLSBJ ;OR IF BOJ DEVICE
795 JRST [HRRZ J,JBCUI(J) ? JRST NCORU4]
796 TLNE H,%CLSST ;STY => USE JOB THAT HAS ASSOCIATED TTY.
797 JRST [ SKIPGE J,TTYSTS(J)
798 JRST OPNL41 ;NO JOB HAS THAT TTY.
801 TLNE H,%CLSFU ;FOREIGN USR, MUST CHECK.
805 JRST NCORU5 ;RANDOM DEVICE. (MAYBE DISK)
806 NCRUI6: MOVEI J,-1 ;PDP6, MUST CHECK.
809 NCORU5: JUMPL T,2(T) ;RANDOM DEVICE, SKIP TWICE IF THATS OK
812 NCORU1: TRNE J,777400 ;CHECK FOR -1 FOR SELF.
815 CAIN J,377 ;CHECK FOR 377 => SUPERIOR.
817 IFN PDP6P,[ ;AND FOR 376 => PDP6.
821 IMULI J,LUBLK ;ELSE WAS USRNUM,
822 CAMGE J,USRHI ;CHECK FOR VALID USER
824 JRST OPNL35 ;IF NOT, NO SUCH JOB.
827 NCORU2: CAME J,[-1,,377777]
830 NCORU4: CONO PI,CLKOFF
831 MOVE H,APRC(J) ;IS THE JOB WE'RE HACKING DIEING?
833 JRST OPNL42 ;YES, PREVENT TIMING ERRORS.
834 TLNE T,200000 ;UNLESS ENTRY POINT WAS NCRUI2,
836 AOS DIELOK(J) ;PREVENT THE JOB FROM DIEING.
841 NCORU6: CONO PI,CLKON
844 NCORU3: SKIPGE J,SUPPRO(U) ;GET SUPERIOR,
849 ;SKIP IF ALLOWED WRITE ACCESS TO PAGES FROM SOURCE IN J
850 ;USE IF NCORUI ETC. SKIPS ONCE. CALL BY JSP T,.
854 CAIN J,-1 ;IF IT GETS THIS FAR, USER HAS A PDP6 CHANNEL,
855 JRST 1(T) ; THEREFORE OBVIOUSLY IS ALLOWED TO WRITE PDP6 MEMORY.
857 CAIE J,LUBLK ;CAN GET WRITE ACCESS TO FRESH PAGE,
858 ;SKIP IF ALLOWED TO MODIFY PAGE MAP OF TARGET JOB IN J.
859 NCORWR: CAIN J,(U) ;CAN DO THAT AND STICK PAGE IN SELF
862 CAIN U,(H) ;AND OUR INFERIORS
864 SKIPL H,JBI(U) ;AND OUR BOJ DEVICE.
872 ;4.7 USED INTERNALLY IN CODE (W RQ ON PDP6)
873 ;4.3-4.1 = 0 GET PAGE FROM SELF
874 ; = 1 GET ABSOLUTE PAGE
875 ; = 2 GET PAGE FROM USER OPEN ON CH # 3.1-3.8
876 ; = 3 GET PAGE FROM USER NUMBER 3.1-3.8
878 ; = 5 GET PAGE (PUBLIC)
879 ; = 6 MAKE PAGE PRIVATE
880 ; = 7 MAKE PAGE PUBLIC
881 ;3.9=1 REQUEST WRITE PERMISSION (IGNORED ON FRESH PAGE, OTHERWISE VALID ONLY FOR
882 ; SELF OR DIRECT INFERIOR OPEN ON CH OR PUBLIC PAGE)
883 ;3.1-3.8 USER NUMBER OR CH # (377 => CREATOR IF JOB DEVICE)
884 ;2.9=1 INSERT PAGE, 0 DELETE (IGNORES 4.3-4.1 EXCEPT FOR 6 OR 7 WHEN IT IS IGNORED)
885 ;2.1-2.8 VIRTUAL PAGE TO BE AFFECTED
886 ;1.1-1.9 BLOCK # IN ABSOLUTE OR OTHER USER (OR SELF IF 4.3-4.1 = 0)
888 ;TO CALL NCBLK, SET UP Q WITH USER INDEX REQUEST IS FOR AND U WITH
889 ;THE USER INDEX MAKING THE REQUEST
891 ;NEW .CBLK CODE, PASSES THE BUCK TO CORBLK.
892 ;SAME AS FAR AS CALLER IS CONCERNED.
894 ACBLK: MOVE TT,U ;TARGET USR IDX.
896 NCBLK0: MOVEI W,5 ;FAKE 5 ARGS TO NCORBL
897 LDB C,[111000,,B] ;TARGET PAGNUM.
898 LDB E,[1100,,B] ;SOURCE PAGNUM.
900 JRST NCBLKD ;LIKELY TO BE DELETE RQ.
901 NCBLK1: MOVSI A,210000 ;NOT DELETE => RQ READ, FAIL IF CAN'T.
902 LDB D,[221000,,B] ;SOURCE USR IDX OR CHNL NUM.
903 LDB H,[330300,,B] ;REQUEST TYPE-CODE.
906 JRST NCBLKS ;TYPE 0, SOURCE IS SELF.
907 JRST NCBLKA ;TYPE 1, GET ABS PAGE.
908 JRST NCBLKC ;2, USE SPEC'D CHNL NUM.
909 JRST NCBLKI ;3, USE SPEC'D USR IDX.
910 JRST NCBLKF ;4, FRESH PAGE.
911 JRST NCBLKP ;5, FRESH PUBLIC PAGE.
912 TLOA A,420000 ;6, MAKE PRIVATE, SOURCE=TARGET.
913 TLO A,440000 ;7, MAKE PUBLIC, " "
914 MOVE E,C ;SOURCE PAGNUM _ TARGET PAGNUM,
915 NCBLKS: TROA D,-1 ;GET PAGE FROM SELF. (%JSELF=-1)
916 NCBLKA: MOVEI D,%JSABS ;GET ABS PAGE
917 ;IF GET-FROM-CHANNEL, THE CHNL NUM IN D IS DESIRED JOB-SPEC.
918 NCBLKC: TLNE B,400 ;IF WRITE-RQ BIT ON,
919 TLO A,100000 ;INSIST ON WRITE ACCESS.
920 NCORBX: CAIE TT,(U) ;IF TARGET .NE. SELF,
921 PUSHJ P,NULSET ;FAKE OUT THOSE EXPECTING A LOSSET.
924 NCBLKI: IORI D,%JSNUM ;GET FROM USR IDX, MAKE JOB SPEC.
927 NCBLKP: TLO A,40000 ;GET FRESH PUBLIC PAGE.
928 NCBLKF: MOVEI D,%JSNEW ;GET FRESH PAGE
931 NCBLKD: TLC B,6000 ;COME HERE IF BIT 2.9 IS 0
933 JRST NCBLK1 ;(TYPES 6,7 IGNORE THAT BIT)
934 SETZB A,B ;OTHERWISE IS DELETE REQUEST.
941 ;ACTUALLY COPY A PAGE FROM ONE MAP TO ANOTHER
942 ;T PNTR TO MAP COPYING FROM
943 ;TT 400000 BIT 1=> WRITE
948 NCORR1: LDB J,T ;ENTRY FROM NCORR
950 JRST ACBK3A ;PAGE NON EXISTANT OR SWAPPED OUT
951 TRNN TT,400000 ;WRITE RQ ?
952 TRZ J,400000 ;DOESN'T RQ MORE
954 TRO J,200000 ;IN CASE OF RWF
955 ACBK3B: MOVE A,E ;TARGET PAGE #
957 LDB C,T ;GET PTW ABOUT TO BE CLOBBERED
958 TRZ C,PMAGEM ;TURN OFF AGE BITS
959 JUMPN C,[JRST 4,.] ;SHOULD HAVE DELETED PAGE BY NOW
962 JRST ACBK3C ;JUMP IF PAGE SWAPPED OUT
966 IFE SWPWSP, AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
969 AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
970 MOVSI C,1 ;ADJUST WORKING SET OF TARGET JOB
971 IDIV C,TT ;1,,0 IF DIVISION BY ZERO
973 JUMPE TT,ACBK3D ;JUMP IF NO SHARERS
974 IMULI TT,1(TT) ;COMPUTE ADJUSTMENT TO ALL WORKING SETS
975 MOVSI C,-1 ;DUE TO INCREASE IN SHARING
980 PUSHJ P,UCPRL7 ;CLOBBERS C,H,I,U
985 ACBK3D: LDB J,B ;POINTER TO PREVIOUS IN CHAIN
992 AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
995 ACBK3A: TRNN TT,400000
997 TRO J,1 ;IN CASE OF R/W/F
1000 ACBK3C: AOS NSWPGS(U)
1004 MOVE W,Q ;INDEX OF USER THAT REQUEST IS FOR
1005 IDIVI W,LUBLK ;CLOBBERS H
1011 NACRFL: PUSHJ P,LSWPOP ;UNLOCK CASW OR CIRPSW
1013 SKIPL CORRQ(U) ;CURRENT USER IN U COR RQ FOR USER IN Q
1014 PUSHJ P,UFLS ;WAIT FOR MY CORE RQ TO CORE JOB TO CLEAR
1018 PUSHJ P,UFLS ;SOMEBODY ELSE HAS RQ IN ON THIS JOB WAIT TO CLEAR
1020 CASW ;GET CORE ASSIGN SW
1022 JRST NACRFL ;CHECK FOR TIMING ERROR
1024 JRST ACRF6 ;OLD TYPE
1025 MOVNI J,1 ;ADDING ONE BLOCK
1026 MOVEI B,105 ;FAKE OUT CORE TO ZERO CHECK
1029 ACRF6: MOVE J,HUSRAD(Q)
1032 JRST LSWPJ1 ;SAME AMOUNT AS NOW
1035 JUMPN B,LSWPOP ;TRYING TO CORE NON-ZERO A JOB THAT IS DYING?
1036 SUB J,B ;GET AMT OF DECREASE (- => INCREASE)
1038 JRST ACRF6A ;GET 20 AT A WHACK MAX
1039 ACRF8: MOVN I,J ;I GETS POSITIVE # OF PAGES ADDED
1041 SUB J,NCBCOM ;J GETS AMT THAT WILL BE LEFT
1043 JUMPG I,ACRF7 ;NOT ENUF CORE
1044 MOVEI J,0 ;INDICATE RQ WILL BE COMPLETELY SATISFIED
1046 MOVNI J,1 ;MAKE SURE RQ IS REALLY FILLED
1047 ACRF5: JUMPL I,ACRF2 ;JUMP IF DECREASING CORE
1048 JUMPE Q,ACRF3 ;SYSTEM JOB DOESN'T USE MMP
1050 ADDB T,MMPFR ;COMMIT SUFFICIENT NUMBER OF MMP ENTRIES
1051 JUMPGE T,ACRF3 ;JUMP IF THAT MANY ARE AVAILABLE
1052 ADDM I,MMPFR ;MMP FULL, DECOMMIT THE MMP ENTRIES
1053 JRST LSWPOP ;AND TAKE ERROR RETURN
1055 ACRF2: AOSA NCRQL ;COUNT # REQUESTS FOR LESS
1056 ACRF3: ADDM I,NCBCOM ;IF EXPANDING, COMMIT SUFFICIENT AMOUNT OF PHYSICAL CORE
1058 IORM T,APRC(Q) ;CORING USER
1061 PUSHJ P,LSWPOP ;UNLOCK
1063 CONO PI,CLKOFF ;GET CORE JOB TO RUN RIGHT AWAY
1064 MOVE I,USER ;THEN COME RIGHT BACK TO US (WHAT A CROCK THIS ALL IS)
1071 SKIPL CORRQ(U) ;WILL NOT SKIP AT FIRST
1073 JUMPN J,ACRF1 ;REALLY NEED TO TAKE ANOTHER WACK AT THIS
1076 ACRF7: PUSHJ P,LSWPOP
1086 ADD TT,J ;GET REDUCED RQ
1090 SUBTTL CORE ALLOCATOR - CORE JOB ROUTINES
1092 CORJI: MOVE P,USRPDL+L ;SET UP CORE JOB PDL
1096 JRST UTBFF ;FLUSH UTAPE
1098 JRST UFDFF ;FLUSH 2314 UFDS
1100 JRST RETMM2 ;FLUSH PARTIALLY-RETURNED MMP ENTRIES
1102 JRST [ PUSHJ P,QDLFBT ;RETURN DISK BLOCKS TO FREE
1106 JRST CORJOB ;RQ'S FOR LESS HAVE COME IN. BETTER EXECUTE THEM OR MAY NOT HAVE ENUF CORE
1108 JRST CORUP ;FOUND USER IN SEARCH WHO WANTS MORE GIVE IT TO HIM
1113 PUSHJ P,CFLM1 ;FREE SOME LOW MEMORY BY SHUFFLING
1115 SOS NCORRQ ;CAN'T FIND ANYTHING TO DO SO DECREMENT COUNT
1116 ;THIS CAN HAPPEN AS A RESULT OF EXCESS ATTEMPTED UTAPE FLUSHAGE
1117 ;OR DUE TO CALLING CFLM1
1118 CORJOB: PUSHJ P,ACMTC ;XFER ANY "SPECIAL FREE" MEM BLOCKS TO FREE
1119 SKIPN NCORRQ ;ANYONE WANT CORE?
1120 PUSHJ P,[ ;IF NOT, WAIT UNTIL SOMEONE DOES, BUT FIRST
1121 MOVE TT,QMDRO ;SEE IF MFD AND TUTS NEED TO BE READ IN
1124 SETOM CORSRV ;INITIALIZE NO RQS SERVED THIS PASS
1126 MOVNI U,LUBLK ;SCAN FOR USER WITH HIGHEST PRIORITY
1127 CORLUP: ADDI U,LUBLK
1129 JRST CORJ2 ;THRU EXAMINE RESULTS OF SEARCH
1137 LSH A,-10. ;COMPUTE # BLKS JOB HAS NOW
1139 JRST 4,CORL1 ;SAME AS NOW, CHECKED FOR AT ACORE
1141 JRST CORLUG ;INCREASE
1142 MOVEM U,CORUPU ;DECREASE HAS PRIORITY
1146 MOVEM B,CORUPA ;DIFFERENCE
1150 CUSTOP: PUSHJ P,RPCLSR ;STOP USER WHO IS BEING CORED
1151 MOVSI T,BUCSTP ;(THE BUCK STOPS HERE)
1154 MOVEI T,-1 ;GET MASK FOR RH
1155 TDNE T,USTP(A) ;WAIT FOR RANDOM STOPS TO CLEAR
1159 ;Core job initializes disks while system job stands around and supervises
1160 ;This makes it possible for system job to print any resulting error messages
1161 ;Provided no one hits ^Z too soon
1169 MOVSI TT,SCLIDK ;System is up now
1175 CORUPU: -1 ;BEST USER SO FAR TO CHANGE CORE
1176 ;IF SETOMED AT CORUPR, REQUEST NOT COMPLETELY FILLED
1177 CORUPA: 0 ;INCREASE AMOUNT(1 FOR .CBLK)
1178 CORUPS: 0 ;CURRENT SIZE
1179 CORUUC: 0 ;USER CORE REQ ACTUALLY FOR
1180 CORSRV: -1 ;0 => RQ SRVED THIS TIME THRU USER VARS
1181 NCRQL: 0 ;# RQS FOR LESS
1185 CORLUG: HRRZS B ;GUY WANTS MORE GIVE GUY WHO WANTS LEAST PRIORITY
1187 CORLUH: MOVE A,NMPGS(Q)
1190 CAMGE B,CORUPA ;IS RQ SMALLER?
1192 CORLG2: CAME B,CORUPA ;OR IF TIE GIVE IT TO GUY WHO IS SMALLER NOW
1194 CAML A,CORUPS ;IS RQ= & SIZE SMALLER?
1196 CORLG1: MOVEM U,CORUPU ;HIGHEST PRIORITY SO FAR
1202 CORNEW: LDB Q,[1100,,B] ;.CBLK TYPE RQ
1207 CORUP: ;EXECUTE REQUEST
1214 JUMPE A,CORUP8 ;DONT USTOP SYS JOB
1215 PUSHJ P,CUSTOP ;STOP GUY
1216 CORUP8: PUSHJ P,SWTL
1220 JRST CORUPN ;.CBLK TYPE
1222 MOVE A,B ;A HAS CURRENT SIZE
1223 ADD B,CORUPA ;B HAS NEW SIZE
1227 JRST CORM1C ;WANTS MORE THAN NOW
1228 CORL2: LDB A,[121100,,HUSRAD(U)]
1233 PUSHJ P,UPGRTN ;RETURN USER PG
1237 CORUPR: MOVE U,CUSER ;FINISHED FOR NOW ANYWAY REVIVE USER
1242 PUSHJ P,E.SLPM ;LOAD PAGE MAP
1246 PUSHJ P,DCRRST ;DIS IS RUNNING BUT UPDATE UPR ETC
1249 ANDCAM A,USTP(U) ;RESTART USER
1250 PUSHJ P,LSWPOP ;UNLOCK MEMORY
1252 PUSHJ P,ACMTC ;XFER IN PROCESS BLOCKS TO FREE
1254 JRST CORJOB ;NOT THRU WITH THIS RQ
1255 MOVE A,CORUUC ;THRU WITH RQ
1258 SOS NCRQL ;FINISHED A REQUEST FOR LESS, DECREMENT COUNT OF THEM
1260 ANDCAM TT,APRC(A) ;CLEAR RQ PENDING THIS USER FLAG
1261 CORL1: SETOM CORRQ(U)
1267 CORUPN: LDB A,[111000,,TT]
1276 TLO E,600000+PMCSHM ;ADD FRESH PAGE
1287 200000,,[ LDB B,[330100,,TT]
1289 POPJ P, ] ;SET TO DESIRED PUBLICNESS
1293 CORM1C: MOVEM J,CORCNT
1294 CORM1A: JUMPE U,CORS2 ;SNIFFLE
1295 CORM1B: MOVE U,CORUUC
1296 LDB E,[121100,,HUSRAD(U)]
1304 \f;INSERT FRESH PAGE INTO USR MEM IN PLACE SPECIFIED BY E PROT BITS IN LH
1305 ;MMPFR SHOULD HAVE BEEN SOS'ED ALREADY
1307 CORGP: JUMPN U,CORGP0 ;JUMP UNLESS GIVING PAGE TO SYS JOB
1308 MOVE A,SJSPG ;GOBBLE PAGE RESERVED
1311 JRST CORGP1 ;USER VARIABLES, CLEAR IT OUT
1312 JRST CORGP2 ;INITIAL GET OF SYSTEM, DON'T ZERO IT
1314 CORGP0: PUSHJ P,GMMPP ;RETN MMP PNTR IN R
1317 JRST HMEMRQ ;GET MEM, HIGH IF POSSIBLE
1319 CORGP1: PUSHJ P,CZRR
1320 CORGP2: AOS NMPGS(U)
1321 AOS SNMPGS ;INCR SYS PAGE COUNT (VIRT)
1322 PUSH P,A ;REAL CORE BLOCK #
1323 HRRZ A,E ;ADDR IN USERS MAP
1328 JUMPE U,CORGP3 ;IF SYS JOB, DON'T TRY TO SET UP MAP
1329 JUMPN B,[JRST 4,.] ;ALREADY HAS PAGE
1330 AOS MMSWP(A) ;INDICATE THAT ONE USER MAP POINTS AT THIS PAGE
1331 TSO A,E ;SET PROTECTION BITS
1332 DPB A,T ;STORE IN USER'S MAP
1334 TRO R,400000 ;MAKE USERS CP POINT AT MMP
1337 MOVSI TT,1 ;INCREASE WORKING SET
1340 ANDI A,PMRCM ;TURN ACCESS BITS BACK OFF
1341 CORGP3: CAIL A,TSYSM
1344 DPB TT,[MUR,,MEMBLT(A)] ;SET USER FIELD IN MEMBLT
1348 IOR TT,E ;PG # IN USER'S MAP
1350 MOVEI TT,600000(A) ;IF SYS JOB, MEM BLOCK POINTS AT SELF
1351 HRRZM TT,MEMPNT(A) ;ELSE MAKE MEM BLOCK POINT AT USERS MAP
1352 JUMPE U,GHUSRA ;IF SYS JOB, NO MMP ENTRY
1353 DPB C,[MMMPX,,MEMBLT(A)];STORE INDEX OF MMP ENTRY IN MEMBLT
1355 HRRM A,MMP(C) ;MAKE MMP POINT AT MEM BLOCK
1356 PUSHJ P,CHACK ;FOR CHECKING ONLY
1357 CAME C,[SETZ 3] ;REAL MEM, 3 ENTRIES (MMP, MEMPNT, USER)
1360 LSH E,10. ;COMP NEW HUSRAD AFTER GETTING PAGE
1361 TLZ E,-2 ;FLUSH PROTECT BITS (LEAVE 3.1)
1366 CORGPZ: PUSH P,E ;SAVE REGISTERS
1368 PUSHJ P,CFLM2 ;TRY TO FREE UP SOME LOW MEMORY
1372 JRST CORGP ;SHOULD WORK NOW
1373 PUSHJ P,LSWPOP ;MEMFRZ
1374 PUSHJ P,LSWPOP ;CIRPSW
1375 BUG INFO,[NO CORE AVAIL FOR MMP PAGE]
1376 PUSHJ P,UDELAY ;Break possible infinite loop if no user pgs in low mem
1377 SKIPG MEMFR ;WAIT FOR SWAPPER TO MAKE ROOM (PANIC!)
1385 PAGERT: PUSHJ P,SWTL
1390 UPGRTN: PUSH P,R ;RETURN VIRT PG # IN A USER IN U
1395 PUSHJ P,UPLC ;SEE IF PAGE XGP LOCKED
1398 JRST UPGRT7 ;SWAPPED OUT, OBVIOUSLY NOT XGP
1399 ANDI E,PMRCM ;E := PHYS PAGE NO
1408 PUSHJ P,UFLS ;WAIT FOR XGP TO CLEAR
1411 .ELSE PUSHJ P,UPLC ;FIND PAGE IF DIDN'T ALREADY
1412 JUMPE U,UPGRT8 ;SYS JOB, NO SWAPPING NOR MMP ENTRY
1415 JRST UPRABS ;ABSOLUTE PAGE
1416 JUMPE B,RHUSRA ;DOESNT REALLY HAVE PG
1419 ADD D,MMPEAD ;D HAS MMP ADDRESS
1420 UPGRTA: MOVSI T,MMPTMP
1422 JRST UPGRTW ;WAIT FOR PAGE TO TRANSIT BUT UNLOCK SWITCHES
1423 MOVNI I,1 ;ASSUME NO DISK SPACE
1424 HLRZ A,1(D) ;SEE IF DISK SPACE ASSIGNED
1427 PUSHJ P,QTLOCK ;LOCK APPRO TUT
1428 UPGRT5: POP P,T ;POINTER TO ORIG MAP ENTRY OF USER
1429 MOVE H,(T) ;SAVE MAP WORD FOR DEBUGGING
1430 LDB TT,T ;IF PROT BITS=0 PAGE IS SWAPPED OUT FOR PURPOSES
1431 MOVEI E,0 ;OF USER'S SWAP OUT COUNT, EVEN IF IN CORE
1432 DPB E,T ;CLEAR USER MAP ENTRY
1433 TRCN TT,600000 ;IS USER MAPPED TO PAGE?
1435 MOVSI E,MMPWRT ;YES, CHECK IF ACCESS BITS = RW
1437 IORM E,(D) ;PAGE WRITTEN BY USER WHO HAS DETACHED IT
1438 ANDI TT,PMRCM ;MASK TO MEM PAGE #
1440 JRST 4,. ;PTW POINTED TO WRONG PAGE
1441 MOVSI E,MMPOUT+MMPTMP
1443 JRST 4,. ;PAGE NOT IN, IN MMP
1444 IFE SWPWSP, SOS MMSWP(J) ;ONE LESS USER POINTING AT PAGE
1446 HRRZ E,MMSWP(TT) ;DECREASE THIS USER'S WORKING SET
1452 JUMPE E,UPGRTB ;JUMP IF NO OTHER SHARERS, FOR SPEED AND NO ZERODIVIDE
1453 PUSH P,C ;ADJUST OTHER SHARER'S WORKING SETS
1460 PUSHJ P,UCPRL7 ;CLOBBERS H ALSO C,T,U,I
1469 ;RETURNING A PAGE TO WHICH USER IS NOT CURRENTLY MAPPED (MAY BE IN OR OUT)
1470 UPGRT9: SOS NSWPGS(U)
1471 SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
1472 JUMPGE C,UPGRT4 ;NO MEM IN CP S, PAGE REALLY SWAPPED OUT
1473 ;RETURNING A PAGE WHICH IS SWAPPED IN
1474 UPGRTB: HLRE E,MMSWP(J) ;GET # EXEC PGS POINTING TO THIS
1475 JUMPL E,[JRST 4,.] ;<0 EXEC PAGES
1476 JUMPE E,UPGRT4 ;NO EXEC PGS POINTING TO THIS
1479 MOVSI T,-NEXPGS ;LOOK FOR EXEC PGS SET UP TO PNT
1480 MOVE E,[442200,,EXEUMP] ;TO USER PAGE FLUSHED
1487 UPGRT2: AOBJN T,UPGRT3
1491 PUSHJ P,E.SPRT ;SEE IF E&S HAS IT
1495 TDNE T,MMSWP(TT) ;FLUSH XGP TIE DOWNS AND RETURN
1499 UPGRT4: LDB T,Q ;DELINK CIRC PNTR
1502 DPB T,Q ;CLOBBER CIRC P
1504 SOS SNMPGS ;SYSTEM HAS 1 LESS PAGE
1507 JRST MMPRTN ;RETURN MMP ENTRY SINCE PAGE NO LONGER IN USE
1510 JRST MMPRT5 ;FLUSH REAL MEM
1517 RHUSR1: LDB A,[121100,,HUSRAD(U)] ;COMP HUSRAD AFTER RETURNING PAGE
1522 JUMPN B,CPOPJ ;FOUND ACTIVE PAGE
1523 MOVNI C,2000 ;KEEP LOOKING
1527 UPGRT8: SOS NMPGS ;RETURNING PAGE FROM SYS JOB
1529 DPB A,[121100,,HUSRAD(U)] ;NORMAL METHOD OF COMPUTING HUSRAD WON'T WORK
1530 MOVNI I,1 ;NO DISK SPACE
1531 MMPRT5: SKIPE MMSWP(A) ;MAKE SURE NO ONE (EXEC OR USER) IS POINTING AT PAGE
1533 PUSHJ P,CMEMR ;HAS REAL MEM, CIRC LENGTH =3 SO FLUSH MEM
1539 LDB E,[.BP <PMRCM-377> B] ;GET MOBY #
1543 PUSHJ P,T11DL ;DELETE PAGE REF TO TEN11 MAP
1552 E.SPRT: CAME U,DISUSR ;IS HE USING THE DISPLAY?
1553 POPJ P, ;NO, DON'T UNTIE ANYTHING
1555 MOVE T,TT ;FOR E.SPCH
1556 PUSHJ P,E.SPCH ;LOOK IN E&S TABLES
1557 SKIPA ;FOUND, INDEX IN H
1558 JRST E.SPR2 ;NOT FOUND, DO NOTHING
1560 ADDM T,MMSWP(TT) ;SOS COUNT
1561 SETZM DISSWP(H) ;CLEAR DISPLAY MMSWP TABLE
1562 AOS E.SNUT ;COUNT FOR UNTIES
1567 XCT EXPFT(T) ;MAYBE XFERR TO ROUTINE TO DO SOMETHING ABOUT THIS
1568 JRST UPGRT6 ;NOT USER CONCERNED ABOUT (THERE HAD BETTER BE ANOTHER)
1570 DPB J,E ;CLEAR OUT EXEC PAGE ENTRY
1573 UPGRT6: CONO PI,UTCON
1576 ;WAIT FOR PAGE TO TRANSIT, WITH CIRPSW FREE (IN CASE SWAP READ ERROR!)
1577 ;COME HERE WITH T/MMPTMP,, D/MMP.ENTRY.ADDR
1583 PUSHJ P,UFLS ;WAIT FOR ACTIVE PAGE TO SETTLE DOWN
1584 CAIE U,LUBLK ;SKIP IF CORE JOB
1585 JRST UUOTROLL ;AS IF PCLSR'ED OUT OF WAIT FOR PAGE & CAME BACK
1586 SETOM CORUPU ;REQUEST FOR THIS USER NOT SATISFIED
1587 MOVE P,USRPDL+LUBLK ;CLEAN UP AND RE INIT CORE JOB
1593 IFN 340P, REPEAT 2+N340PB, PUSHJ P,DISACR
1594 REPEAT 2,JFCL ;CORJF, CORJT
1595 IFN VIDP, REPEAT 2,PUSHJ P,SCNACR
1596 IFN TEN11P, JRST 4,. ;TEN-11 CONTROL PAGE
1598 IFN ECCMEM, JRST 4,. ;ECCPG
1599 IFN XGP, REPEAT 3,JRST 4,.
1600 IFN N11TYS, REPEAT NTTPG+NTVBP,JRST 4,.
1601 IFN CHAOSP, IFN T11CHP, JRST 4,.
1602 REPEAT NMMP,JRST 4,. ;MMP
1603 IFN .-EXPFT-NEXPGS, .ERR LOSE AT EXPFT
1604 \f;CIRCULAR MEM LIST HACKER
1605 ;CALL WITH Q CONTAINING BYTE POINTER TO CIRC PNTR IN LIST TO BE HACKED
1606 ;THE BYTE POINTER MUST POINT AT A UPGCP ENTRY (RATHER THAN MEMPNT OR MMP)
1607 ;OR THIS CODE WILL LOOP FOREVER.
1608 ;RETN BYTE PNTR IN B TO GUY WHO PNTS TO THAT PNTR
1609 ;COUNT FOR ENTRIES IN C (RH)
1610 ; 4.9 C SAYS ACTUAL MEM IN LOOP
1611 ;RETN IN D MMP INDEX
1612 ;RETURN MEM PAGE IF ANY IN J
1616 LDB J,Q ;PICK UP STARTING C. P.
1620 CHACK1: JUMPE B,[JRST 4,.]
1622 CAIE J,-1 ;SKIP ON ABS PAGE
1624 JRST 4,. ;CIRC CHAIN TOO LONG?
1626 JRST CHACK3 ;MEMPNT OR MMP PNTR
1627 LDB I,[1000,,J] ;PG #
1628 LDB H,[101100,,J] ;USER #
1632 JRST 4,. ;POINTER TO NON-EXISTENT USER
1640 JRST CHACK2 ;FOUND ENTRY WHICH PNTS AT ORIGINAL ENTRY
1643 JRST CHACK1 ;KEEP LOOKING
1646 JUMPL D,[JRST 4,.] ;NO MMP ENTRY ?
1649 CHACK3: TRZE J,200000
1650 JRST CHACK4 ;ACTUAL CORE
1652 JRST 4,. ;GARBAGE POINTER
1653 MOVSI B,2200 ;MMP ENTRY
1656 JUMPGE D,[JRST 4,.] ;MORE THAN 1 MMP ENTRY
1661 CHACK4: TLOE C,400000
1662 JRST 4,. ;PAGES IS IN TWO PLACES IN CORE
1664 JRST 4,. ;GARBAGE POINTER
1665 MOVE A,J ;SAVE MEMBLT INDEX
1672 ;LOOK UP PAGE IN USER MAP
1673 ;USER IN U, VIR PG # IN A
1674 ;GET PNTR TO MAP HW IN T, TO CIRC IN Q
1678 JRST 4,. ;BAD VIRTUAL PAGE NUMBER
1691 ;FREE THE MMP ENTRY D POINTS AT, SOSING TUT IF DISK SPACE ASSIGNED.
1692 ;I HAS DSK #, C HAS WHAT CHACK RETURNED IN C, A HAS TRACK #.
1693 ;TUT MUST BE LOCKED ALREADY. CIRPSW AND MEMFRZ SHOULD BE LOCKED.
1694 ;EXIT TO MMPRT4 OR RHUSRA
1696 MMPRTN: MOVEM C,MMPRTC ;SAVE IN CASE OF BUG HALT LATER
1697 JUMPL I,MMPRT3 ;NO DISK SPACE ASSIGNED
1701 JRST 4,. ;WRITING WRONG DISK
1702 MOVE H,D ;H SAVES POINTER TO MMP ENTRY
1703 MOVE D,A ;D GETS DISK TRACK NUMBER
1706 SOJL B,[JRST 4,.] ;DETECT OVER-SOS
1708 EXCH D,H ;D GETS MMP PNTR, H GETS TUT BYTE PNTR
1715 MMPRT2: MOVE T,DCHBT(I)
1717 MOVE A,(D) ;ELSE DELETE MMP ENTRY NOW
1719 JUMPN B,MMPRT0 ;IF PG IS IN FILE, AND SWAPPED IN, MAYBE WRITE OUT.
1722 HLRZ A,1(D) ;ALSO REMOVE FROM SHAREABLE PAGE TABLE
1734 JUMPL C,MMPRT3 ;WAS MEM IN LOOP SO NOT SWAPPED OUT FOR SYSTEM'S COUNT
1735 SOS NPGSWO ;IT WAS SWAPPED OUT
1736 MMPRT3: PUSHJ P,MMPRT1
1737 SOS MMPCNT ;1 LESS IN USE
1738 AOS MMPFR ;1 MORE FREE
1741 ;FLUSHING AN MMP ENTRY FOR A PAGE SHARED WITH A FILE WHICH IS CURRENTLY IN CORE.
1742 ;WE MAY WANT THIS PAGE AGAIN, SO TRY TO KEEP IT AROUND FOR A WHILE.
1743 ;BUT IF PAGE HAS BEEN MODIFIED, IMMEDIATELY SWAP IT OUT SO FILE GETS UPDATED.
1746 LDB C,H ;UN-SOS THE TUT
1747 CAIGE C,TUTMNY ;DON'T OVER-AOS
1753 SKIPE C,LLOOSP ;ADD TO TAIL OF LOOSE PAGE LIST
1754 DPB J,[MLO,,MEMBLT(C)]
1761 PUSH P,U ;PAGE WAS MODIFIED, SWAP IT OUT RIGHT AWAY
1762 CONO PI,CLKOFF ;CALL SWAPPER AT IMITATION CLOCK LEVEL
1765 AOS CIRPSW ;SWOP1A WILL SOS IT BEFORE RETURNING
1766 PUSHJ P,SWOP1A ;WILL RETURN THE MMP ENTRY SINCE NO USERS ARE LINKED TO IT
1767 JRST 4,. ;EXEC PAGES STILL POINT TO PAGE, ALTHOUGH UPGRTN FLUSHED THEM
1772 ;HERE TO RETURN AN MMP ENTRY AND SOS THE TUT, AT P.I. LEVEL
1773 ;IF TUT OR CIRPSW IS LOCKED, PUTS ON MMPFS2 AND WAKES UP CORE JOB
1774 ;OTHERWISE, CLEARS OUT AND PUTS ON MMPFS
1775 ;A -> MMP ENTRY, CLOBBERS B,D,E,I
1781 JRST RETMM1 ;CAN'T SET LOCKS, LET CORE JOB DO IT
1783 PUSHJ P,TUTPNT ;SOS THE TUT
1788 MOVE E,QTUTO(I) ;RETURNING BLOCK TO FREE, AOS APPROPRIATE FREE COUNT
1793 RETMM7: MOVSI D,MMPSHR
1796 HLRZ D,1(A) ;REMOVE FROM SHAREABLE PAGE HASH TABLE
1802 JUMPE D,[JRST 4,.] ;NOT IN TABLE OR MIS-HASHED?
1810 MMPRT1: EXCH D,MMPFS ;ADD THIS ENTRY ONTO THE FRONT OF
1811 MOVE A,MMPFS ;THE LIST OF AVAILABLE MMP ENTRIES
1812 MOVEM D,(A) ;CLEAR LH OF FIRST WORD OF ENTRY
1813 SETZM 1(A) ;CLEAR SECOND WORD OF ENTRY
1816 RETMM1: MOVE D,A ;ADD THIS ENTRY TO LIST OF ONES TO HACK LATER
1818 HRRM D,(A) ;ONLY CLOBBER THE CIRC PNTR, WHICH POINTS TO SELF
1820 AOS NCORRQ ;LIST WAS EMPTY, AWAKEN CORE JOB
1823 ;CORE JOB COMES HERE WHEN MMPFS2 IS NON-ZERO
1832 RETMM4: MOVEI A,0 ;HERE, WITH CIRPSW LOCKED, TO FINISH RETURNING MMP ENTRIES
1834 RETMM3: JUMPE A,CPOPJ
1843 ;GET AN MMP ENTRY, RET. IDX IN R, ADDR IN TT.
1844 ;CLEARS BOTH WDS OF MMP ENTRY. CLOBBERS NO ACS.
1845 ;SKIPS IF SUCCESSFUL. DOESN'T SKIP IF NO LOW CORE FOR NEW MMP PAGE.
1846 ;YOU BETTER ALREADY HAVE COMMITTED THE MMP ENTRY VIA SOSGE MMPFR
1848 GMMPP: HRRZ TT,MMPFS
1849 JUMPE TT,GMMP1 ;FREE LIST IS EMPTY
1851 JRST 4,. ;IDX GOT ON FREE LIST; SHOULD BE ADDR
1858 AOS MMPCNT ;1 MORE MMP ENTRY IN USE.
1863 PUSH P,A ;PROTECT ACS CLOBBERED BY RETMM4
1880 GMMP4: PUSH P,A ;CREATE ANOTHER PAGE-FULL OF MMP ENTRIES
1884 ;JRST IOMQ ;ALLOCATE LOW CORE SO GETS DUMPED WITH CRASHES
1885 JRST NMMRQ ;IOMQ LOSES BECAUSE WE GET CALLED WITH MEMFRZ LOCKED
1886 ;NMMRQ ISN'T QUITE RIGHT, BECAUSE OF NCBCOM. FIX LATER. ---
1887 JRST GMMP3 ;NO LOW CORE AVAIL NOW
1889 DPB B,[MUR,,MEMBLT(A)]
1891 ADDM B,MMPMX ;INCREMENT MAX ALLOWABLE ADDR OF MMP
1894 JRST 4,. ;SOMEONE DIDN'T CHECK MMPFR?
1897 DPB A,MMPPPP-1(B) ;PUT NEW MMP PAGE INTO EXEC MAP
1903 GMMP2: MOVEI D,MMP(B) ;PUT ALL ENTRIES IN PAGE ON THE FREE LIST
1917 ;HERE IF TRANSIENT CONDITION PREVENTS GRABBING PAGE RIGHT NOW
1919 CORS18: MOVE T,LSWPR+LUBLK
1922 PUSHJ P,LSWPOP ;MEMFRZ
1928 ;GROW A JOB'S CONTIGUOUS MEMORY. USED ONLY FOR SYSTEM JOB THESE DAYS.
1932 SKIPL XGPUSR ;AVOID EXPANDING INTO XGP PAGE.
1935 LDB J,[121100,,HUSRAD(U)]
1936 LDB E,[MUR,,MEMBLT(J)]
1938 JRST COSFR ;FREE PAGE, TAKE IT.
1941 JRST CORS18 ;WAIT UNTIL IT STABILIZES
1943 JRST CORS18 ;WAIT UNTIL IT GETS WHERE IT'S GOING
1944 CAIE E,MURUSR ;USER PAGE, SHUFFLE IT AWAY.
1945 JRST 4,. ;SHOULDN'T HAVE TO SHUFFLE SYSTEM PAGES.
1947 ;SHUFFLE A USER PAGE
1948 CORS4: PUSHJ P,TCALL
1949 JRST HMEMRQ ;GET FREE PAGE TO SHUFFLE IT INTO
1950 JRST 4,. ;THERE OUGHT TO BE ONE
1954 ;Shuffle user page in J into page in A
1955 ;Clobbers C,D,E,H,I,Q,U,T
1958 JRST 4,. ;BLOCK IS ON SWAP OUT LIST (??)
1960 PUSHJ P,CORS6 ;SHUFFLING A POSSIBLY LOOSE PAGE, FIX POINTERS
1961 SETOM DLSRCH ;CAN'T BE BEING SWAPPED OUT ETC BECAUSE SWAPOUT
1962 PUSHJ P,UCPRL7 ;BLOCKS HAVE MUR=MU23B, AND CIRPSW IS SIEZED
1963 SETZ CORSTU ;STOP DIRECT TO MEM DEVICES AND FIX USER MAPS
1964 TLC C,200 ;CHANGE TO 20 BIT BYTE
1965 DPB D,C ;RELOCATE PTR TO MEMPNT ENTRY
1966 PUSHJ P,CMOVE1 ;MOVE CONTENTS OF BLOCK
1968 MOVE T,[442200,,EXEUMP]
1969 PUSHJ P,CORPS1 ;FIX ANY EXEC PAGE MAP PNTRS TO THIS PAGE
1971 SETZ DEVSTR ;RESTART DIRECT TO MEM DEVICES
1972 SETZM DLSRCH ;MAPS ARE CONSISTENT AGAIN, LET USERS RUN
1975 CORSTU: PUSHJ P,DEVSTP ;STOP DIRECT-TO-MEM DEVICES
1976 MOVE A,I ;COMPUTE USER'S MAP ENTRY LOCN
1980 POPJ P, ;PAGE SWAPPED IN BUT NOT YET LINKED UP
1984 TLC T,2200#<PMRCAD&7700> ;CHANGE TO ADDRESS REAL CORE ADR FIELD
1985 DPB D,T ;RELOCATE USER'S MAP
1990 CBMRT: MOVEM J,SJSPG ;SAVE PAGE # RESERVED
1993 ;CORE SHUFFLER, TO KEEP LOW MEMORY FREE
1999 PUSHJ P,LSWPOP ;MEMFRZ
2002 CFLM2: MOVEI J,LIOBLK ;Scan through "low" memory
2003 SKIPE MEMHPT ;Make sure there is likely to be free high mem
2005 AOS SWPOPR ;Kick swapper more than kicked already
2006 POPJ P, ;And give up
2010 CAIL J,256. ;Assume USEMDM is always on (safe assumption)
2011 POPJ P, ;All done, couldn't find anything
2012 CFLM4: LDB A,[MUR,,MEMBLT(J)]
2016 JRST HMEMRQ ;Get free page to shuffle it into
2017 POPJ P, ;No memory free, give up for now
2018 PUSHJ P,CORS5 ;Shuffle page into new memory
2019 MOVE A,J ;Free old page
2024 POPJ P, ;Freed sufficient low pages, stop now
2026 ;STOP DIRECT TO MEM DEVICES
2030 CAMN U,SCNUSR ;STOP DIRECT MEM DEVICES
2031 PUSHJ P,SCNSTC ;STOP DIRECT VIDI INPUT
2034 CAMN U,DISUSR ;STOP DISPLAY IF THIS GUY HAS IT
2039 ;RESTART DIRECT TO MEM DEVICES
2041 DEVSTR: CLRPGM +LUBLK ;CLEAR PAGE MAP ASSOC REGS IN HARDWARE
2043 CAMN U,SCNUSR ;RESTART DIRECT MEM DEVICES
2044 PUSHJ P,SCNRST ;RESTART DIRECT VIDI INPUT
2048 PUSHJ P,DCRRST ;RESTART DISPLAY
2052 ;HERE TO RELOCATE EXEC PAGES WHICH POINT TO PAGE IN J
2056 TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE FIELD TO ADDRESS REAL CORE ADR
2060 AOS I ;COUNT # OF EXEC PGS POINTING TO THIS ONE
2061 DPB D,T ;RELOCATE EXEC PG PNTR
2062 CORPS3: TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE BACK TO 22
2065 CAMN T,I ;CHECK COUNT OF EXEC PAGES
2066 POPJ P, ;COUNTED CORRECTLY, WIN
2068 IFN E.SP,[ ;SEE IF E&S CAN ACCOUNT FOR SOME PAGES
2069 MOVSI Q,-MXDISP ;SET UP INDEX
2070 CAMN J,DISSWP(Q) ;J/ OLD INDEX, D/ NEW
2071 AOJA I,E.SX2 ;COUNT I IF FOUND, AND RECHECK COUNT
2072 AOBJN Q,.-2 ;ELSE CONTINUE SEARCH
2073 JRST 4,. ;NOT FOUND, BOMB
2074 E.SX2: MOVEM D,DISSWP(Q) ;RELOCATE PAGE
2075 AOS E.SREL ;# PAGES RELOCATED (FOR DEBUGGING)
2076 CAMN T,I ;SKIP IF COUNT IS STILL BAD
2077 POPJ P, ;E&S COUNT WAS CULPRIT -- HAPPY AGAIN
2089 JRST 4,. ;EXEC PGS COUNT OFF
2091 CORS6: MOVE T,FLOOSP ;FIX POINTERS TO LOOSE PAGE BEING SHUFFLED
2094 LDB T,[MLO,,MEMBLT(C)]
2097 DPB D,[MLO,,MEMBLT(C)]
2098 CORS8: CAMN J,FLOOSP
2104 ;RUN AROUND CIRC LIST STRUCTURE
2105 ;WORD AFTER CALL IS POINTER TO ROUTINE TO BE CALLED FOR EACH ITEM IN LIST ACCORDING
2106 ;TO FLAGS IN LH: 4.9 USER PAGE (U=USER,I=PG#), 4.8 MMP (T=IDX), 4.7 MEMPNT (T=PG#)
2107 ;CALLED ROUTINE MUSTN'T CLOBBER C,H; NOR U,I IF A USER PAGE; NOR T IF MEMPNT.
2108 ;RETURNS IN C BYTE POINTER TO PLACE THAT POINTS TO
2109 ;STARTING BYTE POINTER THAT WAS IN C
2111 ; UCPRL - STARTING BYTE POINTER IN C
2112 ; UCPRL4 - STARTING CORE PAGE # IN D
2113 ; UCPRL7 - STARTING CORE PAGE # IN J
2114 ;PDL DEEPENED BY TWO PUSH'S AND TWO PUSHJ'S.
2115 ;---WARNING--- : CLOBBERS U ------- ALSO CLOBBERS H,T,I
2117 UCPRL7: SKIPA C,[2200,,MEMPNT(J)]
2118 UCPRL4: MOVE C,[2200,,MEMPNT(D)]
2126 UCPRL2: CAMN C,-1(P)
2133 LDB I,[1000,,T] ;PAGE #
2134 LDB U,[101100,,T] ;USER #
2148 UCPRL1: TRZE T,200000
2151 JRST 4,. ;MMP ADR OUT OF RANGE
2159 UCPRL3: CAIL T,TSYSM
2160 JRST 4,. ;MEMBLT ADR OUT OF RANGE
2161 TLNE H,100000 ;MEMPNT
2163 MOVE C,[2200,,MEMPNT]
2170 \f;DISCARD IDLE DISK UFD'S.
2178 ;FLUSH "UTAPE" (200-WD) BUFFERS
2179 ;TRY TO COMPACTIFY INTO FEWER PAGES BY DELETING PAGES CONTAINING
2180 ;ONLY FREE ONES AND BY MOVING NETWORK BUFFERS AROUND. OTHER KINDS
2181 ;OF BUFFERS DON'T STAY AROUND VERY LONG AND ARE HARD TO MOVE
2182 ;WITHOUT INTRODUCING TIMING/PCLSR'ING BUGS.
2187 UTBFF3: LDB R,[MUR,,MEMBLT(J)]
2193 IFN CHAOSP, PUSHJ P,CHCLN ;ALSO, CLEAN UP CHAOS NET BUFFERS
2194 IFN INETP, PUSHJ P,PKBCLN ; Clean up network packet buffers
2195 ;SWAP OUT ALL LOOSE PAGES. THE REASON THIS IS DONE IS THAT IF THE
2196 ;SYSTEM LOAD IS LIGHT LOOSE PAGES FOR DELETED INQUIR DATA BASE FILES
2197 ;CAN STAY AROUND INDEFINITELY, TYING UP DISK SPACE.
2198 ;SWAPPING OUT LOOSE PAGES DOES NOT CAUSE ANY DISK I/O.
2199 ;SWPOPG MAY NON-SKIP RETURN IF CIRPSW OR A TUT IS LOCKED,
2200 ;IN WHICH CASE WE GIVE UP UNTIL THE NEXT 2-MINUTE CLOCK.
2201 UTBFF6: CONO PI,CLKOFF
2202 SKIPN A,FLOOSP ;GET A LOOSE PAGE
2205 PUSHJ P,SWPOPL ;SWAP OUT EVEN IF LOCKED (SHOULDN'T BE)
2206 JRST UTBFF7 ;COULDN'T SWAP OUT, GIVE UP FOR NOW
2207 CONO PI,CLKON ;ALLOW CHANCE FOR AN INTERRUPT
2210 UTBFF7: CONO PI,CLKON
2213 ;RH(J) HAS PAGE NUMBER OF A BLOCK OF 200-WD BUFFERS
2214 UTBFF2: LDB R,[MNUMB,,MEMBLT(J)] ;GET LIST OF IOBFT ENTRIES IN THIS BLOCK
2216 COSIO1: MOVSI E,200000 ;ALLOC INH ALL BUFFERS IN BLOCK
2218 LDB E,[IOCH,,IOBFT(R)]
2220 AOS Q ;COUNT NUMBER USED FOR SOMETHING
2222 CAIL E,NFNETC+NNETCH
2224 AOS TT ;COUNT NUMBER USED FOR NETWORK
2225 LDB R,[IOLC,,IOBFT(R)]
2228 JUMPE Q,COSIO3 ;IF ALL BUFFERS FREE, FLUSH THIS PAGE
2230 JRST UTBFF1 ;CONTAINS NON-NET BUFFERS, LEAVE ALONE
2233 CAIL E,8 ;IF THERE ARE ENOUGH FREE IN OTHER BLOCKS
2234 JRST CISHUF ;THEN GO SHUFFLE THE NET BUFFERS
2236 UTBFF1: LDB R,[MNUMB,,MEMBLT(J)] ;ABANDON IDEA OF FLUSHING THIS BLOCK
2237 MOVSI E,200000 ;UN-INHIBIT THE BUFFERS..
2238 UTBFF4: ANDCAM E,IOBFT(R)
2239 LDB R,[IOLC,,IOBFT(R)]
2242 POPJ P, ;RETURN OUT OF UTBFF2
2244 ;COME HERE WITH UTTBF SET TO 0 AND OLD VALUE IN E
2245 ;LEAVE UTTBF 0 WHILE SHUFFLING SO NO ONE ELSE CAN ALLOCATE
2248 LDB R,[MNUMB,,MEMBLT(J)]
2249 CISHF1: LDB Q,[IOCH,,IOBFT(R)]
2251 JRST CISHF2 ;FREE, IGNORE
2253 CAILE Q,NFNETC+NNETCH
2254 JRST 4,. ;SOME RANDOM UNSHUFFABLE BUFFER
2256 CISHF2: LDB R,[IOLC,,IOBFT(R)]
2259 POP P,UTTBF ;ALLOW ALLOC AGAIN. THIS MEM BLOCK NOW
2260 ;CONTAINS 8 FREE, ALLOC INH BUFFERS.
2261 ;SO FALL INTO COSIO3 TO FLUSH THEM.
2262 ;FLUSH ALL 8 BUFFERS.
2264 COSIO3: LDB R,[MNUMB,,MEMBLT(J)]
2266 COSIO4: LDB Q,[IOCH,,IOBFT(R)]
2268 JRST 4,. ;BUFFER WAS SUPPOSED TO BE FREE??
2269 MOVEI Q,UTFS-IOBFT ;PNTR TO F.S. LIST
2270 SOS UTTBF ;SOON WILL BE ONE LESS FREE UTAPE BUFFER
2272 COSIO5: MOVE E,Q ;REMOVE IOBFT ENTRY IN R FROM F.S. LIST
2273 LDB Q,[IOLO,,IOBFT(Q)]
2275 JRST 4,. ;IT WASN'T IN THE LIST
2279 LDB Q,[IOLO,,IOBFT(R)]
2280 DPB Q,[IOLO,,IOBFT(E)]
2281 MOVE A,R ;GIVE IOBFT ENTRY BACK TO LIST OF UNUSED IOBFTS
2282 LDB R,[IOLC,,IOBFT(R)]
2288 JUMPN TT,[JRST 4,.] ;BLOCK DIDN'T CONTAIN 8 BUFFERS
2291 CAMGE A,[-NUTIC-NUTOC]
2294 HRRZ A,J ;THIS BLOCK OF MEMORY IS FREE NOW
2295 JRST CMEMR ;AND RETURN OUT OF UTBFF2
2297 ;EXCHANGE BUFFER IN R WITH SOME FREE BUFFER, RETURNED IN A
2298 ;CALL WITH UCTOFF, CHANNEL NUMBER IN Q, TURNS UTCON
2300 COSIMG: MOVEI D,NFNETC(Q) ;CHNL NO TO CONS FOR
2301 AOS UTTBF ;UNRESERVE ONE BUFFER MOMENTARILY
2305 LDB TT,[IOSA1,,IOBFT(R)] ;TRANSFER BUFFER R TO BUFFER A
2306 LDB T,[IOSA1,,IOBFT(A)]
2313 PUSHJ P,IBRTN ;RETURN THE OLD BUFFER
2314 SOS UTTBF ;BUT RESERVE IT
2318 ;SHUFFLE OFF A NCP NETWORK BUFFER
2319 ;R HAS IOBFT INDEX, Q HAS CHANNEL NUMBER, E MUST BE PRESERVED
2324 SUBI Q,NFNETC ;GET IMSOC INDEX
2325 HRRZ A,IMSOC1(Q) ;USER WHO OWNS THIS BUFFER
2327 TDNE T,IMSOC1(Q) ;SKIP OVER USER STOP IF BEING CLOSED
2328 TROA A,-1 ; SINCE USER CAN'T REFERENCE BUFFER ANY MORE
2329 PUSHJ P,RPCLSR ;AND LEAVE A=USER # STOPPED OR 0,,-1 IF NONE
2330 MOVSI T,200000 ;MUSTN'T BE ACTIVE AT PI LEVEL
2333 SKIPN IMSOC6(Q) ;LWAIT RETURNS WITH NETOFF
2334 JRST CINET2 ;BUFFER HAS BEEN RETURNED
2335 MOVSI T,400000 ;LOCK THE BUFFER SO PI LEVEL WON'T TOUCH
2337 LDB T,[221000,,IMSOC6(Q)]
2339 JRST 4,. ;IOBFT ENTRY POINTS TO WRONG CHANNEL
2340 PUSH P,A ;SAVE INDEX OF STOPPED USER
2341 PUSHJ P,COSIMG ;COPY BUFFER
2342 LDB TT,[IOSA,,IOBFT(A)]
2346 SUB T,D ;OFFSET NEW BUFFER MINUS OLD
2348 DPB TT,[003200,,IMSOC6(Q)] ;STORE NEW BUFFER ADDR, LEAVE FLAGS ALONE
2349 ADDM T,IMSBFE(Q) ;RELOCATE VARIOUS POINTERS
2358 TLNN TT,100000 ;SKIP IF INPUT OCCURRED WITH BUFFER LOCKED
2361 MOVE TT,IMPSVP ;RESTART INPUT
2365 IFN DMI,CONO FI,FIIN+NETCHN*11
2366 CINET1: MOVSI TT,500000 ;UNLOCK THE BUFFER, CLEAR INPUT WITH LOCK FLAG
2368 PUSHJ P,IMPIOS ;RESTART OUTPUT
2369 POP P,A ;AND FALL INTO CINET2 TO RESTART USER
2370 CINET2: CONO PI,NETON
2371 JRST NJUPCL ;RESTART USER IF ONE WAS STOPPED
2374 ;FREE BLOCKS THAT BECAME FREE AT INT LEVEL.
2375 ACMTC: SKIPN MEMFP1 ;ANY BLKS BECAME FREE AT INT LVL?
2378 SKIPL MEMFRZ ;IF MEMFRZ IS LOCKED, CAN'T DO THIS. JUST
2379 JRST UTCONJ ;HOPE ENOUGH CORE IS FREE. MUST BE BETTER WAY!
2380 MOVE A,MEMFP1 ;GET # OF ONE OF THEM,
2381 LDB B,[MLO,,MEMBLT(A)] ;REMOVE IT FROM LIST OF SUCH BLOCKS
2383 LDB B,[MUR,,MEMBLT(A)]
2389 ;COPY A PHYSICAL PAGE'S DATA FROM PAGE (J) TO PAGE (D)
2390 CMOVE1: MOVE C,MEMBLT(J)
2403 DPB D,[.CORJT+EXEUMP]
2404 DPB J,[.CORJF+EXEUMP]
2408 MOVE A,[400000+CORJF*2000,,400000+CORJT*2000]
2409 BLT A,400000+CORJT*2000+1777
2411 DPB A,[.CORJT+EXEUMP]
2412 DPB A,[.CORJF+EXEUMP]
2415 MEMMF: LDB A,[MUR,,MEMBLT(D)]
2425 ADDI T,15. ;SLEEP 1/2 SEC. (REALLY SHOULD DO A LOW
2426 CAMLE T,TIME ;PRIORITY UNBLOCK IF SYS LIGHTLY LOADED)
2427 UDELA1: PUSHJ P,UFLS
2431 CAIGE A,SYSB ;CORE ZEROER
2434 DPB A,[.CORJT+EXEUMP]
2436 CLEARM 400000+CORJT*2000
2437 MOVE A,[400000+CORJT*2000,,400000+CORJT*2000+1]
2438 BLT A,400000+CORJT*2000+1777
2440 DPB A,[.CORJT+EXEUMP]
2443 ;ROUTINES TO ALLOCATE BLOCKS OF MEMORY
2444 ;CALL ONLY AT UTC LEVEL OR WITH UTC OFF
2446 OVHMTR ALC ;CORE ALLOCATION
2448 ;SEE IF CAN ALLOCATE MEMORY
2449 MQTEST: MOVE A,MEMFR
2457 ;ALLOCATE PREFERRING HIGH MEMORY, FOR RANDOM USER PAGE. SHUFFLEABLE PAGE OK.
2458 HMRQC: PUSHJ P,MQTEST
2462 HRREI B,MEMHPT-MEMBLT
2463 HMRQ3: LDB A,[MLO,,MEMBLT(B)]
2464 JUMPE A,HMRQ1 ;HIGH HALF FULL TRY LOW
2465 CAIL A,SYSB ;DON'T ALLOCATE PART OF THE SYSTEM
2466 SKIPGE MEMBLT(A) ;DON'T ALLOCATE IF LOCKED
2467 SKIPA B,A ;THIS PAGE NOT AVAIL, TRY NEXT
2468 JRST IMRQ8 ;GOBBLE IT
2473 JRST NMMRQ ;THAT DIDNT WORK, TRY LOW HALF
2475 ;ALLOCATE A BLOCK OF MEM FOR 200-WORD BUFFERS
2478 POPJ P, ;NOT ENOUGH ROOM IM IOBFT
2484 ;GET A BLOCK THAT WON'T BE SHUFFLED, AND IS DIRECTLY ACCESSIBLE.
2485 IOMQ: PUSHJ P,MQTEST ;GET LOW OR MEDIUM MEMORY FOR I/O
2489 NMMRQ: MOVEI A,0 ;MEMFP = MEMBLT+0
2493 IMRQ2: LDB A,[MLO,,MEMBLT(A)]
2500 PUSHJ P,QDFLS ;TRY FLUSHING DISK DIRS
2505 IMRQ6: LDB A,[MLO,,MEMBLT(A)]
2506 JUMPE A,IMRQR ;NO MEM AVAIL IN LOW HALF, TAKE NON-SKIP RETURN
2515 IMRQ3: SKIPGE MEMBLT(A)
2516 JRST IMRQ2 ;LOCKED LOOK FOR ANOTHER
2517 IMRQ9: TDZA B,B ;GOBBLE FROM LOW
2518 IMRQ8: MOVNI B,1 ;GOBBLE FROM HIGH
2519 AOS -2(P) ;CAUSE RETURN TO SKIP
2520 LDB E,[MUR,,MEMBLT(A)]
2523 JRST 4,. ;BLOCK GOT PUT ON FREE STORAGE LIST WITHOUT USAGE FIELD GETTING "FREE"
2524 \f;ROUTINES FOR RETURNING MEMORY
2525 IMEMR: PI2SAF ;HERE OTHERWISE (SEE BELOW)
2528 JRST 4,. ;DON'T RETURN PART OF SYSTEM
2531 CIMEMR: PUSH P,B ;ENTER HERE IF OK TO HACK WITH MEM FROZEN
2532 LDB B,[MUR,,MEMBLT(A)] ;I E CALLING FROM CORE ALLOCATOR
2534 JRST 4,. ;ALREADY FREE, LOSSAGE
2535 SETZM MEMBLT(A) ;INITIALIZE RANDOM FIELDS
2536 CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
2537 CAIGE A,LIOBLK ;LOW SHUFFLEABLE GOES ON HIGH LIST
2539 CAIGE A,128. ;LOW NON-SHUFFLEABLE GOES ON LOW LIST
2541 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2542 SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2544 CIMEM0: LDB B,[MLO,,MEMFP] ;PICK UP HEAD OF APPRO FS LIST
2545 DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
2546 CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2547 DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2548 MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2549 DPB B,[MLU,,MEMBLT(A)]
2550 DPB A,[MLO,,MEMFP] ;STORE THIS AS FREE LIST HEAD
2552 CIMEM3: MOVEI B,MUFR
2553 DPB B,[MUR,,MEMBLT(A)] ;STORE FREE IN USER
2558 CIMEM1: LDB B,[MLO,,MEMHPT] ;PICK UP HEAD OF APPRO FS LIST
2559 DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
2560 CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2561 DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2562 MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2563 DPB B,[MLU,,MEMBLT(A)]
2564 DPB A,[MLO,,MEMHPT] ;STORE THIS AS FREE LIST HEAD
2567 IMEMR1: PUSH P,B ;FREE A PAGE WHEN MEMFRZ LOCKED.
2568 MOVE B,MEMFP1 ;ADD IT TO FRONT OF MEMFP1 LIST
2569 DPB B,[MLO,,MEMBLT(A)]
2571 MOVEI B,MUFRT ;THEN SAY THIS BLK BECAME FREE WITH MEM FROZEN.
2572 DPB B,[MUR,,MEMBLT(A)]
2576 ;ROUTINES TO RETURN MEMORY CONTINUED
2578 MGMEMR: PUSHJ P,TMEMR ;MAG TAPE MEMR
2583 LDB B,[MUR,,MEMBLT(A)]
2585 JRST 4,. ;RETURNING BLOCK NOT OF TYPE EXPECTED
2587 AOS (P) ;SKIP OVER ARG
2588 MEMR: CONO PI,UTCOFF
2592 CMEMR: CONO PI,UTCOFF
2596 ; ROUTINES TO UNTHREAD BLOCKS FROM FREE LISTS
2599 MPOUT2: JUMPE A,[JRST 4,.] ;ENTER HERE FROM INITIALIZATION IF HOLE FOUND
2602 CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
2603 CAIGE A,LIOBLK ;LOW NON-SHUFFLEABLE GOES ON HIGH LIST
2605 CAIGE A,128. ;LOW SHUFFLEABLE GOES ON LOW LIST
2607 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2608 SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2609 MPOUT4: SKIPA B,[-1] ;IT'S HIGH MEM
2610 MPOUT3: MOVEI B,0 ;IT'S LOW MEM
2612 IMRQ4: PUSH P,B ;0 LOW -1 HIGH
2613 LDB B,[MLU,,MEMBLT(A)] ;LINK UP
2614 LDB E,[MLO,,MEMBLT(A)] ;LINK OUT
2615 JUMPN B,IMRQ5 ;JUMP IF NOT FIRST IN LIST
2616 JUMPE E,IMRQ5 ;JUMP IF LAST BLOCK IN LIST
2617 LDB B,[MUR,,MEMBLT(E)] ;FIRST AND FOLLOWED
2619 JRST 4,. ;DOESNT LINK TO A FREE BLOCK
2620 MOVEI B,0 ;PUT BACK 0
2621 IMRQ5: SKIPE E ;SKIP IF NO BLOCK FOLLOWS
2622 DPB B,[MLU,,MEMBLT(E)] ;STORE LINK UP OF PATCHED OUT BLOCK IN LINK OUT BLOCK
2624 DPB E,[MLO,,MEMBLT(B)] ;STORE LINK OUT OF PATCHED OUT BLOCK IN LINK UP BLOCK
2625 POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
2628 IMRQ5A: POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
2629 DPB E,[MLO,,MEMFP(B)] ;THIS WAS FIRST IN FREE LIST, ADJUST LIST HEADER
2630 IMRQ5C: SKIPL B ;SKIP IF NOT IN LOW HALF
2631 SOS LMEMFR ;ADJUST FREE BLOCKS IN LOWER HALF
2632 SOS MEMFR ;1 LESS FREE BLOCK IN SYSTEM
2633 SETZM MEMBLT(A) ;CLEAN UP MEMBLT ENTRY FOR CALLER'S SAKE
2634 MOVEI B,MUINP ;IN PROCESS
2635 DPB B,[MUR,,MEMBLT(A)]
2638 OVHMTR UUO ;MORE MISC UUOS ETC.
2640 TCALL: CONO PI,UTCOFF
2648 SUBTTL MEMORY ALLOCATION TABLES
2650 IOBFTL: MXIOB ;BEG FOR GETSYS (MEMORY)
2651 IOBFT: REPEAT MXIOB-1,176000,,.RPCNT+1 ;MAX DYN ALLOC IO BUFFERS
2652 176000,,377 ;4.9 FREEZE
2654 IOCH==340600 ;4.7-4.2 SYS CHN NO 77 => FREE
2655 IOLC==241000 ;4.1-3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
2656 IOLO==1000 ; LINK TO FOLLOWING BUFFER OR
2657 ;SPECIAL STATES LINK OUT
2658 ;-1 LAST BUFFER CURRENTLY FILLED
2660 ;-3 BUFFER ACTIVE AT MAIN PROG LEVEL
2661 ;-4 BUFFER ACTIVE AT PI LEVEL
2662 ;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
2663 ;CHNLS NUTIC+NUTOC+1 (NFCLC)=>$Q+NCLCH-1 ARE CORE LINK DEVICE
2664 ;CHNLS NFNETC => $Q+NNETCH-1 ARE NET CHNLS
2665 SCNCLO==NUTIC+NUTOC+1
2667 IOSA==101400 ; BUFFER SA _-6
2668 IOSA1==111300 ;ONLY RELEVANT BITS FOR 200 WD BUFFERS
2671 IOBFP: 0 ;FREE STG TO IOBFT ENT
2672 IOBFC: MXIOB-8 ;CNT OF AVAIL
2673 ;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
2675 UTFS: 377 ;FREE STG PNTR TO 200 WD BUFFERS
2676 UTTLB: -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
2677 UTTBF: 0 ;TOTAL UT BUFFERS FREE
2681 EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S MAP AREA
2682 EXELMP==UPGMP ;KL10 AND KS10 ALSO NEED EXEC LOWER MAP, + EXISTS
2683 ];IF2 ;SO USERS CAN COPY PAGES FROM THE SYSTEM JOB
2685 ;TABLE OF BYTE POINTERS THAT POINT TO VIDEO BUFFER AREA OF EXEUMP
2687 TTCRT: REPEAT NTVBP,[
2688 CONC [.TTR]\.RPCNT,+EXEUMP
2693 ;DBR FOR REFERENCING PDP6 MEM
2694 PDP6MP: <LPDP6M/2>_1,,PDPUMP
2696 ;PAGE MAP FOR REFERENCING PDP6 MEM
2697 PDPUMP: REPEAT LPDP6M/2,600000+<PDP6BM_-10.>+2*.RPCNT,,600000+<PDP6BM_-10.>+2*.RPCNT+1
2701 DDEXCF: BLOCK NEXPGS ;-1 IF EXEC PAGE SET UP FOR 340
2704 IFN KA10P, EXECMP: 100_1,,EXEUMP ;EXEC DBR
2705 \f;MEMORY ORGANIZATION
2707 ;PAGE 0 ALWAYS BELONGS TO THE SYSTEM AND IS NEVER ALLOCATED OR FREED.
2709 ;N PAGES OF SYSTEM CODE AND VARIABLES ARE ACQUIRED BY THE SYSTEM JOB AT STARTUP.
2711 ;N PAGES OF USER-VARIABLE BLOCKS BELONG TO THE SYSTEM JOB. THESE ARE
2712 ;ALLOCATED AND DEALLOCATED AS REQUIRED. LIOBLK-1 IS THE HIGHEST THIS CAN GO.
2713 ;USER PAGES BELOW LIOBLK CAN BE SHUFFLED OUT WHEN THE SYSTEM JOB NEEDS THE CORE.
2715 ;FROM LIOBLK TO 128K IS THE "LOW HALF." THESE PAGES ARE DIRECTLY ADDRESSABLE
2716 ;IN EXEC MODE AND NEVER NEED TO BE SHUFFLED. I/O BUFFERS, DISK DIRECTORIES,
2717 ;ETC. ARE ALLOCATED IN THESE PAGES.
2719 ;128K TO 128K+NEXPGS ARE PAGES WHICH CAN'T BE ADDRESSED DIRECTLY FROM
2720 ;EXEC MODE BECAUSE THEIR EXEUMP SLOTS ARE USED BY "EXEC PAGES."
2722 ;THE REST OF THE LOW MOBY, UP TO FDDTPG, IS DIRECT-MAPPED AND
2723 ;USED FOR ADDITIONAL "LOW HALF" PAGES.
2725 ;FDDTPG TO 256K CONTAINS DDT AND THE SYSTEM SYMBOL TABLE.
2727 ;PAGES ABOVE 256K ARE IN THE "HIGH MOBY".
2729 ;PAGES NOT IN THE "LOW HALF" (BELOW LIOBLK, SHADOWED BY EXEC, OR HIGH MOBY)
2730 ;ARE CONSIDERED TO BE IN THE "HIGH HALF". USER PAGES PREFER TO GO HERE.
2733 ; IF USEMDM IS OFF, THE DIRECT MAPPED PAGES IN THE HIGH HALF
2734 ; OF THE LOW MOBY ARE CONSIDERED HIGH RATHER THAN LOW. THIS IS USED
2735 ; MOSTLY FOR DEBUGGING, TO CATCH REFERENCES TO RANDOM ADDRESSES.
2736 ; THERE CAN BE HOLES IN MEMORY (NXM).
2738 ;THE MEMBLT TABLE HAS ONE WORD FOR EACH 1K BLOCK OF MEMORY.
2739 ;IT SAYS WHAT THAT BLOCK IS USED FOR AND CONTAINS LINKS TO OTHER
2740 ;BLOCKS AND OTHER TABLES. THE MEMPNT AND MMSWP TABLES ALSO CONTAIN
2741 ;ONE WORD PER BLOCK AND CONTAIN ADDITIONAL INFORMATION.
2743 FDDTPG: 0 ;# OF LOWEST BLOCK USED BY DDT & SYMTAB (SET AT STARTUP)
2745 MEMFR: 0 ;# OF FREE BLOCKS IN ALL OF MEMORY.
2747 LMEMFR: 0 ;# OF FREE BLOCKS IN LOW LIST (MEMFP).
2749 MINCOR: 8 ;TRY TO KEEP THIS MANY PAGES FREE IN LOW MEMORY
2750 ;MUST BE >= 3, SINCE LESSER-PRIORITY CONSUMERS OF
2751 ;MEMORY WAIT IF LMEMFR IS < 3.
2753 MEMFP1: 0 ;LIST (THREADED THROUGH MLO, TERMINATED BY 0)
2754 ;OF BLKS THAT BECAME FREE WHILE MEMFRZ WAS LOCKED.
2756 MEMHPT: 0 ;FREE LIST OF HIGH HALF PAGES AND HIGH MOBY PAGES
2757 ;AND SHUFFLEABLE LOW HALF PAGES. MUST BE AT MEMFP-1.
2759 MEMBLT: 0 ;FREE LIST POINTER FOR LOW PGS AND ALSO WD FOR BLOCK 0
2760 BLOCK TSYSM-1 .SEE BEGF0 ;FILLS THIS IN
2762 ;FIELDS IN MEMBLT ENTRY:
2763 ;4.9 FREEZE OR ALLOC INHIBIT
2764 ;IF 4.9=1, DONT SET UP ANY MORE EXEC PGS POINTING TO THIS ONE
2765 MUR==360500 ;4.4-4.8 USAGE CODE
2766 MURUSR==1 ;USER PAGE, MMMPX=MMP INDEX
2768 MUIOB==3 ;200 WD BUFFERS, MNUMB=FIRST IOBFT ENTRY IN BLOCK
2770 MUINP==5 ;IN PROCESS OF BEING ALLOCATED
2771 MUMGB==6 ;MAG TAPE BUFFER, MNUMB=TAPE NO+EOF BIT, MWC=WORD COUNT
2773 MUDISB==10 ;340 DISPLAY BUFFER
2774 MUFRT==11 ;BLOCK RETURNING TO FREE WHEN MEM LOCKED
2775 MU23B==12 ;DISK BUF, MWC=WORD COUNT, MNUMB=CHANNEL
2776 MU23UD==13 ;DISK USER DIR, MNUMB=QSNUD SLOT
2777 MU23MD==14 ;DISK MASTER DIR
2778 MU23TT==15 ;DISK TUT MNUMB=DISK NO.
2779 MU23LS==16 ;DISK COPY OF USER DIR FOR LISTING
2780 MUHOLE==17 ;"HOLE" IN REAL MEM
2781 MUDDT==20 ;"DDT" PAGE
2782 MUNET==21 ;NETWORK "BIG" BUFFER
2783 MUSWPG==22 ;PAGE IN SWAPPING QUEUE, MMMPX=MMP INDEX
2784 MUCHA==23 ;CHAOS NET BUFFERS
2785 MU23FB==24 .SEE QSFBT ;DISK FREED-BLOCKS TABLES
2786 MUPKT==25 ; Net packet buffers
2787 MUDVB==26 ;Semi-static device IO buffer page
2788 ;ADD NEW MUR TYPES HERE ^
2789 MURMAX==27 ;HIGHEST VALID CODE + 1
2791 MWC==221400 ;3.1-4.3 WORD COUNT IN I/O BUFFERS
2793 MLU==221400 ;3.1-4.3 LINK UP FOR DOUBLY-THREADED FREE LIST
2795 MNUMB==140600 ;2.4-2.9 MAGIC NUMBER SEE COMMENTS UNDER MUR ABOVE
2797 MMMPX==142200 ;2.4-4.3 MMP INDEX IN USER PGS + SWAP BUFFERS
2799 MLO==001400 ;1.1-2.3 LINK TO NEXT PAGE IN A LIST
2801 ;UNLIKE IOLO AND PREVIOUS VERSION OF MLO, THERE ARE NO MAGIC NEGATIVE CODES
2802 ;N.B.: MLO MUST BE AT RIGHT-HAND END OF WORD - CODE DEPENDS
2804 MEMPNT: BLOCK TSYSM ;RH USED FOR CIRC MEM USE PNTR IF USER MEM
2805 ;LH FOR DISK ADDRESS CAME FROM OR GOING TO
2806 ;MEMPNT HAS BLOCK NUMBER
2807 ;DISK NUMBER COMES FROM CHANNEL LINKED TO
2808 ;CIRCULAR PAGE LINK FORM
2813 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
2814 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
2815 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
2817 MMSWP: BLOCK TSYSM ;IF USER MEM, HAS NUMBER OF PAGE TABLE WORDS
2818 ; WHICH POINT AT THIS PAGE. LH IS NUMBER OF EXEC
2819 ; PAGES, RH IS NUMBER OF USER PAGES. NOTE THAT THE
2820 ; NUMBER OF UPGCP ENTRIES COULD BE MORE, FOR VARIOUS
2821 ; REASONS, E.G. CIRPSW LOCKED WHEN PAGE SWAPPED IN,
2822 ; OR A USER WAS SWAPPED OUT.
2823 ;IFN SWPWSP, RH(MMSWP) IS USED AS NUMBER OF SHARERS.
2825 EMEMTL==.-1 ;END FOR GETSYS (MEMORY)
2827 MMPRTC: 0 ;C AT MMPRTN, FOR DEBUGGING
2829 MMPFS: 0 ;FREE-LIST OF MMP ENTRIES. VALUE IS ADDRESS. (FORMERLY WAS IDX).
2831 MMPFS2: 0 ;LIST OF MMPS THAT NEED TO HAVE TUT SOS'ED BEFORE THEY CAN BE FREED.
2832 ;TUT COULDN'T BE SOS'ED AT P.I. LEVEL BECAUSE IT WAS LOCKED.
2833 ;THESE MMPS MAY ALSO NEED TO BE REMOVED FROM THE SHAREABLE
2834 ;PAGE TABLE, WHICH REQUIRES CIRPSW.
2836 MMPCNT: 0 ;# OF MMP ENTRIES IN USE.
2838 MMPFR: NMMP*1000 ;MAX POSSIBLE # MMP ENTRIES, MINUS # IN USE OR COMMITTED.
2840 ;MMP TABLE - TWO WDS PER ENTRY
2841 MMPPUB==400000 ;WD1 4.9 INDICATES A PUBLIC PAGE IF ON (ANYONE CAN ATTACH TO WRITE)
2842 MMPOUT==200000 ;4.8 => PAGE IS SWAPPED OUT OR ON WAY OUT.
2843 MMPTMP==100000 ;4.7 => IN TRANSIT (ON WAY IN OR ON WAY OUT).
2844 MMPWOD==40000 ;4.6 => THIS PAGE HAS BEEN WRITTEN ON DISK AT LEAST ONCE
2845 MMPISW==20000 ;4.5 PAGE ON INITIAL SWAPIN, BEING COPIED SO SWAP OUT TO DIFF PLACE
2846 MMPWRT==10000 ;4.4 HAS BEEN WRITTEN SINCE LAST DISK WRITE BY USER WHO HAS DETACHED THIS PAGE
2847 MMPGON==4000 ;4.3 FILE PAGE BEING WRITTEN OUT AFTER
2848 ;DELETED FROM ALL MAPS (MMP ENTRY WILL SOON GO AWAY.)
2849 MMPBAD==2000 ;4.2 PAGE GOT PAR ERR SINCE LAST TIME SWAPPED OUT OR IN.
2850 MMPLOK==1000 ;4.1 => PAGE MAY NOT BE SWAPPED OUT.
2851 MMPSLO==400 ;3.9 => PAGE SHOULD GO IN SLOW MEMORY.
2852 MMPSHR==200 ;3.8 MMP ENTRY IS IN SHAREABLE PAGE HASH TABLE
2853 MMPPGA==100 ;3.7 BEING SWAPPED IN BY PAGE-AHEAD. DON'T PUT IN USER MAPS; WAIT FOR FAULTS.
2854 MMPPGB==40 ;3.6 BEING SWAPPED OUT BY PAGE-BEHIND.
2855 $MMPUN==220300 ;3.1-3.3 UNIT NUMBER (GOES WITH DISK ADDR IN WD2 LH)
2856 ;WD1 RH CIRC MEM USE PNTR
2857 ;WD2 LH READ DISK ADR OR 0
2858 ;WD2 RH THREAD FOR SHAREABLE PAGE HASH TABLE
2860 MMPNP: 0 ;#MMP PGS ACTUALLY IN USE
2861 MMPMX: 0 ;HIGHEST VALID MMP INDEX (MMPNP*2000)
2863 MMMPG: BLOCK NMMP ;BLOCK NOS OF BLOCKS ACTUALLY USED
2865 ;SHAREABLE PAGE HASH TABLE
2866 ;MMP ENTRIES THAT ARE SHARED WITH FILES ARE LISTED HERE TO SAVE TIME AT NCORQ2
2867 ;SIMPLE REMAINDER HASH ON UNIT#,,DISK ADDRESS,
2868 ;BUCKETS THREADED THROUGH RH(MMPE+1)
2870 SHRHSL==31. ;NUMBER OF BUCKETS
2871 SHRHSH: BLOCK SHRHSL
2873 ;"LOOSE" PAGES (NOT USED BY ANY USER, BUT NOT YET SWAPPED OUT.)
2874 ;MMP ENTRY GOES AWAY WHEN SWAPPED OUT, OR GETS PUT BACK INTO SERVICE AT NCORQ3.
2875 NLOOSP: 0 ;NUMBER OF LOOSE PAGES
2876 FLOOSP: 0 ;HEAD OF LIST. THREADED THROUGH MLO IN MEMBLT.
2877 LLOOSP: 0 ;TAIL OF LIST. ADD AT TAIL, SWAPPER REMOVES FROM HEAD.
2880 MMPEAD: REPEAT NMMP, CONC MMP,\.RPCNT,*2000+400000 ;EXEC ADR
2881 MMPPPP: REPEAT NMMP, CONC .MMP,\.RPCNT,+EXEUMP ;PNTR TO EXEC PC MP
2882 USEMDM: DIRMAP ;NON-ZERO => USE MEDIUM MEMORY.
2883 ;DON'T CHANGE AFTER SYSTEM STARTUP
2885 SUBTTL 200-WORD I/O BUFFER ROUTINES
2889 ; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
2890 ;NUTIC+NUTOC (=NFCLC-1) =>UTAPE FILE DIR
2891 ;NFCLS-NFCLC+NCLCH-1 (=NFNETC-1) => CORE LINK
2892 ;NFNETC-NNETCH => NETWORK
2894 IOBCNS: MOVEI A,IOBFP-IOBFT
2896 LDB A,[IOLO,,IOBFT(A)]
2898 JRST 4,. ;IOBFT POINTERS FOULED UP
2900 IOBC2: LDB B,[420200,,IOBFT(A)]
2902 LDB B,[IOLO,,IOBFT(A)]
2903 DPB B,[IOLO,,IOBFT(E)]
2908 IOBR: MOVE B,IOBFP ;RETURN IOBFT WORD
2910 DPB B,[IOLO,,IOBFT(A)]
2913 DPB B,[IOCH,,IOBFT(A)]
2917 IUTCONS: ;ALLOCATE 200 WORD BUFFER
2919 SKIPG UTTBF ;CLOBBERS A B E TT, RETURNS IOBFT INDEX IN A
2920 JRST IUTC1 ;NO UTAPE BUFFERS FREE
2922 MOVE A,UTFS ;CHNL NO IN D
2925 LDB B,[420200,,IOBFT(A)]
2927 LDB B,[IOCH,,IOBFT(A)]
2929 JRST 4,. ;BUFFER BEING ALLOCATED ISN'T FREE.
2930 LDB B,[IOLO,,IOBFT(A)]
2931 DPB B,[IOLO,,IOBFT(E)]
2932 DPB D,[IOCH,,IOBFT(A)]
2937 LDB A,[IOLO,,IOBFT(A)]
2940 IUTC1: PUSHJ P,UIMRQ
2946 PUSH P,B ;FREE 200 WORD BUFFER (SEE BRTN)
2947 ; LDB B,[IOCH,,IOBFT(A)]
2949 ; JRST 4,. ;RETURNING A BUFFER THAT'S FREE?
2951 DPB B,[IOLO,,IOBFT(A)]
2954 DPB B,[IOCH,,IOBFT(A)]
2955 LDB B,[IOSA,,IOBFT(A)]
2961 UTMGB: PUSH P,J ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
2967 DPB B,[MUR,,MEMBLT(A)]
2969 LSH A,10.-6. ;CONV TO BUF SA
2970 MOVE TT,A ;INCR TO NEXT BUF ADR
2972 ADDM R,UTTLB ;UTTBF AOSED AT IBRTN
2974 UTMG1: PUSHJ P,IOBCNS
2975 DPB TT,[IOSA,,IOBFT(A)]
2977 DPB A,[IOLC,,IOBFT(Q)]
2983 DPB TT,[IOLC,,IOBFT(A)]
2989 FSCMP: ;RECOMPUTE UTAPE BUFFER FAIR SHARE
2999 UTMG2: DPB A,[MNUMB,,MEMBLT(J)]
3002 BRTN: CONO PI,UTCOFF ;RETURN A 200-WD BUFFER