From 2699970af0f4b62631da85616cbaa2252ff45756 Mon Sep 17 00:00:00 2001 From: Jason Wessel Date: Wed, 4 May 2011 15:35:20 -0400 Subject: [PATCH] armv5 archs require write alignment Reads and writes to unsigned int 32 bit numbers must be address aligned or the l2 cache can return junk in the high order 16 bits on reads. This patch activates the original work done for alignment in ltt for the UST code. The config.ac changes will isolate the use of alignment to the known arch type with the problem. Signed-off-by: Jason Wessel Signed-off-by: Mathieu Desnoyers --- configure.ac | 28 +++++++++++++++++++++++++++- include/Makefile.am | 1 + include/ust/config.h.in | 5 +++++ include/ust/core.h | 7 ++++--- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 include/ust/config.h.in diff --git a/configure.ac b/configure.ac index 8ca32ff5..1f3cb33f 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,8 @@ AC_CONFIG_MACRO_DIR([config]) AM_INIT_AUTOMAKE([foreign]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AC_CONFIG_SRCDIR([ustctl/ustctl.c]) -AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_HEADERS([config.h include/ust/config.h]) +AH_TEMPLATE([HAVE_EFFICIENT_UNALIGNED_ACCESS], [Use efficient unaligned access.]) # Checks for programs. AC_PROG_CC @@ -108,6 +109,7 @@ changequote([,])dnl ppc64) LIBFORMAT="elf64-powerpc" ;; s390) LIBFORMAT="elf32-s390" ;; s390x) LIBFORMAT="elf64-s390" ;; + armv5) LIBFORMAT="elf32-littlearm"; NO_UNALIGNED_ACCESS=1 ;; arm) LIBFORMAT="elf32-littlearm" ;; mips*) LIBFORMAT="" ;; *) AC_MSG_ERROR([unable to detect library format (unsupported architecture ($host_cpu)?)]) ;; @@ -115,6 +117,30 @@ esac AC_SUBST(LIBFORMAT) AC_MSG_RESULT($LIBFORMAT) +if test "x$host_cpu" = "xarm" ; then +AC_MSG_CHECKING([checking for armv5]) +AC_TRY_COMPILE( +[ +], +[ +#ifndef __ARM_ARCH_5TEJ__ +#error "no arm5 here" +#endif +], +[ + AC_MSG_RESULT([yes]) + NO_UNALIGNED_ACCESS=1 +] +, +[ + AC_MSG_RESULT([no]) +] +) +fi +if test x$NO_UNALIGNED_ACCESS = x ; then +AC_DEFINE([HAVE_EFFICIENT_UNALIGNED_ACCESS], [1]) +fi + AC_CONFIG_FILES([ Makefile doc/Makefile diff --git a/include/Makefile.am b/include/Makefile.am index 2133efdc..7f9d15e3 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -7,6 +7,7 @@ nobase_include_HEADERS = \ ust/probe.h \ ust/ust.h \ ust/tracectl.h \ + ust/config.h \ ust/core.h \ ust/clock.h \ ust/type-serializer.h \ diff --git a/include/ust/config.h.in b/include/ust/config.h.in new file mode 100644 index 00000000..b619095f --- /dev/null +++ b/include/ust/config.h.in @@ -0,0 +1,5 @@ +/* ust/config.h.in. Manually generated for control over the contained defs. */ + +/* Use efficient unaligned access. */ +#undef HAVE_EFFICIENT_UNALIGNED_ACCESS + diff --git a/include/ust/core.h b/include/ust/core.h index e781a3a6..d0e2750f 100644 --- a/include/ust/core.h +++ b/include/ust/core.h @@ -19,11 +19,12 @@ #define UST_CORE_H #include +#include #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) -#if defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT) +#ifndef HAVE_EFFICIENT_UNALIGNED_ACCESS /* * Calculate the offset needed to align the type. @@ -42,7 +43,7 @@ static inline int ltt_get_alignment(void) return sizeof(void *); } -#else +#else /* HAVE_EFFICIENT_UNALIGNED_ACCESS */ static inline unsigned int ltt_align(size_t align_drift, size_t size_of_type) @@ -56,7 +57,7 @@ static inline int ltt_get_alignment(void) { return 0; } -#endif /* defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT) */ +#endif /* HAVE_EFFICIENT_UNALIGNED_ACCESS */ /* ARRAYS */ -- 2.34.1