Module: xenomai-head
Branch: master
Commit: 392989f410f10ffc228b974ffe26787dff0734f2
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=392989f410f10ffc228b974ffe26787dff0734f2

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Tue Jun 21 21:06:38 2011 +0200

build: arm: rework configuration and introduce kuser tsc

The option --enable-arm-mach has been replaced with --enable-arm-tsc.

--enable-armtsc no longer forces fpu and architectures flags to the compiler,
and proposes a new option "kuser", now the default. The kuser tsc causes
Xenomai libraries to use a kernel user-space helper for tsc emulation, allowing
the same libraries to be used with any processor without any loss of
performance.

The option --enable-arm-eabi and --enable-arm-arch also disappeared, they are
now detected from the compiler defines.

---

 configure                     |  265 ++++++++---------------------------------
 configure.in                  |  179 +++++-----------------------
 include/asm-arm/bits/bind.h   |   76 ++++++------
 include/asm-arm/bits/shadow.h |   20 ++--
 include/asm-arm/features.h    |   63 +++++++++--
 include/asm-arm/syscall.h     |   62 +++++-----
 src/include/xeno_config.h.in  |    9 --
 7 files changed, 211 insertions(+), 463 deletions(-)

diff --git a/configure b/configure
index 7c7b87d..9c85780 100755
--- a/configure
+++ b/configure
@@ -767,8 +767,6 @@ CONFIG_XENO_DOC_DOX_FALSE
 CONFIG_XENO_DOC_DOX_TRUE
 CONFIG_XENO_SHARED_FALSE
 CONFIG_XENO_SHARED_TRUE
-CONFIG_XENO_FASTSYNCH_FALSE
-CONFIG_XENO_FASTSYNCH_TRUE
 DBX_ABS_SRCDIR_FALSE
 DBX_ABS_SRCDIR_TRUE
 DBX_XSL_ROOT
@@ -928,10 +926,8 @@ enable_debug
 enable_smp
 enable_x86_sep
 enable_x86_tsc
-enable_arm_eabi
-enable_arm_mach
-enable_arm_arch
 enable_arm_tsc
+enable_arm_quirks
 enable_doc_install
 enable_dox_doc
 enable_dbx
@@ -1591,17 +1587,11 @@ Optional Features:
   --enable-smp            Enable SMP support
   --enable-x86-sep        Enable x86 SEP instructions for issuing syscalls
   --enable-x86-tsc        Enable x86 TSC for timings
-  --enable-arm-eabi       Enable ARM EABI interface
-  --enable-arm-mach       Select for which machine we are compiling. Valid
-                          machines are at91rm9200, at91sam926x, at91sam9,
-                          generic, generic-vfp, imx, imx21, imx51, integrator,
-                          ixp4xx, mx2, mx3, mx5, omap3, orion, pxa, pxa3xx,
-                          s3c2410, sa1100.
-  --enable-arm-arch=<version>
-                          Select ARM architecture version, if the machine
-                          selected with --enable-arm-mach supports several
-                          architecture versions
-  --disable-arm-tsc       Disable TSC emulation in user-space
+  --enable-arm-tsc        Select for which machine we are compiling. Valid
+                          machines are at91, kuser, imx, ixp4xx, omap, orion,
+                          pxa, s3c24x, sa1100.
+  --enable-arm-quirks     Enable quirks for specific systems. Currently
+                          supported quirks are for sa1100 and xscale3.
   --disable-doc-install   Do not install documentation
   --enable-dox-doc        Build Doxygen documentation
   --enable-dbx            Build Docbook XML documentation.
@@ -5987,13 +5977,13 @@ if test "${lt_cv_nm_interface+set}" = set; then :
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:5990: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:5980: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5993: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:5983: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5996: output\"" >&5)
+  (eval echo "\"\$as_me:5986: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -7091,7 +7081,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 7094 "configure"' > conftest.$ac_ext
+  echo '#line 7084 "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -8453,11 +8443,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8456: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8446: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8460: \$? = $ac_status" >&5
+   echo "$as_me:8450: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8777,11 +8767,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8780: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8770: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8784: \$? = $ac_status" >&5
+   echo "$as_me:8774: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8882,11 +8872,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8885: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8875: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8889: \$? = $ac_status" >&5
+   echo "$as_me:8879: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -8937,11 +8927,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8940: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8930: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8944: \$? = $ac_status" >&5
+   echo "$as_me:8934: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -11309,7 +11299,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11312 "configure"
+#line 11302 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11409,7 +11399,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11412 "configure"
+#line 11402 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11709,163 +11699,56 @@ fi
 
 
 if test $XENO_TARGET_ARCH = arm ; then
-  CONFIG_XENO_ARM_ARCH=4
-  CONFIG_XENO_ARM_SA1100=
-  CONFIX_XENO_ARM_EABI=
 
   unset CONFIG_XENO_ARM_SA1100
   unset CONFIG_XENO_CPU_XSC3
-  unset tsc_type
-  unset vfp
-  unset XNARCH_ARM_TSC_TYPE
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM EABI interface" >&5
-$as_echo_n "checking for ARM EABI interface... " >&6; }
-  # Check whether --enable-arm-eabi was given.
-if test "${enable_arm_eabi+set}" = set; then :
-  enableval=$enable_arm_eabi; case "$enableval" in
-       y | yes) CONFIG_XENO_ARM_EABI=y ;;
-       *) unset CONFIG_XENO_ARM_EABI ;;
-       esac
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: 
${CONFIG_XENO_ARM_EABI:-no}" >&5
-$as_echo "${CONFIG_XENO_ARM_EABI:-no}" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM machine" >&5
-$as_echo_n "checking for ARM machine... " >&6; }
-  # Check whether --enable-arm-mach was given.
-if test "${enable_arm_mach+set}" = set; then :
-  enableval=$enable_arm_mach; case "$enableval" in
-       at91rm9200)     arch=4
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
-
-       at91sam926x|at91sam9)   arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
-
-       generic)        arch=4
-                       CONFIG_XENO_ARM_SA1100=y
-                       unset tsc_type;;
-
-       generic-vfp)    arch=5
-                       vfp=vfp
-                       unset tsc_type;;
+  XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_KUSER
 
-       integrator)     arch=choose
-                       unset tsc_type;;
-
-       ixp4xx)         arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM tsc type" >&5
+$as_echo_n "checking for ARM tsc type... " >&6; }
+  # Check whether --enable-arm-tsc was given.
+if test "${enable_arm_tsc+set}" = set; then :
+  enableval=$enable_arm_tsc; case "$enableval" in
+       at91*)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
 
-       mx1|imx)        arch=4
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       integrator) unset tsc_type;;
 
-       mx2|imx21)      arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       ixp4xx)     XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       mx3)            arch=6
-                       vfp=vfp
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       imx*|mx*)           XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       mx5|imx51)      arch=7
-                       vfp=vfp3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       kuser)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_KUSER;;
 
-       omap3)          arch=7
-                       vfp=vfp3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       omap*)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       orion)          arch=5
-                       vfp=vfp
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_COUNTDOWN;;
+       orion)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING_COUNTDOWN;;
 
-       pxa)            arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       pxa*)       CONFIG_XENO_CPU_XSC3=y
+                   XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       pxa3xx)         arch=xscale3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       s3c24*)     XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_DECREMENTER;;
 
-       s3c2410)        arch=4
-                       tsc_type=__XN_TSC_TYPE_DECREMENTER;;
+       sa1100)     CONFIG_XENO_ARM_SA1100=y
+                   XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       sa1100)         arch=4
-                       CONFIG_XENO_ARM_SA1100=y
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       n | no)     unset XNARCH_ARM_TSC_TYPE;;
 
-       *)as_fn_error $? "Invalid machine selected: \"$enableval\"" "$LINENO" 5 
;;
+       *)as_fn_error $? "Invalid SOC selected: \"$enableval\"" "$LINENO" 5 ;;
        esac
-else
-  as_fn_error $? "Selecting a machine with --enable-arm-mach is mandatory" 
"$LINENO" 5
-
 fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_arm_mach:-no}" >&5
-$as_echo "${enable_arm_mach:-no}" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_arm_tsc:-kuser}" 
>&5
+$as_echo "${enable_arm_tsc:-kuser}" >&6; }
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM EABI interface" >&5
-$as_echo_n "checking for ARM EABI interface... " >&6; }
-  # Check whether --enable-arm-eabi was given.
-if test "${enable_arm_eabi+set}" = set; then :
-  enableval=$enable_arm_eabi; case "$enableval" in
-       y | yes) CONFIG_XENO_ARM_EABI=y ;;
-       *) unset CONFIG_XENO_ARM_EABI ;;
+  # Check whether --enable-arm-quirks was given.
+if test "${enable_arm_quirks+set}" = set; then :
+  enableval=$enable_arm_quirks; case "$enableval" in
+       sa1100)  CONFIG_XENO_ARM_SA1100=y;;
+       xscale3) CONFIG_XENO_CPU_XSC3=y;;
+       *)as_fn_error $? "Invalid SOC selected: \"$enableval\"" "$LINENO" 5 ;;
        esac
 fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: 
${CONFIG_XENO_ARM_EABI:-no}" >&5
-$as_echo "${CONFIG_XENO_ARM_EABI:-no}" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM architecture 
version" >&5
-$as_echo_n "checking for ARM architecture version... " >&6; }
-  if test $arch = choose; then
-       # Check whether --enable-arm-arch was given.
-if test "${enable_arm_arch+set}" = set; then :
-  enableval=$enable_arm_arch;
-               case "$enableval" in
-               "" | y | ye | yes | n | no)
-               as_fn_error $? "You must supply an argument to 
--enable-arm-arch." "$LINENO" 5
-               ;;
-               esac
-               CONFIG_XENO_ARM_ARCH="$enableval"
-
-fi
-
-  elif test $arch = xscale3; then
-       CONFIG_XENO_ARM_ARCH=5
-       CONFIG_XENO_CPU_XSC3=y
-  else
-       CONFIG_XENO_ARM_ARCH="$arch"
-  fi
-  case "$CONFIG_XENO_ARM_ARCH" in
-  4)   XENO_ARM_ARCH_FLAGS="-march=armv4";;
-  5)   XENO_ARM_ARCH_FLAGS="-march=armv5";;
-  6)   XENO_ARM_ARCH_FLAGS="-march=armv6";;
-  7)   XENO_ARM_ARCH_FLAGS="-march=armv7-a";;
-  *)   as_fn_error $? "Invalid architecture $arch, only 4, 5, xscale3, 6 and 7 
are supported" "$LINENO" 5 ;;
-  esac
-
-  # Enable interworking
-  if test x$CONFIG_XENO_ARM_EABI = xy -a $CONFIG_XENO_ARM_ARCH -lt 6; then
-     XENO_ARM_ARCH_FLAGS="${XENO_ARM_ARCH_FLAGS}t"
-  fi
-
-  # Set FPU flags, if EABI is not enabled, all libraries in the system
-  # must be compiled with the same FPU flags, as we do not know how
-  # other components are compiled, we can not set the flags.
-  if test x$CONFIG_XENO_ARM_EABI = xy; then
-     if test x"$vfp" != x; then
-       XENO_ARM_ARCH_FLAGS="$XENO_ARM_ARCH_FLAGS -mfpu=$vfp -mfloat-abi=softfp"
-     else
-       XENO_ARM_ARCH_FLAGS="$XENO_ARM_ARCH_FLAGS -msoft-float"
-     fi
-  fi
-
-  if test $CONFIG_XENO_ARM_ARCH -ge 6 || test x$CONFIG_SMP != xy; then
-       CONFIG_XENO_FASTSYNCH=y
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONFIG_XENO_ARM_ARCH" >&5
-$as_echo "$CONFIG_XENO_ARM_ARCH" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM SA1100 
architecture" >&5
 $as_echo_n "checking for ARM SA1100 architecture... " >&6; }
@@ -11876,31 +11759,6 @@ $as_echo "${CONFIG_XENO_ARM_SA1100:-no}" >&6; }
 $as_echo_n "checking for ARM Xscale3 architecture... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: 
${CONFIG_XENO_CPU_XSC3:-no}" >&5
 $as_echo "${CONFIG_XENO_CPU_XSC3:-no}" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TSC emulation in 
user-space." >&5
-$as_echo_n "checking for TSC emulation in user-space.... " >&6; }
-  if test $tsc_type; then
-       # Check whether --enable-arm-tsc was given.
-if test "${enable_arm_tsc+set}" = set; then :
-  enableval=$enable_arm_tsc; case "$enableval" in
-       y | yes) XNARCH_ARM_TSC_TYPE=$tsc_type ;;
-       *) unset XNARCH_ARM_TSC_TYPE ;;
-       esac
-else
-  XNARCH_ARM_TSC_TYPE=$tsc_type
-fi
-
-       if test $XNARCH_ARM_TSC_TYPE; then
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       else
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-       fi
-  else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: not supported by this 
board" >&5
-$as_echo "not supported by this board" >&6; }
-  fi
 fi
 
 
@@ -12403,17 +12261,6 @@ $as_echo "#define CONFIG_XENO_X86_SEP 1" >>confdefs.h
 test x$CONFIG_SMP = xy &&
 $as_echo "#define CONFIG_SMP 1" >>confdefs.h
 
-test x$CONFIG_XENO_FASTSYNCH = xy &&
-$as_echo "#define CONFIG_XENO_FASTSYNCH 1" >>confdefs.h
-
- if test "$CONFIG_XENO_FASTSYNCH" = y; then
-  CONFIG_XENO_FASTSYNCH_TRUE=
-  CONFIG_XENO_FASTSYNCH_FALSE='#'
-else
-  CONFIG_XENO_FASTSYNCH_TRUE='#'
-  CONFIG_XENO_FASTSYNCH_FALSE=
-fi
-
 
 test x$ac_cv_func_fork = xyes &&
 $as_echo "#define CONFIG_MMU 1" >>confdefs.h
@@ -12422,11 +12269,6 @@ $as_echo "#define CONFIG_MMU 1" >>confdefs.h
 test x$CONFIG_X86_TSC = xy &&
 $as_echo "#define CONFIG_X86_TSC 1" >>confdefs.h
 
-test -n "$CONFIG_XENO_ARM_ARCH" &&
-cat >>confdefs.h <<_ACEOF
-#define CONFIG_XENO_ARM_ARCH $CONFIG_XENO_ARM_ARCH
-_ACEOF
-
 
 test x$CONFIG_XENO_ARM_SA1100 = xy &&
 $as_echo "#define CONFIG_XENO_ARM_SA1100 1" >>confdefs.h
@@ -12439,9 +12281,6 @@ cat >>confdefs.h <<_ACEOF
 #define XNARCH_ARM_TSC_TYPE $XNARCH_ARM_TSC_TYPE
 _ACEOF
 
-test x$CONFIG_XENO_ARM_EABI = xy &&
-$as_echo "#define CONFIG_XENO_ARM_EABI 1" >>confdefs.h
-
  if test "$enable_shared" = 'yes'; then
   CONFIG_XENO_SHARED_TRUE=
   CONFIG_XENO_SHARED_FALSE='#'
@@ -12585,7 +12424,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
 $as_echo "done" >&6; }
 
-XENO_USER_CFLAGS="-D_GNU_SOURCE -D_REENTRANT -Wall -pipe"
+XENO_USER_CFLAGS="-D_GNU_SOURCE -D_REENTRANT -Wall 
-Werror-implicit-function-declaration -pipe"
 XENO_USER_LDFLAGS=
 
 XENO_USER_APP_CFLAGS=$XENO_USER_CFLAGS
@@ -12601,7 +12440,7 @@ case $XENO_TARGET_ARCH in
        # Produce libraries in FDPIC format.
        ;;
  arm)
-       XENO_USER_CFLAGS="$XENO_USER_CFLAGS $XENO_ARM_ARCH_FLAGS"
+       XENO_USER_CFLAGS="$XENO_USER_CFLAGS"
        ;;
 esac
 
@@ -12960,10 +12799,6 @@ if test -z "${DBX_ABS_SRCDIR_TRUE}" && test -z 
"${DBX_ABS_SRCDIR_FALSE}"; then
   as_fn_error $? "conditional \"DBX_ABS_SRCDIR\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${CONFIG_XENO_FASTSYNCH_TRUE}" && test -z 
"${CONFIG_XENO_FASTSYNCH_FALSE}"; then
-  as_fn_error $? "conditional \"CONFIG_XENO_FASTSYNCH\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${CONFIG_XENO_SHARED_TRUE}" && test -z 
"${CONFIG_XENO_SHARED_FALSE}"; then
   as_fn_error $? "conditional \"CONFIG_XENO_SHARED\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/configure.in b/configure.in
index 5393313..9b3d051 100644
--- a/configure.in
+++ b/configure.in
@@ -188,173 +188,60 @@ fi
 dnl ARCH support for ARM (default: 4)
 
 if test $XENO_TARGET_ARCH = arm ; then
-  CONFIG_XENO_ARM_ARCH=4
-  CONFIG_XENO_ARM_SA1100=
-  CONFIX_XENO_ARM_EABI=
 
   unset CONFIG_XENO_ARM_SA1100
   unset CONFIG_XENO_CPU_XSC3
-  unset tsc_type
-  unset vfp
-  unset XNARCH_ARM_TSC_TYPE
+  XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_KUSER
 
-  AC_MSG_CHECKING(for ARM EABI interface)
-  AC_ARG_ENABLE(arm-eabi,
-       AS_HELP_STRING([--enable-arm-eabi], [Enable ARM EABI interface]),
+  AC_MSG_CHECKING(for ARM tsc type)
+  AC_ARG_ENABLE(arm-tsc,
+       AS_HELP_STRING([--enable-arm-tsc], [Select for which machine we are
+compiling. Valid machines are at91, kuser, imx, ixp4xx, omap, orion, pxa,
+  s3c24x, sa1100.]),
        [case "$enableval" in
-       y | yes) CONFIG_XENO_ARM_EABI=y ;;
-       *) unset CONFIG_XENO_ARM_EABI ;;
-       esac])
-  AC_MSG_RESULT(${CONFIG_XENO_ARM_EABI:-no})
-
-  AC_MSG_CHECKING(for ARM machine)
-  AC_ARG_ENABLE(arm-mach,
-       AS_HELP_STRING([--enable-arm-mach], [Select for which machine we are
-compiling. Valid machines are at91rm9200, at91sam926x, at91sam9, generic,
-generic-vfp, imx, imx21, imx51, integrator, ixp4xx, mx2, mx3, mx5,
-omap3, orion, pxa, pxa3xx, s3c2410, sa1100.]),
-       [case "$enableval" in
-       at91rm9200)     arch=4
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
-
-       at91sam926x|at91sam9)   arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
-
-       generic)        arch=4
-                       CONFIG_XENO_ARM_SA1100=y
-                       unset tsc_type;;
+       at91*)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING_FAST_WRAP;;
 
-       generic-vfp)    arch=5
-                       vfp=vfp
-                       unset tsc_type;;
+       integrator) unset tsc_type;;
 
-       integrator)     arch=choose
-                       unset tsc_type;;
+       ixp4xx)     XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       ixp4xx)         arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       imx*|mx*)           XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       mx1|imx)        arch=4
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       kuser)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_KUSER;;
 
-       mx2|imx21)      arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       omap*)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       mx3)            arch=6
-                       vfp=vfp
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       orion)      XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING_COUNTDOWN;;
 
-       mx5|imx51)      arch=7
-                       vfp=vfp3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       pxa*)       CONFIG_XENO_CPU_XSC3=y
+                   XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       omap3)          arch=7
-                       vfp=vfp3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       s3c24*)     XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_DECREMENTER;;
 
-       orion)          arch=5
-                       vfp=vfp
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING_COUNTDOWN;;
+       sa1100)     CONFIG_XENO_ARM_SA1100=y
+                   XNARCH_ARM_TSC_TYPE=__XN_TSC_TYPE_FREERUNNING;;
 
-       pxa)            arch=5
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
+       n | no)     unset XNARCH_ARM_TSC_TYPE;;
 
-       pxa3xx)         arch=xscale3
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
-
-       s3c2410)        arch=4
-                       tsc_type=__XN_TSC_TYPE_DECREMENTER;;
-
-       sa1100)         arch=4
-                       CONFIG_XENO_ARM_SA1100=y
-                       tsc_type=__XN_TSC_TYPE_FREERUNNING;;
-
-       *)AC_MSG_ERROR([Invalid machine selected: "$enableval"]);;
-       esac],
-       [AC_MSG_ERROR([Selecting a machine with --enable-arm-mach is mandatory])
-       ])
-  AC_MSG_RESULT(${enable_arm_mach:-no})
+       *)AC_MSG_ERROR([Invalid SOC selected: "$enableval"]);;
+       esac])
+  AC_MSG_RESULT(${enable_arm_tsc:-kuser})
 
-  AC_MSG_CHECKING(for ARM EABI interface)
-  AC_ARG_ENABLE(arm-eabi,
-       AS_HELP_STRING([--enable-arm-eabi], [Enable ARM EABI interface]),
+  AC_ARG_ENABLE(arm-quirks,
+       AS_HELP_STRING([--enable-arm-quirks], [Enable quirks for
+       specific systems. Currently supported quirks are for sa1100 and
+       xscale3.]),
        [case "$enableval" in
-       y | yes) CONFIG_XENO_ARM_EABI=y ;;
-       *) unset CONFIG_XENO_ARM_EABI ;;
+       sa1100)  CONFIG_XENO_ARM_SA1100=y;;
+       xscale3) CONFIG_XENO_CPU_XSC3=y;;
+       *)AC_MSG_ERROR([Invalid SOC selected: "$enableval"]);;
        esac])
-  AC_MSG_RESULT(${CONFIG_XENO_ARM_EABI:-no})
-
-  AC_MSG_CHECKING(for ARM architecture version)
-  if test $arch = choose; then
-       AC_ARG_ENABLE(arm-arch,
-       AS_HELP_STRING([--enable-arm-arch=<version>], [Select ARM architecture 
version, if the machine selected with --enable-arm-mach supports several 
architecture versions]),
-       [
-               case "$enableval" in
-               "" | y | ye | yes | n | no)
-               AC_MSG_ERROR([You must supply an argument to 
--enable-arm-arch.])
-               ;;
-               esac
-               CONFIG_XENO_ARM_ARCH="$enableval"
-       ])
-  elif test $arch = xscale3; then
-       CONFIG_XENO_ARM_ARCH=5
-       CONFIG_XENO_CPU_XSC3=y
-  else
-       CONFIG_XENO_ARM_ARCH="$arch"
-  fi
-  case "$CONFIG_XENO_ARM_ARCH" in
-  4)   XENO_ARM_ARCH_FLAGS="-march=armv4";;
-  5)   XENO_ARM_ARCH_FLAGS="-march=armv5";;
-  6)   XENO_ARM_ARCH_FLAGS="-march=armv6";;
-  7)   XENO_ARM_ARCH_FLAGS="-march=armv7-a";;
-  *)   AC_MSG_ERROR([Invalid architecture $arch, only 4, 5, xscale3, 6 and 7 
are supported]);;
-  esac
-
-  # Enable interworking
-  if test x$CONFIG_XENO_ARM_EABI = xy -a $CONFIG_XENO_ARM_ARCH -lt 6; then
-     XENO_ARM_ARCH_FLAGS="${XENO_ARM_ARCH_FLAGS}t"
-  fi
-
-  # Set FPU flags, if EABI is not enabled, all libraries in the system
-  # must be compiled with the same FPU flags, as we do not know how
-  # other components are compiled, we can not set the flags.
-  if test x$CONFIG_XENO_ARM_EABI = xy; then
-     if test x"$vfp" != x; then
-       XENO_ARM_ARCH_FLAGS="$XENO_ARM_ARCH_FLAGS -mfpu=$vfp -mfloat-abi=softfp"
-     else
-       XENO_ARM_ARCH_FLAGS="$XENO_ARM_ARCH_FLAGS -msoft-float"
-     fi
-  fi
-
-  if test $CONFIG_XENO_ARM_ARCH -ge 6 || test x$CONFIG_SMP != xy; then
-       CONFIG_XENO_FASTSYNCH=y
-  fi
-
-  AC_MSG_RESULT($CONFIG_XENO_ARM_ARCH)
 
   AC_MSG_CHECKING(for ARM SA1100 architecture)
   AC_MSG_RESULT(${CONFIG_XENO_ARM_SA1100:-no})
 
   AC_MSG_CHECKING(for ARM Xscale3 architecture)
   AC_MSG_RESULT(${CONFIG_XENO_CPU_XSC3:-no})
-
-  AC_MSG_CHECKING(for TSC emulation in user-space.)
-  if test $tsc_type; then
-       AC_ARG_ENABLE(arm-tsc,
-               AS_HELP_STRING([--disable-arm-tsc], [Disable TSC emulation in
-user-space]),
-       [case "$enableval" in
-       y | yes) XNARCH_ARM_TSC_TYPE=$tsc_type ;;
-       *) unset XNARCH_ARM_TSC_TYPE ;;
-       esac], [XNARCH_ARM_TSC_TYPE=$tsc_type])
-       if test $XNARCH_ARM_TSC_TYPE; then
-               AC_MSG_RESULT(yes)
-       else
-               AC_MSG_RESULT(no)
-       fi
-  else
-       AC_MSG_RESULT(not supported by this board)
-  fi
 fi
 
 dnl Documentation package.
@@ -464,8 +351,6 @@ dnl
 
 test x$CONFIG_XENO_X86_SEP = xy && AC_DEFINE(CONFIG_XENO_X86_SEP,1,[config])
 test x$CONFIG_SMP = xy && AC_DEFINE(CONFIG_SMP,1,[config])
-test x$CONFIG_XENO_FASTSYNCH = xy && 
AC_DEFINE(CONFIG_XENO_FASTSYNCH,1,[config])
-AM_CONDITIONAL(CONFIG_XENO_FASTSYNCH,[test "$CONFIG_XENO_FASTSYNCH" = y])
 
 dnl
 dnl Userland may want to know about MMU availability on the target.
@@ -474,12 +359,10 @@ dnl
 test x$ac_cv_func_fork = xyes && AC_DEFINE(CONFIG_MMU,1,[config])
 
 test x$CONFIG_X86_TSC = xy && AC_DEFINE(CONFIG_X86_TSC,1,[config])
-test -n "$CONFIG_XENO_ARM_ARCH" && 
AC_DEFINE_UNQUOTED(CONFIG_XENO_ARM_ARCH,$CONFIG_XENO_ARM_ARCH,[config])
 
 test x$CONFIG_XENO_ARM_SA1100 = xy && 
AC_DEFINE(CONFIG_XENO_ARM_SA1100,1,[config])
 test x$CONFIG_XENO_CPU_XSC3 = xy && AC_DEFINE(CONFIG_XENO_CPU_XSC3,1,[config])
 test $XNARCH_ARM_TSC_TYPE && 
AC_DEFINE_UNQUOTED(XNARCH_ARM_TSC_TYPE,$XNARCH_ARM_TSC_TYPE,[config])
-test x$CONFIG_XENO_ARM_EABI = xy && AC_DEFINE(CONFIG_XENO_ARM_EABI,1,[config])
 AM_CONDITIONAL(CONFIG_XENO_SHARED,[test "$enable_shared" = 'yes'])
 
 # Default sampling period (ns) used in various tests
@@ -561,7 +444,7 @@ fi
 AC_MSG_RESULT([done])
 
 dnl Common CFLAGS and LDFLAGS
-XENO_USER_CFLAGS="-D_GNU_SOURCE -D_REENTRANT -Wall -pipe"
+XENO_USER_CFLAGS="-D_GNU_SOURCE -D_REENTRANT -Wall 
-Werror-implicit-function-declaration -pipe"
 XENO_USER_LDFLAGS=
 
 dnl Exported CFLAGS and LDFLAGS, may be enhanced per-arch below
@@ -578,7 +461,7 @@ case $XENO_TARGET_ARCH in
        # Produce libraries in FDPIC format.
        ;;
  arm)
-       XENO_USER_CFLAGS="$XENO_USER_CFLAGS $XENO_ARM_ARCH_FLAGS"
+       XENO_USER_CFLAGS="$XENO_USER_CFLAGS"
        ;;
 esac
 
diff --git a/include/asm-arm/bits/bind.h b/include/asm-arm/bits/bind.h
index d1dd63b..c55af63 100644
--- a/include/asm-arm/bits/bind.h
+++ b/include/asm-arm/bits/bind.h
@@ -20,6 +20,7 @@ __attribute__((weak)) struct __xn_tscinfo __xn_tscinfo = {
 static inline void xeno_arm_features_check(struct xnfeatinfo *finfo)
 {
 #ifdef XNARCH_ARM_TSC_TYPE
+       unsigned long phys_addr;
        unsigned page_size;
        int err, fd;
        void *addr;
@@ -29,12 +30,8 @@ static inline void xeno_arm_features_check(struct xnfeatinfo 
*finfo)
 
        err = XENOMAI_SYSCALL2(__xn_sys_arch,
                               XENOMAI_SYSARCH_TSCINFO, &__xn_tscinfo);
-       if (err) {
-         error:
-               fprintf(stderr, "Xenomai: Your board/configuration does not"
-                       " allow tsc emulation in user-space: %d\n", err);
-               exit(EXIT_FAILURE);
-       }
+       if (err)
+               goto error;
 
        fd = open("/dev/mem", O_RDONLY | O_SYNC);
        if (fd == -1) {
@@ -45,54 +42,39 @@ static inline void xeno_arm_features_check(struct 
xnfeatinfo *finfo)
        page_size = sysconf(_SC_PAGESIZE);
 
        switch(__xn_tscinfo.type) {
-#if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING                   \
+#if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_KUSER
+       case __XN_TSC_TYPE_FREERUNNING:
+       case __XN_TSC_TYPE_FREERUNNING_COUNTDOWN:
+       case __XN_TSC_TYPE_FREERUNNING_FAST_WRAP:
+       case __XN_TSC_TYPE_DECREMENTER:
+               goto domap;
+
+#elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING                 \
        || XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING_COUNTDOWN   \
        || XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING_FAST_WRAP
        case __XN_TSC_TYPE_FREERUNNING:
-       case __XN_TSC_TYPE_FREERUNNING_COUNTDOWN: {
-               unsigned long phys_addr;
-
-               phys_addr = (unsigned long) __xn_tscinfo.u.fr.counter;
-               addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED,
-                           fd, phys_addr & ~(page_size - 1));
-               if (addr == MAP_FAILED) {
-                       perror("Xenomai init: mmap(/dev/mem)");
-                       exit(EXIT_FAILURE);
-               }
-
-               __xn_tscinfo.u.fr.counter =
-                       ((volatile unsigned *)
-                        ((char *) addr + (phys_addr & (page_size - 1))));
+       case __XN_TSC_TYPE_FREERUNNING_COUNTDOWN:
 #if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING_FAST_WRAP
-               if (__xn_tscinfo.u.fr.mask >= ((1 << 28) - 1)) {
+               if (__xn_tscinfo.mask >= ((1 << 28) - 1)) {
                        fprintf(stderr, "Hardware tsc is not a fast wrapping"
                                " one, select the correct platform, or fix\n"
                                "configure.in\n");
                        exit(EXIT_FAILURE);
                }
 #endif /* __XN_TSC_TYPE_FREERUNNING_FAST_WRAP */
-               break;
-       }
+               goto domap;
+
 #elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_DECREMENTER
-       case __XN_TSC_TYPE_DECREMENTER: {
-               unsigned long phys_addr;
-
-               phys_addr = (unsigned long) __xn_tscinfo.u.dec.counter;
-               addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED,
-                           fd, phys_addr & ~(page_size - 1));
-               if (addr == MAP_FAILED) {
-                       perror("Xenomai init: mmap(/dev/mem)");
-                       exit(EXIT_FAILURE);
-               }
+       case __XN_TSC_TYPE_DECREMENTER:
+               goto domap;
 
-               __xn_tscinfo.u.dec.counter =
-                       ((volatile unsigned *)
-                        ((char *) addr + (phys_addr & (page_size - 1))));
-               break;
-       }
 #endif /* XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_DECREMENTER */
        case __XN_TSC_TYPE_NONE:
-               goto error;
+         error:
+               fprintf(stderr, "Xenomai: Your board/configuration does not"
+                       " allow tsc emulation in user-space: %d\n", err);
+               exit(EXIT_FAILURE);
+               break;
 
        default:
                fprintf(stderr,
@@ -100,6 +82,20 @@ static inline void xeno_arm_features_check(struct 
xnfeatinfo *finfo)
                exit(EXIT_FAILURE);
        }
 
+  domap:
+       phys_addr = (unsigned long) __xn_tscinfo.counter;
+
+       addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED,
+                   fd, phys_addr & ~(page_size - 1));
+       if (addr == MAP_FAILED) {
+               perror("Xenomai init: mmap(/dev/mem)");
+               exit(EXIT_FAILURE);
+       }
+
+       __xn_tscinfo.counter =
+               ((volatile unsigned *)
+                ((char *) addr + (phys_addr & (page_size - 1))));
+
        if (close(fd)) {
                perror("Xenomai init: close(/dev/mem)");
                exit(EXIT_FAILURE);
diff --git a/include/asm-arm/bits/shadow.h b/include/asm-arm/bits/shadow.h
index 883d073..bef96d7 100644
--- a/include/asm-arm/bits/shadow.h
+++ b/include/asm-arm/bits/shadow.h
@@ -143,23 +143,23 @@ static inline int xnarch_local_syscall(struct pt_regs 
*regs)
                switch (RTHAL_TSC_INFO(&ipipe_info).type) {
                case IPIPE_TSC_TYPE_FREERUNNING:
                        info.type = __XN_TSC_TYPE_FREERUNNING,
-                       info.u.fr.counter = 
RTHAL_TSC_INFO(&ipipe_info).u.fr.counter;
-                       info.u.fr.mask = RTHAL_TSC_INFO(&ipipe_info).u.fr.mask;
-                       info.u.fr.tsc = RTHAL_TSC_INFO(&ipipe_info).u.fr.tsc;
+                       info.counter = RTHAL_TSC_INFO(&ipipe_info).u.fr.counter;
+                       info.mask = RTHAL_TSC_INFO(&ipipe_info).u.fr.mask;
+                       info.tsc = RTHAL_TSC_INFO(&ipipe_info).u.fr.tsc;
                        break;
                case IPIPE_TSC_TYPE_DECREMENTER:
                        info.type = __XN_TSC_TYPE_DECREMENTER,
-                       info.u.dec.counter = 
RTHAL_TSC_INFO(&ipipe_info).u.dec.counter;
-                       info.u.dec.mask = 
RTHAL_TSC_INFO(&ipipe_info).u.dec.mask;
-                       info.u.dec.last_cnt = 
RTHAL_TSC_INFO(&ipipe_info).u.dec.last_cnt;
-                       info.u.dec.tsc = RTHAL_TSC_INFO(&ipipe_info).u.dec.tsc;
+                       info.counter = 
RTHAL_TSC_INFO(&ipipe_info).u.dec.counter;
+                       info.mask = RTHAL_TSC_INFO(&ipipe_info).u.dec.mask;
+                       info.last_cnt = 
RTHAL_TSC_INFO(&ipipe_info).u.dec.last_cnt;
+                       info.tsc = RTHAL_TSC_INFO(&ipipe_info).u.dec.tsc;
                        break;
 #ifdef IPIPE_TSC_TYPE_FREERUNNING_COUNTDOWN
                case IPIPE_TSC_TYPE_FREERUNNING_COUNTDOWN:
                        info.type = __XN_TSC_TYPE_FREERUNNING_COUNTDOWN,
-                       info.u.fr.counter = 
RTHAL_TSC_INFO(&ipipe_info).u.fr.counter;
-                       info.u.fr.mask = RTHAL_TSC_INFO(&ipipe_info).u.fr.mask;
-                       info.u.fr.tsc = RTHAL_TSC_INFO(&ipipe_info).u.fr.tsc;
+                       info.counter = RTHAL_TSC_INFO(&ipipe_info).u.fr.counter;
+                       info.mask = RTHAL_TSC_INFO(&ipipe_info).u.fr.mask;
+                       info.tsc = RTHAL_TSC_INFO(&ipipe_info).u.fr.tsc;
                        break;
 #endif /* IPIPE_TSC_TYPE_FREERUNNING_COUNTDOWN */
                case IPIPE_TSC_TYPE_NONE:
diff --git a/include/asm-arm/features.h b/include/asm-arm/features.h
index 1422411..cb42859 100644
--- a/include/asm-arm/features.h
+++ b/include/asm-arm/features.h
@@ -22,7 +22,12 @@
 #ifndef _XENO_ASM_ARM_FEATURES_H
 #define _XENO_ASM_ARM_FEATURES_H
 
-#include <asm-generic/xenomai/features.h>
+#define __XN_TSC_TYPE_NONE                  0
+#define __XN_TSC_TYPE_KUSER                 1
+#define __XN_TSC_TYPE_FREERUNNING           2
+#define __XN_TSC_TYPE_DECREMENTER           3
+#define __XN_TSC_TYPE_FREERUNNING_FAST_WRAP 4
+#define __XN_TSC_TYPE_FREERUNNING_COUNTDOWN 5
 
 #ifdef __KERNEL__
 
@@ -31,14 +36,54 @@
 #endif
 
 #ifdef CONFIG_AEABI
-#define CONFIG_XENO_ARM_EABI    1
+#define CONFIG_XENO_ARM_EABI 1
 #endif
 
-#define CONFIG_XENO_ARM_HW_DIRECT_TSC 1
+#ifdef CONFIG_IPIPE_ARM_KUSER_TSC
+#define CONFIG_XENO_ARM_KUSER_TSC 1
+#endif
+#define XNARCH_HAVE_NONPRIV_TSC  1
 
 #else /* !__KERNEL__ */
-#define __LINUX_ARM_ARCH__  CONFIG_XENO_ARM_ARCH
-#endif /* __KERNEL__ */
+
+#include <xeno_config.h>
+
+#ifdef __ARM_EABI__
+#define CONFIG_XENO_ARM_EABI 1
+#endif
+
+#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
+#define __LINUX_ARM_ARCH__ 4
+#endif /* armv4 */
+
+#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
+       || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__)
+#define __LINUX_ARM_ARCH__ 5
+#endif /* armv5 */
+
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6K__)
+#define __LINUX_ARM_ARCH__ 6
+#endif /* armv6 */
+
+#if defined(__ARM_ARCH_7A__)
+#define __LINUX_ARM_ARCH__ 7
+#endif /* armv7 */
+
+#ifndef __LINUX_ARM_ARCH__
+#error "Could not find current ARM architecture"
+#endif
+
+#if __LINUX_ARM_ARCH__ >= 6 || !defined(CONFIG_SMP)
+#define CONFIG_XENO_FASTSYNCH 1
+#endif
+
+#if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_KUSER
+#define CONFIG_XENO_ARM_KUSER_TSC 1
+#endif
+
+#endif /* !__KERNEL__ */
+
+#include <asm-generic/xenomai/features.h>
 
 #define __xn_feat_arm_atomic_xchg      0x00000001
 #define __xn_feat_arm_atomic_atomic    0x00000002
@@ -63,11 +108,11 @@
 #endif
 #define __xn_feat_arm_eabi_mask                        __xn_feat_arm_eabi
 
-#ifdef CONFIG_XENO_ARM_HW_DIRECT_TSC
+#ifdef CONFIG_XENO_ARM_KUSER_TSC
 #define __xn_feat_arm_tsc_mask                  __xn_feat_arm_tsc
-#else /* !CONFIG_XENO_ARM_HW_DIRECT_TSC */
+#else /* !CONFIG_XENO_ARM_KUSER_TSC */
 #define __xn_feat_arm_tsc_mask                  0
-#endif /* !CONFIG_XENO_ARM_HW_DIRECT_TSC */
+#endif /* !CONFIG_XENO_ARM_KUSER_TSC */
 
 #define XENOMAI_FEAT_DEP  ( __xn_feat_generic_mask              | \
                            __xn_feat_arm_atomic_xchg_mask      | \
@@ -92,7 +137,7 @@ static inline const char *get_feature_label (unsigned 
feature)
     case __xn_feat_arm_eabi:
            return "eabi";
     case __xn_feat_arm_tsc:
-           return "tsc";
+           return "kuser_tsc";
     default:
            return get_generic_feature_label(feature);
     }
diff --git a/include/asm-arm/syscall.h b/include/asm-arm/syscall.h
index 672819a..edc63e0 100644
--- a/include/asm-arm/syscall.h
+++ b/include/asm-arm/syscall.h
@@ -234,25 +234,15 @@ static inline int __xn_interrupted_p(struct pt_regs *regs)
 
 struct __xn_tscinfo {
        int type;               /* Must remain first member */
-       union {
-               struct {
-                       volatile unsigned *counter;
-                       unsigned mask;
-                       volatile unsigned long long *tsc;
-               } fr;
-               struct {
-                       volatile unsigned *counter;
-                       unsigned mask;
-                       volatile unsigned *last_cnt;
-                       volatile unsigned long long *tsc;
-               } dec;
-       } u;
+       unsigned mask;
+       volatile unsigned *counter;
+       volatile unsigned *last_cnt; /* Only used by decrementers */
+       volatile unsigned long long *tsc;
 };
-#define __XN_TSC_TYPE_NONE                  0
-#define __XN_TSC_TYPE_FREERUNNING           1
-#define __XN_TSC_TYPE_DECREMENTER           2
-#define __XN_TSC_TYPE_FREERUNNING_FAST_WRAP 3
-#define __XN_TSC_TYPE_FREERUNNING_COUNTDOWN 4
+
+#define _stringify(x) #x
+#define stringify(x) _stringify(x)
+
 
 #ifndef __KERNEL__
 extern struct __xn_tscinfo __xn_tscinfo;
@@ -260,10 +250,16 @@ extern struct __xn_tscinfo __xn_tscinfo;
 #ifdef XNARCH_ARM_TSC_TYPE
 static inline unsigned long long __xn_rdtsc(void)
 {
-#if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING
-       volatile unsigned long long *const tscp = __xn_tscinfo.u.fr.tsc;
-       volatile unsigned *const counterp = __xn_tscinfo.u.fr.counter;
-       const unsigned mask = __xn_tscinfo.u.fr.mask;
+#if XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_KUSER
+       typedef unsigned long long rdtsc_t(volatile unsigned *vaddr);
+       rdtsc_t *const kuser_tsc_get =
+               (void *)(0xffff1004 - ((*(unsigned *)(0xffff0ffc) + 3) << 5));
+       return kuser_tsc_get(__xn_tscinfo.counter);
+
+#elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING
+       volatile unsigned long long *const tscp = __xn_tscinfo.tsc;
+       volatile unsigned *const counterp = __xn_tscinfo.counter;
+       const unsigned mask = __xn_tscinfo.mask;
        register unsigned long long result;
        unsigned counter;
 
@@ -274,10 +270,11 @@ static inline unsigned long long __xn_rdtsc(void)
        if ((counter & mask) < ((unsigned) result & mask))
                result += mask + 1ULL;
        return (result & ~((unsigned long long) mask)) | (counter & mask);
+
 #elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING_COUNTDOWN
-       volatile unsigned long long *const tscp = __xn_tscinfo.u.fr.tsc;
-       volatile unsigned *const counterp = __xn_tscinfo.u.fr.counter;
-       const unsigned mask = __xn_tscinfo.u.fr.mask;
+       volatile unsigned long long *const tscp = __xn_tscinfo.tsc;
+       volatile unsigned *const counterp = __xn_tscinfo.counter;
+       const unsigned mask = __xn_tscinfo.mask;
        register unsigned long long result;
        unsigned counter;
 
@@ -288,10 +285,11 @@ static inline unsigned long long __xn_rdtsc(void)
        if ((counter & mask) > ((unsigned) result & mask))
                result += mask + 1ULL;
        return (result & ~((unsigned long long) mask)) | (counter & mask);
+
 #elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_FREERUNNING_FAST_WRAP
-       volatile unsigned long long *const tscp = __xn_tscinfo.u.fr.tsc;
-       volatile unsigned *const counterp = __xn_tscinfo.u.fr.counter;
-       const unsigned mask = __xn_tscinfo.u.fr.mask;
+       volatile unsigned long long *const tscp = __xn_tscinfo.tsc;
+       volatile unsigned *const counterp = __xn_tscinfo.counter;
+       const unsigned mask = __xn_tscinfo.mask;
        register unsigned long long after, before;
        unsigned counter;
 
@@ -307,10 +305,10 @@ static inline unsigned long long __xn_rdtsc(void)
        return (before & ~((unsigned long long) mask)) | (counter & mask);
 
 #elif XNARCH_ARM_TSC_TYPE == __XN_TSC_TYPE_DECREMENTER
-       volatile unsigned long long *const tscp = __xn_tscinfo.u.dec.tsc;
-       volatile unsigned *const counterp = __xn_tscinfo.u.dec.counter;
-       volatile unsigned *const last_cntp = __xn_tscinfo.u.dec.last_cnt;
-       const unsigned mask = __xn_tscinfo.u.dec.mask;
+       volatile unsigned long long *const tscp = __xn_tscinfo.tsc;
+       volatile unsigned *const counterp = __xn_tscinfo.counter;
+       volatile unsigned *const last_cntp = __xn_tscinfo.last_cnt;
+       const unsigned mask = __xn_tscinfo.mask;
        register unsigned long long after, before;
        unsigned counter, last_cnt;
 
diff --git a/src/include/xeno_config.h.in b/src/include/xeno_config.h.in
index 5b05843..d9e2887 100644
--- a/src/include/xeno_config.h.in
+++ b/src/include/xeno_config.h.in
@@ -10,12 +10,6 @@
 #undef CONFIG_X86_TSC
 
 /* config */
-#undef CONFIG_XENO_ARM_ARCH
-
-/* config */
-#undef CONFIG_XENO_ARM_EABI
-
-/* config */
 #undef CONFIG_XENO_ARM_SA1100
 
 /* Build system alias */
@@ -30,9 +24,6 @@
 /* config */
 #undef CONFIG_XENO_DEFAULT_PERIOD
 
-/* config */
-#undef CONFIG_XENO_FASTSYNCH
-
 /* Host system alias */
 #undef CONFIG_XENO_HOST_STRING
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to