Alpha setjmp() fix: save/restore the saved FP registers
diff --git a/include/arch/alpha/klibc/archsetjmp.h b/include/arch/alpha/klibc/archsetjmp.h
index d2ef14a..9dc570a 100644
--- a/include/arch/alpha/klibc/archsetjmp.h
+++ b/include/arch/alpha/klibc/archsetjmp.h
@@ -16,6 +16,15 @@
unsigned long __ra;
unsigned long __gp;
unsigned long __sp;
+
+ unsigned long __f2;
+ unsigned long __f3;
+ unsigned long __f4;
+ unsigned long __f5;
+ unsigned long __f6;
+ unsigned long __f7;
+ unsigned long __f8;
+ unsigned long __f9;
};
/* Must be an array so it will decay to a pointer when a function is called */
diff --git a/klibc/arch/alpha/include/klibc/archsetjmp.h b/klibc/arch/alpha/include/klibc/archsetjmp.h
index d2ef14a..9dc570a 100644
--- a/klibc/arch/alpha/include/klibc/archsetjmp.h
+++ b/klibc/arch/alpha/include/klibc/archsetjmp.h
@@ -16,6 +16,15 @@
unsigned long __ra;
unsigned long __gp;
unsigned long __sp;
+
+ unsigned long __f2;
+ unsigned long __f3;
+ unsigned long __f4;
+ unsigned long __f5;
+ unsigned long __f6;
+ unsigned long __f7;
+ unsigned long __f8;
+ unsigned long __f9;
};
/* Must be an array so it will decay to a pointer when a function is called */
diff --git a/klibc/arch/alpha/setjmp.S b/klibc/arch/alpha/setjmp.S
index 2d8dfe6..e1ad642 100644
--- a/klibc/arch/alpha/setjmp.S
+++ b/klibc/arch/alpha/setjmp.S
@@ -20,17 +20,25 @@
.ent setjmp, 0
.globl setjmp
setjmp:
- lda v0, 0(zero)
- stq s0, 0(a0)
- stq s1, 8(a0)
- stq s2, 16(a0)
- stq s3, 24(a0)
- stq s4, 32(a0)
- stq s5, 40(a0)
- stq fp, 48(a0)
- stq ra, 56(a0)
- stq gp, 64(a0)
- stq sp, 72(a0)
+ lda v0, 0(zero)
+ stq s0, 0(a0)
+ stq s1, 8(a0)
+ stq s2, 16(a0)
+ stq s3, 24(a0)
+ stq s4, 32(a0)
+ stq s5, 40(a0)
+ stq fp, 48(a0)
+ stq ra, 56(a0)
+ stq gp, 64(a0)
+ stq sp, 72(a0)
+ stt f2, 80(a0)
+ stt f3, 88(a0)
+ stt f4, 96(a0)
+ stt f5, 104(a0)
+ stt f6, 112(a0)
+ stt f7, 120(a0)
+ stt f8, 128(a0)
+ stt f9, 136(a0)
ret zero,(ra),1
.size setjmp,.-setjmp
@@ -41,16 +49,24 @@
.globl longjmp
longjmp:
mov a1, v0
- ldq s0, 0(a0)
- ldq s1, 8(a0)
- ldq s2, 16(a0)
- ldq s3, 24(a0)
- ldq s4, 32(a0)
- ldq s5, 40(a0)
- ldq fp, 48(a0)
- ldq ra, 56(a0)
- ldq gp, 64(a0)
- ldq sp, 72(a0)
+ ldq s0, 0(a0)
+ ldq s1, 8(a0)
+ ldq s2, 16(a0)
+ ldq s3, 24(a0)
+ ldq s4, 32(a0)
+ ldq s5, 40(a0)
+ ldq fp, 48(a0)
+ ldq ra, 56(a0)
+ ldq gp, 64(a0)
+ ldq sp, 72(a0)
+ ldt f2, 80(a0)
+ ldt f3, 88(a0)
+ ldt f4, 96(a0)
+ ldt f5, 104(a0)
+ ldt f6, 112(a0)
+ ldt f7, 120(a0)
+ ldt f8, 128(a0)
+ ldt f9, 136(a0)
/* We're bound to get a mispredict here, but at least give us
a chance to get the return stack back in sync... */
ret zero,(ra),1