• Dave Martin's avatar
    ARM: 6640/1: Thumb-2: Symbol manipulation macros for function body copying · 5756e9dd
    Dave Martin authored
    In low-level board support code, there is sometimes a need to
    copy a function body to another location at run-time.
    
    A straightforward call to memcpy doesn't work in Thumb-2,
    because bit 0 of external Thumb function symbols is set to 1,
    indicating that the function is Thumb.  Without corrective
    measures, this will cause an off-by-one copy, and the copy
    may be called using the wrong instruction set.
    
    This patch adds an fncpy() macro to help with such copies.
    
    Particular care is needed, because C doesn't guarantee any
    defined behaviour when casting a function pointer to any other
    type.  This has been observed to lead to strange optimisation
    side-effects when doing the arithmetic which is required in
    order to copy/move function bodies correctly in Thumb-2.
    
    Thanks to Russell King and Nicolas Pitre for their input
    on this patch.
    Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
    Tested-by: default avatarJean Pihet <j-pihet@ti.com>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Tested-by: default avatarKevin Hilman <khilman@ti.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    5756e9dd
fncpy.h 3.08 KB