Commit 70499c989f434cba8bc2104da9f6ca162c4a937b
1 parent
6a3b9cc9
better than nothing 64 bit support - added sign extension for TYPE_LONG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3605 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
27 additions
and
1 deletions
thunk.c
| ... | ... | @@ -147,11 +147,37 @@ const argtype *thunk_convert(void *dst, const void *src, |
| 147 | 147 | case TYPE_ULONG: |
| 148 | 148 | case TYPE_PTRVOID: |
| 149 | 149 | if (to_host) { |
| 150 | - *(uint64_t *)dst = tswap32(*(uint32_t *)src); | |
| 150 | + if (type == TYPE_LONG) { | |
| 151 | + /* sign extension */ | |
| 152 | + *(uint64_t *)dst = (int32_t)tswap32(*(uint32_t *)src); | |
| 153 | + } else { | |
| 154 | + *(uint64_t *)dst = tswap32(*(uint32_t *)src); | |
| 155 | + } | |
| 151 | 156 | } else { |
| 152 | 157 | *(uint32_t *)dst = tswap32(*(uint64_t *)src & 0xffffffff); |
| 153 | 158 | } |
| 154 | 159 | break; |
| 160 | +#elif HOST_LONG_BITS == 64 && TARGET_ABI_BITS == 64 | |
| 161 | + case TYPE_LONG: | |
| 162 | + case TYPE_ULONG: | |
| 163 | + case TYPE_PTRVOID: | |
| 164 | + *(uint64_t *)dst = tswap64(*(uint64_t *)src); | |
| 165 | + break; | |
| 166 | +#elif HOST_LONG_BITS == 32 && TARGET_ABI_BITS == 64 | |
| 167 | + case TYPE_LONG: | |
| 168 | + case TYPE_ULONG: | |
| 169 | + case TYPE_PTRVOID: | |
| 170 | + if (to_host) { | |
| 171 | + *(uint32_t *)dst = tswap64(*(uint64_t *)src); | |
| 172 | + } else { | |
| 173 | + if (type == TYPE_LONG) { | |
| 174 | + /* sign extension */ | |
| 175 | + *(uint64_t *)dst = tswap64(*(int32_t *)src); | |
| 176 | + } else { | |
| 177 | + *(uint64_t *)dst = tswap64(*(uint32_t *)src); | |
| 178 | + } | |
| 179 | + } | |
| 180 | + break; | |
| 155 | 181 | #else |
| 156 | 182 | #warning unsupported conversion |
| 157 | 183 | #endif | ... | ... |