159 lines
5.1 KiB
Diff
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
|
|
|