[klibc] [PATCH] fix ARM longjmp with zero 'val'. We need to set the condition codes on the ARM. The previous version was using a left over condition code from the caller. Also, use conditional execution to eliminate branch and reduce size. Signed-off-by: Bill Pringlemeir <bpringle at sympatico.ca> diff --git a/usr/klibc/arch/arm/setjmp.S b/usr/klibc/arch/arm/setjmp.S index 92ffc43..9f96274 100644 --- a/usr/klibc/arch/arm/setjmp.S +++ b/usr/klibc/arch/arm/setjmp.S @@ -40,10 +40,9 @@ setjmp: .type longjmp, #function longjmp: ldmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} - mov r0, r1 - bne 1f - mov r0, #1 -1: BX(lr) + movs r0, r1 + moveq r0, #1 + BX(lr) .size longjmp,.-longjmp #else /* __thumb__ */
On Tue, 02 Oct 2012, Bill Pringlemeir wrote:> > [klibc] [PATCH] fix ARM longjmp with zero 'val'. > > We need to set the condition codes on the ARM. The previous version was > using a left over condition code from the caller. Also, use conditional > execution to eliminate branch and reduce size. > > Signed-off-by: Bill Pringlemeir <bpringle at sympatico.ca>I hope you tested it beyond compilation? Hand applied due to whitespace "damaged" patch and pushed. Please double check me on latest klibc.git Best, -- maks
On 10/02/2012 10:29 AM, Bill Pringlemeir wrote:> > [klibc] [PATCH] fix ARM longjmp with zero 'val'. > > We need to set the condition codes on the ARM. The previous version was > using a left over condition code from the caller. Also, use conditional > execution to eliminate branch and reduce size. > > Signed-off-by: Bill Pringlemeir <bpringle at sympatico.ca> > > diff --git a/usr/klibc/arch/arm/setjmp.S b/usr/klibc/arch/arm/setjmp.S > index 92ffc43..9f96274 100644 > --- a/usr/klibc/arch/arm/setjmp.S > +++ b/usr/klibc/arch/arm/setjmp.S > @@ -40,10 +40,9 @@ setjmp: > .type longjmp, #function > longjmp: > ldmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} > - mov r0, r1 > - bne 1f > - mov r0, #1 > -1: BX(lr) > + movs r0, r1 > + moveq r0, #1 > + BX(lr) > .size longjmp,.-longjmp >This is one of many reasons why I made the decision early on to simply thread setjmp(0) as a user error and not try to DWIM it. The presumed original reason was to handle legacy code which did setjmp() without providing an argument, but that will not even compile anymore. -hpa