From fd07c9e40451e0ec1d0475cd54a83d45ccaea2c0 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Thu, 7 Feb 2013 18:00:36 -0500 Subject: [PATCH] Add cache flushing routine for sun compiler on sparc solaris 2.8 --- ChangeLog | 8 ++++++++ src/sparc/ffi.c | 16 ++++++++++++++-- src/sparc/v8.S | 29 +++++++++++++++++++++++++++-- src/x86/sysv.S | 2 +- src/x86/unix64.S | 2 +- 5 files changed, 51 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2eeb8053..9c4df65b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-02-07 Anthony Green + + * 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 * Makefile.am (EXTRA_DIST): Add libtool-ldflags. diff --git a/src/sparc/ffi.c b/src/sparc/ffi.c index 1ac5d464..7c384ef9 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 2c4eb60a..027c3638 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 71502bb3..3bd5477e 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 37094f18..dcd6bc71 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