2011/10/21 Georg-Johann Lay <a...@gjlay.de>:
>>> This patch adds support to consistently use EIND.
>>>
>>> The compiler never sets this SFR but uses it in table jumps and EIJMP/EICALL
>>> instructions.
>>>
>>> Custom startup code could set EIND to an other value than 0 and the compiler
>>> should use EIND consistently given that EIND might not be zero.
>>>
>>> EIND != 0 will need support of custom linker script to locate jump pads in 
>>> an
>>> other segment, but that's a different story.
>>>
>>> The patch undoes some changes from r179760 and introduces using EIND the 
>>> other
>>> way round: Not trying to avoid EIND altogether and assume code is supposed 
>>> to
>>> work in the lower segment only, but instead use EIND and not zero-reg when
>>> simulating indirect jump by means of RET.
>>>
>>> With this patch, the application may set EIND to a custom value and invent 
>>> own
>>> linker script to place jump pads.  The assertion is that EIND never changes
>>> throughout the application and therefore ISR prologue/epilogue need not 
>>> care.
>>>
>>> With the gs() magic, code using indirect jumps works fine with that, e.g.
>>> - Indirect calls
>>> - Computed goto
>>> - Jumping to 1: in prologue_saves
>>>
>>> What does not work as expected is to jump to const_int addresses like
>>>
>>> int main()
>>> {
>>>   ((void(*)(void))0)();
>>>   return 0;
>>> }
>>>
>>> Instead, code must read
>>>
>>> extern void my_address (void);
>>>
>>> int main()
>>> {
>>>    my_address();
>>>    return 0;
>>> }
>>>
>>> and compiled with, say -Wl,--defsym,my_address=0x20000, so that a jump pad 
>>> is
>>> generated.
>>>
>>> Patch ok for trunk?
>>>
>>> Johann
>>>
>>>        * config/avr/libgcc.S (__EIND__): New define to 0x3C.
>>>        (__tablejump__): Consistently use EIND for indirect jump/call.
>>>        (__tablejump_elpm__): Ditto.
>>
>> Approved.
>>
>> Denis.
>
> Is this a thing to back port?
>

As you please.

Denis.

Reply via email to