From 9fb27c8d52335f547f04ecd9fa91bbd7ff5109f2 Mon Sep 17 00:00:00 2001 From: Hui Li Date: Tue, 12 Jul 2022 21:01:59 +0800 Subject: [PATCH 1/2] strace: Add basic support for 64-bit LoongArch architecture update to strace-5.13-5.el8.src.rpm Signed-off-by: Hui Li --- ...rt-for-64-bit-LoongArch-architecture.patch | 505 ++++++++++++++++++ strace.spec | 10 +- 2 files changed, 514 insertions(+), 1 deletion(-) create mode 100644 3000-Add-basic-support-for-64-bit-LoongArch-architecture.patch diff --git a/3000-Add-basic-support-for-64-bit-LoongArch-architecture.patch b/3000-Add-basic-support-for-64-bit-LoongArch-architecture.patch new file mode 100644 index 0000000..7809d3c --- /dev/null +++ b/3000-Add-basic-support-for-64-bit-LoongArch-architecture.patch @@ -0,0 +1,505 @@ +From c1c8cb6a3c644d7d9f680425742030f060b872d5 Mon Sep 17 00:00:00 2001 +From: Hui Li +Date: Tue, 12 Jul 2022 11:05:51 +0800 +Subject: [PATCH] Add basic support for 64-bit LoongArch architecture + +Signed-off-by: Hui Li +--- + NEWS | 1 + + build-aux/config.guess | 3 ++ + build-aux/config.sub | 1 + + configure | 7 ++++ + configure.ac | 5 +++ + src/Makefile.am | 13 +++++++ + src/linux/loongarch64/arch_defs_.h | 1 + + src/linux/loongarch64/arch_prstatus_regset.c | 37 ++++++++++++++++++++ + src/linux/loongarch64/arch_prstatus_regset.h | 15 ++++++++ + src/linux/loongarch64/arch_regs.c | 21 +++++++++++ + src/linux/loongarch64/get_error.c | 19 ++++++++++ + src/linux/loongarch64/get_scno.c | 14 ++++++++ + src/linux/loongarch64/get_syscall_args.c | 19 ++++++++++ + src/linux/loongarch64/ioctls_arch0.h | 1 + + src/linux/loongarch64/ioctls_inc0.h | 1 + + src/linux/loongarch64/raw_syscall.h | 29 +++++++++++++++ + src/linux/loongarch64/rt_sigframe.h | 13 +++++++ + src/linux/loongarch64/set_error.c | 20 +++++++++++ + src/linux/loongarch64/set_scno.c | 15 ++++++++ + src/linux/loongarch64/syscallent.h | 8 +++++ + src/xlat/audit_arch.in | 1 + + src/xlat/elf_em.in | 1 + + tests/ptrace.c | 21 +++++++++++ + 23 files changed, 266 insertions(+) + create mode 100644 src/linux/loongarch64/arch_defs_.h + create mode 100644 src/linux/loongarch64/arch_prstatus_regset.c + create mode 100644 src/linux/loongarch64/arch_prstatus_regset.h + create mode 100644 src/linux/loongarch64/arch_regs.c + create mode 100644 src/linux/loongarch64/get_error.c + create mode 100644 src/linux/loongarch64/get_scno.c + create mode 100644 src/linux/loongarch64/get_syscall_args.c + create mode 100644 src/linux/loongarch64/ioctls_arch0.h + create mode 100644 src/linux/loongarch64/ioctls_inc0.h + create mode 100644 src/linux/loongarch64/raw_syscall.h + create mode 100644 src/linux/loongarch64/rt_sigframe.h + create mode 100644 src/linux/loongarch64/set_error.c + create mode 100644 src/linux/loongarch64/set_scno.c + create mode 100644 src/linux/loongarch64/syscallent.h + +diff --git a/NEWS b/NEWS +index f4b5948..e9ded3e 100644 +--- a/NEWS ++++ b/NEWS +@@ -17,6 +17,7 @@ Noteworthy changes in release 5.13 (2021-07-18) + * Updated lists of BPF_*, IORING_*, KEXEC_*, KEY_*, KVM_*, NT_*, PR_*, + PTRACE_*, RTM_*, RTPROT_*, TRAP_*, UFFD_*, UFFDIO_*, and V4L2_* constants. + * Updated lists of ioctl commands from Linux 5.13. ++ * Added 64-bit LoongArch architecture support. + + * Bug fixes + * Fixed insufficient buffer size used for network interface name printing, +diff --git a/build-aux/config.guess b/build-aux/config.guess +index 699b3a1..cb178e7 100755 +--- a/build-aux/config.guess ++++ b/build-aux/config.guess +@@ -996,6 +996,9 @@ EOF + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; ++ loongarch32:Linux:*:* | loongarch64:Linux:*:*) ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" ++ exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; +diff --git a/build-aux/config.sub b/build-aux/config.sub +index f1674ec..2fd59bd 100755 +--- a/build-aux/config.sub ++++ b/build-aux/config.sub +@@ -1216,6 +1216,7 @@ case $cpu-$vendor in + | moxie \ + | mt \ + | msp430 \ ++ | loongarch32 | loongarch64 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ +diff --git a/configure b/configure +index 0103536..491261d 100755 +--- a/configure ++++ b/configure +@@ -6045,6 +6045,13 @@ ia64) + + $as_echo "#define IA64 1" >>confdefs.h + ++ ;; ++loongarch64) ++ arch=loongarch64 ++ karch=loongarch ++ ++$as_echo "#define LOONGARCH64 1" >>confdefs.h ++ + ;; + m68k) + arch=m68k +diff --git a/configure.ac b/configure.ac +index 1f195b1..711fffe 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -110,6 +110,11 @@ ia64) + arch=ia64 + AC_DEFINE([IA64], 1, [Define for the IA64 architecture.]) + ;; ++loongarch64) ++ arch=loongarch64 ++ karch=loongarch ++ AC_DEFINE([LOONGARCH64], 1, [Define for the 64-bit LoongArch architecture.]) ++ ;; + m68k) + arch=m68k + AC_DEFINE([M68K], 1, [Define for the m68k architecture.]) +diff --git a/src/Makefile.am b/src/Makefile.am +index 1926b9c..3319363 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -633,6 +633,19 @@ EXTRA_DIST = \ + linux/ia64/syscallent.h \ + linux/ia64/syscallent_base_nr.h \ + linux/ia64/userent.h \ ++ linux/loongarch64/arch_defs_.h \ ++ linux/loongarch64/arch_prstatus_regset.c \ ++ linux/loongarch64/arch_prstatus_regset.h \ ++ linux/loongarch64/arch_regs.c \ ++ linux/loongarch64/get_error.c \ ++ linux/loongarch64/get_scno.c \ ++ linux/loongarch64/get_syscall_args.c \ ++ linux/loongarch64/ioctls_arch0.h \ ++ linux/loongarch64/raw_syscall.h \ ++ linux/loongarch64/rt_sigframe.h \ ++ linux/loongarch64/set_error.c \ ++ linux/loongarch64/set_scno.c \ ++ linux/loongarch64/syscallent.h \ + linux/m68k/arch_defs_.h \ + linux/m68k/arch_regs.c \ + linux/m68k/arch_rt_sigframe.c \ +diff --git a/src/linux/loongarch64/arch_defs_.h b/src/linux/loongarch64/arch_defs_.h +new file mode 100644 +index 0000000..1134991 +--- /dev/null ++++ b/src/linux/loongarch64/arch_defs_.h +@@ -0,0 +1 @@ ++#define PERSONALITY0_AUDIT_ARCH { AUDIT_ARCH_LOONGARCH64, 0 } +diff --git a/src/linux/loongarch64/arch_prstatus_regset.c b/src/linux/loongarch64/arch_prstatus_regset.c +new file mode 100644 +index 0000000..398c32d +--- /dev/null ++++ b/src/linux/loongarch64/arch_prstatus_regset.c +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++static void ++arch_decode_prstatus_regset(struct tcb *const tcp, ++ const kernel_ulong_t addr, ++ const kernel_ulong_t size) ++{ ++ struct_prstatus_regset regs; ++ const size_t fetch_size = MIN(sizeof(regs), size); ++ ++ if (!size || size & 7) { ++ printaddr(addr); ++ } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) { ++ tprint_struct_begin(); ++ PRINT_FIELD_ARRAY_UPTO(regs, regs, ++ fetch_size / 8, tcp, ++ print_xint64_array_member); ++ if (fetch_size > offsetof(struct_prstatus_regset, csr_era)) { ++ tprint_struct_next(); ++ PRINT_FIELD_X(regs, csr_era); ++ } ++ if (fetch_size > offsetof(struct_prstatus_regset, csr_badv)) { ++ tprint_struct_next(); ++ PRINT_FIELD_X(regs, csr_badv); ++ } ++ if (size > sizeof(regs)) { ++ tprint_struct_next(); ++ tprint_more_data_follows(); ++ } ++ tprint_struct_end(); ++ } ++} +diff --git a/src/linux/loongarch64/arch_prstatus_regset.h b/src/linux/loongarch64/arch_prstatus_regset.h +new file mode 100644 +index 0000000..1bba4f8 +--- /dev/null ++++ b/src/linux/loongarch64/arch_prstatus_regset.h +@@ -0,0 +1,15 @@ ++/* ++ * Copyright (c) 2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#ifndef STRACE_ARCH_PRSTATUS_REGSET_H ++# define STRACE_ARCH_PRSTATUS_REGSET_H ++ ++typedef struct user_pt_regs struct_prstatus_regset; ++ ++# define HAVE_ARCH_PRSTATUS_REGSET 1 ++ ++#endif /* !STRACE_ARCH_PRSTATUS_REGSET_H */ +diff --git a/src/linux/loongarch64/arch_regs.c b/src/linux/loongarch64/arch_regs.c +new file mode 100644 +index 0000000..6482d31 +--- /dev/null ++++ b/src/linux/loongarch64/arch_regs.c +@@ -0,0 +1,21 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++static struct user_pt_regs loongarch_regs; ++ ++#define loongarch_regs_sp loongarch_regs.regs[3] ++#define loongarch_regs_a0 loongarch_regs.regs[4] ++#define loongarch_regs_a1 loongarch_regs.regs[5] ++#define loongarch_regs_a2 loongarch_regs.regs[6] ++#define loongarch_regs_a3 loongarch_regs.regs[7] ++#define loongarch_regs_a4 loongarch_regs.regs[8] ++#define loongarch_regs_a5 loongarch_regs.regs[9] ++#define loongarch_regs_a6 loongarch_regs.regs[10] ++#define loongarch_regs_a7 loongarch_regs.regs[11] ++ ++#define ARCH_REGS_FOR_GETREGSET loongarch_regs ++#define ARCH_PC_REG loongarch_regs.csr_era ++#define ARCH_SP_REG loongarch_regs_sp +diff --git a/src/linux/loongarch64/get_error.c b/src/linux/loongarch64/get_error.c +new file mode 100644 +index 0000000..d79cacb +--- /dev/null ++++ b/src/linux/loongarch64/get_error.c +@@ -0,0 +1,19 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#include "negated_errno.h" ++ ++static void ++arch_get_error(struct tcb *tcp, const bool check_errno) ++{ ++ if (check_errno && is_negated_errno(loongarch_regs_a0)) { ++ tcp->u_rval = -1; ++ tcp->u_error = -loongarch_regs_a0; ++ } else { ++ tcp->u_rval = loongarch_regs_a0; ++ } ++} +diff --git a/src/linux/loongarch64/get_scno.c b/src/linux/loongarch64/get_scno.c +new file mode 100644 +index 0000000..b16a1d4 +--- /dev/null ++++ b/src/linux/loongarch64/get_scno.c +@@ -0,0 +1,14 @@ ++/* ++ * Copyright (c) 2015-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++/* Return codes: 1 - ok, 0 - ignore, other - error. */ ++static int ++arch_get_scno(struct tcb *tcp) ++{ ++ tcp->scno = loongarch_regs_a7; ++ return 1; ++} +diff --git a/src/linux/loongarch64/get_syscall_args.c b/src/linux/loongarch64/get_syscall_args.c +new file mode 100644 +index 0000000..889dca7 +--- /dev/null ++++ b/src/linux/loongarch64/get_syscall_args.c +@@ -0,0 +1,19 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++/* Return -1 on error or 1 on success (never 0!). */ ++static int ++arch_get_syscall_args(struct tcb *tcp) ++{ ++ tcp->u_arg[0] = loongarch_regs_a0; ++ tcp->u_arg[1] = loongarch_regs_a1; ++ tcp->u_arg[2] = loongarch_regs_a2; ++ tcp->u_arg[3] = loongarch_regs_a3; ++ tcp->u_arg[4] = loongarch_regs_a4; ++ tcp->u_arg[5] = loongarch_regs_a5; ++ return 1; ++} +diff --git a/src/linux/loongarch64/ioctls_arch0.h b/src/linux/loongarch64/ioctls_arch0.h +new file mode 100644 +index 0000000..59d8aaa +--- /dev/null ++++ b/src/linux/loongarch64/ioctls_arch0.h +@@ -0,0 +1 @@ ++/* Generated by ioctls_gen.sh from definitions found in $linux/arch/loongarch/include/ tree. */ +diff --git a/src/linux/loongarch64/ioctls_inc0.h b/src/linux/loongarch64/ioctls_inc0.h +new file mode 100644 +index 0000000..6028afb +--- /dev/null ++++ b/src/linux/loongarch64/ioctls_inc0.h +@@ -0,0 +1 @@ ++#include "../64/ioctls_inc.h" +diff --git a/src/linux/loongarch64/raw_syscall.h b/src/linux/loongarch64/raw_syscall.h +new file mode 100644 +index 0000000..58ad9b6 +--- /dev/null ++++ b/src/linux/loongarch64/raw_syscall.h +@@ -0,0 +1,29 @@ ++/* ++ * Raw syscalls. ++ * ++ * Copyright (c) 2018-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#ifndef STRACE_RAW_SYSCALL_H ++# define STRACE_RAW_SYSCALL_H ++ ++# include "kernel_types.h" ++ ++static inline kernel_ulong_t ++raw_syscall_0(const kernel_ulong_t nr, kernel_ulong_t *err) ++{ ++ *err = 0; ++ register kernel_ulong_t a7 __asm__("a7") = nr; ++ register kernel_ulong_t a0 __asm__("a0"); ++ __asm__ __volatile__("syscall 0" ++ : "=r"(a0) ++ : "r"(a7) ++ : "memory"); ++ return a0; ++} ++# define raw_syscall_0 raw_syscall_0 ++ ++#endif /* !STRACE_RAW_SYSCALL_H */ +diff --git a/src/linux/loongarch64/rt_sigframe.h b/src/linux/loongarch64/rt_sigframe.h +new file mode 100644 +index 0000000..ed10469 +--- /dev/null ++++ b/src/linux/loongarch64/rt_sigframe.h +@@ -0,0 +1,13 @@ ++/* ++ * Copyright (c) 2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#ifndef STRACE_RT_SIGFRAME_H ++# define STRACE_RT_SIGFRAME_H ++ ++# define OFFSETOF_SIGMASK_IN_RT_SIGFRAME 5664 ++ ++#endif /* !STRACE_RT_SIGFRAME_H */ +diff --git a/src/linux/loongarch64/set_error.c b/src/linux/loongarch64/set_error.c +new file mode 100644 +index 0000000..8686a24 +--- /dev/null ++++ b/src/linux/loongarch64/set_error.c +@@ -0,0 +1,20 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++static int ++arch_set_error(struct tcb *tcp) ++{ ++ loongarch_regs_a0 = -tcp->u_error; ++ return set_regs(tcp->pid); ++} ++ ++static int ++arch_set_success(struct tcb *tcp) ++{ ++ loongarch_regs_a0 = tcp->u_rval; ++ return set_regs(tcp->pid); ++} +diff --git a/src/linux/loongarch64/set_scno.c b/src/linux/loongarch64/set_scno.c +new file mode 100644 +index 0000000..2bd861b +--- /dev/null ++++ b/src/linux/loongarch64/set_scno.c +@@ -0,0 +1,15 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++static int ++arch_set_scno(struct tcb *tcp, kernel_ulong_t scno) ++{ ++ if (ptrace_syscall_info_is_valid() && get_regs(tcp) < 0) ++ return -1; ++ loongarch_regs_a7 = scno; ++ return set_regs(tcp->pid); ++} +diff --git a/src/linux/loongarch64/syscallent.h b/src/linux/loongarch64/syscallent.h +new file mode 100644 +index 0000000..644f780 +--- /dev/null ++++ b/src/linux/loongarch64/syscallent.h +@@ -0,0 +1,8 @@ ++/* ++ * Copyright (c) 2016-2021 The strace developers. ++ * All rights reserved. ++ * ++ * SPDX-License-Identifier: LGPL-2.1-or-later ++ */ ++ ++#include "../64/syscallent.h" +diff --git a/src/xlat/audit_arch.in b/src/xlat/audit_arch.in +index 63d3fe5..fc56b52 100644 +--- a/src/xlat/audit_arch.in ++++ b/src/xlat/audit_arch.in +@@ -25,6 +25,7 @@ AUDIT_ARCH_H8300 (EM_H8_300) /* Removed in v3.13-rc1~130^2~2 */ + AUDIT_ARCH_HEXAGON (EM_HEXAGON) + AUDIT_ARCH_I386 (EM_386|__AUDIT_ARCH_LE) + AUDIT_ARCH_IA64 (EM_IA_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) ++AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) + AUDIT_ARCH_M32R (EM_M32R) + AUDIT_ARCH_M68K (EM_68K) + AUDIT_ARCH_MICROBLAZE (EM_MICROBLAZE) +diff --git a/src/xlat/elf_em.in b/src/xlat/elf_em.in +index 9ffbcd6..18f4c9a 100644 +--- a/src/xlat/elf_em.in ++++ b/src/xlat/elf_em.in +@@ -190,6 +190,7 @@ EM_AMDGPU 224 /* AMD GPU architecture */ + EM_RISCV 243 /* RISC-V */ + EM_BPF 247 /* Linux BPF - in-kernel virtual machine */ + EM_CSKY 252 /* C-SKY */ ++EM_LOONGARCH 258 /* LoongArch */ + EM_AVR32 0x18ad /* Atmel AVR32, removed in v4.12-rc1~159^2~5 */ + EM_FRV 0x5441 /* Fujitsu FR-V */ + EM_OR32 0x8472 /* arch/openrisc/include/uapi/asm/elf.h */ +diff --git a/tests/ptrace.c b/tests/ptrace.c +index 8c98219..9ab6c3d 100644 +--- a/tests/ptrace.c ++++ b/tests/ptrace.c +@@ -233,6 +233,8 @@ typedef struct { + unsigned long cp0_cause; + } mips_regs; + # define TRACEE_REGS_STRUCT mips_regs ++#elif defined __loongarch__ ++# define TRACEE_REGS_STRUCT struct user_pt_regs + #endif + + static void +@@ -826,6 +828,25 @@ print_prstatus_regset(const void *const rs, const size_t size) + PRINT_FIELD_X(*regs, cp0_cause); + } + ++# elif defined __loongarch__ ++ ++ fputs("regs=[", stdout); ++ for (unsigned int i = 0; i < ARRAY_SIZE(regs->regs); ++i) { ++ if (size > i * sizeof(regs->regs[i])) { ++ if (i) ++ fputs(", ", stdout); ++ PRINT_VAL_X(regs->regs[i]); ++ } ++ } ++ fputs("]", stdout); ++ if (size >= offsetofend(TRACEE_REGS_STRUCT, csr_era)) { ++ fputs(", ", stdout); ++ PRINT_FIELD_X(*regs, csr_era); ++ } ++ if (size >= offsetofend(TRACEE_REGS_STRUCT, csr_badv)) { ++ fputs(", ", stdout); ++ PRINT_FIELD_X(*regs, csr_badv); ++ } + # endif /* + __aarch64__ || + __arm64__ || +-- +2.20.1 + diff --git a/strace.spec b/strace.spec index c93e46b..a2f5ba7 100644 --- a/strace.spec +++ b/strace.spec @@ -1,7 +1,7 @@ Summary: Tracks and displays system calls associated with a running process Name: strace Version: 5.13 -Release: 4%{?dist} +Release: 5%{?dist} # The test suite is GPLv2+, all the rest is LGPLv2.1+. License: LGPL-2.1+ and GPL-2.0+ Group: Development/Debuggers @@ -279,6 +279,9 @@ Patch2003: 2003-undef-ARRAY_SIZE.patch ## glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f have been backported in RHEL. Patch2004: 2004-glibc-msgctl-semctl-shmctl-backport-workaround.patch +## Only for 64-bit LoongArch architecture +Patch3000: 3000-Add-basic-support-for-64-bit-LoongArch-architecture.patch + # We no longer need to build a separate strace32 binary, but we don't want # to break existing strace32 users' workflows. @@ -424,6 +427,8 @@ received by a process. %patch2003 -p1 %patch2004 -p1 +%patch3000 -p1 + chmod a+x tests/*.test echo -n %version-%release > .tarball-version @@ -500,6 +505,9 @@ echo 'END OF TEST SUITE INFORMATION' %{_mandir}/man1/* %changelog +* Tue Jul 12 2022 lihui - 5.13-5 +- Add basic support for 64-bit LoongArch architecture. + * Mon Feb 07 2022 Eugene Syromiatnikov - 5.13-4 - Update tests-m32 and tests-mx32 with --secontext=mismatch option support changes (#2046259). -- Gitee From a67573e458907e9b2ebe30bfc918dae4455f0b4a Mon Sep 17 00:00:00 2001 From: lihui Date: Wed, 20 Jul 2022 02:25:03 +0000 Subject: [PATCH 2/2] update strace.spec. --- strace.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strace.spec b/strace.spec index 45a1924..85e9e46 100644 --- a/strace.spec +++ b/strace.spec @@ -516,7 +516,7 @@ echo 'END OF TEST SUITE INFORMATION' %doc CREDITS ChangeLog.gz ChangeLog-CVS.gz COPYING LGPL-2.1-or-later NEWS README %changelog -* Tue Jul 20 2022 lihui - 5.13-4.0.2 +* Wed Jul 20 2022 lihui - 5.13-4.0.2 - Add basic support for 64-bit LoongArch architecture. * Mon Jul 18 2022 Hangbo Fan - 5.13-4.0.1 -- Gitee