Re: longjmp question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Oct 08, 2011 at 02:43:55AM -0400, David Miller wrote:
> From: Jurij Smakov <jurij@xxxxxxxxx>
> Date: Sat, 8 Oct 2011 00:22:10 +0100
> 
> > #define RW_FP [%fp + 0x48]
> 
> Let's just do away with this value entirely and do this the
> safest way possible, since this is the slow path:
> 
> diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S
> index a5453b4..70e8e29 100644
> --- a/sysdeps/sparc/sparc32/__longjmp.S
> +++ b/sysdeps/sparc/sparc32/__longjmp.S
> @@ -22,7 +22,6 @@
>  #include <jmpbuf-offsets.h>
>  #define ENV(base,reg) [%base + (reg * 4)]
>  #define ST_FLUSH_WINDOWS 3
> -#define RW_FP [%fp + 0x48]
>  
>  ENTRY(__longjmp)
>  	/* Store our arguments in global registers so we can still
> @@ -55,6 +54,7 @@ LOC(loop):
>  	 ld ENV(g1,JB_SP), %o0	/* Delay slot: extract target SP.  */
>  
>  LOC(thread):
> +	save	%sp, -96, %sp
>  	/*
>  	 * Do a "flush register windows trap".  The trap handler in the
>  	 * kernel writes all the register windows to their stack slots, and
> @@ -67,15 +67,13 @@ LOC(thread):
>  #ifdef PTR_DEMANGLE
>  	ld	ENV(g1,JB_PC), %g5 /* Set return PC. */
>  	ld	ENV(g1,JB_SP), %g1 /* Set saved SP on restore below. */
> -	PTR_DEMANGLE2 (%o7, %g5, %g4)
> +	PTR_DEMANGLE2 (%i7, %g5, %g4)
>  	PTR_DEMANGLE2 (%fp, %g1, %g4)
>  #else
> -	ld	ENV(g1,JB_PC), %o7 /* Set return PC. */
> +	ld	ENV(g1,JB_PC), %i7 /* Set return PC. */
>  	ld	ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
>  #endif
> -	sub	%fp, 64, %sp	/* Allocate a register frame. */
> -	st	%g3, RW_FP	/* Set saved FP on restore below. */
> -	retl
> +	jmp	%i7 + 8
>  	 restore %g2, 0, %o0	/* Restore values from above register frame. */

I don't really see anything in the code which would ensure that after 
we execute this restore, fp is going to be set to target fp value 
(available as ENV(g1,JB_FP) or g3. It might be the responsibility of 
the unwinding part, but then it would not explain why such code was 
explicitly present in the old version.

Best regards,
-- 
Jurij Smakov                                           jurij@xxxxxxxxx
Key: http://www.wooyd.org/pgpkey/                      KeyID: C99E03CC
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux