From: stassats <sta...@us...> - 2014-05-21 17:22:09
|
The branch "master" has been updated in SBCL: via 4eda59d0dd33e041517b3e76e74f77e3454465b8 (commit) from 5f485c695858bd87120ecb66a081003a361747cc (commit) - Log ----------------------------------------------------------------- commit 4eda59d0dd33e041517b3e76e74f77e3454465b8 Author: Stas Boukarev <sta...@gm...> Date: Wed May 21 21:21:47 2014 +0400 Flush icache in alien-callback-assembler-wrapper on ARM. --- src/compiler/arm/c-call.lisp | 36 +++++++++++++++++++++++------------- 1 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/compiler/arm/c-call.lisp b/src/compiler/arm/c-call.lisp index 3ef75ec..b0d311a 100644 --- a/src/compiler/arm/c-call.lisp +++ b/src/compiler/arm/c-call.lisp @@ -381,20 +381,22 @@ (nsp-save-tn (make-tn 6)) #!-arm-softfp (fp-registers 0) - (gprs (list r0-tn r1-tn r2-tn r3-tn))) + (gprs (list r0-tn r1-tn r2-tn r3-tn)) + (frame-size + (loop for type in argument-types + sum (* n-word-bytes + (if (or (alien-double-float-type-p type) + (and (alien-integer-type-p type) + (eql (alien-type-bits type) 64))) + 2 + 1))))) (assemble (segment) (emit-word segment #xe92d4ff0) ;; stmfd sp!, {r4-r11, lr} (move nsp-save-tn nsp-tn) ;; Make room on the stack for arguments. - (inst sub nsp-tn nsp-tn - (loop for type in argument-types - sum (* n-word-bytes - (if (or (alien-double-float-type-p type) - (and (alien-integer-type-p type) - (eql (alien-type-bits type) 64))) - 2 - 1)))) + (when (plusp frame-size) + (inst sub nsp-tn nsp-tn frame-size)) ;; Copy arguments (dolist (type argument-types) (let ((target-tn (@ nsp-tn (* arg-count n-word-bytes))) @@ -516,7 +518,15 @@ (finalize-segment segment) ;; Now that the segment is done, convert it to a static ;; vector we can point foreign code to. - (let ((buffer (sb!assem::segment-buffer segment))) - (make-static-vector (length buffer) - :element-type '(unsigned-byte 8) - :initial-contents buffer))))) + (let* ((buffer (sb!assem::segment-buffer segment)) + (vector (make-static-vector (length buffer) + :element-type '(unsigned-byte 8) + :initial-contents buffer)) + (sap (vector-sap vector))) + (alien-funcall + (extern-alien "os_flush_icache" + (function void + system-area-pointer + unsigned-long)) + sap (length buffer)) + vector)))) ----------------------------------------------------------------------- hooks/post-receive -- SBCL |