From 6698be0ce3a7877d68468c56a9217c4d87f74e23 Mon Sep 17 00:00:00 2001 From: XingLi Date: Fri, 10 Nov 2023 15:00:28 +0800 Subject: [PATCH 1/3] LoongArch Fix ptr mangling demangling and SHMLBA --- sysdeps/loongarch/__longjmp.S | 7 +++ sysdeps/loongarch/setjmp.S | 7 +++ .../unix/sysv/linux/loongarch/bits/shmlba.h | 24 +++++++ sysdeps/unix/sysv/linux/loongarch/sysdep.h | 62 ++++++++++++++++++- 4 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/shmlba.h diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S index 5cc1bc78..fa86f797 100644 --- a/sysdeps/loongarch/__longjmp.S +++ b/sysdeps/loongarch/__longjmp.S @@ -20,8 +20,15 @@ #include ENTRY (__longjmp) +#ifdef PTR_MANGLE + REG_L t0, a0, 0*SZREG + PTR_DEMANGLE (ra, t0, t1) + REG_L t0, a0, 1*SZREG + PTR_DEMANGLE2 (sp, t0, t1) +#else REG_L ra, a0, 0*SZREG REG_L sp, a0, 1*SZREG +#endif REG_L x, a0, 2*SZREG REG_L fp, a0, 3*SZREG REG_L s0, a0, 4*SZREG diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S index 00ea14b2..6201d0e6 100644 --- a/sysdeps/loongarch/setjmp.S +++ b/sysdeps/loongarch/setjmp.S @@ -29,8 +29,15 @@ ENTRY (setjmp) END (setjmp) ENTRY (__sigsetjmp) +#ifdef PTR_MANGLE + PTR_MANGLE (t0, ra, t1) + REG_S t0, a0, 0*SZREG + PTR_MANGLE2 (t0, sp, t1) + REG_S t0, a0, 1*SZREG +#else REG_S ra, a0, 0*SZREG REG_S sp, a0, 1*SZREG +#endif REG_S x, a0, 2*SZREG REG_S fp, a0, 3*SZREG REG_S s0, a0, 4*SZREG diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/shmlba.h b/sysdeps/unix/sysv/linux/loongarch/bits/shmlba.h new file mode 100644 index 00000000..28ff9d5c --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/bits/shmlba.h @@ -0,0 +1,24 @@ +/* Define SHMLBA. LoongArch version. + Copyright (C) 2018-2023 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 + . */ + +#ifndef _SYS_SHM_H +# error "Never use directly; include instead." +#endif + +/* Segment low boundary address multiple. */ +#define SHMLBA 0x10000 diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h index b2587091..3f2d691b 100644 --- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h @@ -313,8 +313,64 @@ extern long int __syscall_error (long int neg_errno); #endif /* ! __ASSEMBLER__ */ -/* Pointer mangling is not supported. */ -#define PTR_MANGLE(var) (void) (var) -#define PTR_DEMANGLE(var) (void) (var) +/* 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 */ -- 2.33.0