;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Private patches made by naha
;;; Reason:
;;;  
;;; Written 16-May-86 15:43:13 by naha (Mark Nahabedian) at site LMI Cambridge
;;; while running on Laurie Anderson from band 1
;;; with Experimental System 110.232, Experimental Lambda-Diag 7.5, Experimental Local-File 68.7, Experimental FILE-Server 18.4, Experimental Unix-Interface 9.1, Experimental ZMail 65.14, Experimental Object Lisp 3.1, Experimental Tape 6.38, Experimental Site Data Editor 3.3, Experimental Tiger 24.0, Experimental KERMIT 31.3, Experimental Window-Maker 1.1, Experimental Gateway 4.7, Experimental TCP-Kernel 39.7, Experimental TCP-User 62.7, Experimental TCP-Server 45.5, Experimental MEDIUM-RESOLUTION-COLOR 3.4, Experimental MICRO-COMPILATION-TOOLS 3.2, microcode 1505, SDU ROM 102, pace's band.



; From modified file DJ: L.IO; DISK.LISP#401 at 16-May-86 15:43:26
#8R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: IO; DISK  "

(defvar *disable-page-out-words* t)

;;; Just mark pages as good to swap out; don't actually write them.
(DEFUN PAGE-OUT-WORDS (ADDRESS NWDS &OPTIONAL ONLY-IF-UNMODIFIED &AUX STS)
  ONLY-IF-UNMODIFIED
  (when (null *disable-page-out-words*)
    (WITHOUT-INTERRUPTS
      (SETQ ADDRESS (%POINTER ADDRESS))
      ;; This DO is over the whole frob
      (DO ((ADDR (LOGAND (- PAGE-SIZE) ADDRESS) (%MAKE-POINTER-OFFSET DTP-FIX ADDR PAGE-SIZE))
	   (N (+ NWDS (LOGAND (1- PAGE-SIZE) ADDRESS)) (- N PAGE-SIZE)))
	  ((NOT (PLUSP N)))
	(OR (NULL (SETQ STS (%PAGE-STATUS ADDR)))	;Swapped out
	    ( (LDB %%PHT1-SWAP-STATUS-CODE STS)
	       %PHT-SWAP-STATUS-WIRED)		;Wired
	    (%CHANGE-PAGE-STATUS ADDRESS %PHT-SWAP-STATUS-FLUSHABLE
				 (LDB %%REGION-MAP-BITS
				      (%REGION-BITS (%REGION-NUMBER ADDRESS)))))))))

(DEFUN REALLY-PAGE-OUT-PAGE (ADDRESS &AUX CCWP PS PHYS-ADR)
  "Write it on the disk, changing in-core page table status to RWF, etc."
  (when (null *disable-page-out-words*)
    (select-processor
      ((:lambda :cadr)
       (WITHOUT-INTERRUPTS
	 (SETQ ADDRESS (%POINTER ADDRESS))
	 (UNWIND-PROTECT
	     (PROG ()
		   (WIRE-PAGE-RQB)
		   (SETQ CCWP %DISK-RQ-CCW-LIST)
		   ;; We collect some page frames to put them in, remembering the
		   ;; PFNs as CCWs.
		   (COND ((OR (NULL (SETQ PS (%PAGE-STATUS ADDRESS)))
			      (= 0 (LDB %%PHT1-MODIFIED-BIT PS))
			      (NULL (SETQ PHYS-ADR (%PHYSICAL-ADDRESS ADDRESS))))
			  (RETURN NIL))
			 (T (LET ((PFN (LSH PHYS-ADR -8)))
			      (ASET (1+ (LSH PFN 8)) PAGE-RQB CCWP)
			      (ASET (LSH PFN -8) PAGE-RQB (1+ CCWP)))
			    (SETQ CCWP (+ 2 CCWP))
			    (ASET (LOGAND (AREF PAGE-RQB (- CCWP 2)) -2)	;Turn off chain bit
				  PAGE-RQB (- CCWP 2))
			    (DISK-WRITE-WIRED PAGE-RQB 0 (+ (LSH ADDRESS -8) PAGE-OFFSET))
			    (%CHANGE-PAGE-STATUS ADDRESS (+ 1_23. %PHT-SWAP-STATUS-FLUSHABLE)
						 (LDB %%REGION-MAP-BITS
						      (%REGION-BITS (%REGION-NUMBER ADDRESS))))
			    (RETURN T)
			    )))
	   ;; UNWIND-PROTECT forms
	   (UNWIRE-PAGE-RQB)
	   )))
      (:explorer nil))))
))
