[Crash-utility] [PATCH] sial: Fix processing of bitfields on big endian systems

Michael Holzheu holzheu at linux.vnet.ibm.com
Wed Sep 16 17:45:17 UTC 2009


Hi Luc,

The processing of bit fields on big endian systems in sial is currently
broken, because the bits are not copied to the correct position and are
not shifted the right way.

To fix this, the following patch does the processing on big endian
systems as follows:
1. sial_exemem(): Copy complete bit field to the "end" (right) of the 
   long long variable.
2. get_bit_value(): Shift the bits of the bit field member right to
   the "end" of the long long variable. This results in the value of
   the requested bitfield member.

Michael
---
 extensions/libsial/sial_member.c |    7 +++++--
 extensions/libsial/sial_type.c   |    6 +++++-
 2 files changed, 10 insertions(+), 3 deletions(-)

Index: crash-4.0.9/extensions/libsial/sial_member.c
===================================================================
--- crash-4.0.9.orig/extensions/libsial/sial_member.c
+++ crash-4.0.9/extensions/libsial/sial_member.c
@@ -236,10 +236,13 @@ srcpos_t p;
 		}
 		/* bit field gymnastic */
 		else if(stm->m.nbits) {
-
 			ull value=0;
+			void *target = &value;
+
+			if (__BYTE_ORDER != __LITTLE_ENDIAN)
+				target = target + (sizeof(value) - stm->m.size);
 
-			API_GETMEM(m->mem+stm->m.offset, &value, stm->m.size);
+			API_GETMEM(m->mem+stm->m.offset, target, stm->m.size);
 			get_bit_value(value, stm->m.nbits, stm->m.fbit, stm->m.size, v);
 			/* no mempos for bit fields ... */
 
Index: crash-4.0.9/extensions/libsial/sial_type.c
===================================================================
--- crash-4.0.9.orig/extensions/libsial/sial_type.c
+++ crash-4.0.9/extensions/libsial/sial_type.c
@@ -287,7 +287,11 @@ get_bit_value(ull val, int nbits, int bo
         else {
                 mask = ((1 << nbits) - 1);
         }
-        val = val >> boff;
+
+	if (__BYTE_ORDER == __LITTLE_ENDIAN)
+		val = val >> boff;
+	else
+		val = val >> (vnbits - boff - nbits);
 	val &= mask;
 
 	if(issigned(v)) {





More information about the Crash-utility mailing list