summaryrefslogtreecommitdiff
path: root/LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
commitd20db0561a6a36f914fde030512503b114ef9a0c (patch)
treed4e5e3494d95c269a1cee6195f11bf3201bcadbf /LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
parent016343d99b1b269d7246ef1e143d4b54914433d4 (diff)
Diffstat (limited to 'LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch')
-rw-r--r--LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch b/LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
new file mode 100644
index 0000000..cc9b99a
--- /dev/null
+++ b/LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
@@ -0,0 +1,158 @@
+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
+