root / thunk.h @ 31e31b8a
History | View | Annotate | Download (3.5 kB)
1 |
#ifndef THUNK_H
|
---|---|
2 |
#define THUNK_H
|
3 |
|
4 |
#include <inttypes.h> |
5 |
#include <byteswap.h> |
6 |
|
7 |
#undef WORDS_BIGENDIAN
|
8 |
#if __BYTE_ORDER == __BIG_ENDIAN
|
9 |
#define WORDS_BIGENDIAN
|
10 |
#endif
|
11 |
|
12 |
#ifdef WORD_BIGENDIAN
|
13 |
#define BSWAP_NEEDED
|
14 |
#endif
|
15 |
|
16 |
/* XXX: auto autoconf */
|
17 |
#define TARGET_I386
|
18 |
#define TARGET_LONG_BITS 32 |
19 |
|
20 |
|
21 |
#if defined(__alpha__)
|
22 |
#define HOST_LONG_BITS 64 |
23 |
#else
|
24 |
#define HOST_LONG_BITS 32 |
25 |
#endif
|
26 |
|
27 |
#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) |
28 |
#define HOST_LONG_SIZE (TARGET_LONG_BITS / 8) |
29 |
|
30 |
static inline uint16_t bswap16(uint16_t x) |
31 |
{ |
32 |
return bswap_16(x);
|
33 |
} |
34 |
|
35 |
static inline uint32_t bswap32(uint32_t x) |
36 |
{ |
37 |
return bswap_32(x);
|
38 |
} |
39 |
|
40 |
static inline uint64_t bswap64(uint64_t x) |
41 |
{ |
42 |
return bswap_64(x);
|
43 |
} |
44 |
|
45 |
static void inline bswap16s(uint16_t *s) |
46 |
{ |
47 |
*s = bswap16(*s); |
48 |
} |
49 |
|
50 |
static void inline bswap32s(uint32_t *s) |
51 |
{ |
52 |
*s = bswap32(*s); |
53 |
} |
54 |
|
55 |
static void inline bswap64s(uint64_t *s) |
56 |
{ |
57 |
*s = bswap64(*s); |
58 |
} |
59 |
|
60 |
#ifdef BSWAP_NEEDED
|
61 |
|
62 |
static inline uint16_t tswap16(uint16_t s) |
63 |
{ |
64 |
return bswap16(s);
|
65 |
} |
66 |
|
67 |
static inline uint32_t tswap32(uint32_t s) |
68 |
{ |
69 |
return bswap32(s);
|
70 |
} |
71 |
|
72 |
static inline uint64_t tswap64(uint64_t s) |
73 |
{ |
74 |
return bswap64(s);
|
75 |
} |
76 |
|
77 |
static void inline tswap16s(uint16_t *s) |
78 |
{ |
79 |
*s = bswap16(*s); |
80 |
} |
81 |
|
82 |
static void inline tswap32s(uint32_t *s) |
83 |
{ |
84 |
*s = bswap32(*s); |
85 |
} |
86 |
|
87 |
static void inline tswap64s(uint64_t *s) |
88 |
{ |
89 |
*s = bswap64(*s); |
90 |
} |
91 |
|
92 |
#else
|
93 |
|
94 |
static inline uint16_t tswap16(uint16_t s) |
95 |
{ |
96 |
return s;
|
97 |
} |
98 |
|
99 |
static inline uint32_t tswap32(uint32_t s) |
100 |
{ |
101 |
return s;
|
102 |
} |
103 |
|
104 |
static inline uint64_t tswap64(uint64_t s) |
105 |
{ |
106 |
return s;
|
107 |
} |
108 |
|
109 |
static void inline tswap16s(uint16_t *s) |
110 |
{ |
111 |
} |
112 |
|
113 |
static void inline tswap32s(uint32_t *s) |
114 |
{ |
115 |
} |
116 |
|
117 |
static void inline tswap64s(uint64_t *s) |
118 |
{ |
119 |
} |
120 |
|
121 |
#endif
|
122 |
|
123 |
#if TARGET_LONG_SIZE == 4 |
124 |
#define tswapl(s) tswap32(s)
|
125 |
#define tswapls(s) tswap32s((uint32_t *)(s))
|
126 |
#else
|
127 |
#define tswapl(s) tswap64(s)
|
128 |
#define tswapls(s) tswap64s((uint64_t *)(s))
|
129 |
#endif
|
130 |
|
131 |
#if TARGET_LONG_SIZE == 4 |
132 |
typedef int32_t target_long;
|
133 |
typedef uint32_t target_ulong;
|
134 |
#elif TARGET_LONG_SIZE == 8 |
135 |
typedef int64_t target_long;
|
136 |
typedef uint64_t target_ulong;
|
137 |
#else
|
138 |
#error TARGET_LONG_SIZE undefined
|
139 |
#endif
|
140 |
|
141 |
/* types enums definitions */
|
142 |
|
143 |
typedef enum argtype { |
144 |
TYPE_NULL, |
145 |
TYPE_CHAR, |
146 |
TYPE_SHORT, |
147 |
TYPE_INT, |
148 |
TYPE_LONG, |
149 |
TYPE_ULONG, |
150 |
TYPE_PTRVOID, /* pointer on unknown data */
|
151 |
TYPE_LONGLONG, |
152 |
TYPE_ULONGLONG, |
153 |
TYPE_PTR, |
154 |
TYPE_ARRAY, |
155 |
TYPE_STRUCT, |
156 |
} argtype; |
157 |
|
158 |
#define MK_PTR(type) TYPE_PTR, type
|
159 |
#define MK_ARRAY(type, size) TYPE_ARRAY, size, type
|
160 |
#define MK_STRUCT(id) TYPE_STRUCT, id
|
161 |
|
162 |
#define THUNK_TARGET 0 |
163 |
#define THUNK_HOST 1 |
164 |
|
165 |
typedef struct { |
166 |
/* standard struct handling */
|
167 |
const argtype *field_types;
|
168 |
int nb_fields;
|
169 |
int *field_offsets[2]; |
170 |
/* special handling */
|
171 |
void (*convert[2])(void *dst, const void *src); |
172 |
int size[2]; |
173 |
int align[2]; |
174 |
const char *name; |
175 |
} StructEntry; |
176 |
|
177 |
/* Translation table for bitmasks... */
|
178 |
typedef struct bitmask_transtbl { |
179 |
unsigned int x86_mask; |
180 |
unsigned int x86_bits; |
181 |
unsigned int alpha_mask; |
182 |
unsigned int alpha_bits; |
183 |
} bitmask_transtbl; |
184 |
|
185 |
void thunk_register_struct(int id, const char *name, const argtype *types); |
186 |
void thunk_register_struct_direct(int id, const char *name, StructEntry *se1); |
187 |
const argtype *thunk_convert(void *dst, const void *src, |
188 |
const argtype *type_ptr, int to_host); |
189 |
|
190 |
unsigned int target_to_host_bitmask(unsigned int x86_mask, |
191 |
bitmask_transtbl * trans_tbl); |
192 |
unsigned int host_to_target_bitmask(unsigned int alpha_mask, |
193 |
bitmask_transtbl * trans_tbl); |
194 |
|
195 |
#endif
|