Commit 24374901004c774e8b932a3526bda6c627942a88

Authored by bellard
1 parent e4533c7a

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
Showing 2 changed files with 78 additions and 77 deletions
... ... @@ -29,80 +29,7 @@
29 29 #define MAX_STRUCTS 128
30 30  
31 31 /* XXX: make it dynamic */
32   -static StructEntry struct_entries[MAX_STRUCTS];
33   -
34   -static inline int thunk_type_size(const argtype *type_ptr, int is_host)
35   -{
36   - int type, size;
37   - const StructEntry *se;
38   -
39   - type = *type_ptr;
40   - switch(type) {
41   - case TYPE_CHAR:
42   - return 1;
43   - case TYPE_SHORT:
44   - return 2;
45   - case TYPE_INT:
46   - return 4;
47   - case TYPE_LONGLONG:
48   - case TYPE_ULONGLONG:
49   - return 8;
50   - case TYPE_LONG:
51   - case TYPE_ULONG:
52   - case TYPE_PTRVOID:
53   - case TYPE_PTR:
54   - if (is_host) {
55   - return HOST_LONG_SIZE;
56   - } else {
57   - return TARGET_LONG_SIZE;
58   - }
59   - break;
60   - case TYPE_ARRAY:
61   - size = type_ptr[1];
62   - return size * thunk_type_size(type_ptr + 2, is_host);
63   - case TYPE_STRUCT:
64   - se = struct_entries + type_ptr[1];
65   - return se->size[is_host];
66   - default:
67   - return -1;
68   - }
69   -}
70   -
71   -static inline int thunk_type_align(const argtype *type_ptr, int is_host)
72   -{
73   - int type;
74   - const StructEntry *se;
75   -
76   - type = *type_ptr;
77   - switch(type) {
78   - case TYPE_CHAR:
79   - return 1;
80   - case TYPE_SHORT:
81   - return 2;
82   - case TYPE_INT:
83   - return 4;
84   - case TYPE_LONGLONG:
85   - case TYPE_ULONGLONG:
86   - return 8;
87   - case TYPE_LONG:
88   - case TYPE_ULONG:
89   - case TYPE_PTRVOID:
90   - case TYPE_PTR:
91   - if (is_host) {
92   - return HOST_LONG_SIZE;
93   - } else {
94   - return TARGET_LONG_SIZE;
95   - }
96   - break;
97   - case TYPE_ARRAY:
98   - return thunk_type_align(type_ptr + 2, is_host);
99   - case TYPE_STRUCT:
100   - se = struct_entries + type_ptr[1];
101   - return se->align[is_host];
102   - default:
103   - return -1;
104   - }
105   -}
  32 +StructEntry struct_entries[MAX_STRUCTS];
106 33  
107 34 static inline const argtype *thunk_type_next(const argtype *type_ptr)
108 35 {
... ... @@ -167,6 +94,7 @@ void thunk_register_struct(int id, const char *name, const argtype *types)
167 94 offset += size;
168 95 if (align > max_align)
169 96 max_align = align;
  97 + type_ptr = thunk_type_next(type_ptr);
170 98 }
171 99 offset = (offset + max_align - 1) & ~(max_align - 1);
172 100 se->size[i] = offset;
... ...
... ... @@ -61,15 +61,13 @@
61 61  
62 62 #endif
63 63  
64   -#ifdef WORDS_BIGENDIAN
  64 +#if defined(WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
65 65 #define BSWAP_NEEDED
66 66 #endif
67 67  
68 68 /* XXX: autoconf */
69   -#define TARGET_I386
70 69 #define TARGET_LONG_BITS 32
71 70  
72   -
73 71 #if defined(__alpha__) || defined (__ia64__)
74 72 #define HOST_LONG_BITS 64
75 73 #else
... ... @@ -239,6 +237,81 @@ void thunk_register_struct_direct(int id, const char *name, StructEntry *se1);
239 237 const argtype *thunk_convert(void *dst, const void *src,
240 238 const argtype *type_ptr, int to_host);
241 239  
  240 +extern StructEntry struct_entries[];
  241 +
  242 +static inline int thunk_type_size(const argtype *type_ptr, int is_host)
  243 +{
  244 + int type, size;
  245 + const StructEntry *se;
  246 +
  247 + type = *type_ptr;
  248 + switch(type) {
  249 + case TYPE_CHAR:
  250 + return 1;
  251 + case TYPE_SHORT:
  252 + return 2;
  253 + case TYPE_INT:
  254 + return 4;
  255 + case TYPE_LONGLONG:
  256 + case TYPE_ULONGLONG:
  257 + return 8;
  258 + case TYPE_LONG:
  259 + case TYPE_ULONG:
  260 + case TYPE_PTRVOID:
  261 + case TYPE_PTR:
  262 + if (is_host) {
  263 + return HOST_LONG_SIZE;
  264 + } else {
  265 + return TARGET_LONG_SIZE;
  266 + }
  267 + break;
  268 + case TYPE_ARRAY:
  269 + size = type_ptr[1];
  270 + return size * thunk_type_size(type_ptr + 2, is_host);
  271 + case TYPE_STRUCT:
  272 + se = struct_entries + type_ptr[1];
  273 + return se->size[is_host];
  274 + default:
  275 + return -1;
  276 + }
  277 +}
  278 +
  279 +static inline int thunk_type_align(const argtype *type_ptr, int is_host)
  280 +{
  281 + int type;
  282 + const StructEntry *se;
  283 +
  284 + type = *type_ptr;
  285 + switch(type) {
  286 + case TYPE_CHAR:
  287 + return 1;
  288 + case TYPE_SHORT:
  289 + return 2;
  290 + case TYPE_INT:
  291 + return 4;
  292 + case TYPE_LONGLONG:
  293 + case TYPE_ULONGLONG:
  294 + return 8;
  295 + case TYPE_LONG:
  296 + case TYPE_ULONG:
  297 + case TYPE_PTRVOID:
  298 + case TYPE_PTR:
  299 + if (is_host) {
  300 + return HOST_LONG_SIZE;
  301 + } else {
  302 + return TARGET_LONG_SIZE;
  303 + }
  304 + break;
  305 + case TYPE_ARRAY:
  306 + return thunk_type_align(type_ptr + 2, is_host);
  307 + case TYPE_STRUCT:
  308 + se = struct_entries + type_ptr[1];
  309 + return se->align[is_host];
  310 + default:
  311 + return -1;
  312 + }
  313 +}
  314 +
242 315 unsigned int target_to_host_bitmask(unsigned int x86_mask,
243 316 bitmask_transtbl * trans_tbl);
244 317 unsigned int host_to_target_bitmask(unsigned int alpha_mask,
... ...