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 CAIE U,(H) ;AND OUR INFERIORS
863 CAMN U,SERVER(J) ; and anyone who thinks we are a server
865 SKIPL H,JBI(U) ;AND OUR BOJ DEVICE.
873 ;4.7 USED INTERNALLY IN CODE (W RQ ON PDP6)
874 ;4.3-4.1 = 0 GET PAGE FROM SELF
875 ; = 1 GET ABSOLUTE PAGE
876 ; = 2 GET PAGE FROM USER OPEN ON CH # 3.1-3.8
877 ; = 3 GET PAGE FROM USER NUMBER 3.1-3.8
879 ; = 5 GET PAGE (PUBLIC)
880 ; = 6 MAKE PAGE PRIVATE
881 ; = 7 MAKE PAGE PUBLIC
882 ;3.9=1 REQUEST WRITE PERMISSION (IGNORED ON FRESH PAGE, OTHERWISE VALID ONLY FOR
883 ; SELF OR DIRECT INFERIOR OPEN ON CH OR PUBLIC PAGE)
884 ;3.1-3.8 USER NUMBER OR CH # (377 => CREATOR IF JOB DEVICE)
885 ;2.9=1 INSERT PAGE, 0 DELETE (IGNORES 4.3-4.1 EXCEPT FOR 6 OR 7 WHEN IT IS IGNORED)
886 ;2.1-2.8 VIRTUAL PAGE TO BE AFFECTED
887 ;1.1-1.9 BLOCK # IN ABSOLUTE OR OTHER USER (OR SELF IF 4.3-4.1 = 0)
889 ;TO CALL NCBLK, SET UP Q WITH USER INDEX REQUEST IS FOR AND U WITH
890 ;THE USER INDEX MAKING THE REQUEST
892 ;NEW .CBLK CODE, PASSES THE BUCK TO CORBLK.
893 ;SAME AS FAR AS CALLER IS CONCERNED.
895 ACBLK: MOVE TT,U ;TARGET USR IDX.
897 NCBLK0: MOVEI W,5 ;FAKE 5 ARGS TO NCORBL
898 LDB C,[111000,,B] ;TARGET PAGNUM.
899 LDB E,[1100,,B] ;SOURCE PAGNUM.
901 JRST NCBLKD ;LIKELY TO BE DELETE RQ.
902 NCBLK1: MOVSI A,210000 ;NOT DELETE => RQ READ, FAIL IF CAN'T.
903 LDB D,[221000,,B] ;SOURCE USR IDX OR CHNL NUM.
904 LDB H,[330300,,B] ;REQUEST TYPE-CODE.
907 JRST NCBLKS ;TYPE 0, SOURCE IS SELF.
908 JRST NCBLKA ;TYPE 1, GET ABS PAGE.
909 JRST NCBLKC ;2, USE SPEC'D CHNL NUM.
910 JRST NCBLKI ;3, USE SPEC'D USR IDX.
911 JRST NCBLKF ;4, FRESH PAGE.
912 JRST NCBLKP ;5, FRESH PUBLIC PAGE.
913 TLOA A,420000 ;6, MAKE PRIVATE, SOURCE=TARGET.
914 TLO A,440000 ;7, MAKE PUBLIC, " "
915 MOVE E,C ;SOURCE PAGNUM _ TARGET PAGNUM,
916 NCBLKS: TROA D,-1 ;GET PAGE FROM SELF. (%JSELF=-1)
917 NCBLKA: MOVEI D,%JSABS ;GET ABS PAGE
918 ;IF GET-FROM-CHANNEL, THE CHNL NUM IN D IS DESIRED JOB-SPEC.
919 NCBLKC: TLNE B,400 ;IF WRITE-RQ BIT ON,
920 TLO A,100000 ;INSIST ON WRITE ACCESS.
921 NCORBX: CAIE TT,(U) ;IF TARGET .NE. SELF,
922 PUSHJ P,NULSET ;FAKE OUT THOSE EXPECTING A LOSSET.
925 NCBLKI: IORI D,%JSNUM ;GET FROM USR IDX, MAKE JOB SPEC.
928 NCBLKP: TLO A,40000 ;GET FRESH PUBLIC PAGE.
929 NCBLKF: MOVEI D,%JSNEW ;GET FRESH PAGE
932 NCBLKD: TLC B,6000 ;COME HERE IF BIT 2.9 IS 0
934 JRST NCBLK1 ;(TYPES 6,7 IGNORE THAT BIT)
935 SETZB A,B ;OTHERWISE IS DELETE REQUEST.
942 ;ACTUALLY COPY A PAGE FROM ONE MAP TO ANOTHER
943 ;T PNTR TO MAP COPYING FROM
944 ;TT 400000 BIT 1=> WRITE
949 NCORR1: LDB J,T ;ENTRY FROM NCORR
951 JRST ACBK3A ;PAGE NON EXISTANT OR SWAPPED OUT
952 TRNN TT,400000 ;WRITE RQ ?
953 TRZ J,400000 ;DOESN'T RQ MORE
955 TRO J,200000 ;IN CASE OF RWF
956 ACBK3B: MOVE A,E ;TARGET PAGE #
958 LDB C,T ;GET PTW ABOUT TO BE CLOBBERED
959 TRZ C,PMAGEM ;TURN OFF AGE BITS
960 JUMPN C,[JRST 4,.] ;SHOULD HAVE DELETED PAGE BY NOW
963 JRST ACBK3C ;JUMP IF PAGE SWAPPED OUT
967 IFE SWPWSP, AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
970 AOS MMSWP(J) ;AOS NUMBER OF USERS POINTING TO PAGE
971 MOVSI C,1 ;ADJUST WORKING SET OF TARGET JOB
972 IDIV C,TT ;1,,0 IF DIVISION BY ZERO
974 JUMPE TT,ACBK3D ;JUMP IF NO SHARERS
975 IMULI TT,1(TT) ;COMPUTE ADJUSTMENT TO ALL WORKING SETS
976 MOVSI C,-1 ;DUE TO INCREASE IN SHARING
981 PUSHJ P,UCPRL7 ;CLOBBERS C,H,I,U
986 ACBK3D: LDB J,B ;POINTER TO PREVIOUS IN CHAIN
993 AOS SNMPGS ;SYSTEM HAS 1 MORE PAGE
996 ACBK3A: TRNN TT,400000
998 TRO J,1 ;IN CASE OF R/W/F
1001 ACBK3C: AOS NSWPGS(U)
1005 MOVE W,Q ;INDEX OF USER THAT REQUEST IS FOR
1006 IDIVI W,LUBLK ;CLOBBERS H
1012 NACRFL: PUSHJ P,LSWPOP ;UNLOCK CASW OR CIRPSW
1014 SKIPL CORRQ(U) ;CURRENT USER IN U COR RQ FOR USER IN Q
1015 PUSHJ P,UFLS ;WAIT FOR MY CORE RQ TO CORE JOB TO CLEAR
1019 PUSHJ P,UFLS ;SOMEBODY ELSE HAS RQ IN ON THIS JOB WAIT TO CLEAR
1021 CASW ;GET CORE ASSIGN SW
1023 JRST NACRFL ;CHECK FOR TIMING ERROR
1025 JRST ACRF6 ;OLD TYPE
1026 MOVNI J,1 ;ADDING ONE BLOCK
1027 MOVEI B,105 ;FAKE OUT CORE TO ZERO CHECK
1030 ACRF6: MOVE J,HUSRAD(Q)
1033 JRST LSWPJ1 ;SAME AMOUNT AS NOW
1036 JUMPN B,LSWPOP ;TRYING TO CORE NON-ZERO A JOB THAT IS DYING?
1037 SUB J,B ;GET AMT OF DECREASE (- => INCREASE)
1039 JRST ACRF6A ;GET 20 AT A WHACK MAX
1040 ACRF8: MOVN I,J ;I GETS POSITIVE # OF PAGES ADDED
1042 SUB J,NCBCOM ;J GETS AMT THAT WILL BE LEFT
1044 JUMPG I,ACRF7 ;NOT ENUF CORE
1045 MOVEI J,0 ;INDICATE RQ WILL BE COMPLETELY SATISFIED
1047 MOVNI J,1 ;MAKE SURE RQ IS REALLY FILLED
1048 ACRF5: JUMPL I,ACRF2 ;JUMP IF DECREASING CORE
1049 JUMPE Q,ACRF3 ;SYSTEM JOB DOESN'T USE MMP
1051 ADDB T,MMPFR ;COMMIT SUFFICIENT NUMBER OF MMP ENTRIES
1052 JUMPGE T,ACRF3 ;JUMP IF THAT MANY ARE AVAILABLE
1053 ADDM I,MMPFR ;MMP FULL, DECOMMIT THE MMP ENTRIES
1054 JRST LSWPOP ;AND TAKE ERROR RETURN
1056 ACRF2: AOSA NCRQL ;COUNT # REQUESTS FOR LESS
1057 ACRF3: ADDM I,NCBCOM ;IF EXPANDING, COMMIT SUFFICIENT AMOUNT OF PHYSICAL CORE
1059 IORM T,APRC(Q) ;CORING USER
1062 PUSHJ P,LSWPOP ;UNLOCK
1064 CONO PI,CLKOFF ;GET CORE JOB TO RUN RIGHT AWAY
1065 MOVE I,USER ;THEN COME RIGHT BACK TO US (WHAT A CROCK THIS ALL IS)
1072 SKIPL CORRQ(U) ;WILL NOT SKIP AT FIRST
1074 JUMPN J,ACRF1 ;REALLY NEED TO TAKE ANOTHER WACK AT THIS
1077 ACRF7: PUSHJ P,LSWPOP
1087 ADD TT,J ;GET REDUCED RQ
1091 SUBTTL CORE ALLOCATOR - CORE JOB ROUTINES
1093 CORJI: MOVE P,USRPDL+L ;SET UP CORE JOB PDL
1097 JRST UTBFF ;FLUSH UTAPE
1099 JRST UFDFF ;FLUSH 2314 UFDS
1101 JRST RETMM2 ;FLUSH PARTIALLY-RETURNED MMP ENTRIES
1103 JRST [ PUSHJ P,QDLFBT ;RETURN DISK BLOCKS TO FREE
1107 JRST CORJOB ;RQ'S FOR LESS HAVE COME IN. BETTER EXECUTE THEM OR MAY NOT HAVE ENUF CORE
1109 JRST CORUP ;FOUND USER IN SEARCH WHO WANTS MORE GIVE IT TO HIM
1114 PUSHJ P,CFLM1 ;FREE SOME LOW MEMORY BY SHUFFLING
1116 SOS NCORRQ ;CAN'T FIND ANYTHING TO DO SO DECREMENT COUNT
1117 ;THIS CAN HAPPEN AS A RESULT OF EXCESS ATTEMPTED UTAPE FLUSHAGE
1118 ;OR DUE TO CALLING CFLM1
1119 CORJOB: PUSHJ P,ACMTC ;XFER ANY "SPECIAL FREE" MEM BLOCKS TO FREE
1120 SKIPN NCORRQ ;ANYONE WANT CORE?
1121 PUSHJ P,[ ;IF NOT, WAIT UNTIL SOMEONE DOES, BUT FIRST
1122 MOVE TT,QMDRO ;SEE IF MFD AND TUTS NEED TO BE READ IN
1125 SETOM CORSRV ;INITIALIZE NO RQS SERVED THIS PASS
1127 MOVNI U,LUBLK ;SCAN FOR USER WITH HIGHEST PRIORITY
1128 CORLUP: ADDI U,LUBLK
1130 JRST CORJ2 ;THRU EXAMINE RESULTS OF SEARCH
1138 LSH A,-10. ;COMPUTE # BLKS JOB HAS NOW
1140 JRST 4,CORL1 ;SAME AS NOW, CHECKED FOR AT ACORE
1142 JRST CORLUG ;INCREASE
1143 MOVEM U,CORUPU ;DECREASE HAS PRIORITY
1147 MOVEM B,CORUPA ;DIFFERENCE
1151 CUSTOP: PUSHJ P,RPCLSR ;STOP USER WHO IS BEING CORED
1152 MOVSI T,BUCSTP ;(THE BUCK STOPS HERE)
1155 MOVEI T,-1 ;GET MASK FOR RH
1156 TDNE T,USTP(A) ;WAIT FOR RANDOM STOPS TO CLEAR
1160 ;Core job initializes disks while system job stands around and supervises
1161 ;This makes it possible for system job to print any resulting error messages
1162 ;Provided no one hits ^Z too soon
1170 MOVSI TT,SCLIDK ;System is up now
1176 CORUPU: -1 ;BEST USER SO FAR TO CHANGE CORE
1177 ;IF SETOMED AT CORUPR, REQUEST NOT COMPLETELY FILLED
1178 CORUPA: 0 ;INCREASE AMOUNT(1 FOR .CBLK)
1179 CORUPS: 0 ;CURRENT SIZE
1180 CORUUC: 0 ;USER CORE REQ ACTUALLY FOR
1181 CORSRV: -1 ;0 => RQ SRVED THIS TIME THRU USER VARS
1182 NCRQL: 0 ;# RQS FOR LESS
1186 CORLUG: HRRZS B ;GUY WANTS MORE GIVE GUY WHO WANTS LEAST PRIORITY
1188 CORLUH: MOVE A,NMPGS(Q)
1191 CAMGE B,CORUPA ;IS RQ SMALLER?
1193 CORLG2: CAME B,CORUPA ;OR IF TIE GIVE IT TO GUY WHO IS SMALLER NOW
1195 CAML A,CORUPS ;IS RQ= & SIZE SMALLER?
1197 CORLG1: MOVEM U,CORUPU ;HIGHEST PRIORITY SO FAR
1203 CORNEW: LDB Q,[1100,,B] ;.CBLK TYPE RQ
1208 CORUP: ;EXECUTE REQUEST
1215 JUMPE A,CORUP8 ;DONT USTOP SYS JOB
1216 PUSHJ P,CUSTOP ;STOP GUY
1217 CORUP8: PUSHJ P,SWTL
1221 JRST CORUPN ;.CBLK TYPE
1223 MOVE A,B ;A HAS CURRENT SIZE
1224 ADD B,CORUPA ;B HAS NEW SIZE
1228 JRST CORM1C ;WANTS MORE THAN NOW
1229 CORL2: LDB A,[121100,,HUSRAD(U)]
1234 PUSHJ P,UPGRTN ;RETURN USER PG
1238 CORUPR: MOVE U,CUSER ;FINISHED FOR NOW ANYWAY REVIVE USER
1243 PUSHJ P,E.SLPM ;LOAD PAGE MAP
1247 PUSHJ P,DCRRST ;DIS IS RUNNING BUT UPDATE UPR ETC
1250 ANDCAM A,USTP(U) ;RESTART USER
1251 PUSHJ P,LSWPOP ;UNLOCK MEMORY
1253 PUSHJ P,ACMTC ;XFER IN PROCESS BLOCKS TO FREE
1255 JRST CORJOB ;NOT THRU WITH THIS RQ
1256 MOVE A,CORUUC ;THRU WITH RQ
1259 SOS NCRQL ;FINISHED A REQUEST FOR LESS, DECREMENT COUNT OF THEM
1261 ANDCAM TT,APRC(A) ;CLEAR RQ PENDING THIS USER FLAG
1262 CORL1: SETOM CORRQ(U)
1268 CORUPN: LDB A,[111000,,TT]
1277 TLO E,600000+PMCSHM ;ADD FRESH PAGE
1288 200000,,[ LDB B,[330100,,TT]
1290 POPJ P, ] ;SET TO DESIRED PUBLICNESS
1294 CORM1C: MOVEM J,CORCNT
1295 CORM1A: JUMPE U,CORS2 ;SNIFFLE
1296 CORM1B: MOVE U,CORUUC
1297 LDB E,[121100,,HUSRAD(U)]
1305 \f;INSERT FRESH PAGE INTO USR MEM IN PLACE SPECIFIED BY E PROT BITS IN LH
1306 ;MMPFR SHOULD HAVE BEEN SOS'ED ALREADY
1308 CORGP: JUMPN U,CORGP0 ;JUMP UNLESS GIVING PAGE TO SYS JOB
1309 MOVE A,SJSPG ;GOBBLE PAGE RESERVED
1312 JRST CORGP1 ;USER VARIABLES, CLEAR IT OUT
1313 JRST CORGP2 ;INITIAL GET OF SYSTEM, DON'T ZERO IT
1315 CORGP0: PUSHJ P,GMMPP ;RETN MMP PNTR IN R
1318 JRST HMEMRQ ;GET MEM, HIGH IF POSSIBLE
1320 CORGP1: PUSHJ P,CZRR
1321 CORGP2: AOS NMPGS(U)
1322 AOS SNMPGS ;INCR SYS PAGE COUNT (VIRT)
1323 PUSH P,A ;REAL CORE BLOCK #
1324 HRRZ A,E ;ADDR IN USERS MAP
1329 JUMPE U,CORGP3 ;IF SYS JOB, DON'T TRY TO SET UP MAP
1330 JUMPN B,[JRST 4,.] ;ALREADY HAS PAGE
1331 AOS MMSWP(A) ;INDICATE THAT ONE USER MAP POINTS AT THIS PAGE
1332 TSO A,E ;SET PROTECTION BITS
1333 DPB A,T ;STORE IN USER'S MAP
1335 TRO R,400000 ;MAKE USERS CP POINT AT MMP
1338 MOVSI TT,1 ;INCREASE WORKING SET
1341 ANDI A,PMRCM ;TURN ACCESS BITS BACK OFF
1342 CORGP3: CAIL A,TSYSM
1345 DPB TT,[MUR,,MEMBLT(A)] ;SET USER FIELD IN MEMBLT
1349 IOR TT,E ;PG # IN USER'S MAP
1351 MOVEI TT,600000(A) ;IF SYS JOB, MEM BLOCK POINTS AT SELF
1352 HRRZM TT,MEMPNT(A) ;ELSE MAKE MEM BLOCK POINT AT USERS MAP
1353 JUMPE U,GHUSRA ;IF SYS JOB, NO MMP ENTRY
1354 DPB C,[MMMPX,,MEMBLT(A)];STORE INDEX OF MMP ENTRY IN MEMBLT
1356 HRRM A,MMP(C) ;MAKE MMP POINT AT MEM BLOCK
1357 PUSHJ P,CHACK ;FOR CHECKING ONLY
1358 CAME C,[SETZ 3] ;REAL MEM, 3 ENTRIES (MMP, MEMPNT, USER)
1361 LSH E,10. ;COMP NEW HUSRAD AFTER GETTING PAGE
1362 TLZ E,-2 ;FLUSH PROTECT BITS (LEAVE 3.1)
1367 CORGPZ: PUSH P,E ;SAVE REGISTERS
1369 PUSHJ P,CFLM2 ;TRY TO FREE UP SOME LOW MEMORY
1373 JRST CORGP ;SHOULD WORK NOW
1374 PUSHJ P,LSWPOP ;MEMFRZ
1375 PUSHJ P,LSWPOP ;CIRPSW
1376 BUG INFO,[NO CORE AVAIL FOR MMP PAGE]
1377 PUSHJ P,UDELAY ;Break possible infinite loop if no user pgs in low mem
1378 SKIPG MEMFR ;WAIT FOR SWAPPER TO MAKE ROOM (PANIC!)
1386 PAGERT: PUSHJ P,SWTL
1391 UPGRTN: PUSH P,R ;RETURN VIRT PG # IN A USER IN U
1396 PUSHJ P,UPLC ;SEE IF PAGE XGP LOCKED
1399 JRST UPGRT7 ;SWAPPED OUT, OBVIOUSLY NOT XGP
1400 ANDI E,PMRCM ;E := PHYS PAGE NO
1409 PUSHJ P,UFLS ;WAIT FOR XGP TO CLEAR
1412 .ELSE PUSHJ P,UPLC ;FIND PAGE IF DIDN'T ALREADY
1413 JUMPE U,UPGRT8 ;SYS JOB, NO SWAPPING NOR MMP ENTRY
1416 JRST UPRABS ;ABSOLUTE PAGE
1417 JUMPE B,RHUSRA ;DOESNT REALLY HAVE PG
1420 ADD D,MMPEAD ;D HAS MMP ADDRESS
1421 UPGRTA: MOVSI T,MMPTMP
1423 JRST UPGRTW ;WAIT FOR PAGE TO TRANSIT BUT UNLOCK SWITCHES
1424 MOVNI I,1 ;ASSUME NO DISK SPACE
1425 HLRZ A,1(D) ;SEE IF DISK SPACE ASSIGNED
1428 PUSHJ P,QTLOCK ;LOCK APPRO TUT
1429 UPGRT5: POP P,T ;POINTER TO ORIG MAP ENTRY OF USER
1430 MOVE H,(T) ;SAVE MAP WORD FOR DEBUGGING
1431 LDB TT,T ;IF PROT BITS=0 PAGE IS SWAPPED OUT FOR PURPOSES
1432 MOVEI E,0 ;OF USER'S SWAP OUT COUNT, EVEN IF IN CORE
1433 DPB E,T ;CLEAR USER MAP ENTRY
1434 TRCN TT,600000 ;IS USER MAPPED TO PAGE?
1436 MOVSI E,MMPWRT ;YES, CHECK IF ACCESS BITS = RW
1438 IORM E,(D) ;PAGE WRITTEN BY USER WHO HAS DETACHED IT
1439 ANDI TT,PMRCM ;MASK TO MEM PAGE #
1441 JRST 4,. ;PTW POINTED TO WRONG PAGE
1442 MOVSI E,MMPOUT+MMPTMP
1444 JRST 4,. ;PAGE NOT IN, IN MMP
1445 IFE SWPWSP, SOS MMSWP(J) ;ONE LESS USER POINTING AT PAGE
1447 HRRZ E,MMSWP(TT) ;DECREASE THIS USER'S WORKING SET
1453 JUMPE E,UPGRTB ;JUMP IF NO OTHER SHARERS, FOR SPEED AND NO ZERODIVIDE
1454 PUSH P,C ;ADJUST OTHER SHARER'S WORKING SETS
1461 PUSHJ P,UCPRL7 ;CLOBBERS H ALSO C,T,U,I
1470 ;RETURNING A PAGE TO WHICH USER IS NOT CURRENTLY MAPPED (MAY BE IN OR OUT)
1471 UPGRT9: SOS NSWPGS(U)
1472 SOS SNSWPG ;DECR CNT OF SWAPPED OUT FOR SYS
1473 JUMPGE C,UPGRT4 ;NO MEM IN CP S, PAGE REALLY SWAPPED OUT
1474 ;RETURNING A PAGE WHICH IS SWAPPED IN
1475 UPGRTB: HLRE E,MMSWP(J) ;GET # EXEC PGS POINTING TO THIS
1476 JUMPL E,[JRST 4,.] ;<0 EXEC PAGES
1477 JUMPE E,UPGRT4 ;NO EXEC PGS POINTING TO THIS
1480 MOVSI T,-NEXPGS ;LOOK FOR EXEC PGS SET UP TO PNT
1481 MOVE E,[442200,,EXEUMP] ;TO USER PAGE FLUSHED
1488 UPGRT2: AOBJN T,UPGRT3
1492 PUSHJ P,E.SPRT ;SEE IF E&S HAS IT
1496 TDNE T,MMSWP(TT) ;FLUSH XGP TIE DOWNS AND RETURN
1500 UPGRT4: LDB T,Q ;DELINK CIRC PNTR
1503 DPB T,Q ;CLOBBER CIRC P
1505 SOS SNMPGS ;SYSTEM HAS 1 LESS PAGE
1508 JRST MMPRTN ;RETURN MMP ENTRY SINCE PAGE NO LONGER IN USE
1511 JRST MMPRT5 ;FLUSH REAL MEM
1518 RHUSR1: LDB A,[121100,,HUSRAD(U)] ;COMP HUSRAD AFTER RETURNING PAGE
1523 JUMPN B,CPOPJ ;FOUND ACTIVE PAGE
1524 MOVNI C,2000 ;KEEP LOOKING
1528 UPGRT8: SOS NMPGS ;RETURNING PAGE FROM SYS JOB
1530 DPB A,[121100,,HUSRAD(U)] ;NORMAL METHOD OF COMPUTING HUSRAD WON'T WORK
1531 MOVNI I,1 ;NO DISK SPACE
1532 MMPRT5: SKIPE MMSWP(A) ;MAKE SURE NO ONE (EXEC OR USER) IS POINTING AT PAGE
1534 PUSHJ P,CMEMR ;HAS REAL MEM, CIRC LENGTH =3 SO FLUSH MEM
1540 LDB E,[.BP <PMRCM-377> B] ;GET MOBY #
1544 PUSHJ P,T11DL ;DELETE PAGE REF TO TEN11 MAP
1553 E.SPRT: CAME U,DISUSR ;IS HE USING THE DISPLAY?
1554 POPJ P, ;NO, DON'T UNTIE ANYTHING
1556 MOVE T,TT ;FOR E.SPCH
1557 PUSHJ P,E.SPCH ;LOOK IN E&S TABLES
1558 SKIPA ;FOUND, INDEX IN H
1559 JRST E.SPR2 ;NOT FOUND, DO NOTHING
1561 ADDM T,MMSWP(TT) ;SOS COUNT
1562 SETZM DISSWP(H) ;CLEAR DISPLAY MMSWP TABLE
1563 AOS E.SNUT ;COUNT FOR UNTIES
1568 XCT EXPFT(T) ;MAYBE XFERR TO ROUTINE TO DO SOMETHING ABOUT THIS
1569 JRST UPGRT6 ;NOT USER CONCERNED ABOUT (THERE HAD BETTER BE ANOTHER)
1571 DPB J,E ;CLEAR OUT EXEC PAGE ENTRY
1574 UPGRT6: CONO PI,UTCON
1577 ;WAIT FOR PAGE TO TRANSIT, WITH CIRPSW FREE (IN CASE SWAP READ ERROR!)
1578 ;COME HERE WITH T/MMPTMP,, D/MMP.ENTRY.ADDR
1584 PUSHJ P,UFLS ;WAIT FOR ACTIVE PAGE TO SETTLE DOWN
1585 CAIE U,LUBLK ;SKIP IF CORE JOB
1586 JRST UUOTROLL ;AS IF PCLSR'ED OUT OF WAIT FOR PAGE & CAME BACK
1587 SETOM CORUPU ;REQUEST FOR THIS USER NOT SATISFIED
1588 MOVE P,USRPDL+LUBLK ;CLEAN UP AND RE INIT CORE JOB
1594 IFN 340P, REPEAT 2+N340PB, PUSHJ P,DISACR
1595 REPEAT 2,JFCL ;CORJF, CORJT
1596 IFN VIDP, REPEAT 2,PUSHJ P,SCNACR
1597 IFN TEN11P, JRST 4,. ;TEN-11 CONTROL PAGE
1599 IFN ECCMEM, JRST 4,. ;ECCPG
1600 IFN XGP, REPEAT 3,JRST 4,.
1601 IFN N11TYS, REPEAT NTTPG+NTVBP,JRST 4,.
1602 IFN CHAOSP, IFN T11CHP, JRST 4,.
1603 REPEAT NMMP,JRST 4,. ;MMP
1604 IFN .-EXPFT-NEXPGS, .ERR LOSE AT EXPFT
1605 \f;CIRCULAR MEM LIST HACKER
1606 ;CALL WITH Q CONTAINING BYTE POINTER TO CIRC PNTR IN LIST TO BE HACKED
1607 ;THE BYTE POINTER MUST POINT AT A UPGCP ENTRY (RATHER THAN MEMPNT OR MMP)
1608 ;OR THIS CODE WILL LOOP FOREVER.
1609 ;RETN BYTE PNTR IN B TO GUY WHO PNTS TO THAT PNTR
1610 ;COUNT FOR ENTRIES IN C (RH)
1611 ; 4.9 C SAYS ACTUAL MEM IN LOOP
1612 ;RETN IN D MMP INDEX
1613 ;RETURN MEM PAGE IF ANY IN J
1617 LDB J,Q ;PICK UP STARTING C. P.
1621 CHACK1: JUMPE B,[JRST 4,.]
1623 CAIE J,-1 ;SKIP ON ABS PAGE
1625 JRST 4,. ;CIRC CHAIN TOO LONG?
1627 JRST CHACK3 ;MEMPNT OR MMP PNTR
1628 LDB I,[1000,,J] ;PG #
1629 LDB H,[101100,,J] ;USER #
1633 JRST 4,. ;POINTER TO NON-EXISTENT USER
1641 JRST CHACK2 ;FOUND ENTRY WHICH PNTS AT ORIGINAL ENTRY
1644 JRST CHACK1 ;KEEP LOOKING
1647 JUMPL D,[JRST 4,.] ;NO MMP ENTRY ?
1650 CHACK3: TRZE J,200000
1651 JRST CHACK4 ;ACTUAL CORE
1653 JRST 4,. ;GARBAGE POINTER
1654 MOVSI B,2200 ;MMP ENTRY
1657 JUMPGE D,[JRST 4,.] ;MORE THAN 1 MMP ENTRY
1662 CHACK4: TLOE C,400000
1663 JRST 4,. ;PAGES IS IN TWO PLACES IN CORE
1665 JRST 4,. ;GARBAGE POINTER
1666 MOVE A,J ;SAVE MEMBLT INDEX
1673 ;LOOK UP PAGE IN USER MAP
1674 ;USER IN U, VIR PG # IN A
1675 ;GET PNTR TO MAP HW IN T, TO CIRC IN Q
1679 JRST 4,. ;BAD VIRTUAL PAGE NUMBER
1692 ;FREE THE MMP ENTRY D POINTS AT, SOSING TUT IF DISK SPACE ASSIGNED.
1693 ;I HAS DSK #, C HAS WHAT CHACK RETURNED IN C, A HAS TRACK #.
1694 ;TUT MUST BE LOCKED ALREADY. CIRPSW AND MEMFRZ SHOULD BE LOCKED.
1695 ;EXIT TO MMPRT4 OR RHUSRA
1697 MMPRTN: MOVEM C,MMPRTC ;SAVE IN CASE OF BUG HALT LATER
1698 JUMPL I,MMPRT3 ;NO DISK SPACE ASSIGNED
1702 JRST 4,. ;WRITING WRONG DISK
1703 MOVE H,D ;H SAVES POINTER TO MMP ENTRY
1704 MOVE D,A ;D GETS DISK TRACK NUMBER
1707 SOJL B,[JRST 4,.] ;DETECT OVER-SOS
1709 EXCH D,H ;D GETS MMP PNTR, H GETS TUT BYTE PNTR
1716 MMPRT2: MOVE T,DCHBT(I)
1718 MOVE A,(D) ;ELSE DELETE MMP ENTRY NOW
1720 JUMPN B,MMPRT0 ;IF PG IS IN FILE, AND SWAPPED IN, MAYBE WRITE OUT.
1723 HLRZ A,1(D) ;ALSO REMOVE FROM SHAREABLE PAGE TABLE
1735 JUMPL C,MMPRT3 ;WAS MEM IN LOOP SO NOT SWAPPED OUT FOR SYSTEM'S COUNT
1736 SOS NPGSWO ;IT WAS SWAPPED OUT
1737 MMPRT3: PUSHJ P,MMPRT1
1738 SOS MMPCNT ;1 LESS IN USE
1739 AOS MMPFR ;1 MORE FREE
1742 ;FLUSHING AN MMP ENTRY FOR A PAGE SHARED WITH A FILE WHICH IS CURRENTLY IN CORE.
1743 ;WE MAY WANT THIS PAGE AGAIN, SO TRY TO KEEP IT AROUND FOR A WHILE.
1744 ;BUT IF PAGE HAS BEEN MODIFIED, IMMEDIATELY SWAP IT OUT SO FILE GETS UPDATED.
1747 LDB C,H ;UN-SOS THE TUT
1748 CAIGE C,TUTMNY ;DON'T OVER-AOS
1754 SKIPE C,LLOOSP ;ADD TO TAIL OF LOOSE PAGE LIST
1755 DPB J,[MLO,,MEMBLT(C)]
1762 PUSH P,U ;PAGE WAS MODIFIED, SWAP IT OUT RIGHT AWAY
1763 CONO PI,CLKOFF ;CALL SWAPPER AT IMITATION CLOCK LEVEL
1766 AOS CIRPSW ;SWOP1A WILL SOS IT BEFORE RETURNING
1767 PUSHJ P,SWOP1A ;WILL RETURN THE MMP ENTRY SINCE NO USERS ARE LINKED TO IT
1768 JRST 4,. ;EXEC PAGES STILL POINT TO PAGE, ALTHOUGH UPGRTN FLUSHED THEM
1773 ;HERE TO RETURN AN MMP ENTRY AND SOS THE TUT, AT P.I. LEVEL
1774 ;IF TUT OR CIRPSW IS LOCKED, PUTS ON MMPFS2 AND WAKES UP CORE JOB
1775 ;OTHERWISE, CLEARS OUT AND PUTS ON MMPFS
1776 ;A -> MMP ENTRY, CLOBBERS B,D,E,I
1782 JRST RETMM1 ;CAN'T SET LOCKS, LET CORE JOB DO IT
1784 PUSHJ P,TUTPNT ;SOS THE TUT
1789 MOVE E,QTUTO(I) ;RETURNING BLOCK TO FREE, AOS APPROPRIATE FREE COUNT
1794 RETMM7: MOVSI D,MMPSHR
1797 HLRZ D,1(A) ;REMOVE FROM SHAREABLE PAGE HASH TABLE
1803 JUMPE D,[JRST 4,.] ;NOT IN TABLE OR MIS-HASHED?
1811 MMPRT1: EXCH D,MMPFS ;ADD THIS ENTRY ONTO THE FRONT OF
1812 MOVE A,MMPFS ;THE LIST OF AVAILABLE MMP ENTRIES
1813 MOVEM D,(A) ;CLEAR LH OF FIRST WORD OF ENTRY
1814 SETZM 1(A) ;CLEAR SECOND WORD OF ENTRY
1817 RETMM1: MOVE D,A ;ADD THIS ENTRY TO LIST OF ONES TO HACK LATER
1819 HRRM D,(A) ;ONLY CLOBBER THE CIRC PNTR, WHICH POINTS TO SELF
1821 AOS NCORRQ ;LIST WAS EMPTY, AWAKEN CORE JOB
1824 ;CORE JOB COMES HERE WHEN MMPFS2 IS NON-ZERO
1833 RETMM4: MOVEI A,0 ;HERE, WITH CIRPSW LOCKED, TO FINISH RETURNING MMP ENTRIES
1835 RETMM3: JUMPE A,CPOPJ
1844 ;GET AN MMP ENTRY, RET. IDX IN R, ADDR IN TT.
1845 ;CLEARS BOTH WDS OF MMP ENTRY. CLOBBERS NO ACS.
1846 ;SKIPS IF SUCCESSFUL. DOESN'T SKIP IF NO LOW CORE FOR NEW MMP PAGE.
1847 ;YOU BETTER ALREADY HAVE COMMITTED THE MMP ENTRY VIA SOSGE MMPFR
1849 GMMPP: HRRZ TT,MMPFS
1850 JUMPE TT,GMMP1 ;FREE LIST IS EMPTY
1852 JRST 4,. ;IDX GOT ON FREE LIST; SHOULD BE ADDR
1859 AOS MMPCNT ;1 MORE MMP ENTRY IN USE.
1864 PUSH P,A ;PROTECT ACS CLOBBERED BY RETMM4
1881 GMMP4: PUSH P,A ;CREATE ANOTHER PAGE-FULL OF MMP ENTRIES
1885 ;JRST IOMQ ;ALLOCATE LOW CORE SO GETS DUMPED WITH CRASHES
1886 JRST NMMRQ ;IOMQ LOSES BECAUSE WE GET CALLED WITH MEMFRZ LOCKED
1887 ;NMMRQ ISN'T QUITE RIGHT, BECAUSE OF NCBCOM. FIX LATER. ---
1888 JRST GMMP3 ;NO LOW CORE AVAIL NOW
1890 DPB B,[MUR,,MEMBLT(A)]
1892 ADDM B,MMPMX ;INCREMENT MAX ALLOWABLE ADDR OF MMP
1895 JRST 4,. ;SOMEONE DIDN'T CHECK MMPFR?
1898 DPB A,MMPPPP-1(B) ;PUT NEW MMP PAGE INTO EXEC MAP
1904 GMMP2: MOVEI D,MMP(B) ;PUT ALL ENTRIES IN PAGE ON THE FREE LIST
1918 ;HERE IF TRANSIENT CONDITION PREVENTS GRABBING PAGE RIGHT NOW
1920 CORS18: MOVE T,LSWPR+LUBLK
1923 PUSHJ P,LSWPOP ;MEMFRZ
1929 ;GROW A JOB'S CONTIGUOUS MEMORY. USED ONLY FOR SYSTEM JOB THESE DAYS.
1933 SKIPL XGPUSR ;AVOID EXPANDING INTO XGP PAGE.
1936 LDB J,[121100,,HUSRAD(U)]
1937 LDB E,[MUR,,MEMBLT(J)]
1939 JRST COSFR ;FREE PAGE, TAKE IT.
1942 JRST CORS18 ;WAIT UNTIL IT STABILIZES
1944 JRST CORS18 ;WAIT UNTIL IT GETS WHERE IT'S GOING
1945 CAIE E,MURUSR ;USER PAGE, SHUFFLE IT AWAY.
1946 JRST 4,. ;SHOULDN'T HAVE TO SHUFFLE SYSTEM PAGES.
1948 ;SHUFFLE A USER PAGE
1949 CORS4: PUSHJ P,TCALL
1950 JRST HMEMRQ ;GET FREE PAGE TO SHUFFLE IT INTO
1951 JRST 4,. ;THERE OUGHT TO BE ONE
1955 ;Shuffle user page in J into page in A
1956 ;Clobbers C,D,E,H,I,Q,U,T
1959 JRST 4,. ;BLOCK IS ON SWAP OUT LIST (??)
1961 PUSHJ P,CORS6 ;SHUFFLING A POSSIBLY LOOSE PAGE, FIX POINTERS
1962 SETOM DLSRCH ;CAN'T BE BEING SWAPPED OUT ETC BECAUSE SWAPOUT
1963 PUSHJ P,UCPRL7 ;BLOCKS HAVE MUR=MU23B, AND CIRPSW IS SIEZED
1964 SETZ CORSTU ;STOP DIRECT TO MEM DEVICES AND FIX USER MAPS
1965 TLC C,200 ;CHANGE TO 20 BIT BYTE
1966 DPB D,C ;RELOCATE PTR TO MEMPNT ENTRY
1967 PUSHJ P,CMOVE1 ;MOVE CONTENTS OF BLOCK
1969 MOVE T,[442200,,EXEUMP]
1970 PUSHJ P,CORPS1 ;FIX ANY EXEC PAGE MAP PNTRS TO THIS PAGE
1972 SETZ DEVSTR ;RESTART DIRECT TO MEM DEVICES
1973 SETZM DLSRCH ;MAPS ARE CONSISTENT AGAIN, LET USERS RUN
1976 CORSTU: PUSHJ P,DEVSTP ;STOP DIRECT-TO-MEM DEVICES
1977 MOVE A,I ;COMPUTE USER'S MAP ENTRY LOCN
1981 POPJ P, ;PAGE SWAPPED IN BUT NOT YET LINKED UP
1985 TLC T,2200#<PMRCAD&7700> ;CHANGE TO ADDRESS REAL CORE ADR FIELD
1986 DPB D,T ;RELOCATE USER'S MAP
1991 CBMRT: MOVEM J,SJSPG ;SAVE PAGE # RESERVED
1994 ;CORE SHUFFLER, TO KEEP LOW MEMORY FREE
2000 PUSHJ P,LSWPOP ;MEMFRZ
2003 CFLM2: MOVEI J,LIOBLK ;Scan through "low" memory
2004 SKIPE MEMHPT ;Make sure there is likely to be free high mem
2006 AOS SWPOPR ;Kick swapper more than kicked already
2007 POPJ P, ;And give up
2011 CAIL J,256. ;Assume USEMDM is always on (safe assumption)
2012 POPJ P, ;All done, couldn't find anything
2013 CFLM4: LDB A,[MUR,,MEMBLT(J)]
2017 JRST HMEMRQ ;Get free page to shuffle it into
2018 POPJ P, ;No memory free, give up for now
2019 PUSHJ P,CORS5 ;Shuffle page into new memory
2020 MOVE A,J ;Free old page
2025 POPJ P, ;Freed sufficient low pages, stop now
2027 ;STOP DIRECT TO MEM DEVICES
2031 CAMN U,SCNUSR ;STOP DIRECT MEM DEVICES
2032 PUSHJ P,SCNSTC ;STOP DIRECT VIDI INPUT
2035 CAMN U,DISUSR ;STOP DISPLAY IF THIS GUY HAS IT
2040 ;RESTART DIRECT TO MEM DEVICES
2042 DEVSTR: CLRPGM +LUBLK ;CLEAR PAGE MAP ASSOC REGS IN HARDWARE
2044 CAMN U,SCNUSR ;RESTART DIRECT MEM DEVICES
2045 PUSHJ P,SCNRST ;RESTART DIRECT VIDI INPUT
2049 PUSHJ P,DCRRST ;RESTART DISPLAY
2053 ;HERE TO RELOCATE EXEC PAGES WHICH POINT TO PAGE IN J
2057 TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE FIELD TO ADDRESS REAL CORE ADR
2061 AOS I ;COUNT # OF EXEC PGS POINTING TO THIS ONE
2062 DPB D,T ;RELOCATE EXEC PG PNTR
2063 CORPS3: TLC T,2200#<PMRCAD&7700> ;CHANGE SIZE BACK TO 22
2066 CAMN T,I ;CHECK COUNT OF EXEC PAGES
2067 POPJ P, ;COUNTED CORRECTLY, WIN
2069 IFN E.SP,[ ;SEE IF E&S CAN ACCOUNT FOR SOME PAGES
2070 MOVSI Q,-MXDISP ;SET UP INDEX
2071 CAMN J,DISSWP(Q) ;J/ OLD INDEX, D/ NEW
2072 AOJA I,E.SX2 ;COUNT I IF FOUND, AND RECHECK COUNT
2073 AOBJN Q,.-2 ;ELSE CONTINUE SEARCH
2074 JRST 4,. ;NOT FOUND, BOMB
2075 E.SX2: MOVEM D,DISSWP(Q) ;RELOCATE PAGE
2076 AOS E.SREL ;# PAGES RELOCATED (FOR DEBUGGING)
2077 CAMN T,I ;SKIP IF COUNT IS STILL BAD
2078 POPJ P, ;E&S COUNT WAS CULPRIT -- HAPPY AGAIN
2090 JRST 4,. ;EXEC PGS COUNT OFF
2092 CORS6: MOVE T,FLOOSP ;FIX POINTERS TO LOOSE PAGE BEING SHUFFLED
2095 LDB T,[MLO,,MEMBLT(C)]
2098 DPB D,[MLO,,MEMBLT(C)]
2099 CORS8: CAMN J,FLOOSP
2105 ;RUN AROUND CIRC LIST STRUCTURE
2106 ;WORD AFTER CALL IS POINTER TO ROUTINE TO BE CALLED FOR EACH ITEM IN LIST ACCORDING
2107 ;TO FLAGS IN LH: 4.9 USER PAGE (U=USER,I=PG#), 4.8 MMP (T=IDX), 4.7 MEMPNT (T=PG#)
2108 ;CALLED ROUTINE MUSTN'T CLOBBER C,H; NOR U,I IF A USER PAGE; NOR T IF MEMPNT.
2109 ;RETURNS IN C BYTE POINTER TO PLACE THAT POINTS TO
2110 ;STARTING BYTE POINTER THAT WAS IN C
2112 ; UCPRL - STARTING BYTE POINTER IN C
2113 ; UCPRL4 - STARTING CORE PAGE # IN D
2114 ; UCPRL7 - STARTING CORE PAGE # IN J
2115 ;PDL DEEPENED BY TWO PUSH'S AND TWO PUSHJ'S.
2116 ;---WARNING--- : CLOBBERS U ------- ALSO CLOBBERS H,T,I
2118 UCPRL7: SKIPA C,[2200,,MEMPNT(J)]
2119 UCPRL4: MOVE C,[2200,,MEMPNT(D)]
2127 UCPRL2: CAMN C,-1(P)
2134 LDB I,[1000,,T] ;PAGE #
2135 LDB U,[101100,,T] ;USER #
2149 UCPRL1: TRZE T,200000
2152 JRST 4,. ;MMP ADR OUT OF RANGE
2160 UCPRL3: CAIL T,TSYSM
2161 JRST 4,. ;MEMBLT ADR OUT OF RANGE
2162 TLNE H,100000 ;MEMPNT
2164 MOVE C,[2200,,MEMPNT]
2171 \f;DISCARD IDLE DISK UFD'S.
2179 ;FLUSH "UTAPE" (200-WD) BUFFERS
2180 ;TRY TO COMPACTIFY INTO FEWER PAGES BY DELETING PAGES CONTAINING
2181 ;ONLY FREE ONES AND BY MOVING NETWORK BUFFERS AROUND. OTHER KINDS
2182 ;OF BUFFERS DON'T STAY AROUND VERY LONG AND ARE HARD TO MOVE
2183 ;WITHOUT INTRODUCING TIMING/PCLSR'ING BUGS.
2188 UTBFF3: LDB R,[MUR,,MEMBLT(J)]
2194 IFN CHAOSP, PUSHJ P,CHCLN ;ALSO, CLEAN UP CHAOS NET BUFFERS
2195 IFN INETP, PUSHJ P,PKBCLN ; Clean up network packet buffers
2196 ;SWAP OUT ALL LOOSE PAGES. THE REASON THIS IS DONE IS THAT IF THE
2197 ;SYSTEM LOAD IS LIGHT LOOSE PAGES FOR DELETED INQUIR DATA BASE FILES
2198 ;CAN STAY AROUND INDEFINITELY, TYING UP DISK SPACE.
2199 ;SWAPPING OUT LOOSE PAGES DOES NOT CAUSE ANY DISK I/O.
2200 ;SWPOPG MAY NON-SKIP RETURN IF CIRPSW OR A TUT IS LOCKED,
2201 ;IN WHICH CASE WE GIVE UP UNTIL THE NEXT 2-MINUTE CLOCK.
2202 UTBFF6: CONO PI,CLKOFF
2203 SKIPN A,FLOOSP ;GET A LOOSE PAGE
2206 PUSHJ P,SWPOPL ;SWAP OUT EVEN IF LOCKED (SHOULDN'T BE)
2207 JRST UTBFF7 ;COULDN'T SWAP OUT, GIVE UP FOR NOW
2208 CONO PI,CLKON ;ALLOW CHANCE FOR AN INTERRUPT
2211 UTBFF7: CONO PI,CLKON
2214 ;RH(J) HAS PAGE NUMBER OF A BLOCK OF 200-WD BUFFERS
2215 UTBFF2: LDB R,[MNUMB,,MEMBLT(J)] ;GET LIST OF IOBFT ENTRIES IN THIS BLOCK
2217 COSIO1: MOVSI E,200000 ;ALLOC INH ALL BUFFERS IN BLOCK
2219 LDB E,[IOCH,,IOBFT(R)]
2221 AOS Q ;COUNT NUMBER USED FOR SOMETHING
2223 CAIL E,NFNETC+NNETCH
2225 AOS TT ;COUNT NUMBER USED FOR NETWORK
2226 LDB R,[IOLC,,IOBFT(R)]
2229 JUMPE Q,COSIO3 ;IF ALL BUFFERS FREE, FLUSH THIS PAGE
2231 JRST UTBFF1 ;CONTAINS NON-NET BUFFERS, LEAVE ALONE
2234 CAIL E,8 ;IF THERE ARE ENOUGH FREE IN OTHER BLOCKS
2235 JRST CISHUF ;THEN GO SHUFFLE THE NET BUFFERS
2237 UTBFF1: LDB R,[MNUMB,,MEMBLT(J)] ;ABANDON IDEA OF FLUSHING THIS BLOCK
2238 MOVSI E,200000 ;UN-INHIBIT THE BUFFERS..
2239 UTBFF4: ANDCAM E,IOBFT(R)
2240 LDB R,[IOLC,,IOBFT(R)]
2243 POPJ P, ;RETURN OUT OF UTBFF2
2245 ;COME HERE WITH UTTBF SET TO 0 AND OLD VALUE IN E
2246 ;LEAVE UTTBF 0 WHILE SHUFFLING SO NO ONE ELSE CAN ALLOCATE
2249 LDB R,[MNUMB,,MEMBLT(J)]
2250 CISHF1: LDB Q,[IOCH,,IOBFT(R)]
2252 JRST CISHF2 ;FREE, IGNORE
2254 CAILE Q,NFNETC+NNETCH
2255 JRST 4,. ;SOME RANDOM UNSHUFFABLE BUFFER
2257 CISHF2: LDB R,[IOLC,,IOBFT(R)]
2260 POP P,UTTBF ;ALLOW ALLOC AGAIN. THIS MEM BLOCK NOW
2261 ;CONTAINS 8 FREE, ALLOC INH BUFFERS.
2262 ;SO FALL INTO COSIO3 TO FLUSH THEM.
2263 ;FLUSH ALL 8 BUFFERS.
2265 COSIO3: LDB R,[MNUMB,,MEMBLT(J)]
2267 COSIO4: LDB Q,[IOCH,,IOBFT(R)]
2269 JRST 4,. ;BUFFER WAS SUPPOSED TO BE FREE??
2270 MOVEI Q,UTFS-IOBFT ;PNTR TO F.S. LIST
2271 SOS UTTBF ;SOON WILL BE ONE LESS FREE UTAPE BUFFER
2273 COSIO5: MOVE E,Q ;REMOVE IOBFT ENTRY IN R FROM F.S. LIST
2274 LDB Q,[IOLO,,IOBFT(Q)]
2276 JRST 4,. ;IT WASN'T IN THE LIST
2280 LDB Q,[IOLO,,IOBFT(R)]
2281 DPB Q,[IOLO,,IOBFT(E)]
2282 MOVE A,R ;GIVE IOBFT ENTRY BACK TO LIST OF UNUSED IOBFTS
2283 LDB R,[IOLC,,IOBFT(R)]
2289 JUMPN TT,[JRST 4,.] ;BLOCK DIDN'T CONTAIN 8 BUFFERS
2292 CAMGE A,[-NUTIC-NUTOC]
2295 HRRZ A,J ;THIS BLOCK OF MEMORY IS FREE NOW
2296 JRST CMEMR ;AND RETURN OUT OF UTBFF2
2298 ;EXCHANGE BUFFER IN R WITH SOME FREE BUFFER, RETURNED IN A
2299 ;CALL WITH UCTOFF, CHANNEL NUMBER IN Q, TURNS UTCON
2301 COSIMG: MOVEI D,NFNETC(Q) ;CHNL NO TO CONS FOR
2302 AOS UTTBF ;UNRESERVE ONE BUFFER MOMENTARILY
2306 LDB TT,[IOSA1,,IOBFT(R)] ;TRANSFER BUFFER R TO BUFFER A
2307 LDB T,[IOSA1,,IOBFT(A)]
2314 PUSHJ P,IBRTN ;RETURN THE OLD BUFFER
2315 SOS UTTBF ;BUT RESERVE IT
2319 ;SHUFFLE OFF A NCP NETWORK BUFFER
2320 ;R HAS IOBFT INDEX, Q HAS CHANNEL NUMBER, E MUST BE PRESERVED
2325 SUBI Q,NFNETC ;GET IMSOC INDEX
2326 HRRZ A,IMSOC1(Q) ;USER WHO OWNS THIS BUFFER
2328 TDNE T,IMSOC1(Q) ;SKIP OVER USER STOP IF BEING CLOSED
2329 TROA A,-1 ; SINCE USER CAN'T REFERENCE BUFFER ANY MORE
2330 PUSHJ P,RPCLSR ;AND LEAVE A=USER # STOPPED OR 0,,-1 IF NONE
2331 MOVSI T,200000 ;MUSTN'T BE ACTIVE AT PI LEVEL
2334 SKIPN IMSOC6(Q) ;LWAIT RETURNS WITH NETOFF
2335 JRST CINET2 ;BUFFER HAS BEEN RETURNED
2336 MOVSI T,400000 ;LOCK THE BUFFER SO PI LEVEL WON'T TOUCH
2338 LDB T,[221000,,IMSOC6(Q)]
2340 JRST 4,. ;IOBFT ENTRY POINTS TO WRONG CHANNEL
2341 PUSH P,A ;SAVE INDEX OF STOPPED USER
2342 PUSHJ P,COSIMG ;COPY BUFFER
2343 LDB TT,[IOSA,,IOBFT(A)]
2347 SUB T,D ;OFFSET NEW BUFFER MINUS OLD
2349 DPB TT,[003200,,IMSOC6(Q)] ;STORE NEW BUFFER ADDR, LEAVE FLAGS ALONE
2350 ADDM T,IMSBFE(Q) ;RELOCATE VARIOUS POINTERS
2359 TLNN TT,100000 ;SKIP IF INPUT OCCURRED WITH BUFFER LOCKED
2362 MOVE TT,IMPSVP ;RESTART INPUT
2366 IFN DMI,CONO FI,FIIN+NETCHN*11
2367 CINET1: MOVSI TT,500000 ;UNLOCK THE BUFFER, CLEAR INPUT WITH LOCK FLAG
2369 PUSHJ P,IMPIOS ;RESTART OUTPUT
2370 POP P,A ;AND FALL INTO CINET2 TO RESTART USER
2371 CINET2: CONO PI,NETON
2372 JRST NJUPCL ;RESTART USER IF ONE WAS STOPPED
2375 ;FREE BLOCKS THAT BECAME FREE AT INT LEVEL.
2376 ACMTC: SKIPN MEMFP1 ;ANY BLKS BECAME FREE AT INT LVL?
2379 SKIPL MEMFRZ ;IF MEMFRZ IS LOCKED, CAN'T DO THIS. JUST
2380 JRST UTCONJ ;HOPE ENOUGH CORE IS FREE. MUST BE BETTER WAY!
2381 MOVE A,MEMFP1 ;GET # OF ONE OF THEM,
2382 LDB B,[MLO,,MEMBLT(A)] ;REMOVE IT FROM LIST OF SUCH BLOCKS
2384 LDB B,[MUR,,MEMBLT(A)]
2390 ;COPY A PHYSICAL PAGE'S DATA FROM PAGE (J) TO PAGE (D)
2391 CMOVE1: MOVE C,MEMBLT(J)
2404 DPB D,[.CORJT+EXEUMP]
2405 DPB J,[.CORJF+EXEUMP]
2409 MOVE A,[400000+CORJF*2000,,400000+CORJT*2000]
2410 BLT A,400000+CORJT*2000+1777
2412 DPB A,[.CORJT+EXEUMP]
2413 DPB A,[.CORJF+EXEUMP]
2416 MEMMF: LDB A,[MUR,,MEMBLT(D)]
2426 ADDI T,15. ;SLEEP 1/2 SEC. (REALLY SHOULD DO A LOW
2427 CAMLE T,TIME ;PRIORITY UNBLOCK IF SYS LIGHTLY LOADED)
2428 UDELA1: PUSHJ P,UFLS
2432 CAIGE A,SYSB ;CORE ZEROER
2435 DPB A,[.CORJT+EXEUMP]
2437 CLEARM 400000+CORJT*2000
2438 MOVE A,[400000+CORJT*2000,,400000+CORJT*2000+1]
2439 BLT A,400000+CORJT*2000+1777
2441 DPB A,[.CORJT+EXEUMP]
2444 ;ROUTINES TO ALLOCATE BLOCKS OF MEMORY
2445 ;CALL ONLY AT UTC LEVEL OR WITH UTC OFF
2447 OVHMTR ALC ;CORE ALLOCATION
2449 ;SEE IF CAN ALLOCATE MEMORY
2450 MQTEST: MOVE A,MEMFR
2458 ;ALLOCATE PREFERRING HIGH MEMORY, FOR RANDOM USER PAGE. SHUFFLEABLE PAGE OK.
2459 HMRQC: PUSHJ P,MQTEST
2463 HRREI B,MEMHPT-MEMBLT
2464 HMRQ3: LDB A,[MLO,,MEMBLT(B)]
2465 JUMPE A,HMRQ1 ;HIGH HALF FULL TRY LOW
2466 CAIL A,SYSB ;DON'T ALLOCATE PART OF THE SYSTEM
2467 SKIPGE MEMBLT(A) ;DON'T ALLOCATE IF LOCKED
2468 SKIPA B,A ;THIS PAGE NOT AVAIL, TRY NEXT
2469 JRST IMRQ8 ;GOBBLE IT
2474 JRST NMMRQ ;THAT DIDNT WORK, TRY LOW HALF
2476 ;ALLOCATE A BLOCK OF MEM FOR 200-WORD BUFFERS
2479 POPJ P, ;NOT ENOUGH ROOM IM IOBFT
2485 ;GET A BLOCK THAT WON'T BE SHUFFLED, AND IS DIRECTLY ACCESSIBLE.
2486 IOMQ: PUSHJ P,MQTEST ;GET LOW OR MEDIUM MEMORY FOR I/O
2490 NMMRQ: MOVEI A,0 ;MEMFP = MEMBLT+0
2494 IMRQ2: LDB A,[MLO,,MEMBLT(A)]
2501 PUSHJ P,QDFLS ;TRY FLUSHING DISK DIRS
2506 IMRQ6: LDB A,[MLO,,MEMBLT(A)]
2507 JUMPE A,IMRQR ;NO MEM AVAIL IN LOW HALF, TAKE NON-SKIP RETURN
2516 IMRQ3: SKIPGE MEMBLT(A)
2517 JRST IMRQ2 ;LOCKED LOOK FOR ANOTHER
2518 IMRQ9: TDZA B,B ;GOBBLE FROM LOW
2519 IMRQ8: MOVNI B,1 ;GOBBLE FROM HIGH
2520 AOS -2(P) ;CAUSE RETURN TO SKIP
2521 LDB E,[MUR,,MEMBLT(A)]
2524 JRST 4,. ;BLOCK GOT PUT ON FREE STORAGE LIST WITHOUT USAGE FIELD GETTING "FREE"
2525 \f;ROUTINES FOR RETURNING MEMORY
2526 IMEMR: PI2SAF ;HERE OTHERWISE (SEE BELOW)
2529 JRST 4,. ;DON'T RETURN PART OF SYSTEM
2532 CIMEMR: PUSH P,B ;ENTER HERE IF OK TO HACK WITH MEM FROZEN
2533 LDB B,[MUR,,MEMBLT(A)] ;I E CALLING FROM CORE ALLOCATOR
2535 JRST 4,. ;ALREADY FREE, LOSSAGE
2536 SETZM MEMBLT(A) ;INITIALIZE RANDOM FIELDS
2537 CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
2538 CAIGE A,LIOBLK ;LOW SHUFFLEABLE GOES ON HIGH LIST
2540 CAIGE A,128. ;LOW NON-SHUFFLEABLE GOES ON LOW LIST
2542 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2543 SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2545 CIMEM0: LDB B,[MLO,,MEMFP] ;PICK UP HEAD OF APPRO FS LIST
2546 DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
2547 CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2548 DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2549 MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2550 DPB B,[MLU,,MEMBLT(A)]
2551 DPB A,[MLO,,MEMFP] ;STORE THIS AS FREE LIST HEAD
2553 CIMEM3: MOVEI B,MUFR
2554 DPB B,[MUR,,MEMBLT(A)] ;STORE FREE IN USER
2559 CIMEM1: LDB B,[MLO,,MEMHPT] ;PICK UP HEAD OF APPRO FS LIST
2560 DPB B,[MLO,,MEMBLT(A)] ;STORE AS LINK OUT OF CURRENT WD
2561 CAIE B,0 ;SKIP IF NO BLOCK PREVIOUSLY ON LIST
2562 DPB A,[MLU,,MEMBLT(B)] ;MAKE FORMER HEAD'S BACK PNTR POINT TO CURRENT
2563 MOVEI B,0 ;NO BACK PTR, THIS WILL BE FIRST IN LIST
2564 DPB B,[MLU,,MEMBLT(A)]
2565 DPB A,[MLO,,MEMHPT] ;STORE THIS AS FREE LIST HEAD
2568 IMEMR1: PUSH P,B ;FREE A PAGE WHEN MEMFRZ LOCKED.
2569 MOVE B,MEMFP1 ;ADD IT TO FRONT OF MEMFP1 LIST
2570 DPB B,[MLO,,MEMBLT(A)]
2572 MOVEI B,MUFRT ;THEN SAY THIS BLK BECAME FREE WITH MEM FROZEN.
2573 DPB B,[MUR,,MEMBLT(A)]
2577 ;ROUTINES TO RETURN MEMORY CONTINUED
2579 MGMEMR: PUSHJ P,TMEMR ;MAG TAPE MEMR
2584 LDB B,[MUR,,MEMBLT(A)]
2586 JRST 4,. ;RETURNING BLOCK NOT OF TYPE EXPECTED
2588 AOS (P) ;SKIP OVER ARG
2589 MEMR: CONO PI,UTCOFF
2593 CMEMR: CONO PI,UTCOFF
2597 ; ROUTINES TO UNTHREAD BLOCKS FROM FREE LISTS
2600 MPOUT2: JUMPE A,[JRST 4,.] ;ENTER HERE FROM INITIALIZATION IF HOLE FOUND
2603 CAIGE A,256. ;HIGH MOBY GOES ON HIGH LIST
2604 CAIGE A,LIOBLK ;LOW NON-SHUFFLEABLE GOES ON HIGH LIST
2606 CAIGE A,128. ;LOW SHUFFLEABLE GOES ON LOW LIST
2608 CAIL A,128.+NEXPGS ;SHADOWS OF EXEC PAGES GO ON HIGH LIST
2609 SKIPN USEMDM ;MEDIUM MEMORY GOES ON LOW OR HIGH DEPENDING ON USEMDM
2610 MPOUT4: SKIPA B,[-1] ;IT'S HIGH MEM
2611 MPOUT3: MOVEI B,0 ;IT'S LOW MEM
2613 IMRQ4: PUSH P,B ;0 LOW -1 HIGH
2614 LDB B,[MLU,,MEMBLT(A)] ;LINK UP
2615 LDB E,[MLO,,MEMBLT(A)] ;LINK OUT
2616 JUMPN B,IMRQ5 ;JUMP IF NOT FIRST IN LIST
2617 JUMPE E,IMRQ5 ;JUMP IF LAST BLOCK IN LIST
2618 LDB B,[MUR,,MEMBLT(E)] ;FIRST AND FOLLOWED
2620 JRST 4,. ;DOESNT LINK TO A FREE BLOCK
2621 MOVEI B,0 ;PUT BACK 0
2622 IMRQ5: SKIPE E ;SKIP IF NO BLOCK FOLLOWS
2623 DPB B,[MLU,,MEMBLT(E)] ;STORE LINK UP OF PATCHED OUT BLOCK IN LINK OUT BLOCK
2625 DPB E,[MLO,,MEMBLT(B)] ;STORE LINK OUT OF PATCHED OUT BLOCK IN LINK UP BLOCK
2626 POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
2629 IMRQ5A: POP P,B ;GET BACK WHICH PART OF MEM IT'S IN
2630 DPB E,[MLO,,MEMFP(B)] ;THIS WAS FIRST IN FREE LIST, ADJUST LIST HEADER
2631 IMRQ5C: SKIPL B ;SKIP IF NOT IN LOW HALF
2632 SOS LMEMFR ;ADJUST FREE BLOCKS IN LOWER HALF
2633 SOS MEMFR ;1 LESS FREE BLOCK IN SYSTEM
2634 SETZM MEMBLT(A) ;CLEAN UP MEMBLT ENTRY FOR CALLER'S SAKE
2635 MOVEI B,MUINP ;IN PROCESS
2636 DPB B,[MUR,,MEMBLT(A)]
2639 OVHMTR UUO ;MORE MISC UUOS ETC.
2641 TCALL: CONO PI,UTCOFF
2649 SUBTTL MEMORY ALLOCATION TABLES
2651 IOBFTL: MXIOB ;BEG FOR GETSYS (MEMORY)
2652 IOBFT: REPEAT MXIOB-1,176000,,.RPCNT+1 ;MAX DYN ALLOC IO BUFFERS
2653 176000,,377 ;4.9 FREEZE
2655 IOCH==340600 ;4.7-4.2 SYS CHN NO 77 => FREE
2656 IOLC==241000 ;4.1-3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
2657 IOLO==1000 ; LINK TO FOLLOWING BUFFER OR
2658 ;SPECIAL STATES LINK OUT
2659 ;-1 LAST BUFFER CURRENTLY FILLED
2661 ;-3 BUFFER ACTIVE AT MAIN PROG LEVEL
2662 ;-4 BUFFER ACTIVE AT PI LEVEL
2663 ;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
2664 ;CHNLS NUTIC+NUTOC+1 (NFCLC)=>$Q+NCLCH-1 ARE CORE LINK DEVICE
2665 ;CHNLS NFNETC => $Q+NNETCH-1 ARE NET CHNLS
2666 SCNCLO==NUTIC+NUTOC+1
2668 IOSA==101400 ; BUFFER SA _-6
2669 IOSA1==111300 ;ONLY RELEVANT BITS FOR 200 WD BUFFERS
2672 IOBFP: 0 ;FREE STG TO IOBFT ENT
2673 IOBFC: MXIOB-8 ;CNT OF AVAIL
2674 ;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
2676 UTFS: 377 ;FREE STG PNTR TO 200 WD BUFFERS
2677 UTTLB: -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
2678 UTTBF: 0 ;TOTAL UT BUFFERS FREE
2682 EXEUMP=UPGMP+100 ;EXEC UPPER MAP LIVES IN SYSTEM JOB'S MAP AREA
2683 EXELMP==UPGMP ;KL10 AND KS10 ALSO NEED EXEC LOWER MAP, + EXISTS
2684 ];IF2 ;SO USERS CAN COPY PAGES FROM THE SYSTEM JOB
2686 ;TABLE OF BYTE POINTERS THAT POINT TO VIDEO BUFFER AREA OF EXEUMP
2688 TTCRT: REPEAT NTVBP,[
2689 CONC [.TTR]\.RPCNT,+EXEUMP
2694 ;DBR FOR REFERENCING PDP6 MEM
2695 PDP6MP: <LPDP6M/2>_1,,PDPUMP
2697 ;PAGE MAP FOR REFERENCING PDP6 MEM
2698 PDPUMP: REPEAT LPDP6M/2,600000+<PDP6BM_-10.>+2*.RPCNT,,600000+<PDP6BM_-10.>+2*.RPCNT+1
2702 DDEXCF: BLOCK NEXPGS ;-1 IF EXEC PAGE SET UP FOR 340
2705 IFN KA10P, EXECMP: 100_1,,EXEUMP ;EXEC DBR
2706 \f;MEMORY ORGANIZATION
2708 ;PAGE 0 ALWAYS BELONGS TO THE SYSTEM AND IS NEVER ALLOCATED OR FREED.
2710 ;N PAGES OF SYSTEM CODE AND VARIABLES ARE ACQUIRED BY THE SYSTEM JOB AT STARTUP.
2712 ;N PAGES OF USER-VARIABLE BLOCKS BELONG TO THE SYSTEM JOB. THESE ARE
2713 ;ALLOCATED AND DEALLOCATED AS REQUIRED. LIOBLK-1 IS THE HIGHEST THIS CAN GO.
2714 ;USER PAGES BELOW LIOBLK CAN BE SHUFFLED OUT WHEN THE SYSTEM JOB NEEDS THE CORE.
2716 ;FROM LIOBLK TO 128K IS THE "LOW HALF." THESE PAGES ARE DIRECTLY ADDRESSABLE
2717 ;IN EXEC MODE AND NEVER NEED TO BE SHUFFLED. I/O BUFFERS, DISK DIRECTORIES,
2718 ;ETC. ARE ALLOCATED IN THESE PAGES.
2720 ;128K TO 128K+NEXPGS ARE PAGES WHICH CAN'T BE ADDRESSED DIRECTLY FROM
2721 ;EXEC MODE BECAUSE THEIR EXEUMP SLOTS ARE USED BY "EXEC PAGES."
2723 ;THE REST OF THE LOW MOBY, UP TO FDDTPG, IS DIRECT-MAPPED AND
2724 ;USED FOR ADDITIONAL "LOW HALF" PAGES.
2726 ;FDDTPG TO 256K CONTAINS DDT AND THE SYSTEM SYMBOL TABLE.
2728 ;PAGES ABOVE 256K ARE IN THE "HIGH MOBY".
2730 ;PAGES NOT IN THE "LOW HALF" (BELOW LIOBLK, SHADOWED BY EXEC, OR HIGH MOBY)
2731 ;ARE CONSIDERED TO BE IN THE "HIGH HALF". USER PAGES PREFER TO GO HERE.
2734 ; IF USEMDM IS OFF, THE DIRECT MAPPED PAGES IN THE HIGH HALF
2735 ; OF THE LOW MOBY ARE CONSIDERED HIGH RATHER THAN LOW. THIS IS USED
2736 ; MOSTLY FOR DEBUGGING, TO CATCH REFERENCES TO RANDOM ADDRESSES.
2737 ; THERE CAN BE HOLES IN MEMORY (NXM).
2739 ;THE MEMBLT TABLE HAS ONE WORD FOR EACH 1K BLOCK OF MEMORY.
2740 ;IT SAYS WHAT THAT BLOCK IS USED FOR AND CONTAINS LINKS TO OTHER
2741 ;BLOCKS AND OTHER TABLES. THE MEMPNT AND MMSWP TABLES ALSO CONTAIN
2742 ;ONE WORD PER BLOCK AND CONTAIN ADDITIONAL INFORMATION.
2744 FDDTPG: 0 ;# OF LOWEST BLOCK USED BY DDT & SYMTAB (SET AT STARTUP)
2746 MEMFR: 0 ;# OF FREE BLOCKS IN ALL OF MEMORY.
2748 LMEMFR: 0 ;# OF FREE BLOCKS IN LOW LIST (MEMFP).
2750 MINCOR: 8 ;TRY TO KEEP THIS MANY PAGES FREE IN LOW MEMORY
2751 ;MUST BE >= 3, SINCE LESSER-PRIORITY CONSUMERS OF
2752 ;MEMORY WAIT IF LMEMFR IS < 3.
2754 MEMFP1: 0 ;LIST (THREADED THROUGH MLO, TERMINATED BY 0)
2755 ;OF BLKS THAT BECAME FREE WHILE MEMFRZ WAS LOCKED.
2757 MEMHPT: 0 ;FREE LIST OF HIGH HALF PAGES AND HIGH MOBY PAGES
2758 ;AND SHUFFLEABLE LOW HALF PAGES. MUST BE AT MEMFP-1.
2760 MEMBLT: 0 ;FREE LIST POINTER FOR LOW PGS AND ALSO WD FOR BLOCK 0
2761 BLOCK TSYSM-1 .SEE BEGF0 ;FILLS THIS IN
2763 ;FIELDS IN MEMBLT ENTRY:
2764 ;4.9 FREEZE OR ALLOC INHIBIT
2765 ;IF 4.9=1, DONT SET UP ANY MORE EXEC PGS POINTING TO THIS ONE
2766 MUR==360500 ;4.4-4.8 USAGE CODE
2767 MURUSR==1 ;USER PAGE, MMMPX=MMP INDEX
2769 MUIOB==3 ;200 WD BUFFERS, MNUMB=FIRST IOBFT ENTRY IN BLOCK
2771 MUINP==5 ;IN PROCESS OF BEING ALLOCATED
2772 MUMGB==6 ;MAG TAPE BUFFER, MNUMB=TAPE NO+EOF BIT, MWC=WORD COUNT
2774 MUDISB==10 ;340 DISPLAY BUFFER
2775 MUFRT==11 ;BLOCK RETURNING TO FREE WHEN MEM LOCKED
2776 MU23B==12 ;DISK BUF, MWC=WORD COUNT, MNUMB=CHANNEL
2777 MU23UD==13 ;DISK USER DIR, MNUMB=QSNUD SLOT
2778 MU23MD==14 ;DISK MASTER DIR
2779 MU23TT==15 ;DISK TUT MNUMB=DISK NO.
2780 MU23LS==16 ;DISK COPY OF USER DIR FOR LISTING
2781 MUHOLE==17 ;"HOLE" IN REAL MEM
2782 MUDDT==20 ;"DDT" PAGE
2783 MUNET==21 ;NETWORK "BIG" BUFFER
2784 MUSWPG==22 ;PAGE IN SWAPPING QUEUE, MMMPX=MMP INDEX
2785 MUCHA==23 ;CHAOS NET BUFFERS
2786 MU23FB==24 .SEE QSFBT ;DISK FREED-BLOCKS TABLES
2787 MUPKT==25 ; Net packet buffers
2788 MUDVB==26 ;Semi-static device IO buffer page
2789 ;ADD NEW MUR TYPES HERE ^
2790 MURMAX==27 ;HIGHEST VALID CODE + 1
2792 MWC==221400 ;3.1-4.3 WORD COUNT IN I/O BUFFERS
2794 MLU==221400 ;3.1-4.3 LINK UP FOR DOUBLY-THREADED FREE LIST
2796 MNUMB==140600 ;2.4-2.9 MAGIC NUMBER SEE COMMENTS UNDER MUR ABOVE
2798 MMMPX==142200 ;2.4-4.3 MMP INDEX IN USER PGS + SWAP BUFFERS
2800 MLO==001400 ;1.1-2.3 LINK TO NEXT PAGE IN A LIST
2802 ;UNLIKE IOLO AND PREVIOUS VERSION OF MLO, THERE ARE NO MAGIC NEGATIVE CODES
2803 ;N.B.: MLO MUST BE AT RIGHT-HAND END OF WORD - CODE DEPENDS
2805 MEMPNT: BLOCK TSYSM ;RH USED FOR CIRC MEM USE PNTR IF USER MEM
2806 ;LH FOR DISK ADDRESS CAME FROM OR GOING TO
2807 ;MEMPNT HAS BLOCK NUMBER
2808 ;DISK NUMBER COMES FROM CHANNEL LINKED TO
2809 ;CIRCULAR PAGE LINK FORM
2814 ;2.8=0 2.7-1.1 LINK TO MMP TABLE
2815 ;2.8=1 2.7-1.1 LINK TO MEM PNT TABLE
2816 ;EXCEPT 2.9-1.1=777777 => ABSOLUTE PAGE, NOT LINKED
2818 MMSWP: BLOCK TSYSM ;IF USER MEM, HAS NUMBER OF PAGE TABLE WORDS
2819 ; WHICH POINT AT THIS PAGE. LH IS NUMBER OF EXEC
2820 ; PAGES, RH IS NUMBER OF USER PAGES. NOTE THAT THE
2821 ; NUMBER OF UPGCP ENTRIES COULD BE MORE, FOR VARIOUS
2822 ; REASONS, E.G. CIRPSW LOCKED WHEN PAGE SWAPPED IN,
2823 ; OR A USER WAS SWAPPED OUT.
2824 ;IFN SWPWSP, RH(MMSWP) IS USED AS NUMBER OF SHARERS.
2826 EMEMTL==.-1 ;END FOR GETSYS (MEMORY)
2828 MMPRTC: 0 ;C AT MMPRTN, FOR DEBUGGING
2830 MMPFS: 0 ;FREE-LIST OF MMP ENTRIES. VALUE IS ADDRESS. (FORMERLY WAS IDX).
2832 MMPFS2: 0 ;LIST OF MMPS THAT NEED TO HAVE TUT SOS'ED BEFORE THEY CAN BE FREED.
2833 ;TUT COULDN'T BE SOS'ED AT P.I. LEVEL BECAUSE IT WAS LOCKED.
2834 ;THESE MMPS MAY ALSO NEED TO BE REMOVED FROM THE SHAREABLE
2835 ;PAGE TABLE, WHICH REQUIRES CIRPSW.
2837 MMPCNT: 0 ;# OF MMP ENTRIES IN USE.
2839 MMPFR: NMMP*1000 ;MAX POSSIBLE # MMP ENTRIES, MINUS # IN USE OR COMMITTED.
2841 ;MMP TABLE - TWO WDS PER ENTRY
2842 MMPPUB==400000 ;WD1 4.9 INDICATES A PUBLIC PAGE IF ON (ANYONE CAN ATTACH TO WRITE)
2843 MMPOUT==200000 ;4.8 => PAGE IS SWAPPED OUT OR ON WAY OUT.
2844 MMPTMP==100000 ;4.7 => IN TRANSIT (ON WAY IN OR ON WAY OUT).
2845 MMPWOD==40000 ;4.6 => THIS PAGE HAS BEEN WRITTEN ON DISK AT LEAST ONCE
2846 MMPISW==20000 ;4.5 PAGE ON INITIAL SWAPIN, BEING COPIED SO SWAP OUT TO DIFF PLACE
2847 MMPWRT==10000 ;4.4 HAS BEEN WRITTEN SINCE LAST DISK WRITE BY USER WHO HAS DETACHED THIS PAGE
2848 MMPGON==4000 ;4.3 FILE PAGE BEING WRITTEN OUT AFTER
2849 ;DELETED FROM ALL MAPS (MMP ENTRY WILL SOON GO AWAY.)
2850 MMPBAD==2000 ;4.2 PAGE GOT PAR ERR SINCE LAST TIME SWAPPED OUT OR IN.
2851 MMPLOK==1000 ;4.1 => PAGE MAY NOT BE SWAPPED OUT.
2852 MMPSLO==400 ;3.9 => PAGE SHOULD GO IN SLOW MEMORY.
2853 MMPSHR==200 ;3.8 MMP ENTRY IS IN SHAREABLE PAGE HASH TABLE
2854 MMPPGA==100 ;3.7 BEING SWAPPED IN BY PAGE-AHEAD. DON'T PUT IN USER MAPS; WAIT FOR FAULTS.
2855 MMPPGB==40 ;3.6 BEING SWAPPED OUT BY PAGE-BEHIND.
2856 $MMPUN==220300 ;3.1-3.3 UNIT NUMBER (GOES WITH DISK ADDR IN WD2 LH)
2857 ;WD1 RH CIRC MEM USE PNTR
2858 ;WD2 LH READ DISK ADR OR 0
2859 ;WD2 RH THREAD FOR SHAREABLE PAGE HASH TABLE
2861 MMPNP: 0 ;#MMP PGS ACTUALLY IN USE
2862 MMPMX: 0 ;HIGHEST VALID MMP INDEX (MMPNP*2000)
2864 MMMPG: BLOCK NMMP ;BLOCK NOS OF BLOCKS ACTUALLY USED
2866 ;SHAREABLE PAGE HASH TABLE
2867 ;MMP ENTRIES THAT ARE SHARED WITH FILES ARE LISTED HERE TO SAVE TIME AT NCORQ2
2868 ;SIMPLE REMAINDER HASH ON UNIT#,,DISK ADDRESS,
2869 ;BUCKETS THREADED THROUGH RH(MMPE+1)
2871 SHRHSL==31. ;NUMBER OF BUCKETS
2872 SHRHSH: BLOCK SHRHSL
2874 ;"LOOSE" PAGES (NOT USED BY ANY USER, BUT NOT YET SWAPPED OUT.)
2875 ;MMP ENTRY GOES AWAY WHEN SWAPPED OUT, OR GETS PUT BACK INTO SERVICE AT NCORQ3.
2876 NLOOSP: 0 ;NUMBER OF LOOSE PAGES
2877 FLOOSP: 0 ;HEAD OF LIST. THREADED THROUGH MLO IN MEMBLT.
2878 LLOOSP: 0 ;TAIL OF LIST. ADD AT TAIL, SWAPPER REMOVES FROM HEAD.
2881 MMPEAD: REPEAT NMMP, CONC MMP,\.RPCNT,*2000+400000 ;EXEC ADR
2882 MMPPPP: REPEAT NMMP, CONC .MMP,\.RPCNT,+EXEUMP ;PNTR TO EXEC PC MP
2883 USEMDM: DIRMAP ;NON-ZERO => USE MEDIUM MEMORY.
2884 ;DON'T CHANGE AFTER SYSTEM STARTUP
2886 SUBTTL 200-WORD I/O BUFFER ROUTINES
2890 ; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
2891 ;NUTIC+NUTOC (=NFCLC-1) =>UTAPE FILE DIR
2892 ;NFCLS-NFCLC+NCLCH-1 (=NFNETC-1) => CORE LINK
2893 ;NFNETC-NNETCH => NETWORK
2895 IOBCNS: MOVEI A,IOBFP-IOBFT
2897 LDB A,[IOLO,,IOBFT(A)]
2899 JRST 4,. ;IOBFT POINTERS FOULED UP
2901 IOBC2: LDB B,[420200,,IOBFT(A)]
2903 LDB B,[IOLO,,IOBFT(A)]
2904 DPB B,[IOLO,,IOBFT(E)]
2909 IOBR: MOVE B,IOBFP ;RETURN IOBFT WORD
2911 DPB B,[IOLO,,IOBFT(A)]
2914 DPB B,[IOCH,,IOBFT(A)]
2918 IUTCONS: ;ALLOCATE 200 WORD BUFFER
2920 SKIPG UTTBF ;CLOBBERS A B E TT, RETURNS IOBFT INDEX IN A
2921 JRST IUTC1 ;NO UTAPE BUFFERS FREE
2923 MOVE A,UTFS ;CHNL NO IN D
2926 LDB B,[420200,,IOBFT(A)]
2928 LDB B,[IOCH,,IOBFT(A)]
2930 JRST 4,. ;BUFFER BEING ALLOCATED ISN'T FREE.
2931 LDB B,[IOLO,,IOBFT(A)]
2932 DPB B,[IOLO,,IOBFT(E)]
2933 DPB D,[IOCH,,IOBFT(A)]
2938 LDB A,[IOLO,,IOBFT(A)]
2941 IUTC1: PUSHJ P,UIMRQ
2947 PUSH P,B ;FREE 200 WORD BUFFER (SEE BRTN)
2948 ; LDB B,[IOCH,,IOBFT(A)]
2950 ; JRST 4,. ;RETURNING A BUFFER THAT'S FREE?
2952 DPB B,[IOLO,,IOBFT(A)]
2955 DPB B,[IOCH,,IOBFT(A)]
2956 LDB B,[IOSA,,IOBFT(A)]
2962 UTMGB: PUSH P,J ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
2968 DPB B,[MUR,,MEMBLT(A)]
2970 LSH A,10.-6. ;CONV TO BUF SA
2971 MOVE TT,A ;INCR TO NEXT BUF ADR
2973 ADDM R,UTTLB ;UTTBF AOSED AT IBRTN
2975 UTMG1: PUSHJ P,IOBCNS
2976 DPB TT,[IOSA,,IOBFT(A)]
2978 DPB A,[IOLC,,IOBFT(Q)]
2984 DPB TT,[IOLC,,IOBFT(A)]
2990 FSCMP: ;RECOMPUTE UTAPE BUFFER FAIR SHARE
3000 UTMG2: DPB A,[MNUMB,,MEMBLT(J)]
3003 BRTN: CONO PI,UTCOFF ;RETURN A 200-WD BUFFER