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