cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

helper-head.h (4606B)


      1/* Helper file for declaring TCG helper functions.
      2   Used by other helper files.
      3
      4   Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper
      5   functions.  Names should be specified without the helper_ prefix, and
      6   the return and argument types specified.  3 basic types are understood
      7   (i32, i64 and ptr).  Additional aliases are provided for convenience and
      8   to match the types used by the C helper implementation.
      9
     10   The target helper.h should be included in all files that use/define
     11   helper functions.  THis will ensure that function prototypes are
     12   consistent.  In addition it should be included an extra two times for
     13   helper.c, defining:
     14    GEN_HELPER 1 to produce op generation functions (gen_helper_*)
     15    GEN_HELPER 2 to do runtime registration helper functions.
     16 */
     17
     18#ifndef EXEC_HELPER_HEAD_H
     19#define EXEC_HELPER_HEAD_H
     20
     21#define HELPER(name) glue(helper_, name)
     22
     23/* Some types that make sense in C, but not for TCG.  */
     24#define dh_alias_i32 i32
     25#define dh_alias_s32 i32
     26#define dh_alias_int i32
     27#define dh_alias_i64 i64
     28#define dh_alias_s64 i64
     29#define dh_alias_f16 i32
     30#define dh_alias_f32 i32
     31#define dh_alias_f64 i64
     32#define dh_alias_ptr ptr
     33#define dh_alias_cptr ptr
     34#define dh_alias_void void
     35#define dh_alias_noreturn noreturn
     36#define dh_alias(t) glue(dh_alias_, t)
     37
     38#define dh_ctype_i32 uint32_t
     39#define dh_ctype_s32 int32_t
     40#define dh_ctype_int int
     41#define dh_ctype_i64 uint64_t
     42#define dh_ctype_s64 int64_t
     43#define dh_ctype_f16 uint32_t
     44#define dh_ctype_f32 float32
     45#define dh_ctype_f64 float64
     46#define dh_ctype_ptr void *
     47#define dh_ctype_cptr const void *
     48#define dh_ctype_void void
     49#define dh_ctype_noreturn void QEMU_NORETURN
     50#define dh_ctype(t) dh_ctype_##t
     51
     52#ifdef NEED_CPU_H
     53# ifdef TARGET_LONG_BITS
     54#  if TARGET_LONG_BITS == 32
     55#   define dh_alias_tl i32
     56#  else
     57#   define dh_alias_tl i64
     58#  endif
     59# endif
     60# define dh_alias_env ptr
     61# define dh_ctype_tl target_ulong
     62# define dh_ctype_env CPUArchState *
     63#endif
     64
     65/* We can't use glue() here because it falls foul of C preprocessor
     66   recursive expansion rules.  */
     67#define dh_retvar_decl0_void void
     68#define dh_retvar_decl0_noreturn void
     69#define dh_retvar_decl0_i32 TCGv_i32 retval
     70#define dh_retvar_decl0_i64 TCGv_i64 retval
     71#define dh_retvar_decl0_ptr TCGv_ptr retval
     72#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
     73
     74#define dh_retvar_decl_void
     75#define dh_retvar_decl_noreturn
     76#define dh_retvar_decl_i32 TCGv_i32 retval,
     77#define dh_retvar_decl_i64 TCGv_i64 retval,
     78#define dh_retvar_decl_ptr TCGv_ptr retval,
     79#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
     80
     81#define dh_retvar_void NULL
     82#define dh_retvar_noreturn NULL
     83#define dh_retvar_i32 tcgv_i32_temp(retval)
     84#define dh_retvar_i64 tcgv_i64_temp(retval)
     85#define dh_retvar_ptr tcgv_ptr_temp(retval)
     86#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
     87
     88#define dh_typecode_void 0
     89#define dh_typecode_noreturn 0
     90#define dh_typecode_i32 2
     91#define dh_typecode_s32 3
     92#define dh_typecode_i64 4
     93#define dh_typecode_s64 5
     94#define dh_typecode_ptr 6
     95#define dh_typecode(t) glue(dh_typecode_, dh_alias(t))
     96
     97#define dh_callflag_i32  0
     98#define dh_callflag_s32  0
     99#define dh_callflag_int  0
    100#define dh_callflag_i64  0
    101#define dh_callflag_s64  0
    102#define dh_callflag_f16  0
    103#define dh_callflag_f32  0
    104#define dh_callflag_f64  0
    105#define dh_callflag_ptr  0
    106#define dh_callflag_cptr dh_callflag_ptr
    107#define dh_callflag_void 0
    108#define dh_callflag_noreturn TCG_CALL_NO_RETURN
    109#define dh_callflag(t) glue(dh_callflag_, dh_alias(t))
    110
    111#define dh_typemask(t, n)  (dh_typecode(t) << (n * 3))
    112
    113#define dh_arg(t, n) \
    114  glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n))
    115
    116#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
    117
    118#define DEF_HELPER_0(name, ret) \
    119    DEF_HELPER_FLAGS_0(name, 0, ret)
    120#define DEF_HELPER_1(name, ret, t1) \
    121    DEF_HELPER_FLAGS_1(name, 0, ret, t1)
    122#define DEF_HELPER_2(name, ret, t1, t2) \
    123    DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
    124#define DEF_HELPER_3(name, ret, t1, t2, t3) \
    125    DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
    126#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
    127    DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
    128#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \
    129    DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5)
    130#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \
    131    DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6)
    132#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \
    133    DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7)
    134
    135/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
    136
    137#endif /* EXEC_HELPER_HEAD_H */