Commit fd07c9e40451e0ec1d0475cd54a83d45ccaea2c0

Anthony Green 2013-02-07T18:00:36

Add cache flushing routine for sun compiler on sparc solaris 2.8

diff --git a/ChangeLog b/ChangeLog
index 2eeb805..9c4df65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2013-02-07  Anthony Green <green@moxielogic.com>
 
+	* src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for
+	Sun compiler.
+	* src/sparc/ffi.c (ffi_call): Remove warning.
+	Call ffi_flush_icache for non-GCC builds.
+	(ffi_prep_closure_loc): Use ffi_flush_icache.
+
+2013-02-07  Anthony Green <green@moxielogic.com>
+
 	* Makefile.am (EXTRA_DIST): Add libtool-ldflags.
 	* Makefile.in: Rebuilt.
 	* libtool-ldflags: New file.
diff --git a/src/sparc/ffi.c b/src/sparc/ffi.c
index 1ac5d46..7c384ef 100644
--- a/src/sparc/ffi.c
+++ b/src/sparc/ffi.c
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011 Anthony Green
+   ffi.c - Copyright (c) 2011, 2013 Anthony Green
            Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
    
    SPARC Foreign Function Interface 
@@ -376,6 +376,10 @@ extern int ffi_call_v8(void *, extended_cif *, unsigned,
 		       unsigned, unsigned *, void (*fn)(void));
 #endif
 
+#ifndef __GNUC__
+void ffi_flush_icache (void *, size_t);
+#endif
+
 void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
 {
   extended_cif ecif;
@@ -417,7 +421,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
 	  /* behind "call", so we alloc some executable space for it. */
 	  /* l7 is used, we need to make sure v8.S doesn't use %l7.   */
 	  unsigned int *call_struct = NULL;
-	  ffi_closure_alloc(32, &call_struct);
+	  ffi_closure_alloc(32, (void **)&call_struct);
 	  if (call_struct)
 	    {
 	      unsigned long f = (unsigned long)fn;
@@ -432,10 +436,14 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
 		call_struct[5] = 0x01000000;	     	 /* nop			 */
 	      call_struct[6] = 0x81c7e008;		 /* ret			 */
 	      call_struct[7] = 0xbe100017;		 /* mov   %l7, %i7	 */
+#ifdef __GNUC__
 	      asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
 			    "r" (call_struct) : "memory");
 	      /* SPARC v8 requires 5 instructions for flush to be visible */
 	      asm volatile ("nop; nop; nop; nop; nop");
+#else
+	      ffi_flush_icache (call_struct, 32);
+#endif
 	      ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
 			  cif->flags, rvalue, call_struct);
 	      ffi_closure_free(call_struct);
@@ -516,9 +524,13 @@ ffi_prep_closure_loc (ffi_closure* closure,
 #ifdef SPARC64
   asm volatile ("flush	%0; flush %0+8" : : "r" (closure) : "memory");
 #else
+#ifdef __GNUC__
   asm volatile ("iflush	%0; iflush %0+8" : : "r" (closure) : "memory");
   /* SPARC v8 requires 5 instructions for flush to be visible */
   asm volatile ("nop; nop; nop; nop; nop");
+#else
+  ffi_flush_icache (closure, 16);
+#endif
 #endif
 
   return FFI_OK;
diff --git a/src/sparc/v8.S b/src/sparc/v8.S
index 2c4eb60..027c363 100644
--- a/src/sparc/v8.S
+++ b/src/sparc/v8.S
@@ -1,5 +1,6 @@
 /* -----------------------------------------------------------------------
-   v8.S - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
+   v8.S - Copyright (c) 2013  The Written Word, Inc.
+	  Copyright (c) 1996, 1997, 2003, 2004, 2008  Red Hat, Inc.
    
    SPARC Foreign Function Interface 
 
@@ -31,11 +32,35 @@
 #define STACKFRAME 96		/* Minimum stack framesize for SPARC */
 #define ARGS (64+4)		/* Offset of register area in frame */
 
+#ifndef __GNUC__	
 .text
         .align 8
+.globl ffi_flush_icache
+.globl _ffi_flush_icache
+
+ffi_flush_icache:
+_ffi_flush_icache:	
+        add %o0, %o1, %o2
+1:	iflush %o0
+	add %o0, 8, %o0
+	cmp %o0, %o2
+	blt 1b
+	nop
+	nop
+	nop
+	nop
+	nop
+	retl
+	nop
+.ffi_flush_icache_end:
+	.size	ffi_flush_icache,.ffi_flush_icache_end-ffi_flush_icache
+
+	.text
+        .align 8
 .globl ffi_call_v8
 .globl _ffi_call_v8
-
+#endif
+	
 ffi_call_v8:
 _ffi_call_v8:
 .LLFB1:
diff --git a/src/x86/sysv.S b/src/x86/sysv.S
index 71502bb..3bd5477 100644
--- a/src/x86/sysv.S
+++ b/src/x86/sysv.S
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2013  The Written Word
+   sysv.S - Copyright (c) 2013  The Written Word, Inc.
 	  - Copyright (c) 1996,1998,2001-2003,2005,2008,2010  Red Hat, Inc.
    
    X86 Foreign Function Interface 
diff --git a/src/x86/unix64.S b/src/x86/unix64.S
index 37094f1..dcd6bc7 100644
--- a/src/x86/unix64.S
+++ b/src/x86/unix64.S
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   unix64.S - Copyright (c) 2013  The Written Word
+   unix64.S - Copyright (c) 2013  The Written Word, Inc.
 	    - Copyright (c) 2008  Red Hat, Inc
 	    - Copyright (c) 2002  Bo Thorsen <bo@suse.de>