X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=thunk.c;h=bc9bd2881959a333ed91b9ecda58c707022cbc8a;hb=7ef4da1c3a753888e2678388150f1b846b025168;hp=62520a2976dd7333db354bec186f98c0993a395f;hpb=31e31b8a248ffa216223dad49f75efbdfca5df23;p=qemu diff --git a/thunk.c b/thunk.c index 62520a2..bc9bd28 100644 --- a/thunk.c +++ b/thunk.c @@ -3,25 +3,25 @@ * * Copyright (c) 2003 Fabrice Bellard * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * 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 */ #include #include #include -#include "gemu.h" +#include "qemu.h" #include "thunk.h" //#define DEBUG @@ -29,80 +29,7 @@ #define MAX_STRUCTS 128 /* XXX: make it dynamic */ -static StructEntry struct_entries[MAX_STRUCTS]; - -static inline int thunk_type_size(const argtype *type_ptr, int is_host) -{ - int type, size; - const StructEntry *se; - - type = *type_ptr; - switch(type) { - case TYPE_CHAR: - return 1; - case TYPE_SHORT: - return 2; - case TYPE_INT: - return 4; - case TYPE_LONGLONG: - case TYPE_ULONGLONG: - return 8; - case TYPE_LONG: - case TYPE_ULONG: - case TYPE_PTRVOID: - case TYPE_PTR: - if (is_host) { - return HOST_LONG_SIZE; - } else { - return TARGET_LONG_SIZE; - } - break; - case TYPE_ARRAY: - size = type_ptr[1]; - return size * thunk_type_size(type_ptr + 2, is_host); - case TYPE_STRUCT: - se = struct_entries + type_ptr[1]; - return se->size[is_host]; - default: - return -1; - } -} - -static inline int thunk_type_align(const argtype *type_ptr, int is_host) -{ - int type; - const StructEntry *se; - - type = *type_ptr; - switch(type) { - case TYPE_CHAR: - return 1; - case TYPE_SHORT: - return 2; - case TYPE_INT: - return 4; - case TYPE_LONGLONG: - case TYPE_ULONGLONG: - return 8; - case TYPE_LONG: - case TYPE_ULONG: - case TYPE_PTRVOID: - case TYPE_PTR: - if (is_host) { - return HOST_LONG_SIZE; - } else { - return TARGET_LONG_SIZE; - } - break; - case TYPE_ARRAY: - return thunk_type_align(type_ptr + 2, is_host); - case TYPE_STRUCT: - se = struct_entries + type_ptr[1]; - return se->align[is_host]; - default: - return -1; - } -} +StructEntry struct_entries[MAX_STRUCTS]; static inline const argtype *thunk_type_next(const argtype *type_ptr) { @@ -167,6 +94,7 @@ void thunk_register_struct(int id, const char *name, const argtype *types) offset += size; if (align > max_align) max_align = align; + type_ptr = thunk_type_next(type_ptr); } offset = (offset + max_align - 1) & ~(max_align - 1); se->size[i] = offset; @@ -218,14 +146,14 @@ const argtype *thunk_convert(void *dst, const void *src, case TYPE_LONG: case TYPE_ULONG: case TYPE_PTRVOID: - if (target_to_host) { + if (to_host) { *(uint64_t *)dst = tswap32(*(uint32_t *)src); } else { *(uint32_t *)dst = tswap32(*(uint64_t *)src & 0xffffffff); } break; #else -#error unsupported conversion +#warning unsupported conversion #endif case TYPE_ARRAY: { @@ -308,7 +236,7 @@ unsigned int host_to_target_bitmask(unsigned int alpha_mask, for(btp = trans_tbl; btp->x86_mask && btp->alpha_mask; btp++) { if((alpha_mask & btp->alpha_mask) == btp->alpha_bits) { - x86_mask |= btp->x86_mask; + x86_mask |= btp->x86_bits; } } return(x86_mask);