X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=thunk.h;h=597d753c79a668e4bc3919a51b00b23f6fea1322;hb=48c50a6234447c36d518457c6a1cbb95a1b557fe;hp=b281319a5a5f95d234754dbc16eec03f9c0b6063;hpb=35b66fc4f9dd2c4c3fb8e26c5c1480965b81bbd4;p=qemu diff --git a/thunk.h b/thunk.h index b281319..597d753 100644 --- a/thunk.h +++ b/thunk.h @@ -1,6 +1,6 @@ /* * Generic thunking code to convert data between host and target CPU - * + * * Copyright (c) 2003 Fabrice Bellard * * This library is free software; you can redistribute it and/or @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA */ #ifndef THUNK_H #define THUNK_H @@ -23,83 +23,6 @@ #include #include "cpu.h" -#include "bswap.h" - -#if defined(WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) -#define BSWAP_NEEDED -#endif - -#ifdef BSWAP_NEEDED - -static inline uint16_t tswap16(uint16_t s) -{ - return bswap16(s); -} - -static inline uint32_t tswap32(uint32_t s) -{ - return bswap32(s); -} - -static inline uint64_t tswap64(uint64_t s) -{ - return bswap64(s); -} - -static inline void tswap16s(uint16_t *s) -{ - *s = bswap16(*s); -} - -static inline void tswap32s(uint32_t *s) -{ - *s = bswap32(*s); -} - -static inline void tswap64s(uint64_t *s) -{ - *s = bswap64(*s); -} - -#else - -static inline uint16_t tswap16(uint16_t s) -{ - return s; -} - -static inline uint32_t tswap32(uint32_t s) -{ - return s; -} - -static inline uint64_t tswap64(uint64_t s) -{ - return s; -} - -static inline void tswap16s(uint16_t *s) -{ -} - -static inline void tswap32s(uint32_t *s) -{ -} - -static inline void tswap64s(uint64_t *s) -{ -} - -#endif - -#if TARGET_LONG_SIZE == 4 -#define tswapl(s) tswap32(s) -#define tswapls(s) tswap32s((uint32_t *)(s)) -#else -#define tswapl(s) tswap64(s) -#define tswapls(s) tswap64s((uint64_t *)(s)) -#endif - /* types enums definitions */ typedef enum argtype { @@ -145,13 +68,17 @@ typedef struct bitmask_transtbl { } bitmask_transtbl; void thunk_register_struct(int id, const char *name, const argtype *types); -void thunk_register_struct_direct(int id, const char *name, StructEntry *se1); -const argtype *thunk_convert(void *dst, const void *src, +void thunk_register_struct_direct(int id, const char *name, + const StructEntry *se1); +const argtype *thunk_convert(void *dst, const void *src, const argtype *type_ptr, int to_host); #ifndef NO_THUNK_TYPE_SIZE extern StructEntry struct_entries[]; +int thunk_type_size_array(const argtype *type_ptr, int is_host); +int thunk_type_align_array(const argtype *type_ptr, int is_host); + static inline int thunk_type_size(const argtype *type_ptr, int is_host) { int type, size; @@ -175,12 +102,12 @@ static inline int thunk_type_size(const argtype *type_ptr, int is_host) if (is_host) { return HOST_LONG_SIZE; } else { - return TARGET_LONG_SIZE; + return TARGET_ABI_BITS / 8; } break; case TYPE_ARRAY: size = type_ptr[1]; - return size * thunk_type_size(type_ptr + 2, is_host); + return size * thunk_type_size_array(type_ptr + 2, is_host); case TYPE_STRUCT: se = struct_entries + type_ptr[1]; return se->size[is_host]; @@ -212,11 +139,11 @@ static inline int thunk_type_align(const argtype *type_ptr, int is_host) if (is_host) { return HOST_LONG_SIZE; } else { - return TARGET_LONG_SIZE; + return TARGET_ABI_BITS / 8; } break; case TYPE_ARRAY: - return thunk_type_align(type_ptr + 2, is_host); + return thunk_type_align_array(type_ptr + 2, is_host); case TYPE_STRUCT: se = struct_entries + type_ptr[1]; return se->align[is_host]; @@ -227,9 +154,9 @@ static inline int thunk_type_align(const argtype *type_ptr, int is_host) #endif /* NO_THUNK_TYPE_SIZE */ -unsigned int target_to_host_bitmask(unsigned int x86_mask, - bitmask_transtbl * trans_tbl); -unsigned int host_to_target_bitmask(unsigned int alpha_mask, - bitmask_transtbl * trans_tbl); +unsigned int target_to_host_bitmask(unsigned int x86_mask, + const bitmask_transtbl * trans_tbl); +unsigned int host_to_target_bitmask(unsigned int alpha_mask, + const bitmask_transtbl * trans_tbl); #endif