]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - examples/stubs.c
EP88x: fix broken linker script
[karo-tx-uboot.git] / examples / stubs.c
index b9dbcf9065b9a8e635f1c1b9f5bcb9b99b391145..a8cb954282139a9b80ad6f1baef05a59084cc0d2 100644 (file)
@@ -162,11 +162,29 @@ gd_t *global_data;
                #x ":\n"                                \
                "       mov     r13, r1\n"              \
                "       add     %0, r1\n"               \
-               "       add     %1, r1\n"               \
+               "       mov.l @r1, r2\n"        \
+               "       add     %1, r2\n"               \
+               "       mov.l @r2, r1\n"        \
                "       jmp     @r1\n"                  \
                "       nop\n"                          \
                "       nop\n"                          \
-               : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1");
+               : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1", "r2");
+#elif defined(CONFIG_SPARC)
+/*
+ * g7 holds the pointer to the global_data. g1 is call clobbered.
+ */
+#define EXPORT_FUNC(x)                                 \
+       asm volatile(                                   \
+"      .globl\t" #x "\n"                               \
+#x ":\n"                                               \
+"      set %0, %%g1\n"                                 \
+"      or %%g1, %%g7, %%g1\n"                          \
+"      ld [%%g1], %%g1\n"                              \
+"      ld [%%g1 + %1], %%g1\n"                         \
+"      call %%g1\n"                                    \
+"      nop\n"                                          \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "g1" );
+
 #else
 #error stubs definition missing for this architecture
 #endif