Subject: Re: [PATCH kexec-tools] ppc64: correct @ha relocation

From: Mohan Kumar M <[email-masked]>
Date: Thu, 12 Apr 2007 13:47:16 +0530

On Wed, Apr 11, 2007 at 03:30:00AM -0500, Milton Miller wrote:
> 
> The @ha relocation is supposed to account for the @l relocation being
> a signed quantity by adding 1 if the msb of @l is set.
> 
> The trick of adding 0x8000 stolen from the linux kernel file
> arch/powerpc/kernel/module_64.c which credits binutils.
> 
> Signed-off-by: Milton Miller <[email-masked]>
>
Acked-by: Mohan Kumar M <[email-masked]>

Cross checked with PPC64 ELF ABI also.
 
> --- 
> This relocation is used in v2wrap.S to hold and release the slave cpus.
> Without this fix the memory location may be 64k off the initialized variable
> which is checked against 0.
> 
> 
> --- kexec-tools-testing/kexec/arch/ppc64/kexec-elf-rel-ppc64.c.orig	2007-04-10 22:29:59.000000000 -0500
> +++ kexec-tools-testing/kexec/arch/ppc64/kexec-elf-rel-ppc64.c	2007-04-10 22:29:59.000000000 -0500
> @@ -97,7 +97,7 @@ void machine_apply_elf_rel(struct mem_eh
>  		break;
> 
>  	case R_PPC64_ADDR16_HA:
> -		*(uint16_t *)location = ((value>>16)  & 0xffff);
> +		*(uint16_t *)location = (((value+0x8000)>>16)  & 0xffff);
>  		break;
> 
>  	case R_PPC64_ADDR16_HIGHEST: