[Openmcl-cvs-notifications] r10202 - /trunk/source/compiler/X86/x86-disassemble.lisp

rme at clozure.com rme at clozure.com
Thu Jul 24 22:03:04 EDT 2008


Author: rme
Date: Thu Jul 24 22:03:04 2008
New Revision: 10202

Log:
Add support for disassembling 32-bit x86 functions.

Modified:
    trunk/source/compiler/X86/x86-disassemble.lisp

Modified: trunk/source/compiler/X86/x86-disassemble.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/compiler/X86/x86-disassemble.lisp (original)
+++ trunk/source/compiler/X86/x86-disassemble.lisp Thu Jul 24 22:03:04 2008
@@ -334,7 +334,8 @@
   (x86-dis-make-reg-operand (svref x86::*x86-float-regs* (x86-ds-rm ds))))
 =

 (defun op-indire (ds bytemode sizeflag)
-  (when (zerop (x86-ds-prefixes ds))
+  (when (and (x86-ds-mode-64 ds)
+	     (zerop (x86-ds-prefixes ds)))
     (setf (x86-ds-rex ds) (logior #x48 (x86-ds-rex ds))))
   (op-e ds bytemode sizeflag))
 =

@@ -2364,7 +2365,7 @@
                (let* ((entry (x86::x86-register-operand-entry thing)))
                  (eq entry (if (x86-ds-mode-64 ds)
                              (x86::x86-reg64 13)
-                             (x86::x86-reg32 6))))))
+                             (x86::x86-reg32 x8632::fn))))))
            (is-rip (thing)
              (if (and (typep thing 'x86::x86-register-operand)
                       (x86-ds-mode-64 ds))
@@ -2429,7 +2430,9 @@
            (let* ((disp (is-disp-only op0)))
              (when disp
                (let* ((info (find (early-x86-lap-expression-value disp)
-                                  x8664::*x8664-subprims*
+				  (if (x86-ds-mode-64 ds)
+				    x8664::*x8664-subprims*
+				    x8632::*x8632-subprims*)
                                   :key #'subprimitive-info-offset)))
                  (when info (setf (x86::x86-memory-operand-disp op0)
                                   (subprimitive-info-name info)))))))
@@ -2666,7 +2669,7 @@
              (eq (x86::x86-register-operand-entry base)
                  (if (x86-ds-mode-64 ds)
                    (x86::x86-reg64 13)
-                   (x86::x86-reg32 6)))
+                   (x86::x86-reg32 x8632::fn)))
              (null index)
              (or (eql scale 0) (null scale))
              (and (if (typep disp 'constant-x86-lap-expression)
@@ -2679,7 +2682,9 @@
                   (>=3D val (x86-ds-code-limit ds))))
       (let* ((diff (- val (x86-ds-code-limit ds)))
              (constant (uvref (x86-ds-constants-vector ds)
-                              (1+ (ash diff -3)))))
+			      (1+ (ash diff (if (x86-ds-mode-64 ds)
+					      (- x8664::word-shift)
+					      (- x8632::word-shift)))))))
         `(@ ',constant ,(unparse-x86-lap-operand base ds)))
       (collect ((subforms))
         (subforms '@)
@@ -2756,6 +2761,30 @@
         (do-dll-nodes (instruction (x86-dis-block-instructions block))
           (setq seq (funcall collect-function ds instruction seq)))))))
 =

+(defun x8632-disassemble-xfunction (xfunction &key (symbolic-names
+                                                         x8632::*x8632-sym=
bolic-register-names*) (collect-function #'x86-print-disassembled-instructi=
on))
+  (check-type xfunction xfunction)
+  (check-type (uvref xfunction 0) (simple-array (unsigned-byte 8) (*)))
+  (let* ((ds (make-x86-disassembly-state
+	      :mode-64 nil
+              :code-vector (uvref xfunction 0)
+              :constants-vector xfunction
+              :entry-point 2
+              :code-pointer 0           ; for next-u16 below
+              :symbolic-names symbolic-names
+              :pending-labels (list 2)))
+         (blocks (x86-ds-blocks ds)))
+    (setf (x86-ds-code-limit ds) (ash (x86-ds-next-u16 ds) 2))
+    (do* ()
+         ((null (x86-ds-pending-labels ds)))
+      (let* ((lab (pop (x86-ds-pending-labels ds))))
+        (or (x86-dis-find-label lab blocks)
+            (x86-disassemble-new-block ds lab))))
+    (let* ((seq 0))
+      (do-dll-nodes (block blocks)
+        (do-dll-nodes (instruction (x86-dis-block-instructions block))
+          (setq seq (funcall collect-function ds instruction seq)))))))
+
 #+x8664-target
 (defun x8664-xdisassemble (function &optional (collect-function #'x86-prin=
t-disassembled-instruction ))
   (let* ((fv (%function-to-function-vector function))
@@ -2773,6 +2802,26 @@
           (j 1 (1+ j)))
          ((=3D k function-size-in-words)
           (x8664-disassemble-xfunction xfunction :collect-function collect=
-function))
+      (declare (fixnum j k))
+      (setf (uvref xfunction j) (uvref fv k)))))
+
+#+x8632-target
+(defun x8632-xdisassemble (function &optional (collect-function #'x86-prin=
t-disassembled-instruction ))
+  (let* ((fv (function-to-function-vector function))
+         (function-size-in-words (uvsize fv))
+         (code-words (%function-code-words function))
+         (ncode-bytes (ash function-size-in-words x8632::word-shift))
+         (code-bytes (make-array ncode-bytes
+                                 :element-type '(unsigned-byte 8)))
+         (numimms (- function-size-in-words code-words))
+         (xfunction (%alloc-misc (the fixnum (1+ numimms)) target::subtag-=
xfunction)))
+    (declare (fixnum code-words ncode-bytes numimms))
+    (%copy-ivector-to-ivector fv 0 code-bytes 0 ncode-bytes)
+    (setf (uvref xfunction 0) code-bytes)
+    (do* ((k code-words (1+ k))
+          (j 1 (1+ j)))
+         ((=3D k function-size-in-words)
+          (x8632-disassemble-xfunction xfunction :collect-function collect=
-function))
       (declare (fixnum j k))
       (setf (uvref xfunction j) (uvref fv k)))))
 =




More information about the Openmcl-cvs-notifications mailing list