diff --git a/pac/arm64/include/asm_pointer_init.h b/pac/arm64/include/asm_pointer_init.h new file mode 100644 index 0000000000000000000000000000000000000000..ca4f7706c927ce50d650450f6db75a7f7ca04da0 --- /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 0000000000000000000000000000000000000000..47573cf6a31b86601ade46d3294d32aaaeb7fb6e --- /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 0000000000000000000000000000000000000000..fb08603fdae1542895f9a3e93a7a645818b90bae --- /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