66 lines
1.7 KiB
Diff
66 lines
1.7 KiB
Diff
Index: qemu/thunk.h
|
|
================================================================================
|
|
--- qemu/thunk.c
|
|
+++ qemu/thunk.c
|
|
@@ -40,6 +40,7 @@
|
|
case TYPE_CHAR:
|
|
case TYPE_SHORT:
|
|
case TYPE_INT:
|
|
+ case TYPE_INTBITFIELD:
|
|
case TYPE_LONGLONG:
|
|
case TYPE_ULONGLONG:
|
|
case TYPE_LONG:
|
|
@@ -132,6 +133,26 @@
|
|
case TYPE_INT:
|
|
*(uint32_t *)dst = tswap32(*(uint32_t *)src);
|
|
break;
|
|
+ case TYPE_INTBITFIELD:
|
|
+#if defined(TARGET_I386) && defined(__powerpc__)
|
|
+ /* powerpc uses the MSB, whereas i386 uses the LSB
|
|
+ * to store the first bit in a field */
|
|
+ {
|
|
+ unsigned char byte = *(uint8_t *)src;
|
|
+ *(uint8_t *)dst = ((byte >> 7) & 1)
|
|
+ | ((byte >> 5) & 2)
|
|
+ | ((byte >> 3) & 4)
|
|
+ | ((byte >> 1) & 8)
|
|
+ | ((byte << 1) & 16)
|
|
+ | ((byte << 3) & 32)
|
|
+ | ((byte << 5) & 64)
|
|
+ | ((byte << 7) & 128);
|
|
+ /* FIXME: implement for bitfields > 1 byte and other archs */
|
|
+ }
|
|
+#else
|
|
+ *(uint32_t *)dst = tswap32(*(uint32_t *)src);
|
|
+#endif
|
|
+ break;
|
|
case TYPE_LONGLONG:
|
|
case TYPE_ULONGLONG:
|
|
*(uint64_t *)dst = tswap64(*(uint64_t *)src);
|
|
--- qemu/thunk.h
|
|
+++ qemu/thunk.h
|
|
@@ -38,6 +38,7 @@
|
|
TYPE_PTR,
|
|
TYPE_ARRAY,
|
|
TYPE_STRUCT,
|
|
+ TYPE_INTBITFIELD,
|
|
} argtype;
|
|
|
|
#define MK_PTR(type) TYPE_PTR, type
|
|
@@ -87,6 +88,7 @@
|
|
case TYPE_SHORT:
|
|
return 2;
|
|
case TYPE_INT:
|
|
+ case TYPE_INTBITFIELD:
|
|
return 4;
|
|
case TYPE_LONGLONG:
|
|
case TYPE_ULONGLONG:
|
|
@@ -124,6 +126,7 @@
|
|
case TYPE_SHORT:
|
|
return 2;
|
|
case TYPE_INT:
|
|
+ case TYPE_INTBITFIELD:
|
|
return 4;
|
|
case TYPE_LONGLONG:
|
|
case TYPE_ULONGLONG:
|