[movitz-cvs] CVS update: movitz/losp/muerte/segments.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Wed Apr 13 06:57:02 UTC 2005
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv3835
Modified Files:
segments.lisp
Log Message:
Reworked %sgdt and %lgdt.
Date: Wed Apr 13 08:57:02 2005
Author: ffjeld
Index: movitz/losp/muerte/segments.lisp
diff -u movitz/losp/muerte/segments.lisp:1.6 movitz/losp/muerte/segments.lisp:1.7
--- movitz/losp/muerte/segments.lisp:1.6 Wed Apr 13 08:43:12 2005
+++ movitz/losp/muerte/segments.lisp Wed Apr 13 08:57:01 2005
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Thu May 8 14:25:06 2003
;;;;
-;;;; $Id: segments.lisp,v 1.6 2005/04/13 06:43:12 ffjeld Exp $
+;;;; $Id: segments.lisp,v 1.7 2005/04/13 06:57:01 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -55,39 +55,38 @@
Error if the GDT location is not zero modulo 4."
(eval-when (:compile-toplevel)
(assert (= 4 movitz:+movitz-fixnum-factor+)))
- (with-inline-assembly (:returns :multiple-values)
- (:pushl #.movitz:+scan-skip-word+)
- (:pushl 2)
- (:pushl 0)
- (:pushl 0)
- (:leal (:esp 2) :ecx)
- (:sgdt (:ecx))
- (:popl :ecx)
- (:shrl 16 :ecx)
- (:leal ((:ecx #.movitz::+movitz-fixnum-factor+)) :ebx)
- (:popl :ecx)
- (:testb 3 :cl)
- (:jnz '(:sub-program ()
- (:compile-form (:result-mode :ignore)
- (error "The GDT base is not 4-aligned."))))
- (:movl :ecx :eax)
- (:movl 2 :ecx)
- (:stc)))
+ (without-interrupts
+ (with-inline-assembly (:returns :multiple-values)
+ (:std)
+ (:pushl 0)
+ (:pushl 0)
+ (:leal (:esp 2) :ecx)
+ (:sgdt (:ecx))
+ (:popl :ebx)
+ (:shrl #.(cl:- 16 movitz::+movitz-fixnum-shift+) :ebx)
+ (:andl #.movitz:+movitz-fixnum-zmask+ :ebx)
+ (:popl :eax)
+ (:andl #.movitz:+movitz-fixnum-zmask+ :eax)
+ (:cld)
+ (:movl 2 :ecx)
+ (:stc))))
(defun %lgdt (base-location limit)
"Set the GDT according to base-location and limit.
This is the setter corresponding to the sgdt getter."
(eval-when (:compile-toplevel)
(assert (= 4 movitz:+movitz-fixnum-factor+)))
- (with-inline-assembly (:returns :nothing)
- (:compile-two-forms (:eax :ebx) base-location limit)
- (:pushl #.movitz:+scan-skip-word+)
- (:pushl 2)
- (:shll #.(cl:- 16 movitz:+movitz-fixnum-shift+) :ebx)
- (:pushl :eax)
- (:pushl :ebx)
- (:leal (:esp 2) :ecx)
- (:lgdt (:ecx))))
+ (check-type base-location fixnum)
+ (check-type limit positive-fixnum)
+ (without-interrupts
+ (with-inline-assembly (:returns :eax)
+ (:compile-form (:result-mode :push) base-location)
+ (:compile-form (:result-mode :push) limit)
+ (:shll #.(cl:- 16 movitz:+movitz-fixnum-shift+) (:esp))
+ (:leal (:esp 2) :ecx)
+ (:lgdt (:ecx))
+ (:popl :eax)
+ (:popl :eax))))
;;;
More information about the Movitz-cvs
mailing list