#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
void app_startup(char **argv)
{
- unsigned long * cp = &__bss_start;
+ unsigned char * cp = (unsigned char *) &__bss_start;
/* Zero out BSS */
- while (cp < &_end) {
+ while (cp < (unsigned char *)&_end) {
*cp++ = 0;
}