diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 0d2a38c1c..e9018f7ba 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2003-02-18 Christian Groessler + + * libc/machine/z8k/setjmp.S (_setjmp / _longjmp): Fix to + support z8001 segmented mode. + 2003-02-18 Earnie Boyd * libc/stdlib/mallocr.c (unlink): Don't assign a value to a pointer diff --git a/newlib/libc/machine/z8k/setjmp.S b/newlib/libc/machine/z8k/setjmp.S index 6a7664112..e58d0d1f4 100644 --- a/newlib/libc/machine/z8k/setjmp.S +++ b/newlib/libc/machine/z8k/setjmp.S @@ -3,27 +3,62 @@ segm .global _setjmp + .globl _longjmp + +#ifdef __STD_CALL__ + +_setjmp: + ldl rr6,rr14(#4) ! get argument + ldl rr2,@rr14 ! fetch pc + ldl @rr6,rr2 ! save it + ldl rr6(#16),rr8 + ldl rr6(#4),rr10 + ldl rr6(#8),rr12 ! remember frame pointer + ldl rr6(#12),rr14 ! remember stack pointer + ldk r7,#0 + ret t + +_longjmp: + ldl rr4,rr14(#4) ! get first argument + ld r7,rr14(#8) ! get return value + ldl rr8,rr4(#16) + ldl rr10,rr4(#4) + ldl rr12,rr4(#8) ! restore old frame pointer + ldl rr14,rr4(#12) ! restore old stack pointer + ldl rr4,@rr4 ! return address + inc r15,#4 + jp @rr4 + +#else /* above __STD_CALL_, below not */ + _setjmp: ldl rr2,@rr14 ! fetch pc ldl @rr6,rr2 ! save it + ldl rr6(16),rr8 ldl rr6(4),rr10 ldl rr6(8),rr12 ! and the other special regs ldl rr6(12),rr14 ldk r2,#0 ret t - - .globl _longjmp _longjmp: ld r2,r5 ! get return value ldl rr4,rr6(0) + ldl rr8,rr6(16) ldl rr10,rr6(4) ldl rr12,rr6(8) ldl rr14,rr6(12) + inc r15,#4 jp @rr4 -#else + +#endif /* not __STD_CALL__ */ +#else /* above Z8001, below Z8002 */ unseg +#ifdef __STD_CALL__ +#warning Z8002 std call not implemented! +#endif + .global _setjmp _setjmp: ld r2,@r15 ! fetch pc @@ -44,6 +79,4 @@ _longjmp: ldl rr14,rr7(12) jp @rr4 -#endif - - +#endif /* Z8002 version */