include/ktap_ffi.h - ktap

Data types defined

Macros defined

Source code

  1. #ifndef __KTAP_FFI_H__
  2. #define __KTAP_FFI_H__

  3. #ifdef CONFIG_KTAP_FFI

  4. #include "../include/ktap_types.h"

  5. /*
  6. * Types design in FFI module
  7. *
  8. * ktap_cdata_t is an instance of csymbol, so it's a combination of csymbol
  9. * and it's actual data in memory.
  10. *
  11. * csymbol structs are globally unique and readonly type that represent C
  12. * types.  For non scalar C types like struct and function, helper structs are
  13. * used to store detailed information. See csymbol_func and csymbol_struct for
  14. * more information.
  15. */

  16. typedef enum {
  17.     /* 0 - 4 */
  18.     FFI_VOID,
  19.     FFI_UINT8,
  20.     FFI_INT8,
  21.     FFI_UINT16,
  22.     FFI_INT16,
  23.     /* 5 - 9 */
  24.     FFI_UINT32,
  25.     FFI_INT32,
  26.     FFI_UINT64,
  27.     FFI_INT64,
  28.     FFI_PTR,
  29.     /* 10 - 12 */
  30.     FFI_FUNC,
  31.     FFI_STRUCT,
  32.     FFI_UNION,
  33.     FFI_UNKNOWN,
  34. } ffi_type;
  35. #define NUM_FFI_TYPE ((int)FFI_UNKNOWN)


  36. /* following struct and macros are added for C typedef
  37. * size and alignment calculation */
  38. typedef struct {
  39.     size_t size;
  40.     size_t align;
  41.     const char *name;
  42. } ffi_mode;
  43. extern const ffi_mode const ffi_type_modes[];

  44. #define ffi_type_size(t) (ffi_type_modes[t].size)
  45. #define ffi_type_align(t) (ffi_type_modes[t].align)
  46. #define ffi_type_name(t) (ffi_type_modes[t].name)


  47. /* start of csymbol definition */
  48. #define CSYM_NAME_MAX_LEN 64

  49. typedef struct csymbol_func {
  50.     void *addr;        /* function address */
  51.     csymbol_id ret_id;    /* function return type */
  52.     int arg_nr;        /* number of arguments */
  53.     csymbol_id *arg_ids;    /* function argument types */
  54.     unsigned has_var_arg;    /* is this a var arg function? */
  55. } csymbol_func;

  56. typedef struct struct_member {
  57.     char name[CSYM_NAME_MAX_LEN];    /* name for this struct member */
  58.     csymbol_id id;            /* type for this struct member */
  59.     int len;                /* length of the array, -1 for non-array */
  60. } struct_member;

  61. typedef struct csymbol_struct {
  62.     int memb_nr;            /* number of members */
  63.     struct_member *members;        /* array for each member definition */
  64.     size_t size;            /* bytes used to store struct */
  65.     /* alignment of the struct, 0 indicates uninitialization */
  66.     size_t align;
  67. } csymbol_struct;


  68. /* wrapper struct for all C symbols */
  69. typedef struct csymbol {
  70.     char name[CSYM_NAME_MAX_LEN];    /* name for this symbol */
  71.     ffi_type type;            /* type for this symbol  */
  72.     /* following members are used only for non scalar C types */
  73.     union {
  74.         csymbol_id p;        /* pointer type */
  75.         csymbol_func f;        /* C function type */
  76.         csymbol_struct st;    /* struct/union type */
  77.         csymbol_id td;        /* typedef type */
  78.     } u;
  79. } csymbol;


  80. /* helper macors for c symbols */
  81. #define max_csym_id(ks) (G(ks)->ffis.csym_nr)

  82. /* lookup csymbol address by its id */
  83. inline csymbol *ffi_get_csym_by_id(ktap_state_t *ks, csymbol_id id);
  84. #define id_to_csym(ks, id) (ffi_get_csym_by_id(ks, id))

  85. /* helper macros for struct csymbol */
  86. #define csym_type(cs) ((cs)->type)
  87. #define csym_name(cs) ((cs)->name)

  88. /*
  89. * helper macros for pointer symbol
  90. */
  91. #define csym_ptr_deref_id(cs) ((cs)->u.p)
  92. #define csym_set_ptr_deref_id(cs, id) ((cs)->u.p = (id))
  93. /* following macro gets csymbol address */
  94. #define csym_ptr_deref(ks, cs) (id_to_csym(ks, csym_ptr_deref_id(cs)))

  95. /*
  96. * helper macros for function symbol
  97. * csym_* accepts csymbol type
  98. * csymf_* accepts csymbol_func type
  99. */
  100. #define csymf_addr(csf) ((csf)->addr)
  101. #define csymf_ret_id(csf) ((csf)->ret_id)
  102. #define csymf_arg_nr(csf) ((csf)->arg_nr)
  103. #define csymf_arg_ids(csf) ((csf)->arg_ids)
  104. /* get csymbol id for the nth argument */
  105. #define csymf_arg_id(csf, n) ((csf)->arg_ids[n])
  106. #define csym_func(cs) (&((cs)->u.f))
  107. #define csym_func_addr(cs) (csymf_addr(csym_func(cs)))
  108. #define csym_func_arg_ids(cs) (csymf_arg_ids(csym_func(cs)))
  109. /* following macros get csymbol address */
  110. #define csymf_ret(ks, csf) (id_to_csym(ks, csymf_ret_id(csf)))
  111. /* get csymbol address for the nth argument */
  112. #define csymf_arg(ks, csf, n) (id_to_csym(ks, csymf_arg_id(csf, n)))
  113. #define csym_func_arg(ks, cs, n) (csymf_arg(ks, csym_func(cs), n))

  114. /*
  115. * helper macors for struct symbol
  116. * csym_* accepts csymbol type
  117. * csymst_* accepts csymbol_struct type
  118. */
  119. #define csymst_mb_nr(csst) ((csst)->memb_nr)
  120. #define csym_struct(cs) (&(cs)->u.st)
  121. #define csym_struct_mb(cs, n) (csymst_mb(csym_struct(cs), n))
  122. #define csym_struct_mb_nr(cs) (csymst_mb_nr(csym_struct(cs)))
  123. /* following macro gets csymbol address for the nth struct member */
  124. #define csymst_mb(csst, n) (&(csst)->members[n])
  125. #define csymst_mb_name(csst, n) ((csst)->members[n].name)
  126. #define csymst_mb_id(csst, n) ((csst)->members[n].id)
  127. #define csymst_mb_len(csst, n) ((csst)->members[n].len)
  128. #define csymst_mb_csym(ks, csst, n) (id_to_csym(ks, (csst)->members[n].id))


  129. /*
  130. * helper macros for ktap_cdata_t type
  131. */
  132. #define cd_csym_id(cd) ((cd)->id)
  133. #define cd_set_csym_id(cd, id) (cd_csym_id(cd) = (id))
  134. #define cd_csym(ks, cd) (id_to_csym(ks, cd_csym_id(cd)))
  135. #define cd_type(ks, cd) (csym_type(cd_csym(ks, cd)))

  136. #define cd_int(cd) ((cd)->u.i)
  137. #define cd_ptr(cd) ((cd)->u.p.addr)
  138. #define cd_ptr_nmemb(cd) ((cd)->u.p.nmemb)
  139. #define cd_record(cd) ((cd)->u.rec)
  140. #define cd_struct(cd) cd_record(cd)
  141. #define cd_union(cd) cd_record(cd)

  142. #ifdef __KERNEL__
  143. size_t csym_size(ktap_state_t *ks, csymbol *sym);
  144. size_t csym_align(ktap_state_t *ks, csymbol *sym);
  145. size_t csym_record_mb_offset_by_name(ktap_state_t *ks,
  146.         csymbol *cs, const char *name);
  147. struct_member *csymst_mb_by_name(ktap_state_t *ks,
  148.         csymbol_struct *csst, const char *name);

  149. void ffi_free_symbols(ktap_state_t *ks);
  150. csymbol_id ffi_get_csym_id(ktap_state_t *ks, char *name);

  151. ktap_cdata_t *kp_cdata_new(ktap_state_t *ks, csymbol_id id);
  152. ktap_cdata_t *kp_cdata_new_ptr(ktap_state_t *ks, void *addr,
  153.         int nmemb, csymbol_id id, int to_allocate);
  154. ktap_cdata_t *kp_cdata_new_record(ktap_state_t *ks, void *val, csymbol_id id);
  155. void kp_cdata_dump(ktap_state_t *ks, ktap_cdata_t *cd);
  156. int kp_cdata_type_match(ktap_state_t *ks, csymbol *cs, ktap_val_t *val);
  157. void kp_cdata_unpack(ktap_state_t *ks, char *dst, csymbol *cs, ktap_val_t *val);
  158. void kp_cdata_ptr_set(ktap_state_t *ks, ktap_cdata_t *cd,
  159.         ktap_val_t *key, ktap_val_t *val);
  160. void kp_cdata_ptr_get(ktap_state_t *ks, ktap_cdata_t *cd,
  161.         ktap_val_t *key, ktap_val_t *val);
  162. void kp_cdata_record_set(ktap_state_t *ks, ktap_cdata_t *cd,
  163.          ktap_val_t *key, ktap_val_t *val);
  164. void kp_cdata_record_get(ktap_state_t *ks, ktap_cdata_t *cd,
  165.          ktap_val_t *key, ktap_val_t *val);

  166. int ffi_call(ktap_state_t *ks, csymbol_func *cf);

  167. #endif /* for CONFIG_FFI_KTAP */
  168. #endif /* for __KERNEL__ */
  169. #endif /* __KTAP_FFI_H__ */