Changeset 10202


Ignore:
Timestamp:
Jul 25, 2008, 2:03:04 AM (11 years ago)
Author:
rme
Message:

Add support for disassembling 32-bit x86 functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/x86-disassemble.lisp

    r8130 r10202  
    335335
    336336(defun op-indire (ds bytemode sizeflag)
    337   (when (zerop (x86-ds-prefixes ds))
     337  (when (and (x86-ds-mode-64 ds)
     338             (zerop (x86-ds-prefixes ds)))
    338339    (setf (x86-ds-rex ds) (logior #x48 (x86-ds-rex ds))))
    339340  (op-e ds bytemode sizeflag))
     
    23652366                 (eq entry (if (x86-ds-mode-64 ds)
    23662367                             (x86::x86-reg64 13)
    2367                              (x86::x86-reg32 6))))))
     2368                             (x86::x86-reg32 x8632::fn))))))
    23682369           (is-rip (thing)
    23692370             (if (and (typep thing 'x86::x86-register-operand)
     
    24302431             (when disp
    24312432               (let* ((info (find (early-x86-lap-expression-value disp)
    2432                                   x8664::*x8664-subprims*
     2433                                  (if (x86-ds-mode-64 ds)
     2434                                    x8664::*x8664-subprims*
     2435                                    x8632::*x8632-subprims*)
    24332436                                  :key #'subprimitive-info-offset)))
    24342437                 (when info (setf (x86::x86-memory-operand-disp op0)
     
    26672670                 (if (x86-ds-mode-64 ds)
    26682671                   (x86::x86-reg64 13)
    2669                    (x86::x86-reg32 6)))
     2672                   (x86::x86-reg32 x8632::fn)))
    26702673             (null index)
    26712674             (or (eql scale 0) (null scale))
     
    26802683      (let* ((diff (- val (x86-ds-code-limit ds)))
    26812684             (constant (uvref (x86-ds-constants-vector ds)
    2682                               (1+ (ash diff -3)))))
     2685                              (1+ (ash diff (if (x86-ds-mode-64 ds)
     2686                                              (- x8664::word-shift)
     2687                                              (- x8632::word-shift)))))))
    26832688        `(@ ',constant ,(unparse-x86-lap-operand base ds)))
    26842689      (collect ((subforms))
     
    27572762          (setq seq (funcall collect-function ds instruction seq)))))))
    27582763
     2764(defun x8632-disassemble-xfunction (xfunction &key (symbolic-names
     2765                                                         x8632::*x8632-symbolic-register-names*) (collect-function #'x86-print-disassembled-instruction))
     2766  (check-type xfunction xfunction)
     2767  (check-type (uvref xfunction 0) (simple-array (unsigned-byte 8) (*)))
     2768  (let* ((ds (make-x86-disassembly-state
     2769              :mode-64 nil
     2770              :code-vector (uvref xfunction 0)
     2771              :constants-vector xfunction
     2772              :entry-point 2
     2773              :code-pointer 0           ; for next-u16 below
     2774              :symbolic-names symbolic-names
     2775              :pending-labels (list 2)))
     2776         (blocks (x86-ds-blocks ds)))
     2777    (setf (x86-ds-code-limit ds) (ash (x86-ds-next-u16 ds) 2))
     2778    (do* ()
     2779         ((null (x86-ds-pending-labels ds)))
     2780      (let* ((lab (pop (x86-ds-pending-labels ds))))
     2781        (or (x86-dis-find-label lab blocks)
     2782            (x86-disassemble-new-block ds lab))))
     2783    (let* ((seq 0))
     2784      (do-dll-nodes (block blocks)
     2785        (do-dll-nodes (instruction (x86-dis-block-instructions block))
     2786          (setq seq (funcall collect-function ds instruction seq)))))))
     2787
    27592788#+x8664-target
    27602789(defun x8664-xdisassemble (function &optional (collect-function #'x86-print-disassembled-instruction ))
     
    27742803         ((= k function-size-in-words)
    27752804          (x8664-disassemble-xfunction xfunction :collect-function collect-function))
     2805      (declare (fixnum j k))
     2806      (setf (uvref xfunction j) (uvref fv k)))))
     2807
     2808#+x8632-target
     2809(defun x8632-xdisassemble (function &optional (collect-function #'x86-print-disassembled-instruction ))
     2810  (let* ((fv (function-to-function-vector function))
     2811         (function-size-in-words (uvsize fv))
     2812         (code-words (%function-code-words function))
     2813         (ncode-bytes (ash function-size-in-words x8632::word-shift))
     2814         (code-bytes (make-array ncode-bytes
     2815                                 :element-type '(unsigned-byte 8)))
     2816         (numimms (- function-size-in-words code-words))
     2817         (xfunction (%alloc-misc (the fixnum (1+ numimms)) target::subtag-xfunction)))
     2818    (declare (fixnum code-words ncode-bytes numimms))
     2819    (%copy-ivector-to-ivector fv 0 code-bytes 0 ncode-bytes)
     2820    (setf (uvref xfunction 0) code-bytes)
     2821    (do* ((k code-words (1+ k))
     2822          (j 1 (1+ j)))
     2823         ((= k function-size-in-words)
     2824          (x8632-disassemble-xfunction xfunction :collect-function collect-function))
    27762825      (declare (fixnum j k))
    27772826      (setf (uvref xfunction j) (uvref fv k)))))
Note: See TracChangeset for help on using the changeset viewer.