On 11/12/2014 01:20 AM, Simon McVittie wrote: > Control: severity 757037 grave > Control: tags 757037 + patch > > I'm bumping this bug up to grave severity, because it seems it makes > this liblzo2 version entirely useless on a fairly common armel CPU (my armel > has a Marvell Kirkwood armv5tel, as used in the SheevaPlug and its > derivatives) in the default Debian configuration. It also makes liblzo2 > FTBFS on such machines, because the tests fail.
Thanks. > On Sun, 09 Nov 2014 at 21:26:37 +0100, Marc Kleine-Budde wrote: >> So from my point of view switching unaligned access >> off in libzop with -DLZO_CFG_NO_UNALIGNED should be done on at least >> ARMel. Are there other alignment sensitive platforms in debian? > > (Please Cc me, I am not subscribed to this bug. Non-maintainer contributors > to Debian bugs usually aren't.) Done > I think alignment-sensitivity is the common case, and quietly accepting > unaligned accesses (and giving the correct answer!) as is done on x86 is the > exceptional case... Looking at the linux Kernel, there we have the HAVE_EFFICIENT_UNALIGNED_ACCESS kconfig symbol. When an unaligned access occurs in the kernel it's always fixed up. So the bad code will run, but not as fast as it could. > arch/arm/Kconfig:44: select HAVE_EFFICIENT_UNALIGNED_ACCESS if (CPU_V6 || > CPU_V6K || CPU_V7) && MMU Translated to debian this mean: armel -> unaligned access will silently fail on <= ARMv5 (unless configured otherwise in /proc/cpu/alignment) will work if run on => ARMv6, e.g. Raspberry Pi, Beagle Bone But usually you would use armhf on such a system. armhf -> ok with unaligned access > arch/arm64/Kconfig:50: select HAVE_EFFICIENT_UNALIGNED_ACCESS arm64 -> ok > arch/powerpc/Kconfig:103: select HAVE_EFFICIENT_UNALIGNED_ACCESS if > !CPU_LITTLE_ENDIAN ppc, ppc64 -> ok ppcel -> not ok > arch/x86/Kconfig:64: select HAVE_EFFICIENT_UNALIGNED_ACCESS i386, amd64 -> ok > According to http://www.ibm.com/developerworks/library/pa-dalign/ > the mips family are alignment-sensitive, and so is powerpc sometimes, > although it might do automatic fixup. > > According to https://bugs.launchpad.net/ubuntu/+source/zmqpp/+bug/1256886 > Ubuntu armhf is alignment-sensitive (presumably Debian armhf is the same?) The just "starting lzop" testcase works on my ARMv7, current debian testing, both with armhf and armel root filesystem. /proc/cpu/alignment shows now Problems with the user space. > I've also seen references to sparc not liking unaligned accesses. > > s390 can do unaligned accesses fine according to > http://lxr.free-electrons.com/source/include/asm-s390/unaligned.h?v=2.2.26, > but realistically, who's going to test that? Not me :-) > > I think the safest thing would be to use -DLZO_CFG_NO_UNALIGNED > on all Debian architectures except i386, amd64, and maybe the powerpc > family if someone can test those. I attach a patch that restricts > use of unaligned accesses to i386 and amd64 CPUs (any kernel); > it's easy to extend to whitelist other CPUs where unaligned > accesses are OK. > > liblzo2 does actually try to avoid using unsafe unaligned accesses > by using a structure > > typedef struct lzo_memops_TU2_struct { unsigned char a[2]; } > lzo_memops_TU2; > > and only doing a type-punning assignment similar to[1] > > *(lzo_memops_TU2 *) (void *) dest = *(const lzo_memops_TU2 *) (void *) > src; Which AFAIK should boil down to some kind of memcpy() with compile time constant length. > if that structure has required alignment 1... but it seems (recent?) gcc > might be optimizing that into a single 2-byte operation which requires > alignment. This might be a gcc bug, but then, I suspect this might be > a violation of strict aliasing (hence undefined behaviour) if you get all > language-lawyer about it. Pessimistically assuming that we have to access > byte-by-byte on miscellaneous architectures seems both quicker and safer > than working out whether this is the compiler's fault. > > tl;dr: the attached patch works, I would suggest using it. > > Regards, > S > > [1] Actually it's a little more complicated than that; there are another > couple of layers of typedef between the source code and the reality > regards, Marc
signature.asc
Description: OpenPGP digital signature