This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: 32-bit PowerPC sdata linker problem
- From: Sebastian Huber <sebastian dot huber at embedded-brains dot de>
- To: binutils at sourceware dot org
- Date: Fri, 06 Jun 2014 14:48:55 +0200
- Subject: Re: 32-bit PowerPC sdata linker problem
- Authentication-results: sourceware.org; auth=none
- References: <53918356 dot 3040102 at embedded-brains dot de> <20140606105420 dot GH5592 at bubble dot grove dot modra dot org> <5391A4BF dot 2030308 at embedded-brains dot de> <5391A6A4 dot 6050708 at embedded-brains dot de> <20140606121531 dot GI5592 at bubble dot grove dot modra dot org>
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.