Resolve loongarch64 patch add error and add support for loongarch64

This commit is contained in:
doupengda 2024-04-16 09:57:29 +08:00
parent 66daec136b
commit d32856d64d
2 changed files with 371 additions and 350 deletions

View File

@ -1,125 +1,175 @@
From b9e0a25e29a897161360a44b1c206368f7d99310 Mon Sep 17 00:00:00 2001 From 0630f9aac4a41f14d1f30862ae41dd28aeb61d0e Mon Sep 17 00:00:00 2001
From: Ming Wang <wangming01@loongson.cn> From: doupengda <doupengda@loongson.cn>
Date: Mon, 10 Jul 2023 14:04:37 +0800 Date: Tue, 16 Apr 2024 01:44:30 +0000
Subject: [PATCH] crash: add loongarch support. Subject: [PATCH] crash 8.0.4 add support for loongarch64
Signed-off-by: Ming Wang <wangming01@loongson.cn>
--- ---
Makefile | 9 +- .rh_rpm_package | 1 -
README | 4 +- Makefile | 26 +-
configure.c | 27 +- README | 2 +-
configure.c | 28 +-
crash.8 | 2 +- crash.8 | 2 +-
defs.h | 160 +- defs.h | 162 +-
diskdump.c | 26 +- diskdump.c | 22 +-
gdb-10.2-loongarch.patch | 15207 +++++++++++++++++++++++++++++++++++++ gdb-10.2-loongarch.patch | 15207 +++++++++++++++++++++++++++++++++++++
gdb_interface.c | 1 - help.c | 2 +-
help.c | 9 +- lkcd_vmdump_v1.h | 2 +-
lkcd_vmdump_v1.h | 2 +
lkcd_vmdump_v2_v3.h | 4 +- lkcd_vmdump_v2_v3.h | 4 +-
loongarch64.c | 1347 ++++ loongarch64.c | 1347 ++++
main.c | 3 +- main.c | 3 +-
netdump.c | 28 +- netdump.c | 26 +-
ramdump.c | 2 + ramdump.c | 2 +
symbols.c | 26 +- symbols.c | 23 +-
16 files changed, 16836 insertions(+), 21 deletions(-) 16 files changed, 16831 insertions(+), 28 deletions(-)
delete mode 100644 .rh_rpm_package
create mode 100644 gdb-10.2-loongarch.patch create mode 100644 gdb-10.2-loongarch.patch
create mode 100644 loongarch64.c create mode 100644 loongarch64.c
diff --git a/.rh_rpm_package b/.rh_rpm_package
deleted file mode 100644
index 50c496d..0000000
--- a/.rh_rpm_package
+++ /dev/null
@@ -1 +0,0 @@
-8.0.4
diff --git a/Makefile b/Makefile diff --git a/Makefile b/Makefile
index 79aef17..d26d2e2 100644 index 6f94f25..83cff8f 100644
--- a/Makefile --- a/Makefile
+++ b/Makefile +++ b/Makefile
@@ -64,7 +64,7 @@ CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \ @@ -24,7 +24,7 @@ PROGRAM=crash
# Supported targets: X86 ALPHA PPC IA64 PPC64 SPARC64
# TARGET and GDB_CONF_FLAGS will be configured automatically by configure
#
-TARGET=
+TARGET=LOONGARCH64
GDB_CONF_FLAGS=
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
@@ -35,10 +35,10 @@ endif
#
# GDB, GDB_FILES, GDB_OFILES and GDB_PATCH_FILES will be configured automatically by configure
#
-GDB=
-GDB_FILES=
-GDB_OFILES=
-GDB_PATCH_FILES=
+GDB=gdb-10.2
+GDB_FILES=${GDB_10.2_FILES}
+GDB_OFILES=${GDB_10.2_OFILES}
+GDB_PATCH_FILES=gdb-10.2.patch
#
# Default installation directory
@@ -65,7 +65,7 @@ CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
kernel.c test.c gdb_interface.c configure.c net.c dev.c bpf.c \ kernel.c test.c gdb_interface.c configure.c net.c dev.c bpf.c \
printk.c \ printk.c \
alpha.c x86.c ppc.c ia64.c s390.c s390x.c s390dbf.c ppc64.c x86_64.c \ alpha.c x86.c ppc.c ia64.c s390.c s390x.c s390dbf.c ppc64.c x86_64.c \
- arm.c arm64.c mips.c mips64.c sparc64.c \ - arm.c arm64.c mips.c mips64.c riscv64.c sparc64.c \
+ arm.c arm64.c mips.c mips64.c sparc64.c loongarch64.c\ + arm.c arm64.c mips.c mips64.c riscv64.c sparc64.c loongarch64.c \
extensions.c remote.c va_server.c va_server_v1.c symbols.c cmdline.c \ extensions.c remote.c va_server.c va_server_v1.c symbols.c cmdline.c \
lkcd_common.c lkcd_v1.c lkcd_v2_v3.c lkcd_v5.c lkcd_v7.c lkcd_v8.c\ lkcd_common.c lkcd_v1.c lkcd_v2_v3.c lkcd_v5.c lkcd_v7.c lkcd_v8.c\
lkcd_fix_mem.c s390_dump.c lkcd_x86_trace.c \ lkcd_fix_mem.c s390_dump.c lkcd_x86_trace.c \
@@ -84,7 +84,7 @@ OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \ @@ -85,7 +85,7 @@ OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \ build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
printk.o \ printk.o \
alpha.o x86.o ppc.o ia64.o s390.o s390x.o s390dbf.o ppc64.o x86_64.o \ alpha.o x86.o ppc.o ia64.o s390.o s390x.o s390dbf.o ppc64.o x86_64.o \
- arm.o arm64.o mips.o mips64.o sparc64.o \ - arm.o arm64.o mips.o mips64.o riscv64.o sparc64.o \
+ arm.o arm64.o mips.o mips64.o sparc64.o loongarch64.o\ + arm.o arm64.o mips.o mips64.o riscv64.o sparc64.o loongarch64.o \
extensions.o remote.o va_server.o va_server_v1.o symbols.o cmdline.o \ extensions.o remote.o va_server.o va_server_v1.o symbols.o cmdline.o \
lkcd_common.o lkcd_v1.o lkcd_v2_v3.o lkcd_v5.o lkcd_v7.o lkcd_v8.o \ lkcd_common.o lkcd_v1.o lkcd_v2_v3.o lkcd_v5.o lkcd_v7.o lkcd_v8.o \
lkcd_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \ lkcd_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
@@ -292,6 +292,8 @@ gdb_unzip: @@ -190,7 +190,7 @@ GDB_10.2_OFILES=${GDB}/gdb/symtab.o crash_target.o
#
# GDB_FLAGS is passed up from the gdb Makefile.
#
-GDB_FLAGS=
+GDB_FLAGS=-DGDB_10_2
#
# WARNING_OPTIONS and WARNING_ERROR are both applied on a per-file basis.
@@ -207,7 +207,7 @@ TARGET_CFLAGS=
CRASH_CFLAGS=-g -D${TARGET} ${TARGET_CFLAGS} ${GDB_FLAGS} ${CFLAGS}
-GPL_FILES=
+GPL_FILES=COPYING3
TAR_FILES=${SOURCE_FILES} Makefile ${GPL_FILES} README .rh_rpm_package crash.8 \
${EXTENSION_SOURCE_FILES} ${MEMORY_DRIVER_FILES}
CSCOPE_FILES=${SOURCE_FILES}
@@ -292,7 +292,9 @@ gdb_unzip:
gdb_patch: gdb_patch:
if [ -f ${GDB}.patch ] && [ -s ${GDB}.patch ]; then \ if [ -f ${GDB}.patch ] && [ -s ${GDB}.patch ]; then \
patch -p0 < ${GDB}.patch; cp ${GDB}.patch ${GDB}; fi - patch -p0 < ${GDB}.patch; cp ${GDB}.patch ${GDB}; fi
+ patch -p0 < ${GDB}.patch; cp ${GDB}.patch ${GDB}; fi
+ if [ -f ${GDB}-loongarch.patch ] && [ -s ${GDB}-loongarch.patch ]; then \ + if [ -f ${GDB}-loongarch.patch ] && [ -s ${GDB}-loongarch.patch ]; then \
+ patch -p0 < ${GDB}-loongarch.patch; cp ${GDB}-loongarch.patch ${GDB}; fi + patch -p0 < ${GDB}-loongarch.patch; cp ${GDB}-loongarch.patch ${GDB}; fi
library: ${OBJECT_FILES} library: ${OBJECT_FILES}
ar -rs ${PROGRAM}lib.a ${OBJECT_FILES} ar -rs ${PROGRAM}lib.a ${OBJECT_FILES}
@@ -441,6 +443,9 @@ mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c @@ -445,6 +447,10 @@ riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR} ${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+loongarch64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} loongarch64.c +loongarch64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} loongarch64.c
+ ${CC} -c ${CRASH_CFLAGS} loongarch64.c ${WARNING_OPTIONS} ${WARNING_ERROR} + ${CC} -c ${CRASH_CFLAGS} loongarch64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+
+ +
s390.o: ${GENERIC_HFILES} ${IBM_HFILES} s390.c s390.o: ${GENERIC_HFILES} ${IBM_HFILES} s390.c
${CC} -c ${CRASH_CFLAGS} s390.c ${WARNING_OPTIONS} ${WARNING_ERROR} ${CC} -c ${CRASH_CFLAGS} s390.c ${WARNING_OPTIONS} ${WARNING_ERROR}
diff --git a/README b/README diff --git a/README b/README
index 1f98fbf..de3bdf9 100644 index 6ecdd10..4392712 100644
--- a/README --- a/README
+++ b/README +++ b/README
@@ -37,8 +37,8 @@ @@ -37,7 +37,7 @@
These are the current prerequisites: These are the current prerequisites:
o At this point, x86, ia64, x86_64, ppc64, ppc, arm, arm64, alpha, mips, o At this point, x86, ia64, x86_64, ppc64, ppc, arm, arm64, alpha, mips,
- mips64, s390 and s390x-based kernels are supported. Other architectures - mips64, riscv64, s390 and s390x-based kernels are supported. Other
- may be addressed in the future. + mips64, riscv64, loongarch64, s390 and s390x-based kernels are supported. Other
+ mips64, loongarch64, s390 and s390x-based kernels are supported. Other architectures may be addressed in the future.
+ architectures may be addressed in the future.
o One size fits all -- the utility can be run on any Linux kernel version o One size fits all -- the utility can be run on any Linux kernel version
version dating back to 2.2.5-15. A primary design goal is to always
diff --git a/configure.c b/configure.c diff --git a/configure.c b/configure.c
index 5188851..9d038f5 100644 index 08b52be..a6895ec 100644
--- a/configure.c --- a/configure.c
+++ b/configure.c +++ b/configure.c
@@ -107,6 +107,7 @@ void add_extra_lib(char *); @@ -108,6 +108,7 @@ void add_extra_lib(char *);
#undef MIPS
#undef SPARC64 #undef SPARC64
#undef MIPS64 #undef MIPS64
#undef RISCV64
+#undef LOONGARCH64 +#undef LOONGARCH64
#define UNKNOWN 0 #define UNKNOWN 0
#define X86 1 #define X86 1
@@ -122,6 +123,7 @@ void add_extra_lib(char *); @@ -124,6 +125,7 @@ void add_extra_lib(char *);
#define MIPS 11
#define SPARC64 12 #define SPARC64 12
#define MIPS64 13 #define MIPS64 13
+#define LOONGARCH64 14 #define RISCV64 14
+#define LOONGARCH64 15
#define TARGET_X86 "TARGET=X86" #define TARGET_X86 "TARGET=X86"
#define TARGET_ALPHA "TARGET=ALPHA" #define TARGET_ALPHA "TARGET=ALPHA"
@@ -136,6 +138,7 @@ void add_extra_lib(char *); @@ -139,6 +141,7 @@ void add_extra_lib(char *);
#define TARGET_MIPS "TARGET=MIPS"
#define TARGET_MIPS64 "TARGET=MIPS64" #define TARGET_MIPS64 "TARGET=MIPS64"
#define TARGET_SPARC64 "TARGET=SPARC64" #define TARGET_SPARC64 "TARGET=SPARC64"
#define TARGET_RISCV64 "TARGET=RISCV64"
+#define TARGET_LOONGARCH64 "TARGET=LOONGARCH64" +#define TARGET_LOONGARCH64 "TARGET=LOONGARCH64"
#define TARGET_CFLAGS_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64" #define TARGET_CFLAGS_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
#define TARGET_CFLAGS_ALPHA "TARGET_CFLAGS=" #define TARGET_CFLAGS_ALPHA "TARGET_CFLAGS="
@@ -158,6 +161,7 @@ void add_extra_lib(char *); @@ -163,6 +166,7 @@ void add_extra_lib(char *);
#define TARGET_CFLAGS_MIPS_ON_X86_64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
#define TARGET_CFLAGS_MIPS64 "TARGET_CFLAGS="
#define TARGET_CFLAGS_SPARC64 "TARGET_CFLAGS=" #define TARGET_CFLAGS_SPARC64 "TARGET_CFLAGS="
#define TARGET_CFLAGS_RISCV64 "TARGET_CFLAGS="
#define TARGET_CFLAGS_RISCV64_ON_X86_64 "TARGET_CFLAGS="
+#define TARGET_CFLAGS_LOONGARCH64 "TARGET_CFLAGS=" +#define TARGET_CFLAGS_LOONGARCH64 "TARGET_CFLAGS="
#define GDB_TARGET_DEFAULT "GDB_CONF_FLAGS=" #define GDB_TARGET_DEFAULT "GDB_CONF_FLAGS="
#define GDB_TARGET_ARM_ON_X86 "GDB_CONF_FLAGS=--target=arm-elf-linux" #define GDB_TARGET_ARM_ON_X86 "GDB_CONF_FLAGS=--target=arm-elf-linux"
@@ -404,6 +408,9 @@ get_current_configuration(struct supported_gdb_version *sp) @@ -413,6 +417,9 @@ get_current_configuration(struct supported_gdb_version *sp)
#ifdef __sparc_v9__ #if defined(__riscv) && (__riscv_xlen == 64)
target_data.target = SPARC64; target_data.target = RISCV64;
#endif #endif
+#ifdef __loongarch64 +#ifdef __loongarch64
+ target_data.target = LOONGARCH64; + target_data.target = LOONGARCH64;
@ -127,20 +177,21 @@ index 5188851..9d038f5 100644
set_initial_target(sp); set_initial_target(sp);
@@ -497,6 +504,10 @@ get_current_configuration(struct supported_gdb_version *sp) @@ -472,7 +479,10 @@ get_current_configuration(struct supported_gdb_version *sp)
(target_data.target != MIPS64)) * Build an RISCV64 crash binary on an X86_64 host.
arch_mismatch(sp); */
target_data.target = RISCV64;
+ if ((target_data.initial_gdb_target == LOONGARCH64) && - } else {
+ (target_data.target != LOONGARCH64)) + } else if ((target_data.initial_gdb_target == LOONGARCH64) &&
+ (target_data.target != LOONGARCH64)) {
+ arch_mismatch(sp); + arch_mismatch(sp);
+ + } else {
if ((target_data.initial_gdb_target == X86) && fprintf(stderr,
(target_data.target != X86)) { "\ntarget=%s is not supported on the %s host architecture\n\n",
if (target_data.target == X86_64) target_data.target_as_param,
@@ -660,6 +671,9 @@ show_configuration(void) @@ -686,6 +696,9 @@ show_configuration(void)
case SPARC64: case RISCV64:
printf("TARGET: SPARC64\n"); printf("TARGET: RISCV64\n");
break; break;
+ case LOONGARCH64: + case LOONGARCH64:
+ printf("TARGET: LOONGARCH64\n"); + printf("TARGET: LOONGARCH64\n");
@ -148,9 +199,9 @@ index 5188851..9d038f5 100644
} }
if (strlen(target_data.program)) { if (strlen(target_data.program)) {
@@ -777,6 +791,10 @@ build_configure(struct supported_gdb_version *sp) @@ -811,6 +824,10 @@ build_configure(struct supported_gdb_version *sp)
target = TARGET_SPARC64; } else
target_CFLAGS = TARGET_CFLAGS_SPARC64; target_CFLAGS = TARGET_CFLAGS_RISCV64;
break; break;
+ case LOONGARCH64: + case LOONGARCH64:
+ target = TARGET_LOONGARCH64; + target = TARGET_LOONGARCH64;
@ -159,36 +210,36 @@ index 5188851..9d038f5 100644
} }
ldflags = get_extra_flags("LDFLAGS.extra", NULL); ldflags = get_extra_flags("LDFLAGS.extra", NULL);
@@ -1374,7 +1392,7 @@ make_spec_file(struct supported_gdb_version *sp) @@ -1408,7 +1425,7 @@ make_spec_file(struct supported_gdb_version *sp)
printf("Vendor: Red Hat, Inc.\n"); printf("Vendor: Red Hat, Inc.\n");
printf("Packager: Dave Anderson <anderson@redhat.com>\n"); printf("Packager: Dave Anderson <anderson@redhat.com>\n");
printf("ExclusiveOS: Linux\n"); printf("ExclusiveOS: Linux\n");
- printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64\n"); - printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64 riscv64\n");
+ printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64 loongarch64\n"); + printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64 riscv64 loongarch64\n");
printf("Buildroot: %%{_tmppath}/%%{name}-root\n"); printf("Buildroot: %%{_tmppath}/%%{name}-root\n");
printf("BuildRequires: ncurses-devel zlib-devel bison\n"); printf("BuildRequires: ncurses-devel zlib-devel bison\n");
printf("Requires: binutils\n"); printf("Requires: binutils\n");
@@ -1613,6 +1631,8 @@ set_initial_target(struct supported_gdb_version *sp) @@ -1643,6 +1660,8 @@ set_initial_target(struct supported_gdb_version *sp)
target_data.initial_gdb_target = MIPS; target_data.initial_gdb_target = ARM;
else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0) else if (strncmp(buf, "MIPS64", strlen("MIPS64")) == 0)
target_data.initial_gdb_target = SPARC64; target_data.initial_gdb_target = MIPS64;
+ else if (strncmp(buf, "LOONGARCH64", strlen("LOONGARCH64")) == 0) + else if (strncmp(buf, "LOONGARCH64", strlen("LOONGARCH64")) == 0)
+ target_data.initial_gdb_target = LOONGARCH64; + target_data.initial_gdb_target = LOONGARCH64;
} else if (strncmp(buf, "MIPS", strlen("MIPS")) == 0)
target_data.initial_gdb_target = MIPS;
char * else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
@@ -1633,6 +1653,7 @@ target_to_name(int target) @@ -1670,6 +1689,7 @@ target_to_name(int target)
case MIPS: return("MIPS");
case MIPS64: return("MIPS64"); case MIPS64: return("MIPS64");
case SPARC64: return("SPARC64"); case SPARC64: return("SPARC64");
case RISCV64: return("RISCV64");
+ case LOONGARCH64: return("LOONGARCH64"); + case LOONGARCH64: return("LOONGARCH64");
} }
return "UNKNOWN"; return "UNKNOWN";
@@ -1697,6 +1718,10 @@ name_to_target(char *name) @@ -1738,6 +1758,10 @@ name_to_target(char *name)
return MIPS64; return RISCV64;
else if (strncmp(name, "sparc64", strlen("sparc64")) == 0) else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
return SPARC64; return RISCV64;
+ else if (strncmp(name, "loongarch64", strlen("loongarch64")) == 0) + else if (strncmp(name, "loongarch64", strlen("loongarch64")) == 0)
+ return LOONGARCH64; + return LOONGARCH64;
+ else if (strncmp(name, "LOONGARCH64", strlen("LOONGARCH64")) == 0) + else if (strncmp(name, "LOONGARCH64", strlen("LOONGARCH64")) == 0)
@ -197,7 +248,7 @@ index 5188851..9d038f5 100644
return UNKNOWN; return UNKNOWN;
} }
diff --git a/crash.8 b/crash.8 diff --git a/crash.8 b/crash.8
index e553a0b..0662f92 100644 index e553a0b..bcd492d 100644
--- a/crash.8 --- a/crash.8
+++ b/crash.8 +++ b/crash.8
@@ -491,7 +491,7 @@ Search for the kernel source code in directory instead of in the @@ -491,7 +491,7 @@ Search for the kernel source code in directory instead of in the
@ -205,44 +256,44 @@ index e553a0b..0662f92 100644
.TP .TP
.BI --kaslr \ offset | auto .BI --kaslr \ offset | auto
-If an x86_64 kernel was configured with -If an x86_64 kernel was configured with
+If an x86, x86_64, s390x or loongarch64 kernel was configured with +If an x86_64 loongarch64 kernel was configured with
.B CONFIG_RANDOMIZE_BASE, .B CONFIG_RANDOMIZE_BASE,
the offset value is equal to the difference between the symbol values the offset value is equal to the difference between the symbol values
compiled into the vmlinux file and their relocated KASLR values. If set to compiled into the vmlinux file and their relocated KASLR values. If set to
diff --git a/defs.h b/defs.h diff --git a/defs.h b/defs.h
index afdcf6c..dc8f2e0 100644 index deef1d5..2d1ef9a 100644
--- a/defs.h --- a/defs.h
+++ b/defs.h +++ b/defs.h
@@ -76,7 +76,7 @@ @@ -76,7 +76,7 @@
#if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \ #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
!defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \ !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
!defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \ !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
- !defined(SPARC64) - !defined(RISCV64) && !defined(SPARC64)
+ !defined(SPARC64) && !defined(LOONGARCH64) + !defined(RISCV64) && !defined(SPARC64) && !defined(LOONGARCH64)
#ifdef __alpha__ #ifdef __alpha__
#define ALPHA #define ALPHA
#endif #endif
@@ -118,6 +118,9 @@ @@ -108,6 +108,9 @@
#ifdef __sparc_v9__ #ifdef __aarch64__
#define SPARC64 #define ARM64
#endif #endif
+#ifdef __loongarch64 +#ifdef __loongarch64
+#define LOONGARCH64 +#define LOONGARCH64
+#endif +#endif
#endif #ifdef __mipsel__
#ifndef __mips64
#ifdef X86 #define MIPS
@@ -159,6 +162,9 @@ @@ -159,6 +162,9 @@
#ifdef SPARC64 #ifdef MIPS64
#define NR_CPUS (4096) #define NR_CPUS (256)
#endif #endif
+#ifdef LOONGARCH64 +#ifdef LOONGARCH64
+#define NR_CPUS (256) +#define NR_CPUS (256)
+#endif +#endif
#ifdef SPARC64
#define NR_DEVICE_DUMPS (64) #define NR_CPUS (4096)
#endif
@@ -2005,6 +2011,8 @@ struct offset_table { /* stash of commonly-used offsets */ @@ -2016,6 +2022,8 @@ struct offset_table { /* stash of commonly-used offsets */
long atomic_t_counter; long atomic_t_counter;
long percpu_counter_count; long percpu_counter_count;
long mm_struct_mm_count; long mm_struct_mm_count;
@ -251,9 +302,9 @@ index afdcf6c..dc8f2e0 100644
long task_struct_thread_reg29; long task_struct_thread_reg29;
long task_struct_thread_reg31; long task_struct_thread_reg31;
long pt_regs_regs; long pt_regs_regs;
@@ -3484,6 +3492,43 @@ struct arm64_stackframe { @@ -3498,6 +3506,44 @@ struct arm64_stackframe {
#define _MAX_PHYSMEM_BITS 48
#endif /* MIPS64 */ #endif /* ARM64 */
+#ifdef LOONGARCH64 +#ifdef LOONGARCH64
+#define _64BIT_ +#define _64BIT_
@ -292,10 +343,11 @@ index afdcf6c..dc8f2e0 100644
+#define _MAX_PHYSMEM_BITS 48 +#define _MAX_PHYSMEM_BITS 48
+#endif /* LOONGARCH64 */ +#endif /* LOONGARCH64 */
+ +
#ifdef X86 +
#ifdef MIPS
#define _32BIT_ #define _32BIT_
#define MACHINE_TYPE "X86" #define MACHINE_TYPE "MIPS"
@@ -4532,6 +4577,10 @@ struct machine_specific { @@ -4770,6 +4816,10 @@ struct machine_specific {
#define MAX_HEXADDR_STRLEN (16) #define MAX_HEXADDR_STRLEN (16)
#define UVADDR_PRLEN (16) #define UVADDR_PRLEN (16)
#endif #endif
@ -306,19 +358,20 @@ index afdcf6c..dc8f2e0 100644
#define BADADDR ((ulong)(-1)) #define BADADDR ((ulong)(-1))
#define BADVAL ((ulong)(-1)) #define BADVAL ((ulong)(-1))
@@ -5130,6 +5179,9 @@ void dump_build_data(void); @@ -5391,6 +5441,10 @@ void dump_build_data(void);
#ifdef SPARC64 #ifdef SPARC64
#define machdep_init(X) sparc64_init(X) #define machdep_init(X) sparc64_init(X)
#endif #endif
+#ifdef LOONGARCH64 +#ifdef LOONGARCH64
+#define machdep_init(X) loongarch64_init(X) +#define machdep_init(X) loongarch64_init(X)
+#endif +#endif
+
int clean_exit(int); int clean_exit(int);
int untrusted_file(FILE *, char *); int untrusted_file(FILE *, char *);
char *readmem_function_name(void); char *readmem_function_name(void);
@@ -5607,6 +5659,9 @@ void display_help_screen(char *); @@ -5882,6 +5936,9 @@ void display_help_screen(char *);
#ifdef SPARC64 #ifdef RISCV64
#define dump_machdep_table(X) sparc64_dump_machdep_table(X) #define dump_machdep_table(X) riscv64_dump_machdep_table(X)
#endif #endif
+#ifdef LOONGARCH64 +#ifdef LOONGARCH64
+#define dump_machdep_table(X) loongarch64_dump_machdep_table(X) +#define dump_machdep_table(X) loongarch64_dump_machdep_table(X)
@ -326,7 +379,7 @@ index afdcf6c..dc8f2e0 100644
extern char *help_pointer[]; extern char *help_pointer[];
extern char *help_alias[]; extern char *help_alias[];
extern char *help_ascii[]; extern char *help_ascii[];
@@ -6695,6 +6750,109 @@ int sparc64_vmalloc_addr(ulong); @@ -7086,6 +7143,109 @@ int sparc64_vmalloc_addr(ulong);
error(FATAL, "The -d option is not applicable to sparc64.\n") error(FATAL, "The -d option is not applicable to sparc64.\n")
#endif #endif
@ -437,12 +490,12 @@ index afdcf6c..dc8f2e0 100644
* netdump.c * netdump.c
*/ */
diff --git a/diskdump.c b/diskdump.c diff --git a/diskdump.c b/diskdump.c
index 2c1f9be..b3fbe8f 100644 index 7fbbbf5..8a20f5d 100644
--- a/diskdump.c --- a/diskdump.c
+++ b/diskdump.c +++ b/diskdump.c
@@ -622,6 +622,9 @@ restart: @@ -686,6 +686,9 @@ restart:
else if (STRNEQ(header->utsname.machine, "aarch64") && else if (STRNEQ(header->utsname.machine, "riscv64") &&
machine_type_mismatch(file, "ARM64", NULL, 0)) machine_type_mismatch(file, "RISCV64", NULL, 0))
goto err; goto err;
+ else if (STRNEQ(header->utsname.machine, "loongarch64") && + else if (STRNEQ(header->utsname.machine, "loongarch64") &&
+ machine_type_mismatch(file, "LOONGARCH64", NULL, 0)) + machine_type_mismatch(file, "LOONGARCH64", NULL, 0))
@ -450,16 +503,16 @@ index 2c1f9be..b3fbe8f 100644
if (header->block_size != block_size) { if (header->block_size != block_size) {
block_size = header->block_size; block_size = header->block_size;
@@ -780,6 +783,8 @@ restart: @@ -846,6 +849,8 @@ restart:
dd->machine_type = EM_AARCH64;
else if (machine_type("SPARC64"))
dd->machine_type = EM_SPARCV9; dd->machine_type = EM_SPARCV9;
else if (machine_type("RISCV64"))
dd->machine_type = EM_RISCV;
+ else if (machine_type("LOONGARCH64")) + else if (machine_type("LOONGARCH64"))
+ dd->machine_type = EM_LOONGARCH; + dd->machine_type = EM_LOONGARCH;
else { else {
error(INFO, "%s: unsupported machine type: %s\n", error(INFO, "%s: unsupported machine type: %s\n",
DISKDUMP_VALID() ? "diskdump" : "compressed kdump", DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
@@ -1526,6 +1531,12 @@ get_diskdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp) @@ -1600,6 +1605,12 @@ get_diskdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp)
machdep->get_stack_frame(bt, eip, esp); machdep->get_stack_frame(bt, eip, esp);
} }
@ -470,30 +523,28 @@ index 2c1f9be..b3fbe8f 100644
+} +}
+ +
static void static void
get_diskdump_regs_sparc64(struct bt_info *bt, ulong *eip, ulong *esp) get_diskdump_regs_riscv64(struct bt_info *bt, ulong *eip, ulong *esp)
{ {
@@ -1605,6 +1616,10 @@ get_diskdump_regs(struct bt_info *bt, ulong *eip, ulong *esp) @@ -1688,6 +1699,9 @@ get_diskdump_regs(struct bt_info *bt, ulong *eip, ulong *esp)
get_diskdump_regs_sparc64(bt, eip, esp); case EM_RISCV:
get_diskdump_regs_riscv64(bt, eip, esp);
break; break;
+ case EM_LOONGARCH: + case EM_LOONGARCH:
+ get_diskdump_regs_loongarch64(bt, eip, esp); + get_diskdump_regs_loongarch64(bt, eip, esp);
+ break; + break;
+
default: default:
error(FATAL, "%s: unsupported machine type: %s\n", error(FATAL, "%s: unsupported machine type: %s\n",
DISKDUMP_VALID() ? "diskdump" : "compressed kdump", @@ -1836,7 +1850,7 @@ dump_note_offsets(FILE *fp)
@@ -1751,7 +1766,8 @@ dump_note_offsets(FILE *fp)
qemu = FALSE;
if (machine_type("X86_64") || machine_type("S390X") || if (machine_type("X86_64") || machine_type("S390X") ||
machine_type("ARM64") || machine_type("PPC64") || machine_type("ARM64") || machine_type("PPC64") ||
- machine_type("SPARC64") || machine_type("MIPS64")) { machine_type("SPARC64") || machine_type("MIPS64") ||
+ machine_type("SPARC64") || machine_type("MIPS64") || - machine_type("RISCV64")) {
+ machine_type("LOONGARCH64")) { + machine_type("RISCV64") || machine_type("LOONGARCH64")) {
note64 = (void *)dd->notes_buf + tot; note64 = (void *)dd->notes_buf + tot;
len = sizeof(Elf64_Nhdr); len = sizeof(Elf64_Nhdr);
if (STRNEQ((char *)note64 + len, "QEMU")) if (STRNEQ((char *)note64 + len, "QEMU"))
@@ -1862,6 +1878,8 @@ __diskdump_memory_dump(FILE *fp) @@ -1947,6 +1961,8 @@ __diskdump_memory_dump(FILE *fp)
fprintf(fp, "(EM_AARCH64)\n"); break; fprintf(fp, "(EM_AARCH64)\n"); break;
case EM_SPARCV9: case EM_SPARCV9:
fprintf(fp, "(EM_SPARCV9)\n"); break; fprintf(fp, "(EM_SPARCV9)\n"); break;
@ -502,23 +553,21 @@ index 2c1f9be..b3fbe8f 100644
default: default:
fprintf(fp, "(unknown)\n"); break; fprintf(fp, "(unknown)\n"); break;
} }
@@ -2548,6 +2566,9 @@ diskdump_display_regs(int cpu, FILE *ofp) @@ -2633,6 +2649,8 @@ diskdump_display_regs(int cpu, FILE *ofp)
if (machine_type("MIPS64")) if (machine_type("MIPS64"))
mips64_display_regs_from_elf_notes(cpu, ofp); mips64_display_regs_from_elf_notes(cpu, ofp);
+
+ if (machine_type("LOONGARCH64")) + if (machine_type("LOONGARCH64"))
+ loongarch64_display_regs_from_elf_notes(cpu, ofp); + loongarch64_display_regs_from_elf_notes(cpu, ofp);
} }
void void
@@ -2558,7 +2579,8 @@ dump_registers_for_compressed_kdump(void) @@ -2644,7 +2662,7 @@ dump_registers_for_compressed_kdump(void)
if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
!(machine_type("X86") || machine_type("X86_64") || !(machine_type("X86") || machine_type("X86_64") ||
machine_type("ARM64") || machine_type("PPC64") || machine_type("ARM64") || machine_type("PPC64") ||
- machine_type("MIPS") || machine_type("MIPS64"))) machine_type("MIPS") || machine_type("MIPS64") ||
+ machine_type("MIPS") || machine_type("MIPS64") || - machine_type("RISCV64")))
+ machine_type("LOONGARCH64"))) + machine_type("RISCV64") || machine_type("LOONGARCH64")))
error(FATAL, "-r option not supported for this dumpfile\n"); error(FATAL, "-r option not supported for this dumpfile\n");
if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes)) if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
@ -15735,80 +15784,53 @@ index 0000000..d5a65d0
+-- +--
+2.33.0 +2.33.0
+ +
diff --git a/gdb_interface.c b/gdb_interface.c
index b14319c..e7b65ac 100644
--- a/gdb_interface.c
+++ b/gdb_interface.c
@@ -973,7 +973,6 @@ gdb_error_debug(void)
}
-
/*
* gdb callback to access debug mode.
*/
diff --git a/help.c b/help.c diff --git a/help.c b/help.c
index 99214c1..3662dad 100644 index cc7ab20..c36a6f1 100644
--- a/help.c --- a/help.c
+++ b/help.c +++ b/help.c
@@ -336,10 +336,11 @@ char *program_usage_info[] = { @@ -336,7 +336,7 @@ char *program_usage_info[] = {
" and verification. The default count is 32768.", " and verification. The default count is 32768.",
"", "",
" --kaslr offset | auto", " --kaslr offset | auto",
- " If x86, x86_64 or s390x kernel was configured with CONFIG_RANDOMIZE_BASE,", - " If x86, x86_64 or s390x kernel was configured with CONFIG_RANDOMIZE_BASE,",
- " the offset value is equal to the difference between the symbol values ", + " If x86, x86_64 loongarch64 or s390x kernel was configured with CONFIG_RANDOMIZE_BASE,",
- " compiled into the vmlinux file and their relocated KASLR value. If", " the offset value is equal to the difference between the symbol values ",
- " set to auto, the KASLR offset value will be automatically calculated.", " compiled into the vmlinux file and their relocated KASLR value. If",
+ " If x86, x86_64, s390x or loongarch64 kernel was configured with", " set to auto, the KASLR offset value will be automatically calculated.",
+ " CONFIG_RANDOMIZE_BASE, the offset value is equal to the difference",
+ " between the symbol values compiled into the vmlinux file and their",
+ " relocated KASLR value. If set to auto, the KASLR offset value will",
+ " be automatically calculated.",
"",
" --minimal",
" Bring up a session that is restricted to the log, dis, rd, sym,",
diff --git a/lkcd_vmdump_v1.h b/lkcd_vmdump_v1.h diff --git a/lkcd_vmdump_v1.h b/lkcd_vmdump_v1.h
index 4933427..841f150 100644 index 98ee094..3ffb219 100644
--- a/lkcd_vmdump_v1.h --- a/lkcd_vmdump_v1.h
+++ b/lkcd_vmdump_v1.h +++ b/lkcd_vmdump_v1.h
@@ -118,10 +118,12 @@ typedef struct _dump_header_s { @@ -114,7 +114,7 @@ typedef struct _dump_header_s {
#ifndef S390 struct new_utsname dh_utsname;
#ifndef S390X
#ifndef ARM64 /* the dump registers */
+#ifndef LOONGARCH64 -#if !defined(IA64) && !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64)
+#if !defined(IA64) && !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64) && !defined(LOONGARCH64)
struct pt_regs dh_regs; struct pt_regs dh_regs;
#endif
#endif
#endif
+#endif
#endif #endif
/* the address of the current task */
diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
index 984c2c2..ab395ea 100644 index ef3067f..2113c59 100644
--- a/lkcd_vmdump_v2_v3.h --- a/lkcd_vmdump_v2_v3.h
+++ b/lkcd_vmdump_v2_v3.h +++ b/lkcd_vmdump_v2_v3.h
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
#if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \ #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
defined(S390X) || defined(ARM64) || defined(MIPS) || \ defined(S390X) || defined(ARM64) || defined(MIPS) || \
- defined(MIPS64) || defined(SPARC64) - defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
+ defined(MIPS64) || defined(SPARC64) || defined(LOONGARCH64) + defined(MIPS64) || defined(SPARC64) || defined(RISCV64) || defined(LOONGARCH64)
/* /*
* Kernel header file for Linux crash dumps. * Kernel header file for Linux crash dumps.
@@ -87,10 +87,12 @@ typedef struct _dump_header_asm_s { @@ -84,7 +84,7 @@ typedef struct _dump_header_asm_s {
#ifndef S390 uint32_t dha_eip;
#ifndef S390X
#ifndef ARM64 /* the dump registers */
+#ifndef LOONGARCH64 -#if !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64)
+#if !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64) && !defined(LOONGARCH64)
struct pt_regs dha_regs; struct pt_regs dha_regs;
#endif #endif
#endif
#endif
+#endif
} dump_header_asm_t;
diff --git a/loongarch64.c b/loongarch64.c diff --git a/loongarch64.c b/loongarch64.c
new file mode 100644 new file mode 100644
@ -17164,45 +17186,44 @@ index 0000000..09df05a
+ +
+#endif /* !LOONGARCH64 */ +#endif /* !LOONGARCH64 */
diff --git a/main.c b/main.c diff --git a/main.c b/main.c
index b278c22..a70fd5e 100644 index 4fd4ca5..71bcc15 100644
--- a/main.c --- a/main.c
+++ b/main.c +++ b/main.c
@@ -228,7 +228,8 @@ main(int argc, char **argv) @@ -228,7 +228,8 @@ main(int argc, char **argv)
} else if (STREQ(long_options[option_index].name, "kaslr")) { } else if (STREQ(long_options[option_index].name, "kaslr")) {
if (!machine_type("X86_64") && if (!machine_type("X86_64") &&
!machine_type("ARM64") && !machine_type("X86") && !machine_type("ARM64") && !machine_type("X86") &&
- !machine_type("S390X")) - !machine_type("S390X") && !machine_type("RISCV64"))
+ !machine_type("S390X") && + !machine_type("S390X") && !machine_type("RISCV64") &&
+ !machine_type("LOONGARCH64")) + !machine_type("LOONGARCH64"))
error(INFO, "--kaslr not valid " error(INFO, "--kaslr not valid "
"with this machine type.\n"); "with this machine type.\n");
else if (STREQ(optarg, "auto")) else if (STREQ(optarg, "auto"))
diff --git a/netdump.c b/netdump.c diff --git a/netdump.c b/netdump.c
index ff273b4..f8ce939 100644 index 3907863..e977ae8 100644
--- a/netdump.c --- a/netdump.c
+++ b/netdump.c +++ b/netdump.c
@@ -42,6 +42,7 @@ static void get_netdump_regs_ppc64(struct bt_info *, ulong *, ulong *); @@ -43,6 +43,7 @@ static void get_netdump_regs_arm(struct bt_info *, ulong *, ulong *);
static void get_netdump_regs_arm(struct bt_info *, ulong *, ulong *);
static void get_netdump_regs_arm64(struct bt_info *, ulong *, ulong *); static void get_netdump_regs_arm64(struct bt_info *, ulong *, ulong *);
static void get_netdump_regs_mips(struct bt_info *, ulong *, ulong *); static void get_netdump_regs_mips(struct bt_info *, ulong *, ulong *);
static void get_netdump_regs_riscv(struct bt_info *, ulong *, ulong *);
+static void get_netdump_regs_loongarch64(struct bt_info *, ulong *, ulong *); +static void get_netdump_regs_loongarch64(struct bt_info *, ulong *, ulong *);
static void check_dumpfile_size(char *); static void check_dumpfile_size(char *);
static int proc_kcore_init_32(FILE *, int); static int proc_kcore_init_32(FILE *, int);
static int proc_kcore_init_64(FILE *, int); static int proc_kcore_init_64(FILE *, int);
@@ -300,6 +301,12 @@ is_netdump(char *file, ulong source_query) @@ -217,6 +218,11 @@ is_netdump(char *file, ulong source_query)
source_query))
goto bailout; goto bailout;
break; break;
+ case EM_LOONGARCH: + case EM_LOONGARCH:
+ if (machine_type_mismatch(file, "LOONGARCH64", NULL, + if (machine_type_mismatch(file, "LOONGARCH64", NULL,
+ source_query)) + source_query))
+ goto bailout; + goto bailout;
+ break; + break;
+
default: default:
if (machine_type_mismatch(file, "(unknown)", NULL, if (machine_type_mismatch(file, "(unknown)", NULL,
source_query)) @@ -1493,6 +1499,9 @@ dump_Elf32_Ehdr(Elf32_Ehdr *elf)
@@ -1482,6 +1489,9 @@ dump_Elf32_Ehdr(Elf32_Ehdr *elf)
case EM_MIPS: case EM_MIPS:
netdump_print("(EM_MIPS)\n"); netdump_print("(EM_MIPS)\n");
break; break;
@ -17212,7 +17233,7 @@ index ff273b4..f8ce939 100644
default: default:
netdump_print("(unsupported)\n"); netdump_print("(unsupported)\n");
break; break;
@@ -1644,6 +1654,9 @@ dump_Elf64_Ehdr(Elf64_Ehdr *elf) @@ -1655,6 +1664,9 @@ dump_Elf64_Ehdr(Elf64_Ehdr *elf)
case EM_AARCH64: case EM_AARCH64:
netdump_print("(EM_AARCH64)\n"); netdump_print("(EM_AARCH64)\n");
break; break;
@ -17222,8 +17243,8 @@ index ff273b4..f8ce939 100644
default: default:
netdump_print("(unsupported)\n"); netdump_print("(unsupported)\n");
break; break;
@@ -2669,6 +2682,10 @@ get_netdump_regs(struct bt_info *bt, ulong *eip, ulong *esp) @@ -2684,6 +2696,10 @@ get_netdump_regs(struct bt_info *bt, ulong *eip, ulong *esp)
return get_netdump_regs_mips(bt, eip, esp); get_netdump_regs_riscv(bt, eip, esp);
break; break;
+ case EM_LOONGARCH: + case EM_LOONGARCH:
@ -17233,26 +17254,25 @@ index ff273b4..f8ce939 100644
default: default:
error(FATAL, error(FATAL,
"support for ELF machine type %d not available\n", "support for ELF machine type %d not available\n",
@@ -2925,6 +2942,8 @@ display_regs_from_elf_notes(int cpu, FILE *ofp) @@ -2942,6 +2958,8 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
mips_display_regs_from_elf_notes(cpu, ofp);
} else if (machine_type("MIPS64")) {
mips64_display_regs_from_elf_notes(cpu, ofp); mips64_display_regs_from_elf_notes(cpu, ofp);
} else if (machine_type("RISCV64")) {
riscv64_display_regs_from_elf_notes(cpu, ofp);
+ } else if (machine_type("LOONGARCH64")) { + } else if (machine_type("LOONGARCH64")) {
+ loongarch64_display_regs_from_elf_notes(cpu, ofp); + loongarch64_display_regs_from_elf_notes(cpu, ofp);
} }
} }
@@ -2935,7 +2954,8 @@ dump_registers_for_elf_dumpfiles(void) @@ -2953,7 +2971,7 @@ dump_registers_for_elf_dumpfiles(void)
if (!(machine_type("X86") || machine_type("X86_64") || if (!(machine_type("X86") || machine_type("X86_64") ||
machine_type("ARM64") || machine_type("PPC64") || machine_type("ARM64") || machine_type("PPC64") ||
- machine_type("MIPS") || machine_type("MIPS64"))) machine_type("MIPS") || machine_type("MIPS64") ||
+ machine_type("MIPS") || machine_type("MIPS64") || - machine_type("RISCV64")))
+ machine_type("LOONGARCH64"))) + machine_type("RISCV64") || machine_type("LOONGARCH64")))
error(FATAL, "-r option not supported for this dumpfile\n"); error(FATAL, "-r option not supported for this dumpfile\n");
if (NETDUMP_DUMPFILE()) { if (NETDUMP_DUMPFILE()) {
@@ -3870,6 +3890,12 @@ get_netdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp) @@ -3888,6 +3906,12 @@ get_netdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp)
machdep->get_stack_frame(bt, eip, esp); machdep->get_stack_frame(bt, eip, esp);
} }
@ -17262,46 +17282,45 @@ index ff273b4..f8ce939 100644
+ machdep->get_stack_frame(bt, eip, esp); + machdep->get_stack_frame(bt, eip, esp);
+} +}
+ +
int static void
is_partial_netdump(void) get_netdump_regs_riscv(struct bt_info *bt, ulong *eip, ulong *esp)
{ {
diff --git a/ramdump.c b/ramdump.c diff --git a/ramdump.c b/ramdump.c
index a206fcb..c32d9fd 100644 index d2bd7ff..4b03f0f 100644
--- a/ramdump.c --- a/ramdump.c
+++ b/ramdump.c +++ b/ramdump.c
@@ -188,6 +188,8 @@ char *ramdump_to_elf(void) @@ -190,6 +190,8 @@ char *ramdump_to_elf(void)
e_machine = EM_MIPS;
else if (machine_type("X86_64"))
e_machine = EM_X86_64; e_machine = EM_X86_64;
else if (machine_type("RISCV64"))
e_machine = EM_RISCV;
+ else if (machine_type("LOONGARCH64")) + else if (machine_type("LOONGARCH64"))
+ e_machine = EM_LOONGARCH; + e_machine = EM_LOONGARCH;
else else
error(FATAL, "ramdump: unsupported machine type: %s\n", error(FATAL, "ramdump: unsupported machine type: %s\n",
MACHINE_TYPE); MACHINE_TYPE);
diff --git a/symbols.c b/symbols.c diff --git a/symbols.c b/symbols.c
index 42c4eb4..4bdeaf7 100644 index 8e8b4c3..83fa061 100644
--- a/symbols.c --- a/symbols.c
+++ b/symbols.c +++ b/symbols.c
@@ -593,7 +593,8 @@ kaslr_init(void) @@ -629,7 +629,7 @@ kaslr_init(void)
char *string; char *string;
if ((!machine_type("X86_64") && !machine_type("ARM64") && !machine_type("X86") && if ((!machine_type("X86_64") && !machine_type("ARM64") && !machine_type("X86") &&
- !machine_type("S390X")) || (kt->flags & RELOC_SET)) - !machine_type("S390X") && !machine_type("RISCV64")) || (kt->flags & RELOC_SET))
+ !machine_type("S390X") && !machine_type("LOONGARCH64")) || + !machine_type("S390X") && !machine_type("RISCV64") && !machine_type("LOONGARCH64")) || (kt->flags & RELOC_SET))
+ (kt->flags & RELOC_SET))
return; return;
if (!kt->vmcoreinfo._stext_SYMBOL && if (!kt->vmcoreinfo._stext_SYMBOL &&
@@ -759,7 +760,7 @@ store_symbols(bfd *abfd, int dynamic, void *minisyms, long symcount, @@ -795,7 +795,7 @@ store_symbols(bfd *abfd, int dynamic, void *minisyms, long symcount,
} else if (!(kt->flags & RELOC_SET)) } else if (!(kt->flags & RELOC_SET))
kt->flags |= RELOC_FORCE; kt->flags |= RELOC_FORCE;
} else if (machine_type("X86_64") || machine_type("ARM64") || } else if (machine_type("X86_64") || machine_type("ARM64") ||
- machine_type("S390X")) { - machine_type("S390X") || machine_type("RISCV64")) {
+ machine_type("S390X") || machine_type("LOONGARCH64")) { + machine_type("S390X") || machine_type("RISCV64") || machine_type("LOONGARCH64")) {
if ((kt->flags2 & RELOC_AUTO) && !(kt->flags & RELOC_SET)) if ((kt->flags2 & RELOC_AUTO) && !(kt->flags & RELOC_SET))
derive_kaslr_offset(abfd, dynamic, from, derive_kaslr_offset(abfd, dynamic, from,
fromend, size, store); fromend, size, store);
@@ -831,7 +832,8 @@ store_sysmap_symbols(void) @@ -867,7 +867,8 @@ store_sysmap_symbols(void)
strerror(errno)); strerror(errno));
if (!machine_type("X86") && !machine_type("X86_64") && if (!machine_type("X86") && !machine_type("X86_64") &&
@ -17311,7 +17330,7 @@ index 42c4eb4..4bdeaf7 100644
kt->flags &= ~RELOC_SET; kt->flags &= ~RELOC_SET;
first = 0; first = 0;
@@ -2490,9 +2492,11 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr, @@ -2976,9 +2977,11 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
/* /*
* On ARM/ARM64 we have linker mapping symbols like '$a' * On ARM/ARM64 we have linker mapping symbols like '$a'
* or '$x' for ARM64, and '$d'. * or '$x' for ARM64, and '$d'.
@ -17324,23 +17343,21 @@ index 42c4eb4..4bdeaf7 100644
!machdep->verify_symbol(nameptr, ec->st_value, ec->st_info)) !machdep->verify_symbol(nameptr, ec->st_value, ec->st_info))
continue; continue;
@@ -3694,6 +3698,11 @@ is_kernel(char *file) @@ -4228,6 +4231,10 @@ is_kernel(char *file)
if (machine_type_mismatch(file, "SPARC64", NULL, 0))
goto bailout; goto bailout;
break; break;
+ case EM_LOONGARCH: + case EM_LOONGARCH:
+ if (machine_type_mismatch(file, "LOONGARCH64", NULL, 0)) + if (machine_type_mismatch(file, "LOONGARCH64", NULL, 0))
+ goto bailout; + goto bailout;
+ break; + break;
+
default: default:
if (machine_type_mismatch(file, "(unknown)", NULL, 0)) if (machine_type_mismatch(file, "(unknown)", NULL, 0))
goto bailout; @@ -4495,6 +4502,10 @@ is_shared_object(char *file)
@@ -4002,6 +4011,11 @@ is_shared_object(char *file) if (machine_type("PPC"))
if (machine_type("MIPS64"))
return TRUE; return TRUE;
break; break;
+
+ case EM_LOONGARCH: + case EM_LOONGARCH:
+ if (machine_type("LOONGARCH64")) + if (machine_type("LOONGARCH64"))
+ return TRUE; + return TRUE;
@ -17348,17 +17365,17 @@ index 42c4eb4..4bdeaf7 100644
} }
if (CRASHDEBUG(1)) if (CRASHDEBUG(1))
@@ -8818,6 +8832,10 @@ dump_offset_table(char *spec, ulong makestruct) @@ -9786,6 +9797,10 @@ dump_offset_table(char *spec, ulong makestruct)
OFFSET(task_struct_thread_esp)); OFFSET(task_struct_tss_esp));
fprintf(fp, " task_struct_thread_ksp: %ld\n", fprintf(fp, " task_struct_tss_ksp: %ld\n",
OFFSET(task_struct_thread_ksp)); OFFSET(task_struct_tss_ksp));
+ fprintf(fp, " task_struct_thread_reg01: %ld\n", + fprintf(fp, " task_struct_thread_reg01: %ld\n",
+ OFFSET(task_struct_thread_reg01)); + OFFSET(task_struct_thread_reg01));
+ fprintf(fp, " task_struct_thread_reg03: %ld\n", + fprintf(fp, " task_struct_thread_reg03: %ld\n",
+ OFFSET(task_struct_thread_reg03)); + OFFSET(task_struct_thread_reg03));
fprintf(fp, " task_struct_thread_reg29: %ld\n", fprintf(fp, " task_struct_thread_eip: %ld\n",
OFFSET(task_struct_thread_reg29)); OFFSET(task_struct_thread_eip));
fprintf(fp, " task_struct_thread_reg31: %ld\n", fprintf(fp, " inactive_task_frame_bp: %ld\n", OFFSET(inactive_task_frame_bp));
-- --
2.33.0 2.43.0

View File

@ -1,6 +1,6 @@
Name: crash Name: crash
Version: 8.0.4 Version: 8.0.4
Release: 1 Release: 2
Summary: Linux kernel crash utility. Summary: Linux kernel crash utility.
License: GPLv3 License: GPLv3
URL: https://crash-utility.github.io URL: https://crash-utility.github.io
@ -13,7 +13,7 @@ Patch1: 0001-add-SDEI-stack-resolution.patch
Patch2: 0002-crash-8.0.2-sw.patch Patch2: 0002-crash-8.0.2-sw.patch
%endif %endif
%ifarch loongarch64 %ifarch loongarch64
Patch3: 0003-crash-add-loongarch-support.patch Patch3: 0003-crash-8.0.4-add-support-for-loongarch64.patch
%endif %endif
BuildRequires: ncurses-devel zlib-devel lzo-devel snappy-devel texinfo libzstd-devel BuildRequires: ncurses-devel zlib-devel lzo-devel snappy-devel texinfo libzstd-devel
@ -80,6 +80,10 @@ install -D -m 0644 defs.h %{buildroot}%{_includedir}/%{name}/defs.h
%{_mandir}/man8/crash.8* %{_mandir}/man8/crash.8*
%changelog %changelog
* Tue Apr 16 2024 Pengda Dou <doupengda@loongson.cn> - 8.0.4-2
- Resolve loongarch64 patch add error
- add support for loongarch64
* Thu Jan 25 2024 chenhaixiang<chenhaixiang3@huawei.com> - 8.0.4-1 * Thu Jan 25 2024 chenhaixiang<chenhaixiang3@huawei.com> - 8.0.4-1
- Upgrade to crash-8.0.4 - Upgrade to crash-8.0.4