diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
commit | d20db0561a6a36f914fde030512503b114ef9a0c (patch) | |
tree | d4e5e3494d95c269a1cee6195f11bf3201bcadbf /LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch | |
parent | 016343d99b1b269d7246ef1e143d4b54914433d4 (diff) |
automatic import of glibcopeneuler22.03_LTS_SP4openeuler22.03_LTS_SP3openeuler20.03
Diffstat (limited to 'LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch')
-rw-r--r-- | LoongArch-Fix-ptr-mangling-demangling-and-SHMLBA.patch | 158 |
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 + |