0.8.0.3:
[sbcl.git] / src / code / x86-vm.lisp
index d0e88ad..203b2bb 100644 (file)
 (defvar *num-fixups* 0)
 ;;; FIXME: When the system runs, it'd be interesting to see what this is.
 
+(declaim (inline adjust-fixup-array))
+(defun adjust-fixup-array (array size)
+  (let ((length (length array))
+        (new (make-array size :element-type '(unsigned-byte 32))))
+    (replace new array)
+    new))
+
 ;;; This gets called by LOAD to resolve newly positioned objects
 ;;; with things (like code instructions) that have to refer to them.
 ;;;
@@ -69,8 +76,7 @@
           (let ((fixups (code-header-ref code code-constants-offset)))
             (cond ((typep fixups '(simple-array (unsigned-byte 32) (*)))
                    (let ((new-fixups
-                          (adjust-array fixups (1+ (length fixups))
-                                        :element-type '(unsigned-byte 32))))
+                          (adjust-fixup-array fixups (1+ (length fixups)))))
                      (setf (aref new-fixups (length fixups)) offset)
                      (setf (code-header-ref code code-constants-offset)
                            new-fixups)))
@@ -80,7 +86,7 @@
                                (zerop fixups))
                      (format t "** Init. code FU = ~S~%" fixups)) ; FIXME
                    (setf (code-header-ref code code-constants-offset)
-                         (make-specializable-array
+                         (make-array
                           1
                           :element-type '(unsigned-byte 32)
                           :initial-element offset)))))))
                            (sb!kernel:code-instructions code)))
            (obj-start-addr (logand (sb!kernel:get-lisp-obj-address code)
                                    #xfffffff8))
-           #+nil (const-start-addr (+ obj-start-addr (* 5 4)))
+           ;; FIXME: what is this 5?
+           #+nil (const-start-addr (+ obj-start-addr (* 5 n-word-bytes)))
            (code-start-addr (sb!sys:sap-int (sb!kernel:code-instructions
                                              code)))
            (ncode-words (sb!kernel:code-header-ref code 1))
-           (code-end-addr (+ code-start-addr (* ncode-words 4))))
+           (code-end-addr (+ code-start-addr (* ncode-words n-word-bytes))))
        (unless (member kind '(:absolute :relative))
         (error "Unknown code-object-fixup kind ~S." kind))
        (ecase kind
            (add-fixup code offset))
          ;; Replace word with value to add to that loc to get there.
          (let* ((loc-sap (+ (sap-int sap) offset))
-                (rel-val (- fixup loc-sap 4)))
+                (rel-val (- fixup loc-sap n-word-bytes)))
            (declare (type (unsigned-byte 32) loc-sap)
                     (type (signed-byte 32) rel-val))
            (setf (signed-sap-ref-32 sap offset) rel-val))))))
     nil))
 
-;;; Add a code fixup to a code object generated by GENESIS. The fixup has
-;;; already been applied, it's just a matter of placing the fixup in the code's
-;;; fixup vector if necessary.
+;;; Add a code fixup to a code object generated by GENESIS. The fixup
+;;; has already been applied, it's just a matter of placing the fixup
+;;; in the code's fixup vector if necessary.
 ;;;
 ;;; KLUDGE: I'd like a good explanation of why this has to be done at
 ;;; load time instead of in GENESIS. It's probably simple, I just haven't
 ;;; figured it out, or found it written down anywhere. -- WHN 19990908
 #!+gencgc
-(defun !do-load-time-code-fixup (code offset fixup kind)
-  (flet ((add-load-time-code-fixup (code offset)
+(defun !envector-load-time-code-fixup (code offset fixup kind)
+  (flet ((frob (code offset)
           (let ((fixups (code-header-ref code code-constants-offset)))
             (cond ((typep fixups '(simple-array (unsigned-byte 32) (*)))
                    (let ((new-fixups
-                          (adjust-array fixups (1+ (length fixups))
-                                        :element-type '(unsigned-byte 32))))
+                          (adjust-fixup-array fixups (1+ (length fixups)))))
                      (setf (aref new-fixups (length fixups)) offset)
                      (setf (code-header-ref code code-constants-offset)
                            new-fixups)))
                                (zerop fixups))
                      (sb!impl::!cold-lose "Argh! can't process fixup"))
                    (setf (code-header-ref code code-constants-offset)
-                         (make-specializable-array
+                         (make-array
                           1
                           :element-type '(unsigned-byte 32)
                           :initial-element offset)))))))
           (code-start-addr (sb!sys:sap-int (sb!kernel:code-instructions
                                             code)))
           (ncode-words (sb!kernel:code-header-ref code 1))
-        (code-end-addr (+ code-start-addr (* ncode-words 4))))
+        (code-end-addr (+ code-start-addr (* ncode-words n-word-bytes))))
       (ecase kind
        (:absolute
         ;; Record absolute fixups that point within the code object.
         (when (> code-end-addr (sap-ref-32 sap offset) obj-start-addr)
-          (add-load-time-code-fixup code offset)))
+          (frob code offset)))
        (:relative
         ;; Record relative fixups that point outside the code object.
         (when (or (< fixup obj-start-addr) (> fixup code-end-addr))
-          (add-load-time-code-fixup code offset)))))))
+          (frob code offset)))))))
 \f
 ;;;; low-level signal context access functions
 ;;;;
 
 ;;; Given a signal context, return the floating point modes word in
 ;;; the same format as returned by FLOATING-POINT-MODES.
+#!-linux
 (defun context-floating-point-modes (context)
   ;; FIXME: As of sbcl-0.6.7 and the big rewrite of signal handling for
   ;; POSIXness and (at the Lisp level) opaque signal contexts,
     (logior (ash (logand sw #xffff) 16) (logxor (logand cw #xffff) #x3f)))
 
   0)
+
+#!+linux
+(define-alien-routine ("os_context_fp_control" context-floating-point-modes)
+    (sb!alien:unsigned 32)
+  (context (* os-context-t)))
 \f
-;;;; INTERNAL-ERROR-ARGUMENTS
+;;;; INTERNAL-ERROR-ARGS
 
 ;;; Given a (POSIX) signal context, extract the internal error
 ;;; arguments from the instruction stream.
-(defun internal-error-arguments (context)
+(defun internal-error-args (context)
   (declare (type (alien (* os-context-t)) context))
-  (/show0 "entering INTERNAL-ERROR-ARGUMENTS, CONTEXT=..")
+  (/show0 "entering INTERNAL-ERROR-ARGS, CONTEXT=..")
   (/hexstr context)
   (let ((pc (context-pc context)))
     (declare (type system-area-pointer pc))
                             vector (* n-word-bits vector-data-offset)
                             (* length n-byte-bits))
       (let* ((index 0)
-            (error-number (sb!c::read-var-integer vector index)))
+            (error-number (sb!c:read-var-integer vector index)))
        (/hexstr error-number)
        (collect ((sc-offsets))
          (loop
           (/hexstr index)
           (when (>= index length)
             (return))
-          (let ((sc-offset (sb!c::read-var-integer vector index)))
+          (let ((sc-offset (sb!c:read-var-integer vector index)))
             (/show0 "SC-OFFSET=..")
             (/hexstr sc-offset)
             (sc-offsets sc-offset)))
          (values error-number (sc-offsets)))))))
 \f
-;;; Do whatever is necessary to make the given code component
-;;; executable. (This is a no-op on the x86.)
-(defun sanctify-for-execution (component)
-  (declare (ignore component))
-  nil)
-
 ;;; This is used in error.lisp to insure that floating-point exceptions
 ;;; are properly trapped. The compiler translates this to a VOP.
 (defun float-wait ()
 ;;; than the i387 load constant instructions to avoid consing in some
 ;;; cases. Note these are initialized by GENESIS as they are needed
 ;;; early.
-(defvar *fp-constant-0s0*)
-(defvar *fp-constant-1s0*)
+(defvar *fp-constant-0f0*)
+(defvar *fp-constant-1f0*)
 (defvar *fp-constant-0d0*)
 (defvar *fp-constant-1d0*)
 ;;; the long-float constants