diff -Naurp include/setjmp.h include/setjmp.h --- include/setjmp.h 2011-12-29 14:21:50.000000000 +0530 +++ include/setjmp.h 2012-06-15 11:53:57.000000000 +0530 @@ -40,17 +40,20 @@ extern "C" { /* jmp_buf: offset size description - 0 16 call-saved registers (r2-r17) - 16 2 frame pointer (r29:r28) - 18 2 stack pointer (SPH:SPL) - 20 1 status register (SREG) - 21 2/3 return address (PC) (2 bytes used for <=128Kw flash) - 23/24 = total size + 0 16/4 call-saved registers (r2-r17) + (AVR tiny10 family has only 4 call saved registers (r18-r21)) + 16/4 2 frame pointer (r29:r28) + 18/6 2 stack pointer (SPH:SPL) + 20/8 1 status register (SREG) + 21/9 2/3 return address (PC) (2 bytes used for <=128Kw flash) + 23/24/11 = total size (AVR Tiny10 family always has 2 bytes PC) */ #if !defined(__DOXYGEN__) -#if defined(__AVR_3_BYTE_PC__) && __AVR_3_BYTE_PC__ +#if defined(__AVR_TINY__) +# define _JBLEN 11 +#elif defined(__AVR_3_BYTE_PC__) && __AVR_3_BYTE_PC__ # define _JBLEN 24 #else # define _JBLEN 23 diff -Naurp libc/stdlib/setjmp.S libc/stdlib/setjmp.S --- libc/stdlib/setjmp.S 2011-12-29 14:21:54.000000000 +0530 +++ libc/stdlib/setjmp.S 2012-06-15 11:51:32.000000000 +0530 @@ -29,8 +29,6 @@ /* $Id: setjmp.S 2191 2010-11-05 13:45:57Z arcanum $ */ -#if !defined(__AVR_TINY__) - /* setjmp.S @@ -42,12 +40,13 @@ /* jmp_buf: offset size description - 0 16 call-saved registers (r2-r17) - 16 2 frame pointer (r29:r28) - 18 2 stack pointer (SPH:SPL) - 20 1 status register (SREG) - 21 2/3 return address (PC) (2 bytes used for <=128Kw flash) - 23/24 = total size + 0 16/4 call-saved registers (r2-r17) + (AVR tiny10 family has only 4 call saved registers (r18-r21)) + 16/4 2 frame pointer (r29:r28) + 18/6 2 stack pointer (SPH:SPL) + 20/8 1 status register (SREG) + 21/9 2/3 return address (PC) (2 bytes used for <=128Kw flash) + 23/24/11 = total size (AVR tiny10 family always has 2 bytes PC) All multibytes are stored as little-endian. int setjmp(jmp_buf __jmpb); @@ -82,7 +81,11 @@ _U(setjmp): X_movw XL, jmpb_lo ; save call-saved registers and frame pointer +#if !defined(__AVR_TINY__) .irp .L_regno, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,28,29 +#else + .irp .L_regno, 18,19,20,21,28,29 +#endif st X+, r\.L_regno .endr ; get return address @@ -129,7 +132,11 @@ _U(longjmp): cpc ret_hi, __zero_reg__ adc ret_lo, __zero_reg__ ; restore call-saved registers and frame pointer +#if !defined(__AVR_TINY__) .irp .L_regno, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,28,29 +#else + .irp .L_regno, 18,19,20,21,28,29 +#endif ld r\.L_regno, X+ .endr ; restore stack pointer (SP value before the setjmp() call) and SREG @@ -169,5 +176,3 @@ _U(longjmp): .size _U(longjmp), . - _U(longjmp) #endif /* !__DOXYGEN__ */ - -#endif /* !defined(__AVR_TINY__) */