1*0f4e14c2SRichard Henderson /* 2*0f4e14c2SRichard Henderson * TCG Helper Infomation Structure 3*0f4e14c2SRichard Henderson * 4*0f4e14c2SRichard Henderson * Copyright (c) 2023 Linaro Ltd 5*0f4e14c2SRichard Henderson * 6*0f4e14c2SRichard Henderson * SPDX-License-Identifier: GPL-2.0-or-later 7*0f4e14c2SRichard Henderson */ 8*0f4e14c2SRichard Henderson 9*0f4e14c2SRichard Henderson #ifndef TCG_HELPER_INFO_H 10*0f4e14c2SRichard Henderson #define TCG_HELPER_INFO_H 11*0f4e14c2SRichard Henderson 12*0f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER 13*0f4e14c2SRichard Henderson #include <ffi.h> 14*0f4e14c2SRichard Henderson #endif 15*0f4e14c2SRichard Henderson 16*0f4e14c2SRichard Henderson /* 17*0f4e14c2SRichard Henderson * Describe the calling convention of a given argument type. 18*0f4e14c2SRichard Henderson */ 19*0f4e14c2SRichard Henderson typedef enum { 20*0f4e14c2SRichard Henderson TCG_CALL_RET_NORMAL, /* by registers */ 21*0f4e14c2SRichard Henderson TCG_CALL_RET_BY_REF, /* for i128, by reference */ 22*0f4e14c2SRichard Henderson TCG_CALL_RET_BY_VEC, /* for i128, by vector register */ 23*0f4e14c2SRichard Henderson } TCGCallReturnKind; 24*0f4e14c2SRichard Henderson 25*0f4e14c2SRichard Henderson typedef enum { 26*0f4e14c2SRichard Henderson TCG_CALL_ARG_NORMAL, /* by registers (continuing onto stack) */ 27*0f4e14c2SRichard Henderson TCG_CALL_ARG_EVEN, /* like normal, but skipping odd slots */ 28*0f4e14c2SRichard Henderson TCG_CALL_ARG_EXTEND, /* for i32, as a sign/zero-extended i64 */ 29*0f4e14c2SRichard Henderson TCG_CALL_ARG_EXTEND_U, /* ... as a zero-extended i64 */ 30*0f4e14c2SRichard Henderson TCG_CALL_ARG_EXTEND_S, /* ... as a sign-extended i64 */ 31*0f4e14c2SRichard Henderson TCG_CALL_ARG_BY_REF, /* for i128, by reference, first */ 32*0f4e14c2SRichard Henderson TCG_CALL_ARG_BY_REF_N, /* ... by reference, subsequent */ 33*0f4e14c2SRichard Henderson } TCGCallArgumentKind; 34*0f4e14c2SRichard Henderson 35*0f4e14c2SRichard Henderson typedef struct TCGCallArgumentLoc { 36*0f4e14c2SRichard Henderson TCGCallArgumentKind kind : 8; 37*0f4e14c2SRichard Henderson unsigned arg_slot : 8; 38*0f4e14c2SRichard Henderson unsigned ref_slot : 8; 39*0f4e14c2SRichard Henderson unsigned arg_idx : 4; 40*0f4e14c2SRichard Henderson unsigned tmp_subindex : 2; 41*0f4e14c2SRichard Henderson } TCGCallArgumentLoc; 42*0f4e14c2SRichard Henderson 43*0f4e14c2SRichard Henderson typedef struct TCGHelperInfo { 44*0f4e14c2SRichard Henderson void *func; 45*0f4e14c2SRichard Henderson const char *name; 46*0f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER 47*0f4e14c2SRichard Henderson ffi_cif *cif; 48*0f4e14c2SRichard Henderson #endif 49*0f4e14c2SRichard Henderson unsigned typemask : 32; 50*0f4e14c2SRichard Henderson unsigned flags : 8; 51*0f4e14c2SRichard Henderson unsigned nr_in : 8; 52*0f4e14c2SRichard Henderson unsigned nr_out : 8; 53*0f4e14c2SRichard Henderson TCGCallReturnKind out_kind : 8; 54*0f4e14c2SRichard Henderson 55*0f4e14c2SRichard Henderson /* Maximum physical arguments are constrained by TCG_TYPE_I128. */ 56*0f4e14c2SRichard Henderson TCGCallArgumentLoc in[MAX_CALL_IARGS * (128 / TCG_TARGET_REG_BITS)]; 57*0f4e14c2SRichard Henderson } TCGHelperInfo; 58*0f4e14c2SRichard Henderson 59*0f4e14c2SRichard Henderson #endif /* TCG_HELPER_INFO_H */ 60