On Tue, Apr 6, 2021 at 4:37 AM Mark Rutland <mark.rutland@xxxxxxx> wrote: > > On Thu, Apr 01, 2021 at 04:32:10PM -0700, Sami Tolvanen wrote: > > With CONFIG_CFI_CLANG, the compiler replaces function addresses in > > instrumented C code with jump table addresses. This change implements > > the function_nocfi() macro, which returns the actual function address > > instead. > > > > Signed-off-by: Sami Tolvanen <samitolvanen@xxxxxxxxxx> > > Reviewed-by: Kees Cook <keescook@xxxxxxxxxxxx> > > I think that it's unfortunate that we have to drop to assembly here, but > given this is infrequent I agree it's not the end of the world, so: > > Acked-by: Mark Rutland <mark.rutland@xxxxxxx> > > > --- > > arch/arm64/include/asm/memory.h | 15 +++++++++++++++ > > 1 file changed, 15 insertions(+) > > > > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > > index 0aabc3be9a75..b55410afd3d1 100644 > > --- a/arch/arm64/include/asm/memory.h > > +++ b/arch/arm64/include/asm/memory.h > > @@ -321,6 +321,21 @@ static inline void *phys_to_virt(phys_addr_t x) > > #define virt_to_pfn(x) __phys_to_pfn(__virt_to_phys((unsigned long)(x))) > > #define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x)) > > > > +#ifdef CONFIG_CFI_CLANG > > +/* > > + * With CONFIG_CFI_CLANG, the compiler replaces function address > > + * references with the address of the function's CFI jump table > > + * entry. The function_nocfi macro always returns the address of the > > + * actual function instead. > > + */ > > +#define function_nocfi(x) ({ \ > > + void *addr; \ > > + asm("adrp %0, " __stringify(x) "\n\t" \ > > + "add %0, %0, :lo12:" __stringify(x) : "=r" (addr)); \ > > If it's not too painful, could we please move the asm constrain onto its > own line? That makes it slightly easier to read, and aligns with what > we've (mostly) done elsewhere in arm64. Sure, I'll change this in the next version. > Not a big deal either way, and the ack stands regardless. > > Thanks, > Mark. Sami