Follow-up Comment #6, patch #6352 (project avr-libc):

The xxx_PF() functions modify the RAMPZ register, but on XMegas with EBI,
RAMPZ influences also LD/LDD/ST/STD, making code after using xxx_PF() to
access unintended data memory "pages".


In the attached file, in macros.inc, macro LPM_R0_ZPLUS_INIT is modified and
macro LPM_R0_ZPLUS_FINI added, storing and restoring RAMPZ, for targets with
__AVR_HAVE_RAMPD__ defined (which IMHO is unique indication of presence of
EBI). Only LPM_R0_ZPLUS_FINI needs to be added to xxx_PF() functions (and
documentation modified accordingly), as shown in the attached memcpy_PF(). All
the xxx_PF() functions are affected and should be modified accordingly after
consensus happens.


As a cheaper alternative, RAMPZ could be simply zeroed as all "standard" RAM
access in current avr-gcc is restricted to 16-bit addresses; whether this is a
better option I leave to decide for the more experienced developers on this
forum.


This resolves https://savannah.nongnu.org/bugs/?func=detailitem&item_id=25120
which thus could be closed as duplicate (the issue with RAMPZ mods being
non-interrupt safe is resolved by saving RAMPZ in the standard interrupt
prologue/epilogue as of avr-gcc version 4.3+).


(file #20859)
    _______________________________________________________

Additional Item Attachment:

File name: memcpy_PF.zip                  Size:5 KB


    _______________________________________________________

Reply to this item at:

  <http://savannah.nongnu.org/patch/?6352>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.nongnu.org/


_______________________________________________
AVR-libc-dev mailing list
AVR-libc-dev@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev

Reply via email to