qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/3] tci: Build ffi data structures for helpers


From: Richard Henderson
Subject: [Qemu-devel] [PATCH 2/3] tci: Build ffi data structures for helpers
Date: Tue, 13 May 2014 14:22:04 -0700

Signed-off-by: Richard Henderson <address@hidden>
---
 configure                    | 12 +++++++
 include/exec/helper-ffi.h    | 83 ++++++++++++++++++++++++++++++++++++++++++++
 include/exec/helper-tcg.h    | 18 ++++++----
 target-i386/ops_sse_header.h |  6 ++++
 target-ppc/helper.h          |  1 +
 tcg/tcg.c                    | 11 ++++++
 6 files changed, 125 insertions(+), 6 deletions(-)
 create mode 100644 include/exec/helper-ffi.h

diff --git a/configure b/configure
index 46bc0c9..8c33f83 100755
--- a/configure
+++ b/configure
@@ -1755,6 +1755,18 @@ EOF
 fi
 
 ##########################################
+# libffi check
+
+if test "$tcg_interpreter" != "no" ; then
+    if $pkg_config --atleast-version=3.0 libffi; then
+        LIBS="$LIBS `$pkg_config --libs libffi`"
+        QEMU_CFLAGS="$QEMU_CFLAGS `$pkg_config --cflags libffi`"
+    else
+        feature_not_found "tcg-interpreter" "Install libffi devel >= 3.0"
+    fi
+fi
+
+##########################################
 # libseccomp check
 
 if test "$seccomp" != "no" ; then
diff --git a/include/exec/helper-ffi.h b/include/exec/helper-ffi.h
new file mode 100644
index 0000000..78579aa
--- /dev/null
+++ b/include/exec/helper-ffi.h
@@ -0,0 +1,83 @@
+/* Helper file for declaring TCG helper functions.
+   This one defines data structures private to tcg.c.  */
+
+#ifndef HELPER_FFI_H
+#define HELPER_FFI_H 1
+
+#include <exec/helper-head.h>
+
+#define dh_ffitype_i32  &ffi_type_uint32
+#define dh_ffitype_s32  &ffi_type_sint32
+#define dh_ffitype_int  &ffi_type_sint
+#define dh_ffitype_i64  &ffi_type_uint64
+#define dh_ffitype_s64  &ffi_type_sint64
+#define dh_ffitype_f32  &ffi_type_uint32
+#define dh_ffitype_f64  &ffi_type_uint64
+#ifdef TARGET_LONG_BITS
+# if TARGET_LONG_BITS == 32
+#  define dh_ffitype_tl &ffi_type_uint32
+# else
+#  define dh_ffitype_tl &ffi_type_uint64
+# endif
+#endif
+#define dh_ffitype_ptr  &ffi_type_pointer
+#define dh_ffitype_void &ffi_type_void
+#define dh_ffitype_noreturn &ffi_type_void
+#define dh_ffitype_env  &ffi_type_pointer
+#define dh_ffitype(t) glue(dh_ffitype_, t)
+
+#define DEF_HELPER_FLAGS_0(NAME, FLAGS, ret)    \
+    static ffi_cif cif_##NAME = {               \
+        .rtype = dh_ffitype(ret), .nargs = 0,   \
+    };
+
+#define DEF_HELPER_FLAGS_1(NAME, FLAGS, ret, t1)                            \
+    static ffi_type *cif_args_##NAME[1] = { dh_ffitype(t1) };               \
+    static ffi_cif cif_##NAME = {                                           \
+        .rtype = dh_ffitype(ret), .nargs = 1, .arg_types = cif_args_##NAME, \
+    };
+
+#define DEF_HELPER_FLAGS_2(NAME, FLAGS, ret, t1, t2)                        \
+    static ffi_type *cif_args_##NAME[2] = {                                 \
+        dh_ffitype(t1), dh_ffitype(t2)                                      \
+    };                                                                      \
+    static ffi_cif cif_##NAME = {                                           \
+        .rtype = dh_ffitype(ret), .nargs = 2, .arg_types = cif_args_##NAME, \
+    };
+
+#define DEF_HELPER_FLAGS_3(NAME, FLAGS, ret, t1, t2, t3) \
+    static ffi_type *cif_args_##NAME[3] = {                                 \
+        dh_ffitype(t1), dh_ffitype(t2), dh_ffitype(t3)                      \
+    };                                                                      \
+    static ffi_cif cif_##NAME = {                                           \
+        .rtype = dh_ffitype(ret), .nargs = 3, .arg_types = cif_args_##NAME, \
+    };
+
+#define DEF_HELPER_FLAGS_4(NAME, FLAGS, ret, t1, t2, t3, t4) \
+    static ffi_type *cif_args_##NAME[4] = {                                 \
+        dh_ffitype(t1), dh_ffitype(t2), dh_ffitype(t3), dh_ffitype(t4)      \
+    };                                                                      \
+    static ffi_cif cif_##NAME = {                                           \
+        .rtype = dh_ffitype(ret), .nargs = 4, .arg_types = cif_args_##NAME, \
+    };
+
+#define DEF_HELPER_FLAGS_5(NAME, FLAGS, ret, t1, t2, t3, t4, t5) \
+    static ffi_type *cif_args_##NAME[5] = {                                 \
+        dh_ffitype(t1), dh_ffitype(t2), dh_ffitype(t3),                     \
+        dh_ffitype(t4), dh_ffitype(t5)                                      \
+    };                                                                      \
+    static ffi_cif cif_##NAME = {                                           \
+        .rtype = dh_ffitype(ret), .nargs = 5, .arg_types = cif_args_##NAME, \
+    };
+
+#include "helper.h"
+#include "tcg-runtime.h"
+
+#undef DEF_HELPER_FLAGS_0
+#undef DEF_HELPER_FLAGS_1
+#undef DEF_HELPER_FLAGS_2
+#undef DEF_HELPER_FLAGS_3
+#undef DEF_HELPER_FLAGS_4
+#undef DEF_HELPER_FLAGS_5
+
+#endif /* HELPER_FFI_H */
diff --git a/include/exec/helper-tcg.h b/include/exec/helper-tcg.h
index d704c81..c0c258f 100644
--- a/include/exec/helper-tcg.h
+++ b/include/exec/helper-tcg.h
@@ -6,31 +6,37 @@
 
 #include <exec/helper-head.h>
 
+#ifdef CONFIG_TCG_INTERPRETER
+# define DO_CIF(NAME)  .cif = &cif_##NAME,
+#else
+# define DO_CIF(NAME)
+#endif
+
 #define DEF_HELPER_FLAGS_0(NAME, FLAGS, ret) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) },
 
 #define DEF_HELPER_FLAGS_1(NAME, FLAGS, ret, t1) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) },
 
 #define DEF_HELPER_FLAGS_2(NAME, FLAGS, ret, t1, t2) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
     | dh_sizemask(t2, 2) },
 
 #define DEF_HELPER_FLAGS_3(NAME, FLAGS, ret, t1, t2, t3) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
     | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) },
 
 #define DEF_HELPER_FLAGS_4(NAME, FLAGS, ret, t1, t2, t3, t4) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
     | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) },
 
 #define DEF_HELPER_FLAGS_5(NAME, FLAGS, ret, t1, t2, t3, t4, t5) \
-  { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
+  { .func = HELPER(NAME), DO_CIF(NAME) .name = #NAME, .flags = FLAGS, \
     .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
     | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) \
     | dh_sizemask(t5, 5) },
diff --git a/target-i386/ops_sse_header.h b/target-i386/ops_sse_header.h
index a68c7cc..35ec03b 100644
--- a/target-i386/ops_sse_header.h
+++ b/target-i386/ops_sse_header.h
@@ -27,13 +27,19 @@
 #define dh_alias_Reg ptr
 #define dh_alias_XMMReg ptr
 #define dh_alias_MMXReg ptr
+
 #define dh_ctype_Reg Reg *
 #define dh_ctype_XMMReg XMMReg *
 #define dh_ctype_MMXReg MMXReg *
+
 #define dh_is_signed_Reg dh_is_signed_ptr
 #define dh_is_signed_XMMReg dh_is_signed_ptr
 #define dh_is_signed_MMXReg dh_is_signed_ptr
 
+#define dh_ffitype_Reg  dh_ffitype_ptr
+#define dh_ffitype_XMMReg  dh_ffitype_ptr
+#define dh_ffitype_MMXReg  dh_ffitype_ptr
+
 DEF_HELPER_3(glue(psrlw, SUFFIX), void, env, Reg, Reg)
 DEF_HELPER_3(glue(psraw, SUFFIX), void, env, Reg, Reg)
 DEF_HELPER_3(glue(psllw, SUFFIX), void, env, Reg, Reg)
diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 08f3916..70a3d50 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -103,6 +103,7 @@ DEF_HELPER_FLAGS_1(ftsqrt, TCG_CALL_NO_RWG_SE, i32, i64)
 #define dh_alias_avr ptr
 #define dh_ctype_avr ppc_avr_t *
 #define dh_is_signed_avr dh_is_signed_ptr
+#define dh_ffitype_avr dh_ffitype_ptr
 
 DEF_HELPER_3(vaddubm, void, avr, avr, avr)
 DEF_HELPER_3(vadduhm, void, avr, avr, avr)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 04280ef..11d1996 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -62,6 +62,10 @@
 
 #include "elf.h"
 
+#ifdef CONFIG_TCG_INTERPRETER
+#include <ffi.h>
+#endif
+
 /* Forward declarations for functions declared in tcg-target.c and used here. 
*/
 static void tcg_target_init(TCGContext *s);
 static void tcg_target_qemu_prologue(TCGContext *s);
@@ -309,6 +313,9 @@ void tcg_pool_reset(TCGContext *s)
 
 typedef struct TCGHelperInfo {
     void *func;
+#ifdef CONFIG_TCG_INTERPRETER
+    ffi_cif *cif;
+#endif
     const char *name;
     unsigned flags;
     unsigned sizemask;
@@ -316,6 +323,10 @@ typedef struct TCGHelperInfo {
 
 #include "exec/helper-proto.h"
 
+#ifdef CONFIG_TCG_INTERPRETER
+#include "exec/helper-ffi.h"
+#endif
+
 static const TCGHelperInfo all_helpers[] = {
 #include "exec/helper-tcg.h"
 };
-- 
1.9.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]