32-bit PowerPC sdata linker problem

Sebastian Huber sebastian.huber@embedded-brains.de
Fri Jun 6 12:49:00 GMT 2014


On 2014-06-06 14:15, Alan Modra wrote:
> On Fri, Jun 06, 2014 at 01:31:48PM +0200, Sebastian Huber wrote:
>> >On 2014-06-06 13:23, Sebastian Huber wrote:
>>> > >Ok, so this "cmplwi cr0, rX, ppc_exc_lock_std@sdarel" is illegal, since
>>> > >ppc_exc_lock_std@sdarel is signed and the immediate is unsigned 16-bit?  The
>>> > >assembler doesn't issue a warning about this.
>>> > >
>>> > >Exists there a way to rescue this cmplwi hack without relaxing the overflow
>>> > >checks?
>> >
>> >Hm, sorry, it was surprisingly simple.  This works:
>> >
>> >"cmplwi cr0, rX, ppc_exc_lock_std@sdarel@l"
>> >
>> >I was not aware that you can add several @ in a row.
> That is the wrong thing to use here.  sdarel@l translates to a VLE
> reloc which applies to a split 16-bit field in VLE insns.

Oh, yes.  This is not what I want.

>
> You want
>   cmpwi cr0, rX, ppc_exc_lock_std@sdarel
> to properly compare a 16-bit signed number from sym@sdarel.
>
> Note that the assembler does error if you write something like
>   cmplwi 3,-30000
> or
>   cmpwi 3,40000
> so what the linker is now doing is extending this behaviour to link
> time.

I actually need only the lower 16-bit of sym@sdarel here.  The code reads an 
opcode on a certain address and tests if the opcode is equal to "stw r1, 
ppc_exc_lock_std@sdarel(r13)".

/*
  *****************************************************************************
  * MACRO: TEST_1ST_OPCODE_crit
  *****************************************************************************
  *
  * USES:    REG, cr0
  * ON EXIT: REG available (contains *pc - STW_R1_R13(0)),
  *          return value in cr0.
  *
  * test opcode interrupted by critical (asynchronous) exception; set CR_LOCK if
  *
  *   *SRR0 == 'stw r1, ppc_exc_lock_std@sdarel(r13)'
  *
  */
	.macro	TEST_1ST_OPCODE_crit _REG

	lwz	\_REG, SRR0_FRAME_OFFSET(FRAME_REGISTER)
	lwz	\_REG, 0(\_REG)
	/*	opcode now in REG */

	/*	subtract upper 16bits of 'stw r1, 0(r13)' instruction */
	subis	\_REG, \_REG, STW_R1_R13(0)@h
	/*
	 * if what's left compares against the 'ppc_exc_lock_std@sdarel'
	 * address offset then we have a match...
	 */
	cmplwi	cr0, \_REG, ppc_exc_lock_std@sdarel

	.endm

I guess, I have to rewrite this a bit.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the Binutils mailing list