[movitz-cvs] CVS update: movitz/losp/muerte/interrupt.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Sun Jun 6 02:10:55 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv10187
Modified Files:
interrupt.lisp
Log Message:
More cruft for restarting atomically blocks. I really need to document
this stuff properly before I forget the details.
Date: Sat Jun 5 19:10:55 2004
Author: ffjeld
Index: movitz/losp/muerte/interrupt.lisp
diff -u movitz/losp/muerte/interrupt.lisp:1.12 movitz/losp/muerte/interrupt.lisp:1.13
--- movitz/losp/muerte/interrupt.lisp:1.12 Fri Jun 4 06:33:50 2004
+++ movitz/losp/muerte/interrupt.lisp Sat Jun 5 19:10:55 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.12 2004/06/04 13:33:50 ffjeld Exp $
+;;;; $Id: interrupt.lisp,v 1.13 2004/06/06 02:10:55 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -106,6 +106,7 @@
;; *DEST* iret branches to here.
;; we're now in the context of the interruptee.
+ (:cld)
;; Save/push thread-local values
(:locally (:movl (:edi (:edi-offset num-values)) :ecx))
(:jecxz 'push-values-done)
@@ -166,8 +167,7 @@
restart-atomical-block
(:cmpb ,(bt:enum-value 'movitz::atomically-status :restart-primitive-function) :cl)
(:jne 'not-simple-atomical-pf-restart)
- (:testl ,(bt:enum-value 'movitz::atomically-status '(:eax :ebx :ecx :edx))
- :ecx) ; map of registers to restore
+ (:testl #xff00 :ecx) ; map of registers to restore
(:jnz 'not-simple-atomical-pf-restart)
(:sarl 16 :ecx) ; move atomically-status data into ECX
(:movl (:edi (:ecx 4) ,(- (movitz:tag :null)))
@@ -199,6 +199,10 @@
(: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.
+
+ (:testl #x40 (:ebp 16)) ; Test EFLAGS bit DF
+ (:jnz 'atomically-jumper-return-dirty-registers)
+
(:movl (:ebp -28) :edi)
(:movl (:ebp -24) :esi)
(:movl (:ebp -16) :edx)
@@ -215,6 +219,28 @@
(: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)))
+
+ atomically-jumper-return-dirty-registers
+ ;; If the interruptee had DF set, then initialize all GP registers with
+ ;; safe values, keep EBP, set ESI=(EBP -4), and EDI is known-good EDI.
+ ;; DF will be cleared.
+ (:movl :edi :edx)
+ (:movl :edi :eax)
+ (:movl :edi :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 interrupt-frame
+ (:movl (:ebp -4) :esi)
(:locally (:movl (:edi (:edi-offset atomically-esp)) :esp)) ; restore ESP
(:jmp (:esi :ebx ,(bt:slot-offset 'movitz:movitz-funobj 'movitz::constant0)))
More information about the Movitz-cvs
mailing list