Add cache flushing routine for sun compiler on sparc solaris 2.8
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
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>
|
2013-02-07 Anthony Green <green@moxielogic.com>
|
||||||
|
|
||||||
* Makefile.am (EXTRA_DIST): Add libtool-ldflags.
|
* Makefile.am (EXTRA_DIST): Add libtool-ldflags.
|
||||||
|
|||||||
@@ -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.
|
Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
|
||||||
|
|
||||||
SPARC Foreign Function Interface
|
SPARC Foreign Function Interface
|
||||||
@@ -376,6 +376,10 @@ extern int ffi_call_v8(void *, extended_cif *, unsigned,
|
|||||||
unsigned, unsigned *, void (*fn)(void));
|
unsigned, unsigned *, void (*fn)(void));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
void ffi_flush_icache (void *, size_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
||||||
{
|
{
|
||||||
extended_cif ecif;
|
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. */
|
/* behind "call", so we alloc some executable space for it. */
|
||||||
/* l7 is used, we need to make sure v8.S doesn't use %l7. */
|
/* l7 is used, we need to make sure v8.S doesn't use %l7. */
|
||||||
unsigned int *call_struct = NULL;
|
unsigned int *call_struct = NULL;
|
||||||
ffi_closure_alloc(32, &call_struct);
|
ffi_closure_alloc(32, (void **)&call_struct);
|
||||||
if (call_struct)
|
if (call_struct)
|
||||||
{
|
{
|
||||||
unsigned long f = (unsigned long)fn;
|
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[5] = 0x01000000; /* nop */
|
||||||
call_struct[6] = 0x81c7e008; /* ret */
|
call_struct[6] = 0x81c7e008; /* ret */
|
||||||
call_struct[7] = 0xbe100017; /* mov %l7, %i7 */
|
call_struct[7] = 0xbe100017; /* mov %l7, %i7 */
|
||||||
|
#ifdef __GNUC__
|
||||||
asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
|
asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
|
||||||
"r" (call_struct) : "memory");
|
"r" (call_struct) : "memory");
|
||||||
/* SPARC v8 requires 5 instructions for flush to be visible */
|
/* SPARC v8 requires 5 instructions for flush to be visible */
|
||||||
asm volatile ("nop; nop; nop; nop; nop");
|
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,
|
ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
|
||||||
cif->flags, rvalue, call_struct);
|
cif->flags, rvalue, call_struct);
|
||||||
ffi_closure_free(call_struct);
|
ffi_closure_free(call_struct);
|
||||||
@@ -516,9 +524,13 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|||||||
#ifdef SPARC64
|
#ifdef SPARC64
|
||||||
asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory");
|
asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory");
|
||||||
#else
|
#else
|
||||||
|
#ifdef __GNUC__
|
||||||
asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory");
|
asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory");
|
||||||
/* SPARC v8 requires 5 instructions for flush to be visible */
|
/* SPARC v8 requires 5 instructions for flush to be visible */
|
||||||
asm volatile ("nop; nop; nop; nop; nop");
|
asm volatile ("nop; nop; nop; nop; nop");
|
||||||
|
#else
|
||||||
|
ffi_flush_icache (closure, 16);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return FFI_OK;
|
return FFI_OK;
|
||||||
|
|||||||
@@ -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
|
SPARC Foreign Function Interface
|
||||||
|
|
||||||
@@ -31,11 +32,35 @@
|
|||||||
#define STACKFRAME 96 /* Minimum stack framesize for SPARC */
|
#define STACKFRAME 96 /* Minimum stack framesize for SPARC */
|
||||||
#define ARGS (64+4) /* Offset of register area in frame */
|
#define ARGS (64+4) /* Offset of register area in frame */
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
.text
|
.text
|
||||||
.align 8
|
.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
|
||||||
.globl _ffi_call_v8
|
.globl _ffi_call_v8
|
||||||
|
#endif
|
||||||
|
|
||||||
ffi_call_v8:
|
ffi_call_v8:
|
||||||
_ffi_call_v8:
|
_ffi_call_v8:
|
||||||
.LLFB1:
|
.LLFB1:
|
||||||
|
|||||||
@@ -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.
|
- Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc.
|
||||||
|
|
||||||
X86 Foreign Function Interface
|
X86 Foreign Function Interface
|
||||||
|
|||||||
@@ -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) 2008 Red Hat, Inc
|
||||||
- Copyright (c) 2002 Bo Thorsen <bo@suse.de>
|
- Copyright (c) 2002 Bo Thorsen <bo@suse.de>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user