Changeset 8823


Ignore:
Timestamp:
Mar 19, 2008, 1:18:57 AM (11 years ago)
Author:
rme
Message:

Get Darwin/IA-32 syscalls partially working.

(64-bit args/results aren't done right.)

Location:
branches/ia32
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/x862.lisp

    r8821 r8823  
    89638963(defx862 x862-i386-syscall i386-syscall (seg vreg xfer idx argspecs argvals resultspec &optional monitor-exception-ports)
    89648964  (declare (ignore monitor-exception-ports))
    8965   (format t "i386-syscall")
    8966   #+notyet
    8967   (progn
    8968     (let* ((*x862-vstack* *x862-vstack*)
    8969            (*x862-top-vstack-lcell* *x862-top-vstack-lcell*)
    8970            (*x862-cstack* *x862-cstack*)
    8971            (offset 0)
    8972            (simple-foreign-args nil)
    8973            (nwords 0))
    8974       (dolist (argspec argspecs)
    8975         (case argspec
     8965  (let* ((*x862-vstack* *x862-vstack*)
     8966         (*x862-top-vstack-lcell* *x862-top-vstack-lcell*)
     8967         (*x862-cstack* *x862-cstack*)
     8968         (offset 0)
     8969         (simple-foreign-args nil)
     8970         (nwords 0))
     8971    (dolist (argspec argspecs)
     8972      (case argspec
     8973        ((:unsigned-doubleword :signed-doubleword)
     8974         (incf nwords 2))
     8975        (t (incf nwords))))
     8976    (when (null argspecs)
     8977      (setq simple-foreign-args t))
     8978    (! alloc-c-frame nwords)
     8979    (x862-open-undo $undo-x86-c-frame)
     8980    (unless simple-foreign-args
     8981      (x862-vpush-register seg (x862-one-untargeted-reg-form seg idx x8632::arg_z)))
     8982    ;; Evaluate each form into the C frame, according to the
     8983    ;; matching argspec.
     8984    (do* ((specs argspecs (cdr specs))
     8985          (vals argvals (cdr vals)))
     8986         ((null specs))
     8987      (declare (list specs vals))
     8988      (let* ((valform (car vals))
     8989             (spec (car specs))
     8990             (absptr (acode-absolute-ptr-p valform)))
     8991        (case spec
    89768992          ((:unsigned-doubleword :signed-doubleword)
    8977            (incf nwords 2))
    8978           (t (incf nwords))))
    8979       (when (null argspecs)
    8980         (setq simple-foreign-args t))
    8981       (! alloc-c-frame nwords)
    8982       (x862-open-undo $undo-x86-c-frame)
    8983       (unless simple-foreign-args
    8984         (x862-vpush-register seg (x862-one-untargeted-reg-form seg idx x8632::arg_z)))
    8985       ;; Evaluate each form into the C frame, according to the
    8986       ;; matching argspec.
    8987       (do* ((specs argspecs (cdr specs))
    8988             (vals argvals (cdr vals)))
    8989            ((null specs))
    8990         (declare (list specs vals))
    8991         (let* ((valform (car vals))
    8992                (spec (car specs))
    8993                (absptr (acode-absolute-ptr-p valform)))
    8994           (case spec
    8995             ((:unsigned-doubleword :signed-doubleword)
    8996              (x862-one-targeted-reg-form seg valform ($ x8632::arg_z))
    8997              (if (eq spec :signed-doubleword)
    8998                (! gets64)
    8999                (! getu64))
    9000              (! set-c-arg-from-mm0 nextarg)
    9001              (incf offset 2)
    9002              (:address
    9003               (with-imm-target () (ptr :address)
    9004                 (if absptr
    9005                   (x862-lri seg ptr absptr)
    9006                   (x862-form seg ptr nil valform))
    9007                 (! set-c-arg ptr offset))
    9008               (incf offset))
    9009              (t
    9010               (if (typep spec 'unsigned-byte)
    9011                 (progn
    9012                   (with-imm-target () (ptr :address)
    9013                     (x862-one-targeted-reg-form seg valform ptr)
    9014                     (with-additional-imm-reg (ptr)
    9015                       (with-imm-target (ptr) (r :natural)
    9016                         (dotimes (i spec)
    9017                           (! mem-ref-c-fullword r ptr (ash i x8632::word-shift))
    9018                           (! set-c-arg r offset)))))
    9019                   (incf offset spec))
    9020                 (with-imm-target () (valreg :natural)
    9021                   (let* ((reg (x862-unboxed-integer-arg-to-reg seg valform valreg spec)))
    9022                     (! set-c-arg reg offset)
    9023                     (incf offset))))))))
    9024         (unless simple-foreign-args
    9025           (x862-vpop-register seg ($ x8632::arg_z)))
    9026         (! syscall)
    9027         (x862-close-undo)
    9028         (when vreg
    9029           (cond ((eq resultspec :void) (<- nil))
    9030                 ((eq resultspec :unsigned-doubleword)
    9031                  (ensuring-node-target (target vreg)
    9032                    ;; xxx -- need to ensure that edx is marked as an imm reg
    9033                    (! makeu64)
    9034                    (x862-copy-register seg target ($ *x862-arg-z*))))
    9035                 ((eq resultspec :signed-doubleword)
    9036                  (ensuring-node-target (target vreg)
    9037                    ;; xxx -- need to ensure that edx is marked as an imm reg
    9038                    (! makes64)
    9039                    (x862-copy-register seg target ($ *x862-arg-z*))))
    9040                 (t
    9041                  (case resultspec
    9042                    (:signed-byte (! sign-extend-s8 *x862-imm0* *x862-imm0*))
    9043                    (:signed-halfword (! sign-extend-s16 *x862-imm0* *x862-imm0*))
    9044                    (:unsigned-byte (! zero-extend-u8 *x862-imm0* *x862-imm0*))
    9045                    (:unsigned-halfword (! zero-extend-u16 *x862-imm0* *x862-imm0*)))
    9046                  (<- (make-wired-lreg x8632::imm0
    9047                                       :mode
    9048                                       (gpr-mode-name-value
    9049                                        (case resultspec
    9050                                          (:address :address)
    9051                                          (:signed-byte :s8)
    9052                                          (:unsigned-byte :u8)
    9053                                          (:signed-halfword :s16)
    9054                                          (:unsigned-halfword :u16)
    9055                                          (:signed-fullword :s32)
    9056                                          (t :u32))))))))
    9057         (^))))
    9058   )
     8993           (x862-one-targeted-reg-form seg valform ($ x8632::arg_z))
     8994           (if (eq spec :signed-doubleword)
     8995             (! gets64)
     8996             (! getu64))
     8997           (! set-c-arg-from-mm0 offset)
     8998           (incf offset 2))
     8999          (:address
     9000           (with-imm-target () (ptr :address)
     9001             (if absptr
     9002               (x862-lri seg ptr absptr)
     9003               (x862-form seg ptr nil valform))
     9004             (! set-c-arg ptr offset))
     9005           (incf offset))
     9006          (t
     9007           (with-imm-target () (valreg :natural)
     9008             (let* ((reg (x862-unboxed-integer-arg-to-reg seg valform valreg spec)))
     9009               (! set-c-arg reg offset)
     9010               (incf offset)))))))
     9011    (unless simple-foreign-args
     9012      (x862-vpop-register seg ($ x8632::arg_z)))
     9013    (! syscall)
     9014    (x862-close-undo)
     9015    (when vreg
     9016      (cond ((eq resultspec :void) (<- nil))
     9017            ((eq resultspec :unsigned-doubleword)
     9018             (ensuring-node-target (target vreg)
     9019               ;; xxx -- need to ensure that edx is marked as an imm reg
     9020               (! makeu64)
     9021               (x862-copy-register seg target ($ *x862-arg-z*))))
     9022            ((eq resultspec :signed-doubleword)
     9023             (ensuring-node-target (target vreg)
     9024               ;; xxx -- need to ensure that edx is marked as an imm reg
     9025               (! makes64)
     9026               (x862-copy-register seg target ($ *x862-arg-z*))))
     9027            (t
     9028             (case resultspec
     9029               (:signed-byte (! sign-extend-s8 *x862-imm0* *x862-imm0*))
     9030               (:signed-halfword (! sign-extend-s16 *x862-imm0* *x862-imm0*))
     9031               (:unsigned-byte (! zero-extend-u8 *x862-imm0* *x862-imm0*))
     9032               (:unsigned-halfword (! zero-extend-u16 *x862-imm0* *x862-imm0*)))
     9033             (<- (make-wired-lreg x8632::imm0
     9034                                  :mode
     9035                                  (gpr-mode-name-value
     9036                                   (case resultspec
     9037                                     (:address :address)
     9038                                     (:signed-byte :s8)
     9039                                     (:unsigned-byte :u8)
     9040                                     (:signed-halfword :s16)
     9041                                     (:unsigned-halfword :u16)
     9042                                     (:signed-fullword :s32)
     9043                                     (t :u32))))))))
     9044    (^)))
    90599045
    90609046
  • branches/ia32/lisp-kernel/x86-spentry32.s

    r8745 r8823  
    998998_spentry(makes64)
    999999        __(int $3)
     1000        __(jmp _SPmakes32)
    10001001_endsubp(makes64)
    10011002
     
    10371038        __(movl %rcontext:tcr.foreign_sp,%esp)
    10381039        __(emms)
    1039         __(movl (%esp),%ebp)
    1040         __(addl $2*node_size,%esp)
    1041         __(unbox_fixnum(%arg_z,%eax))
    1042 
    1043         /* syscall args on stack */
    1044         __(movl $local_label(back_from_sysenter),%edx)
    1045         __(movl %esp,%ecx)
    1046         __(sysenter)
    1047 local_label(back_from_sysenter):
    1048        
    1049         __(movl %ecx,%esp)
     1040        __(movl (%esp),%ebp)            /* save backlink */
     1041        __(addl $1*node_size,%esp)      /* pop it off */
     1042        __(unbox_fixnum(%arg_z,%eax))   /* syscall number */
     1043        __(pushl $local_label(back_from_syscall))
     1044        __(int $0x80)
     1045local_label(back_from_syscall):
     1046        __(jnc 0f)
     1047        __(neg %eax)
     10480:     
     1049        __(movl %ebp,%esp)
    10501050        __(movl %esp,%rcontext:tcr.foreign_sp)
    10511051        __(zero_node_regs)
     
    22712271_endsubp(popj)
    22722272
    2273 
     2273/* arg_z should be of type (signed-byte 64) */
     2274/* return unboxed value in mm0 */
    22742275_spentry(gets64)
    22752276        __(int $3)
    22762277_endsubp(gets64)
    2277 
    22782278
    22792279/* arg_z should be of type (unsigned-byte 64) */
    22802280/* return unboxed value in mm0 */
    22812281_spentry(getu64)
     2282        __(int $3)
    22822283        __(movl $~(target_most_positive_fixnum << fixnumshift),%imm0)
    22832284        __(testl %arg_z,%imm0)
Note: See TracChangeset for help on using the changeset viewer.