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

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Jun 4 13:33:50 UTC 2004


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

Modified Files:
	interrupt.lisp 
Log Message:
Improved restarting atomically blocks.

Date: Fri Jun  4 06:33:50 2004
Author: ffjeld

Index: movitz/losp/muerte/interrupt.lisp
diff -u movitz/losp/muerte/interrupt.lisp:1.11 movitz/losp/muerte/interrupt.lisp:1.12
--- movitz/losp/muerte/interrupt.lisp:1.11	Wed Jun  2 07:31:01 2004
+++ movitz/losp/muerte/interrupt.lisp	Fri Jun  4 06:33:50 2004
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Wed Apr  7 01:50:03 2004
 ;;;;                
-;;;; $Id: interrupt.lisp,v 1.11 2004/06/02 14:31:01 ffjeld Exp $
+;;;; $Id: interrupt.lisp,v 1.12 2004/06/04 13:33:50 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -82,6 +82,7 @@
 	    (:pushl :edi)		; -28
 	    (:movl ':nil-value :edi)	; We want NIL!
 	    (:locally (:pushl (:edi (:edi-offset atomically-status)))) ; -32
+	    (:locally (:pushl (:edi (:edi-offset atomically-esp)))) ; -36
 
 	    (:locally (:movl 0 (:edi (:edi-offset atomically-status))))
 
@@ -145,12 +146,18 @@
 	    ;; Interrupted code was non-atomical, the normal case.
 	   normal-return		; With atomically-status-to-restore in ECX
 	    (:locally (:movl :ecx (:edi (:edi-offset atomically-status))))
+	    (:movl (:ebp -36) :ecx)	; Load interruptee's atomically-esp..
+	    (:locally (:movl :ecx (:edi (:edi-offset atomically-esp)))) ; ..and restore it.
 	    (:movl (:ebp -28) :edi)
 	    (:movl (:ebp -24) :esi)
 	    (:movl (:ebp -20) :ebx)
 	    (:movl (:ebp -16) :edx)
 	    (:movl (:ebp -12) :eax)
 	    (:movl (:ebp -8)  :ecx)
+	    ;; Make stack safe before we exit interrupt-frame..
+	    (:movl :edi (:ebp 4))
+	    (:movl :edi (:ebp 8))
+	    (:movl :edi (:ebp 12))
 	    (:leave)
 	    (:addl 12 :esp)
 	    (:popfl)			; pop EFLAGS
@@ -175,20 +182,42 @@
 	   not-simple-atomical-pf-restart
 	    (:cmpb ,(bt:enum-value 'movitz::atomically-status :restart-jumper) :cl)
 	    (:jne 'not-simple-restart-jumper)
-	    (:testl ,(bt:enum-value 'movitz::atomically-status '(:eax :ebx :ecx :edx))
+	    (:testl ,(bt:enum-value 'movitz::atomically-status :esp)
 		    :ecx)		; map of registers to restore
-	    (:jnz 'not-simple-restart-jumper)
-	    (:shrl 16 :ecx)		; move atomically-status data into ECX
-	    (:movl (:ebp -24) :eax)	; This is the interruptee's ESI/funobj
-	    (:movl (:eax (:ecx 4) ,(bt:slot-offset 'movitz:movitz-funobj 'movitz::constant0))
-		   :ecx)		; This is the EIP to restart
-	    (:movl :ecx (:ebp 20))
+	    (:jnz 'atomically-esp-ok)
+	    ;; Generate the correct ESP for interruptee's atomically-esp
+	    (:leal (:ebp 24) :ecx)
+	    (:movl :ecx (:ebp -36))
+	   atomically-esp-ok
 	    (:movl (:ebp -32) :ecx)
 	    (:testl ,(bt:enum-value 'movitz::atomically-status :reset-status-p)
 		    :ecx)		; Should we reset status to zero?
-	    (:jnz 'normal-return)
+	    (:jnz 'atomically-jumper-return)
 	    (:xorl :ecx :ecx)		; Do reset status to zero.
-	    (:jmp 'normal-return)
+	    
+	   atomically-jumper-return
+	    (:locally (:movl :ecx (:edi (:edi-offset atomically-status))))
+	    (:movl (:ebp -36) :ecx)	; Load interruptee's atomically-esp..
+	    (:locally (:movl :ecx (:edi (:edi-offset atomically-esp)))) ; ..and restore it.
+	    (:movl (:ebp -28) :edi)
+	    (:movl (:ebp -24) :esi)
+	    (:movl (:ebp -16) :edx)
+	    (:movl (:ebp -12) :eax)
+	    (:movl (:ebp -8)  :ecx)
+
+	    (:movl (:ebp -32) :ebx)	; atomically-status..
+	    (:shrl ,(- 16 movitz:+movitz-fixnum-shift+) :ebx)
+
+	    ;; Make stack safe before we exit interrupt-frame..
+	    (:movl :edi (:ebp 4))
+	    (:movl :edi (:ebp 8))
+	    (:movl :edi (:ebp 12))
+	    (:movl :edi (:ebp 16))
+	    (:movl :edi (:ebp 20))
+	    (:movl (:ebp 0) :ebp)	; pop stack-frame
+	    (:locally (:movl (:edi (:edi-offset atomically-esp)) :esp)) ; restore ESP
+	    (:jmp (:esi :ebx ,(bt:slot-offset 'movitz:movitz-funobj 'movitz::constant0)))
+
 	   not-simple-restart-jumper
 	    ;; Don't know what to do.
 	    (:halt)





More information about the Movitz-cvs mailing list