From d3cc4ebf58ec05037c3b0dd7c83c075a56f1dc62 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 25 Aug 2011 14:24:03 +0200 Subject: [PATCH] Make SH port work for packagers that don't differentiate between SH4 and SH4A Generic bits done by me, SH specific bits implemented by Nobuhiro Iwamatsu . Signed-off-by: Jens Axboe --- arch/arch-sh.h | 35 ++++++++++++++++++++++++++++++----- arch/arch.h | 14 ++++++++++++++ fio.c | 6 +++++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/arch/arch-sh.h b/arch/arch-sh.h index 08c5fb3d..ef4ee032 100644 --- a/arch/arch-sh.h +++ b/arch/arch-sh.h @@ -22,13 +22,38 @@ #define nop __asm__ __volatile__ ("nop": : :"memory") -#if defined(__SH4A__) -#define mb() __asm__ __volatile__ ("synco": : :"memory") -#else -#define mb() __asm__ __volatile__ (" " : : : "memory") -#endif +#define mb() \ + do { \ + if (arch_flags & ARCH_FLAG_1) \ + __asm__ __volatile__ ("synco": : :"memory"); \ + else \ + __asm__ __volatile__ (" " : : : "memory"); \ + } while (0) #define read_barrier() mb() #define write_barrier() mb() +#define CPU_HAS_LLSC 0x0040 + +static inline int arch_init(char *envp[]) +{ + Elf32_auxv_t *auxv; + + while (*envp++ != NULL) + ; + + for (auxv = (Elf32_auxv_t *) envp; auxv->a_type != AT_NULL; auxv++) { + if (auxv->a_type == AT_HWCAP) { + if (auxv->a_un.a_val & CPU_HAS_LLSC) { + arch_flags |= ARCH_FLAG_1; + break; + } + } + } + + return 0; +} + +#define ARCH_HAVE_INIT + #endif diff --git a/arch/arch.h b/arch/arch.h index 8cafa118..16f4c3ab 100644 --- a/arch/arch.h +++ b/arch/arch.h @@ -58,4 +58,18 @@ enum { #include "../lib/ffz.h" #endif +#ifndef ARCH_HAVE_INIT +static inline int arch_init(char *envp[]) +{ + return 0; +} +#endif + +enum { + ARCH_FLAG_1 = 1 << 0, + ARCH_FLAG_2 = 1 << 1, + ARCH_FLAG_3 = 1 << 2, + ARCH_FLAG_4 = 1 << 3, +}; + #endif diff --git a/fio.c b/fio.c index 73964214..9c1bed37 100644 --- a/fio.c +++ b/fio.c @@ -70,6 +70,8 @@ static pthread_t disk_util_thread; static struct flist_head *cgroup_list; static char *cgroup_mnt; +unsigned long arch_flags = 0; + struct io_log *agg_io_log[2]; #define TERMINATE_ALL (-1) @@ -1690,10 +1692,12 @@ static void run_threads(void) fio_unpin_memory(); } -int main(int argc, char *argv[]) +int main(int argc, char *argv[], char *envp[]) { long ps; + arch_init(envp); + sinit(); init_rand(&__fio_rand_state); -- 2.25.1