|
@@ -434,3 +434,63 @@ struct linux_smonblock {
|
|
|
__res; \
|
|
|
})
|
|
|
|
|
|
+#define ARC_CALL4(dest, a1, a2, a3, a4) \
|
|
|
+({ long __res; \
|
|
|
+ register signed int __a1 __asm__("$4") = (int) (long) (a1); \
|
|
|
+ register signed int __a2 __asm__("$5") = (int) (long) (a2); \
|
|
|
+ register signed int __a3 __asm__("$6") = (int) (long) (a3); \
|
|
|
+ register signed int __a4 __asm__("$7") = (int) (long) (a4); \
|
|
|
+ long __vec = (long) romvec->dest; \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ "dsubu\t$29, 32\n\t" \
|
|
|
+ "jalr\t%1\n\t" \
|
|
|
+ "daddu\t$29, 32\n\t" \
|
|
|
+ "move\t%0, $2" \
|
|
|
+ : "=r" (__res), "=r" (__vec) \
|
|
|
+ : "1" (__vec), "r" (__a1), "r" (__a2), "r" (__a3), \
|
|
|
+ "r" (__a4) \
|
|
|
+ : __arc_clobbers); \
|
|
|
+ __res; \
|
|
|
+})
|
|
|
+
|
|
|
+#define ARC_CALL5(dest, a1, a2, a3, a4, a5) \
|
|
|
+({ long __res; \
|
|
|
+ register signed int __a1 __asm__("$4") = (int) (long) (a1); \
|
|
|
+ register signed int __a2 __asm__("$5") = (int) (long) (a2); \
|
|
|
+ register signed int __a3 __asm__("$6") = (int) (long) (a3); \
|
|
|
+ register signed int __a4 __asm__("$7") = (int) (long) (a4); \
|
|
|
+ register signed int __a5 = (int) (long) (a5); \
|
|
|
+ long __vec = (long) romvec->dest; \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ "dsubu\t$29, 32\n\t" \
|
|
|
+ "sw\t%7, 16($29)\n\t" \
|
|
|
+ "jalr\t%1\n\t" \
|
|
|
+ "daddu\t$29, 32\n\t" \
|
|
|
+ "move\t%0, $2" \
|
|
|
+ : "=r" (__res), "=r" (__vec) \
|
|
|
+ : "1" (__vec), \
|
|
|
+ "r" (__a1), "r" (__a2), "r" (__a3), "r" (__a4), \
|
|
|
+ "r" (__a5) \
|
|
|
+ : __arc_clobbers); \
|
|
|
+ __res; \
|
|
|
+})
|
|
|
+
|
|
|
+#endif /* defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32) */
|
|
|
+
|
|
|
+#if (defined(CONFIG_32BIT) && defined(CONFIG_FW_ARC32)) || \
|
|
|
+ (defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC64))
|
|
|
+
|
|
|
+#define ARC_CALL0(dest) \
|
|
|
+({ long __res; \
|
|
|
+ long (*__vec)(void) = (void *) romvec->dest; \
|
|
|
+ \
|
|
|
+ __res = __vec(); \
|
|
|
+ __res; \
|
|
|
+})
|
|
|
+
|
|
|
+#define ARC_CALL1(dest, a1) \
|
|
|
+({ long __res; \
|
|
|
+ long __a1 = (long) (a1); \
|
|
|
+ long (*__vec)(long) = (void *) romvec->dest; \
|
|
|
+ \
|
|
|
+ __res = __vec(__a1); \
|