1*1fd5a2e1SPrashanth Swaminathan /* -----------------------------------------------------------------*-C-*- 2*1fd5a2e1SPrashanth Swaminathan ffitarget.h - Copyright (c) 2012 Anthony Green 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 1996-2003 Red Hat, Inc. 4*1fd5a2e1SPrashanth Swaminathan Target configuration macros for MIPS. 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 7*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 8*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 9*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 10*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 11*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 12*1fd5a2e1SPrashanth Swaminathan the following conditions: 13*1fd5a2e1SPrashanth Swaminathan 14*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 15*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 18*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 25*1fd5a2e1SPrashanth Swaminathan 26*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_TARGET_H 29*1fd5a2e1SPrashanth Swaminathan #define LIBFFI_TARGET_H 30*1fd5a2e1SPrashanth Swaminathan 31*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_H 32*1fd5a2e1SPrashanth Swaminathan #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." 33*1fd5a2e1SPrashanth Swaminathan #endif 34*1fd5a2e1SPrashanth Swaminathan 35*1fd5a2e1SPrashanth Swaminathan #ifdef __linux__ 36*1fd5a2e1SPrashanth Swaminathan # include <asm/sgidefs.h> 37*1fd5a2e1SPrashanth Swaminathan #elif defined(__rtems__) 38*1fd5a2e1SPrashanth Swaminathan /* 39*1fd5a2e1SPrashanth Swaminathan * Subprogram calling convention - copied from sgidefs.h 40*1fd5a2e1SPrashanth Swaminathan */ 41*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_ABI32 1 42*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_NABI32 2 43*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_ABI64 3 44*1fd5a2e1SPrashanth Swaminathan #elif !defined(__OpenBSD__) 45*1fd5a2e1SPrashanth Swaminathan # include <sgidefs.h> 46*1fd5a2e1SPrashanth Swaminathan #endif 47*1fd5a2e1SPrashanth Swaminathan 48*1fd5a2e1SPrashanth Swaminathan # ifndef _ABIN32 49*1fd5a2e1SPrashanth Swaminathan # define _ABIN32 _MIPS_SIM_NABI32 50*1fd5a2e1SPrashanth Swaminathan # endif 51*1fd5a2e1SPrashanth Swaminathan # ifndef _ABI64 52*1fd5a2e1SPrashanth Swaminathan # define _ABI64 _MIPS_SIM_ABI64 53*1fd5a2e1SPrashanth Swaminathan # endif 54*1fd5a2e1SPrashanth Swaminathan # ifndef _ABIO32 55*1fd5a2e1SPrashanth Swaminathan # define _ABIO32 _MIPS_SIM_ABI32 56*1fd5a2e1SPrashanth Swaminathan # endif 57*1fd5a2e1SPrashanth Swaminathan 58*1fd5a2e1SPrashanth Swaminathan #if !defined(_MIPS_SIM) 59*1fd5a2e1SPrashanth Swaminathan # error -- something is very wrong -- 60*1fd5a2e1SPrashanth Swaminathan #else 61*1fd5a2e1SPrashanth Swaminathan # if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) 62*1fd5a2e1SPrashanth Swaminathan # define FFI_MIPS_N32 63*1fd5a2e1SPrashanth Swaminathan # else 64*1fd5a2e1SPrashanth Swaminathan # if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) 65*1fd5a2e1SPrashanth Swaminathan # define FFI_MIPS_O32 66*1fd5a2e1SPrashanth Swaminathan # else 67*1fd5a2e1SPrashanth Swaminathan # error -- this is an unsupported platform -- 68*1fd5a2e1SPrashanth Swaminathan # endif 69*1fd5a2e1SPrashanth Swaminathan # endif 70*1fd5a2e1SPrashanth Swaminathan #endif 71*1fd5a2e1SPrashanth Swaminathan 72*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32 73*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */ 74*1fd5a2e1SPrashanth Swaminathan # define FFI_SIZEOF_ARG 4 75*1fd5a2e1SPrashanth Swaminathan #else 76*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */ 77*1fd5a2e1SPrashanth Swaminathan # define FFI_SIZEOF_ARG 8 78*1fd5a2e1SPrashanth Swaminathan # if _MIPS_SIM == _ABIN32 79*1fd5a2e1SPrashanth Swaminathan # define FFI_SIZEOF_JAVA_RAW 4 80*1fd5a2e1SPrashanth Swaminathan # endif 81*1fd5a2e1SPrashanth Swaminathan #endif 82*1fd5a2e1SPrashanth Swaminathan 83*1fd5a2e1SPrashanth Swaminathan #define FFI_FLAG_BITS 2 84*1fd5a2e1SPrashanth Swaminathan 85*1fd5a2e1SPrashanth Swaminathan /* SGI's strange assembler requires that we multiply by 4 rather 86*1fd5a2e1SPrashanth Swaminathan than shift left by FFI_FLAG_BITS */ 87*1fd5a2e1SPrashanth Swaminathan 88*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_D FFI_TYPE_DOUBLE 89*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_F FFI_TYPE_FLOAT 90*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE 91*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT 92*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT 93*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE 94*1fd5a2e1SPrashanth Swaminathan 95*1fd5a2e1SPrashanth Swaminathan /* Needed for N32 structure returns */ 96*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 97*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 98*1fd5a2e1SPrashanth Swaminathan 99*1fd5a2e1SPrashanth Swaminathan #if 0 100*1fd5a2e1SPrashanth Swaminathan /* The SGI assembler can't handle this.. */ 101*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT 102*1fd5a2e1SPrashanth Swaminathan /* (and so on) */ 103*1fd5a2e1SPrashanth Swaminathan #else 104*1fd5a2e1SPrashanth Swaminathan /* ...so we calculate these by hand! */ 105*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_D 61 106*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_F 45 107*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD 253 108*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FF 173 109*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FD 237 110*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DF 189 111*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SMALL 93 112*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SMALL2 109 113*1fd5a2e1SPrashanth Swaminathan 114*1fd5a2e1SPrashanth Swaminathan /* and for n32 soft float, add 16 * 2^4 */ 115*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_D_SOFT 317 116*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_F_SOFT 301 117*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD_SOFT 509 118*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FF_SOFT 429 119*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FD_SOFT 493 120*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DF_SOFT 445 121*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SOFT 16 122*1fd5a2e1SPrashanth Swaminathan #endif 123*1fd5a2e1SPrashanth Swaminathan 124*1fd5a2e1SPrashanth Swaminathan #ifdef LIBFFI_ASM 125*1fd5a2e1SPrashanth Swaminathan #define v0 $2 126*1fd5a2e1SPrashanth Swaminathan #define v1 $3 127*1fd5a2e1SPrashanth Swaminathan #define a0 $4 128*1fd5a2e1SPrashanth Swaminathan #define a1 $5 129*1fd5a2e1SPrashanth Swaminathan #define a2 $6 130*1fd5a2e1SPrashanth Swaminathan #define a3 $7 131*1fd5a2e1SPrashanth Swaminathan #define a4 $8 132*1fd5a2e1SPrashanth Swaminathan #define a5 $9 133*1fd5a2e1SPrashanth Swaminathan #define a6 $10 134*1fd5a2e1SPrashanth Swaminathan #define a7 $11 135*1fd5a2e1SPrashanth Swaminathan #define t0 $8 136*1fd5a2e1SPrashanth Swaminathan #define t1 $9 137*1fd5a2e1SPrashanth Swaminathan #define t2 $10 138*1fd5a2e1SPrashanth Swaminathan #define t3 $11 139*1fd5a2e1SPrashanth Swaminathan #define t4 $12 140*1fd5a2e1SPrashanth Swaminathan #define t5 $13 141*1fd5a2e1SPrashanth Swaminathan #define t6 $14 142*1fd5a2e1SPrashanth Swaminathan #define t7 $15 143*1fd5a2e1SPrashanth Swaminathan #define t8 $24 144*1fd5a2e1SPrashanth Swaminathan #define t9 $25 145*1fd5a2e1SPrashanth Swaminathan #define ra $31 146*1fd5a2e1SPrashanth Swaminathan 147*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32 148*1fd5a2e1SPrashanth Swaminathan # define REG_L lw 149*1fd5a2e1SPrashanth Swaminathan # define REG_S sw 150*1fd5a2e1SPrashanth Swaminathan # define SUBU subu 151*1fd5a2e1SPrashanth Swaminathan # define ADDU addu 152*1fd5a2e1SPrashanth Swaminathan # define SRL srl 153*1fd5a2e1SPrashanth Swaminathan # define LI li 154*1fd5a2e1SPrashanth Swaminathan #else /* !FFI_MIPS_O32 */ 155*1fd5a2e1SPrashanth Swaminathan # define REG_L ld 156*1fd5a2e1SPrashanth Swaminathan # define REG_S sd 157*1fd5a2e1SPrashanth Swaminathan # define SUBU dsubu 158*1fd5a2e1SPrashanth Swaminathan # define ADDU daddu 159*1fd5a2e1SPrashanth Swaminathan # define SRL dsrl 160*1fd5a2e1SPrashanth Swaminathan # define LI dli 161*1fd5a2e1SPrashanth Swaminathan # if (_MIPS_SIM==_ABI64) 162*1fd5a2e1SPrashanth Swaminathan # define LA dla 163*1fd5a2e1SPrashanth Swaminathan # define EH_FRAME_ALIGN 3 164*1fd5a2e1SPrashanth Swaminathan # define FDE_ADDR_BYTES .8byte 165*1fd5a2e1SPrashanth Swaminathan # else 166*1fd5a2e1SPrashanth Swaminathan # define LA la 167*1fd5a2e1SPrashanth Swaminathan # define EH_FRAME_ALIGN 2 168*1fd5a2e1SPrashanth Swaminathan # define FDE_ADDR_BYTES .4byte 169*1fd5a2e1SPrashanth Swaminathan # endif /* _MIPS_SIM==_ABI64 */ 170*1fd5a2e1SPrashanth Swaminathan #endif /* !FFI_MIPS_O32 */ 171*1fd5a2e1SPrashanth Swaminathan #else /* !LIBFFI_ASM */ 172*1fd5a2e1SPrashanth Swaminathan # ifdef __GNUC__ 173*1fd5a2e1SPrashanth Swaminathan # ifdef FFI_MIPS_O32 174*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */ 175*1fd5a2e1SPrashanth Swaminathan typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); 176*1fd5a2e1SPrashanth Swaminathan typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); 177*1fd5a2e1SPrashanth Swaminathan #else 178*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */ 179*1fd5a2e1SPrashanth Swaminathan typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); 180*1fd5a2e1SPrashanth Swaminathan typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); 181*1fd5a2e1SPrashanth Swaminathan # endif 182*1fd5a2e1SPrashanth Swaminathan # else 183*1fd5a2e1SPrashanth Swaminathan # ifdef FFI_MIPS_O32 184*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */ 185*1fd5a2e1SPrashanth Swaminathan typedef __uint32_t ffi_arg; 186*1fd5a2e1SPrashanth Swaminathan typedef __int32_t ffi_sarg; 187*1fd5a2e1SPrashanth Swaminathan # else 188*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */ 189*1fd5a2e1SPrashanth Swaminathan typedef __uint64_t ffi_arg; 190*1fd5a2e1SPrashanth Swaminathan typedef __int64_t ffi_sarg; 191*1fd5a2e1SPrashanth Swaminathan # endif 192*1fd5a2e1SPrashanth Swaminathan # endif /* __GNUC__ */ 193*1fd5a2e1SPrashanth Swaminathan 194*1fd5a2e1SPrashanth Swaminathan typedef enum ffi_abi { 195*1fd5a2e1SPrashanth Swaminathan FFI_FIRST_ABI = 0, 196*1fd5a2e1SPrashanth Swaminathan FFI_O32, 197*1fd5a2e1SPrashanth Swaminathan FFI_N32, 198*1fd5a2e1SPrashanth Swaminathan FFI_N64, 199*1fd5a2e1SPrashanth Swaminathan FFI_O32_SOFT_FLOAT, 200*1fd5a2e1SPrashanth Swaminathan FFI_N32_SOFT_FLOAT, 201*1fd5a2e1SPrashanth Swaminathan FFI_N64_SOFT_FLOAT, 202*1fd5a2e1SPrashanth Swaminathan FFI_LAST_ABI, 203*1fd5a2e1SPrashanth Swaminathan 204*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32 205*1fd5a2e1SPrashanth Swaminathan #ifdef __mips_soft_float 206*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT 207*1fd5a2e1SPrashanth Swaminathan #else 208*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_O32 209*1fd5a2e1SPrashanth Swaminathan #endif 210*1fd5a2e1SPrashanth Swaminathan #else 211*1fd5a2e1SPrashanth Swaminathan # if _MIPS_SIM==_ABI64 212*1fd5a2e1SPrashanth Swaminathan # ifdef __mips_soft_float 213*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT 214*1fd5a2e1SPrashanth Swaminathan # else 215*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_N64 216*1fd5a2e1SPrashanth Swaminathan # endif 217*1fd5a2e1SPrashanth Swaminathan # else 218*1fd5a2e1SPrashanth Swaminathan # ifdef __mips_soft_float 219*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT 220*1fd5a2e1SPrashanth Swaminathan # else 221*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_N32 222*1fd5a2e1SPrashanth Swaminathan # endif 223*1fd5a2e1SPrashanth Swaminathan # endif 224*1fd5a2e1SPrashanth Swaminathan #endif 225*1fd5a2e1SPrashanth Swaminathan } ffi_abi; 226*1fd5a2e1SPrashanth Swaminathan 227*1fd5a2e1SPrashanth Swaminathan #define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag; unsigned mips_nfixedargs 228*1fd5a2e1SPrashanth Swaminathan #define FFI_TARGET_SPECIFIC_VARIADIC 229*1fd5a2e1SPrashanth Swaminathan #endif /* !LIBFFI_ASM */ 230*1fd5a2e1SPrashanth Swaminathan 231*1fd5a2e1SPrashanth Swaminathan /* ---- Definitions for closures ----------------------------------------- */ 232*1fd5a2e1SPrashanth Swaminathan 233*1fd5a2e1SPrashanth Swaminathan #define FFI_CLOSURES 1 234*1fd5a2e1SPrashanth Swaminathan #define FFI_GO_CLOSURES 1 235*1fd5a2e1SPrashanth Swaminathan #define FFI_NATIVE_RAW_API 0 236*1fd5a2e1SPrashanth Swaminathan 237*1fd5a2e1SPrashanth Swaminathan #if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) 238*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 20 239*1fd5a2e1SPrashanth Swaminathan #else 240*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 56 241*1fd5a2e1SPrashanth Swaminathan #endif 242*1fd5a2e1SPrashanth Swaminathan 243*1fd5a2e1SPrashanth Swaminathan #endif 244*1fd5a2e1SPrashanth Swaminathan 245