From 4d8616dae4471015f525b61f265b26bad25819bc Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 20 Jun 2018 23:33:39 -0700 Subject: [PATCH] Use memcpy for possibly-unaligned loads and stores. The core change is ported from https://github.com/BLAKE2/BLAKE2/commit/b8024d53e77374d4a5b7868aa17cac3f11c33581. This let's us remove the ALIGNED_ACCESS_REQUIRED configure check. This isn't a very good thing to check through configure because it requires running an executable. That doesn't work for cross compiles. --- configure.ac | 1 - m4/ax_check_aligned_access_required.m4 | 84 -------------------------- src/blake2-impl.h | 20 +++--- 3 files changed, 12 insertions(+), 93 deletions(-) delete mode 100644 m4/ax_check_aligned_access_required.m4 diff --git a/configure.ac b/configure.ac index 2cf6225..c7738a2 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,6 @@ AC_CHECK_FUNCS(explicit_memset) AC_CHECK_FUNCS(memset_s) AC_CHECK_HEADERS([stddef.h stdint.h stdlib.h string.h]) AC_OPENMP -AX_CHECK_ALIGNED_ACCESS_REQUIRED # AX_FORCEINLINE() AC_C_BIGENDIAN( [], diff --git a/m4/ax_check_aligned_access_required.m4 b/m4/ax_check_aligned_access_required.m4 deleted file mode 100644 index b078275..0000000 --- a/m4/ax_check_aligned_access_required.m4 +++ /dev/null @@ -1,84 +0,0 @@ -# ==================================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_aligned_access_required.html -# ==================================================================================== -# -# SYNOPSIS -# -# AC_CHECK_ALIGNED_ACCESS_REQUIRED -# -# DESCRIPTION -# -# While the x86 CPUs allow access to memory objects to be unaligned it -# happens that most of the modern designs require objects to be aligned - -# or they will fail with a buserror. That mode is quite known by -# big-endian machines (sparc, etc) however the alpha cpu is little- -# endian. -# -# The following function will test for aligned access to be required and -# set a config.h define HAVE_ALIGNED_ACCESS_REQUIRED (name derived by -# standard usage). Structures loaded from a file (or mmapped to memory) -# should be accessed per-byte in that case to avoid segfault type errors. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 7 - -AC_DEFUN([AX_CHECK_ALIGNED_ACCESS_REQUIRED], -[AC_CACHE_CHECK([if pointers to integers require aligned access], - [ax_cv_have_aligned_access_required], - [AC_TRY_RUN([ -#include -#include - -int main() -{ - char* string = malloc(40); - int i; - for (i=0; i < 40; i++) string[[i]] = i; - { - void* s = string; - int* p = s+1; - int* q = s+2; - - if (*p == *q) { return 1; } - } - return 0; -} - ], - [ax_cv_have_aligned_access_required=yes], - [ax_cv_have_aligned_access_required=no], - [ax_cv_have_aligned_access_required=no]) - ]) -if test "$ax_cv_have_aligned_access_required" = yes ; then - AC_DEFINE([HAVE_ALIGNED_ACCESS_REQUIRED], [1], - [Define if pointers to integers require aligned access]) -fi -]) diff --git a/src/blake2-impl.h b/src/blake2-impl.h index dc105b6..801f1ae 100644 --- a/src/blake2-impl.h +++ b/src/blake2-impl.h @@ -29,8 +29,10 @@ static inline uint32_t load32( const void *src ) { -#if defined(NATIVE_LITTLE_ENDIAN) && !defined(HAVE_ALIGNED_ACCESS_REQUIRED) - return *( uint32_t * )( src ); +#if defined(NATIVE_LITTLE_ENDIAN) + uint32_t w; + memcpy( &w, src, sizeof( w ) ); + return w; #else const uint8_t *p = ( uint8_t * )src; uint32_t w = *p++; @@ -43,8 +45,10 @@ static inline uint32_t load32( const void *src ) static inline uint64_t load64( const void *src ) { -#if defined(NATIVE_LITTLE_ENDIAN) && !defined(HAVE_ALIGNED_ACCESS_REQUIRED) - return *( uint64_t * )( src ); +#if defined(NATIVE_LITTLE_ENDIAN) + uint64_t w; + memcpy( &w, src, sizeof( w ) ); + return w; #else const uint8_t *p = ( uint8_t * )src; uint64_t w = *p++; @@ -61,8 +65,8 @@ static inline uint64_t load64( const void *src ) static inline void store32( void *dst, uint32_t w ) { -#if defined(NATIVE_LITTLE_ENDIAN) && !defined(HAVE_ALIGNED_ACCESS_REQUIRED) - *( uint32_t * )( dst ) = w; +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy( dst, &w, sizeof( w ) ); #else uint8_t *p = ( uint8_t * )dst; *p++ = ( uint8_t )w; w >>= 8; @@ -74,8 +78,8 @@ static inline void store32( void *dst, uint32_t w ) static inline void store64( void *dst, uint64_t w ) { -#if defined(NATIVE_LITTLE_ENDIAN) && !defined(HAVE_ALIGNED_ACCESS_REQUIRED) - *( uint64_t * )( dst ) = w; +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy( dst, &w, sizeof( w ) ); #else uint8_t *p = ( uint8_t * )dst; *p++ = ( uint8_t )w; w >>= 8;