/* See LICENSE file for copyright and license details. */ #ifdef REQUIRE_FLEXABLE_OR_NPARAMS # if defined(__clang__) || defined(__GNUC__) # define LIBSYSCALLS_FLEXABLE_OR_NPARAMS_ # else # define LIBSYSCALLS_FLEXABLE_OR_NPARAMS_ NPARAMS # warning Setting LIBSYSCALLS_FLEXABLE_OR_NPARAMS_ to NPARAMS as it is not known that the compiler supports static allocation of structs with flexible arrays # endif #endif #include "libsyscalls.h" #include #include #define COMMA , #define MISALIGNMENT(ADDR, ALIGN) (((ADDR) - ((ADDR) % (uintptr_t)(ALIGN))) % (uintptr_t)(ALIGN)) #define ALIGN_BUF(BUF, ALIGN) (&(BUF)[(size_t)MISALIGNMENT((uintptr_t)(char *)(BUF), (ALIGN))]) #define ELEMSOF(ARR) (sizeof(ARR) / sizeof *(ARR)) struct libsyscalls_symbol_printer_data { enum libsyscalls_arch arch; int nr; char buf[]; }; #include "generated/oses.h" #include "generated/arches.h" #include "generated/lowercase.h" #include "generated/macros.h" #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunsafe-buffer-usage" #endif extern const struct libsyscalls_syscall *const *const *const libsyscalls_syscalls_tables_[]; #define X(UPPERCASE, LOWERCASE)\ extern const struct libsyscalls_syscall *const *const libsyscalls_##LOWERCASE##_syscalls_table_[]; LIST_OSES(X,) #undef X #if defined(__clang__) # pragma clang diagnostic pop #endif #define COUNT_ARG_PAIRS(...) (0 __VA_OPT__(+ COUNT_ARG_PAIRS_1(__VA_ARGS__))) /* mk/generate.mk reads these two lines, do not format them as multiline macros! */ #define COUNT_ARG_PAIRS_1(x1, x2, ...) 1 __VA_OPT__(+ COUNT_ARG_PAIRS_2(__VA_ARGS__)) #define PARAMS_BUILD_TYPES_1(x, A, ...) LIBSYSCALLS_TYPE_##A __VA_OPT__(, PARAMS_BUILD_TYPES_2(__VA_ARGS__)) #define PARAMS(...)\ .max_argument_count = COUNT_ARG_PAIRS(__VA_ARGS__),\ .in_pointer_mask = PARAMS_BUILD_MASK(IN, __VA_ARGS__),\ .out_pointer_mask = PARAMS_BUILD_MASK(OUT, __VA_ARGS__), \ .symbolic_mask = PARAMS_BUILD_MASK(SYM, __VA_ARGS__)\ __VA_OPT__(, .parameters_types = {PARAMS_BUILD_TYPES_1(__VA_ARGS__)}) #define ZERO(TYPE) TYPE, .expect_zero = 1 #define LIBSYSCALLS_TYPE_ZERO(TYPE) ZERO(LIBSYSCALLS_TYPE_##TYPE) #define SYMB(TYPE) TYPE, .symbolic_return = 1 #define LIBSYSCALLS_TYPE_SYMB(TYPE) SYMB(LIBSYSCALLS_TYPE_##TYPE) #define SYSCALL_ABI(OS, NAME, CATEGORY, SUBCATEGORY, MIN_ARGS, RETURN_TYPE, ...)\ static struct libsyscalls_syscall_abi OS##_syscall_##NAME = {\ .category = LIBSYSCALLS_CAT_##CATEGORY,\ .subcategory.LOWERCASE_##CATEGORY = LIBSYSCALLS_##CATEGORY##_SUBCAT_##SUBCATEGORY,\ .min_argument_count = MIN_ARGS,\ .return_type = LIBSYSCALLS_TYPE_##RETURN_TYPE,\ __VA_ARGS__\ }