Skip to content

Commit 4ecfca8

Browse files
samitolvanenkees
authored andcommitted
arm64: implement function_nocfi
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@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20210408182843.1754385-13-samitolvanen@google.com
1 parent 167d0da commit 4ecfca8

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

arch/arm64/include/asm/memory.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,22 @@ static inline void *phys_to_virt(phys_addr_t x)
321321
#define virt_to_pfn(x) __phys_to_pfn(__virt_to_phys((unsigned long)(x)))
322322
#define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x))
323323

324+
#ifdef CONFIG_CFI_CLANG
325+
/*
326+
* With CONFIG_CFI_CLANG, the compiler replaces function address
327+
* references with the address of the function's CFI jump table
328+
* entry. The function_nocfi macro always returns the address of the
329+
* actual function instead.
330+
*/
331+
#define function_nocfi(x) ({ \
332+
void *addr; \
333+
asm("adrp %0, " __stringify(x) "\n\t" \
334+
"add %0, %0, :lo12:" __stringify(x) \
335+
: "=r" (addr)); \
336+
addr; \
337+
})
338+
#endif
339+
324340
/*
325341
* virt_to_page(x) convert a _valid_ virtual address to struct page *
326342
* virt_addr_valid(x) indicates whether a virtual address is valid

0 commit comments

Comments
 (0)