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 <iwamatsu@nigauri.org>.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/arch/arch-sh.h b/arch/arch-sh.h
index 08c5fb3..ef4ee03 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 8cafa11..16f4c3a 100644
--- a/arch/arch.h
+++ b/arch/arch.h
@@ -58,4 +58,18 @@
 #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