Async SHMLBA value with kernel

(cherry picked from commit f957e6025c012709b2f98fe9fac290c7f40e92cc)
This commit is contained in:
Xing Li 2023-05-20 10:29:50 +08:00 committed by liqingqing_1229
parent bf65691800
commit f2871bed32
3 changed files with 158 additions and 8 deletions

View File

@ -0,0 +1,142 @@
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 */

View File

@ -66,7 +66,7 @@
##############################################################################
Name: glibc
Version: 2.34
Release: 119
Release: 120
Summary: The GNU libc libraries
License: %{all_license}
URL: http://www.gnu.org/software/glibc/
@ -294,14 +294,15 @@ Patch9028: 4_6-LoongArch-Optimize-string-functions-strcmp-strncmp.patch
Patch9029: 5_6-LoongArch-Optimize-string-function-strcpy.patch
Patch9030: 6_6-LoongArch-Optimize-string-functions-strlen-strnlen.patch
Patch9031: math-Fix-asin-and-acos-invalid-exception-with-old-gc.patch
Patch9032: LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch
%endif
Patch9032: add-pthread_cond_clockwait-GLIBC_2_28.patch
Patch9033: 0001-ld.so-support-ld.so-mmap-hugetlb-hugepage-according-.patch
Patch9034: 0002-elf-ld.so-keep-compatible-with-the-original-policy-o.patch
Patch9035: 0003-elf-ld.so-remove-_mmap_hole-when-ld.so-mmap-PT_LOAD-.patch
Patch9036: elf-ld.so-add-MAP_NORESERVE-flag-for-the-first-mmap-2MB-contig.patch
Patch9037: elf-ld.so-prohibit-multiple-i-options-and-do-not-allow-i-speci.patch
Patch9038: elf-ld.so-Consider-maybe-existing-hole-between-PT_LO.patch
Patch9033: add-pthread_cond_clockwait-GLIBC_2_28.patch
Patch9034: 0001-ld.so-support-ld.so-mmap-hugetlb-hugepage-according-.patch
Patch9035: 0002-elf-ld.so-keep-compatible-with-the-original-policy-o.patch
Patch9036: 0003-elf-ld.so-remove-_mmap_hole-when-ld.so-mmap-PT_LOAD-.patch
Patch9037: elf-ld.so-add-MAP_NORESERVE-flag-for-the-first-mmap-2MB-contig.patch
Patch9038: elf-ld.so-prohibit-multiple-i-options-and-do-not-allow-i-speci.patch
Patch9039: elf-ld.so-Consider-maybe-existing-hole-between-PT_LO.patch
Provides: ldconfig rtld(GNU_HASH) bundled(gnulib)
@ -1467,6 +1468,11 @@ fi
%endif
%changelog
* Fri May 19 2023 Peng Fan <fanpeng@loongson.cn> - 2.34-120
- Backport LoongArch patches:
- Fix ptr mangling/demangling features.
- Keep SHMLBA the same value with kernel.
* Mon May 08 2023 laokz <zhangkai@iscas.ac.cn> - 2.34-119
- Backport RISC-V patches:
- Align stack in clone (from v2.35)

View File

@ -133,3 +133,5 @@ elf/tst-ifunc-fault-bindnow:loongarch64
elf/tst-ifunc-fault-lazy:loongarch64
locale/tst-localedef-path-norm:loongarch64
misc/tst-glibcsyscalls:loongarch64
# Failed for environment, remove it later.
resolv/tst-resolv-res_init-multi:loongarch64