glibc/LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
Xing Li 3d89829d16 Fixup LoongArch Port errors after the fstatat64 backport
(cherry picked from commit a11d8db8e5f44a5dd6b482483ae6dc2cdf4397fb)
2023-11-22 09:05:47 +08:00

159 lines
5.1 KiB
Diff

From 6698be0ce3a7877d68468c56a9217c4d87f74e23 Mon Sep 17 00:00:00 2001
From: XingLi <lixing@loongson.cn>
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 <sys/asm.h>
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
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_SHM_H
+# error "Never use <bits/shmlba.h> directly; include <sys/shm.h> 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