On Thu, 2008-10-16 at 23:45 +0800, Paul Wise wrote:

> Program received signal SIGBUS, Bus error.
> [Switching to Thread 0x40020a50 (LWP 11257)]
> 0x0000ee28 in tiger_t (str=0x5d987, length=<value optimized out>, 
> res=0x5d8d4) at ./src/sh_tiger1.c:284
> 284         tiger_compress_macro(str, res);
> (gdb) bt full
> #0  0x0000ee28 in tiger_t (str=0x5d987, length=<value optimized out>, 
> res=0x5d8d4) at ./src/sh_tiger1.c:284

After replacing tiger_compress_macro with the relevant code, I get this:

Program received signal SIGBUS, Bus error.
[Switching to Thread 0x40020a50 (LWP 11348)]
0x0000ee28 in tiger_t (str=0x5d987, length=<value optimized out>, res=0x5d8d4) 
at ./src/sh_tiger1.c:300
300       x00=str[0*2]; x01=str[0*2+1]; x10=str[1*2]; x11=str[1*2+1];
(gdb) l
295       c0 = res[4];
296       c1 = res[5];
297     
298           save_abc
299     
300       x00=str[0*2]; x01=str[0*2+1]; x10=str[1*2]; x11=str[1*2+1];
301       x20=str[2*2]; x21=str[2*2+1]; x30=str[3*2]; x31=str[3*2+1];
302       x40=str[4*2]; x41=str[4*2+1]; x50=str[5*2]; x51=str[5*2+1];
303       x60=str[6*2]; x61=str[6*2+1]; x70=str[7*2]; x71=str[7*2+1];
304     

Looks like the problem is that the pointer str comes from a static array
of bytes (unsigned char), allocated in ./src/sh_tiger0.c line 101, but
it is used as an array of 32-bit integers, leading to the alignment bug.

This patch makes the SIGBUS go away on my OpenMoko:

--- samhain-2.2.3.orig/src/sh_tiger0.c
+++ samhain-2.2.3/src/sh_tiger0.c
@@ -98,7 +98,7 @@
  */
 SL_TICKET tiger_fd = (-1);
 
-static sh_byte buffer[PRIV_MAX + 72];
+static sh_byte buffer[PRIV_MAX + 72] __attribute__((aligned(32)));
 
 #if defined(TIGER_64_BIT)
 static

Ideally the whole thing would be rewritten to be more alignment-safe,
but this works until upstream can get around to doing this.

-- 
bye,
pabs

http://wiki.debian.org/PaulWise

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to