RE: [PATCH v2 1/4] siphash: add cryptographically secure hashtable function
From: David Laight <hidden>
Date: 2016-12-15 15:41:56
Also in:
lkml, netdev
From: Hannes Frederic Sowa
Sent: 15 December 2016 14:57 On 15.12.2016 14:56, David Laight wrote:quoted
From: Hannes Frederic Sowaquoted
Sent: 15 December 2016 12:50 On 15.12.2016 13:28, David Laight wrote:quoted
From: Hannes Frederic Sowaquoted
Sent: 15 December 2016 12:23...quoted
Hmm? Even the Intel ABI expects alignment of unsigned long long to be 8 bytes on 32 bit. Do you question that?Yes. The linux ABI for x86 (32 bit) only requires 32bit alignment for u64 (etc).Hmm, u64 on 32 bit is unsigned long long and not unsigned long. Thus I am actually not sure if the ABI would say anything about that (sorry also for my wrong statement above). Alignment requirement of unsigned long long on gcc with -m32 actually seem to be 8.It depends on the architecture. For x86 it is definitely 4.May I ask for a reference?
Ask anyone who has had to do compatibility layers to support 32bit binaries on 64bit systems.
I couldn't see unsigned long long being mentioned in the ia32 abi spec that I found. I agree that those accesses might be synthetically assembled by gcc and for me the alignment of 4 would have seemed natural. But my gcc at least in 32 bit mode disagrees with that.
Try (retyped):
echo 'struct { long a; long long b; } s; int bar { return sizeof s; }' >foo.c
gcc [-m32] -O2 -S foo.c; cat foo.s
And look at what is generated.
Right now ipv6 addresses have an alignment of 4. So we couldn't even naturally pass them to siphash but would need to copy them around, which I feel like a source of bugs.
That is more of a problem on systems that don't support misaligned accesses. Reading the 64bit values with two explicit 32bit reads would work. I think you can get gcc to do that by adding an aligned(4) attribute to the structure member. David