diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/loongarch')
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/pointer_guard.h | 82 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/loongarch/sysdep.h | 60 |
2 files changed, 82 insertions, 60 deletions
diff --git a/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h new file mode 100644 index 0000000000..4b2ed46167 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/pointer_guard.h @@ -0,0 +1,82 @@ +/* Pointer obfuscation implenentation. LoongArch version. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef POINTER_GUARD_H +#define POINTER_GUARD_H + +/* Load a got-relative EXPR into G, using T. + Note G and T are register names. */ +#define LD_GLOBAL(G, EXPR) \ + la.global G, EXPR; \ + REG_L G, G, 0; + +/* Load a pc-relative EXPR into G, using T. + Note G and T are register names. */ +#define LD_PCREL(G, EXPR) \ + la.pcrel G, EXPR; \ + REG_L G, G, 0; + +#if (IS_IN (rtld) \ + || (!defined SHARED && (IS_IN (libc) \ + || IS_IN (libpthread)))) + +#ifdef __ASSEMBLER__ +#define PTR_MANGLE(dst, src, guard) \ + LD_PCREL (guard, __pointer_chk_guard_local); \ + PTR_MANGLE2 (dst, src, guard); +#define PTR_DEMANGLE(dst, src, guard) \ + LD_PCREL (guard, __pointer_chk_guard_local); \ + PTR_DEMANGLE2 (dst, src, guard); +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +#define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard; +#define PTR_DEMANGLE2(dst, src, guard) \ + PTR_MANGLE2 (dst, src, guard); +#else +# include <stdint.h> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; +#define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) +#define PTR_DEMANGLE(var) PTR_MANGLE (var) +#endif + +#else + +#ifdef __ASSEMBLER__ +#define PTR_MANGLE(dst, src, guard) \ + LD_GLOBAL (guard, __pointer_chk_guard); \ + PTR_MANGLE2 (dst, src, guard); +#define PTR_DEMANGLE(dst, src, guard) \ + LD_GLOBAL (guard, __pointer_chk_guard); \ + PTR_DEMANGLE2 (dst, src, guard); +/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ +#define PTR_MANGLE2(dst, src, guard) \ + xor dst, src, guard; +#define PTR_DEMANGLE2(dst, src, guard) \ + PTR_MANGLE2 (dst, src, guard); +#else +# include <stdint.h> +extern uintptr_t __pointer_chk_guard attribute_relro; +#define PTR_MANGLE(var) \ + (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) +#define PTR_DEMANGLE(var) PTR_MANGLE (var) +#endif + +#endif + +#endif /* POINTER_GUARD_H */ diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h index f4a1d23a97..09f8243f25 100644 --- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h @@ -314,64 +314,4 @@ extern long int __syscall_error (long int neg_errno); #endif /* ! __ASSEMBLER__ */ -/* Pointer mangling is supported for LoongArch. */ - -/* Load a got-relative EXPR into G, using T. - Note G and T are register names. */ -#define LD_GLOBAL(G, EXPR) \ - la.global G, EXPR; \ - REG_L G, G, 0; - -/* Load a pc-relative EXPR into G, using T. - Note G and T are register names. */ -#define LD_PCREL(G, EXPR) \ - la.pcrel G, EXPR; \ - REG_L G, G, 0; - -#if (IS_IN (rtld) \ - || (!defined SHARED && (IS_IN (libc) \ - || IS_IN (libpthread)))) - -#ifdef __ASSEMBLER__ -#define PTR_MANGLE(dst, src, guard) \ - LD_PCREL (guard, __pointer_chk_guard_local); \ - PTR_MANGLE2 (dst, src, guard); -#define PTR_DEMANGLE(dst, src, guard) \ - LD_PCREL (guard, __pointer_chk_guard_local); \ - PTR_DEMANGLE2 (dst, src, guard); -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -#define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard; -#define PTR_DEMANGLE2(dst, src, guard) \ - PTR_MANGLE2 (dst, src, guard); -#else -extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; -#define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local) -#define PTR_DEMANGLE(var) PTR_MANGLE (var) -#endif - -#else - -#ifdef __ASSEMBLER__ -#define PTR_MANGLE(dst, src, guard) \ - LD_GLOBAL (guard, __pointer_chk_guard); \ - PTR_MANGLE2 (dst, src, guard); -#define PTR_DEMANGLE(dst, src, guard) \ - LD_GLOBAL (guard, __pointer_chk_guard); \ - PTR_DEMANGLE2 (dst, src, guard); -/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ -#define PTR_MANGLE2(dst, src, guard) \ - xor dst, src, guard; -#define PTR_DEMANGLE2(dst, src, guard) \ - PTR_MANGLE2 (dst, src, guard); -#else -extern uintptr_t __pointer_chk_guard attribute_relro; -#define PTR_MANGLE(var) \ - (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard) -#define PTR_DEMANGLE(var) PTR_MANGLE (var) -#endif - -#endif - #endif /* linux/loongarch/sysdep.h */ |