From 36f0c65401337edce7d1577ef45ee3dea520920e Mon Sep 17 00:00:00 2001 From: renzehua Date: Fri, 5 May 2023 21:50:59 +0800 Subject: [PATCH] PAC-FWD-CFI DATA:5.5 Signed-off-by: renzehua --- pac/arm64/include/asm_pointer_init.h | 16 +++++++++++++ pac/arm64/include/pauth.h | 36 ++++++++++++++++++++++++++++ pac/arm64/src/asm_pointer_init.S | 32 +++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 pac/arm64/include/asm_pointer_init.h create mode 100644 pac/arm64/include/pauth.h create mode 100644 pac/arm64/src/asm_pointer_init.S diff --git a/pac/arm64/include/asm_pointer_init.h b/pac/arm64/include/asm_pointer_init.h new file mode 100644 index 0000000..ca4f770 --- /dev/null +++ b/pac/arm64/include/asm_pointer_init.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * + * Copyright (c) 2023 Huawei Device Co., Ltd. + * + * Global Pointers initialization. + * + */ + +#ifndef __ASM_POINTER_INIT_H +#define __ASM_POINTER_INIT_H + +#ifdef CONFIG_ARM64_PTR_AUTH_FWD_CFI + void ptrauth_init_globals(void); +#endif +#endif diff --git a/pac/arm64/include/pauth.h b/pac/arm64/include/pauth.h new file mode 100644 index 0000000..dbf667d --- /dev/null +++ b/pac/arm64/include/pauth.h @@ -0,0 +1,36 @@ +#ifndef __ASM_PAUTH_H +#define __ASM_PAUTH_H + +#ifdef CONFIG_ARM64_PTR_AUTH_EXT +#define pauth_common(prefix, type, key, addr, mod) \ +({ \ + const void *__addr = (addr); \ + unsigned long __mod = (unsigned long)(mod); \ +\ + if (__builtin_constant_p(mod) && (__mod == 0)) \ + asm(#prefix #type "z" #key " %0\n" : "+r" (__addr)); \ + else \ + asm(#prefix #type #key " %0, %1\n" : "+r" (__addr) : \ + "r" (__mod)); \ + (typeof (addr))(__addr); \ +}) + +#define pauth_sign_ptr_parameter(fun, mod, key) \ +({ / + const void * __fun = fun; \ + unsigned long __mod = (unsigned long)mod; \ + asm("paci" #key " %0, %1\n" : "+r" (__fun) : \ + "r" (__mod)); \ + (void *)__fun; \ +}) + +#define pauth_autia(addr, mod) pauth_common(aut, i, a, addr, mod) +#define pauth_autib(addr, mod) pauth_common(aut, i, b, addr, mod) + +#define pauth_pacia(addr, mod) pauth_common(pac, i, a, addr, mod) +#define pauth_pacib(addr, mod) pauth_common(pac, i, b, addr, mod) + + + +#endif //CONFIG_ARM64_PTR_AUTH_EXT +#endif diff --git a/pac/arm64/src/asm_pointer_init.S b/pac/arm64/src/asm_pointer_init.S new file mode 100644 index 0000000..fb08603 --- /dev/null +++ b/pac/arm64/src/asm_pointer_init.S @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * + * Copyright (c) 2023 Huawei Device Co., Ltd. + * + * Global Pointers initialization. + * + */ + + #include + #include + #include + + .pushsection ".init.text", "ax" + + SYM_CODE_START(ptrauth_init_globals) + mov x21, x30 + adrp x19, __ctors_end + adrp x20, __ctors_start + add x19, x19, #:lo12:__ctors_end + add x20, x20, #:lo12:__ctors_start + cmp x20, x19 + b.cs 4f +3: + ldr x8, [x20], #8 + blr x8 + cmp x20, x19 + b.cc 3b +4: + mov x30, x21 + ret + SYM_CODE_END(ptrauth_init_globals) \ No newline at end of file -- Gitee