[movitz-cvs] CVS update: movitz/losp/muerte/scavenge.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Mon Jan 31 17:54:06 UTC 2005


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv26913

Modified Files:
	scavenge.lisp 
Log Message:
Do RET roll-forward in map-stack-dit.

Date: Mon Jan 31 09:54:04 2005
Author: ffjeld

Index: movitz/losp/muerte/scavenge.lisp
diff -u movitz/losp/muerte/scavenge.lisp:1.44 movitz/losp/muerte/scavenge.lisp:1.45
--- movitz/losp/muerte/scavenge.lisp:1.44	Fri Jan 28 00:47:18 2005
+++ movitz/losp/muerte/scavenge.lisp	Mon Jan 31 09:54:03 2005
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Mon Mar 29 14:54:08 2004
 ;;;;                
-;;;; $Id: scavenge.lisp,v 1.44 2005/01/28 08:47:18 ffjeld Exp $
+;;;; $Id: scavenge.lisp,v 1.45 2005/01/31 17:54:03 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -168,7 +168,14 @@
 	     (+ start-frame 1)
 	     map-region))
 
-(defun scavenge-find-code-vector (location casf-funobj esi &optional searchp)
+(defun scavenge-find-pf (location)
+  (loop for (slot-name type) in (slot-value (class-of (current-run-time-context)) 'slot-map)
+      do (when (eq type 'code-vector-word)
+	   (let ((code-vector (%run-time-context-slot slot-name)))
+	     (when (location-in-object-p code-vector location)
+	       (return code-vector))))))
+
+(defun scavenge-find-code-vector (location casf-funobj esi &optional primitive-function-p)
   (flet ((match-funobj (funobj location)
 	   (cond
 	    ((not (typep funobj 'function))
@@ -201,7 +208,9 @@
       (break "Unknown funobj/frame-type: ~S" casf-funobj))
      ((location-in-object-p (%run-time-context-slot 'dynamic-jump-next) location)
       (%run-time-context-slot 'dynamic-jump-next))
-     ((when searchp
+     ((when primitive-function-p
+	(scavenge-find-pf location)
+	#+ignore
 	(%find-code-vector location)))
      (t (with-simple-restart (continue "Try to perform a code-vector-search.")
 	  (error "Unable to decode EIP #x~X funobj ~S, ESI ~S."
@@ -216,6 +225,8 @@
     (funcall function value frame)))
 
 (defun map-stack (function frame frame-bottom eip-index map-region)
+  "Scavenge the stack starting at location <frame> which ends at <frame-bottom>
+and whose return instruction-pointer is at location eip-index."
   (with-funcallable (map-region)
     (loop
       ;; for frame = frame then (stack-frame-uplink frame)
@@ -252,6 +263,7 @@
 	       #'map-header-vals)))
 
 (defun map-stack-dit (function dit-frame frame-bottom eip-index map-region)
+  "Scavenge the stack, starting at a DIT stack-frame." 
   (with-funcallable (map-region)
     (let* ((atomically
 	    (dit-frame-ref nil dit-frame :atomically-continuation :unsigned-byte32))
@@ -271,11 +283,10 @@
 	     (= 0 (ldb (byte 2 0) atomically)))
 	;; Interrupt occurred inside an (non-pf) atomically, so none of the
 	;; GC-root registers are active.
-	#+ignore
-	(setf (dit-frame-ref nil dit-frame :eax) nil
-	      (dit-frame-ref nil dit-frame :ebx) nil
-	      (dit-frame-ref nil dit-frame :edx) nil
-	      (dit-frame-ref nil dit-frame :esi) nil)
+	#+ignore (setf (dit-frame-ref nil dit-frame :eax) nil
+		       (dit-frame-ref nil dit-frame :ebx) nil
+		       (dit-frame-ref nil dit-frame :edx) nil
+		       (dit-frame-ref nil dit-frame :esi) nil)
 	(map-region function frame-bottom (+ dit-frame 1 (dit-frame-index :scratch1))))
        (secondary-register-mode-p
 	;; EBX is also active
@@ -294,12 +305,15 @@
 	;;
 	(multiple-value-bind (x0-location x0-tag)
 	    (stack-frame-ref nil next-frame-bottom 0 :signed-byte30+2)
-	  ;; (warn "X0: ~S ~S" x0-location x0-tag)
 	  (cond
 	   ((and (or (eq x0-tag 1)	; 1 or 5?
 		     (eq x0-tag 3)	; 3 or 7?
 		     (and (oddp x0-location) (eq x0-tag 2))) ; 6?
 		 (location-in-object-p casf-code-vector x0-location))
+	    (when (= #xc3 (memref-int (stack-frame-ref nil next-eip-index 0 :unsigned-byte32)
+				      :physicalp nil :type :unsigned-byte8))
+	      (setf (stack-frame-ref nil next-eip-index 0 :code-vector)
+		(symbol-value 'ret-trampoline)))
 	    (let* ((old-x0-code-vector
 		    (scavenge-find-code-vector (stack-frame-ref nil next-eip-index 0 :location)
 					       casf-funobj interrupted-esi t)))
@@ -329,15 +343,5 @@
     (when (not (eq old-code-vector new-code-vector))
       (break "Code-vector for stack instruction-pointer moved. [index: ~S]" index))
     new-code-vector))
-
-(defun map-stack-flaccid-pointer (function index)
-  "If the pointed-to object is moved, reset pointer to NIL."
-  (let ((old (stack-frame-ref nil index 0)))
-    (cond
-     ((not (typep old 'pointer))
-      old)
-     ((eq old (funcall function old index))
-      old)
-     (t (setf (stack-frame-ref nil index 0) nil)))))
 
 




More information about the Movitz-cvs mailing list