ACK - and thanks!
 -----Original Message-----
 From: crash-utility-bounces(a)redhat.com [mailto:crash-utility-
 bounces(a)redhat.com] On Behalf Of Michael Holzheu
 Sent: Wednesday, September 16, 2009 1:45 PM
 To: Chouinard, Luc
 Cc: wein(a)de.ibm.com; crash
 Subject: [Crash-utility] [PATCH] sial: Fix processing of bitfields on
 bigendian systems
 
 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)) {
 
 
 --
 Crash-utility mailing list
 Crash-utility(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/crash-utility