fixed serious ioctl parameter conversion issue - exported type size and align functions
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@239 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
e4533c7a8c
commit
2437490100
76
thunk.c
76
thunk.c
|
@ -29,80 +29,7 @@
|
||||||
#define MAX_STRUCTS 128
|
#define MAX_STRUCTS 128
|
||||||
|
|
||||||
/* XXX: make it dynamic */
|
/* XXX: make it dynamic */
|
||||||
static StructEntry struct_entries[MAX_STRUCTS];
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline const argtype *thunk_type_next(const argtype *type_ptr)
|
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;
|
offset += size;
|
||||||
if (align > max_align)
|
if (align > max_align)
|
||||||
max_align = align;
|
max_align = align;
|
||||||
|
type_ptr = thunk_type_next(type_ptr);
|
||||||
}
|
}
|
||||||
offset = (offset + max_align - 1) & ~(max_align - 1);
|
offset = (offset + max_align - 1) & ~(max_align - 1);
|
||||||
se->size[i] = offset;
|
se->size[i] = offset;
|
||||||
|
|
79
thunk.h
79
thunk.h
|
@ -61,15 +61,13 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#if defined(WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
|
||||||
#define BSWAP_NEEDED
|
#define BSWAP_NEEDED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XXX: autoconf */
|
/* XXX: autoconf */
|
||||||
#define TARGET_I386
|
|
||||||
#define TARGET_LONG_BITS 32
|
#define TARGET_LONG_BITS 32
|
||||||
|
|
||||||
|
|
||||||
#if defined(__alpha__) || defined (__ia64__)
|
#if defined(__alpha__) || defined (__ia64__)
|
||||||
#define HOST_LONG_BITS 64
|
#define HOST_LONG_BITS 64
|
||||||
#else
|
#else
|
||||||
|
@ -239,6 +237,81 @@ void thunk_register_struct_direct(int id, const char *name, StructEntry *se1);
|
||||||
const argtype *thunk_convert(void *dst, const void *src,
|
const argtype *thunk_convert(void *dst, const void *src,
|
||||||
const argtype *type_ptr, int to_host);
|
const argtype *type_ptr, int to_host);
|
||||||
|
|
||||||
|
extern StructEntry struct_entries[];
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int target_to_host_bitmask(unsigned int x86_mask,
|
unsigned int target_to_host_bitmask(unsigned int x86_mask,
|
||||||
bitmask_transtbl * trans_tbl);
|
bitmask_transtbl * trans_tbl);
|
||||||
unsigned int host_to_target_bitmask(unsigned int alpha_mask,
|
unsigned int host_to_target_bitmask(unsigned int alpha_mask,
|
||||||
|
|
Loading…
Reference in New Issue