1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2019, Joyent, Inc.
  14  */
  15 
  16 #ifndef _CHECK_COMMON_H
  17 #define _CHECK_COMMON_H
  18 
  19 /*
  20  * Common definitions for the CTF tests
  21  */
  22 
  23 #include <stdlib.h>
  24 #include <unistd.h>
  25 #include <libctf.h>
  26 #include <err.h>
  27 #include <strings.h>
  28 #include <sys/param.h>
  29 
  30 #ifdef __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 typedef struct check_number {
  35         const char *cn_tname;
  36         uint_t cn_kind;
  37         uint_t cn_flags;
  38         uint_t cn_offset;
  39         uint_t cn_size;
  40 } check_number_t;
  41 
  42 typedef struct check_symbol {
  43         const char *cs_symbol;
  44         const char *cs_type;
  45 } check_symbol_t;
  46 
  47 typedef struct check_descent {
  48         const char *cd_tname;
  49         uint_t cd_kind;
  50         const char *cd_contents;
  51         uint_t cd_nents;
  52 } check_descent_t;
  53 
  54 typedef struct check_descent_test {
  55         const char *cdt_sym;
  56         const check_descent_t *cdt_tests;
  57 } check_descent_test_t;
  58 
  59 typedef struct check_enum {
  60         const char *ce_name;
  61         int64_t ce_value;
  62 } check_enum_t;
  63 
  64 typedef struct check_enum_test {
  65         const char *cet_type;
  66         const check_enum_t *cet_tests;
  67 } check_enum_test_t;
  68 
  69 typedef struct check_member {
  70         const char *cm_name;
  71         const char *cm_type;
  72         ulong_t cm_offset;
  73 } check_member_t;
  74 
  75 typedef struct check_member_test {
  76         const char *cmt_type;
  77         int cmt_kind;
  78         size_t cmt_size;
  79         const check_member_t *cmt_members;
  80 } check_member_test_t;
  81 
  82 typedef struct check_function_test {
  83         const char *cft_name;
  84         const char *cft_rtype;
  85         uint_t cft_nargs;
  86         uint_t cft_flags;
  87         const char **cft_args;
  88 } check_function_test_t;
  89 
  90 /*
  91  * Looks up each type and verifies that it matches the expected type.
  92  */
  93 extern boolean_t ctftest_check_numbers(ctf_file_t *, const check_number_t *);
  94 
  95 /*
  96  * Looks at each symbol specified and verifies that it matches the expected
  97  * type.
  98  */
  99 extern boolean_t ctftest_check_symbols(ctf_file_t *, const check_symbol_t *);
 100 
 101 /*
 102  * Given a symbol name which refers to a type, walks all the references of that
 103  * type and checks against it with each subsequent entry.
 104  */
 105 extern boolean_t ctftest_check_descent(const char *, ctf_file_t *,
 106     const check_descent_t *, boolean_t);
 107 
 108 /*
 109  * Checks that all of the listed members of an enum are present and have the
 110  * right values.
 111  */
 112 extern boolean_t ctftest_check_enum(const char *, ctf_file_t *,
 113     const check_enum_t *);
 114 
 115 /*
 116  * Checks that all of the members of a structure or union are present and have
 117  * the right types and byte offsets. This can be used for either structures or
 118  * unions.
 119  */
 120 extern boolean_t ctftest_check_members(const char *, ctf_file_t *, int, size_t,
 121     const check_member_t *);
 122 
 123 /*
 124  * Check that the named function or function pointer has the correct return
 125  * type, arguments, and function flags.
 126  */
 127 extern boolean_t ctftest_check_function(const char *, ctf_file_t *,
 128     const char *, uint_t, uint_t, const char **);
 129 extern boolean_t ctftest_check_fptr(const char *, ctf_file_t *,
 130     const char *, uint_t, uint_t, const char **);
 131 
 132 /*
 133  * Determine whether or not we have a duplicate type or not based on its name.
 134  */
 135 extern boolean_t ctftest_duplicates(ctf_file_t *);
 136 
 137 #ifdef __cplusplus
 138 }
 139 #endif
 140 
 141 #endif /* _CHECK_COMMON_H */