diff mbox series

[Crash-utility,1/8] Add RISCV64 framework code support

Message ID 20220718025346.411758-2-xianting.tian@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series Support RISCV64 arch and common commands | expand

Commit Message

Xianting Tian July 18, 2022, 2:53 a.m. UTC
This patch mainly added some environment configurations, macro definitions,
specific architecture structures and some function declarations supported
by the RISCV64 architecture.

We can use the build command to get the simplest version crash tool:
	make target=RISCV64 -j2

Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
---
 Makefile            |   7 +-
 README              |   2 +-
 configure.c         |  39 ++++++++++-
 defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
 diskdump.c          |  11 +++-
 help.c              |   2 +-
 lkcd_vmdump_v2_v3.h |   2 +-
 netdump.c           |   9 ++-
 ramdump.c           |   2 +
 riscv64.c           |  56 ++++++++++++++++
 symbols.c           |  10 +++
 11 files changed, 285 insertions(+), 10 deletions(-)
 create mode 100644 riscv64.c

Comments

HAGIO KAZUHITO(萩尾 一仁) July 21, 2022, 8:17 a.m. UTC | #1
On 2022/07/18 11:53, Xianting Tian wrote:
> This patch mainly added some environment configurations, macro definitions,
> specific architecture structures and some function declarations supported
> by the RISCV64 architecture.
> 
> We can use the build command to get the simplest version crash tool:
> 	make target=RISCV64 -j2
> 
> Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
> ---
>   Makefile            |   7 +-
>   README              |   2 +-
>   configure.c         |  39 ++++++++++-
>   defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
>   diskdump.c          |  11 +++-
>   help.c              |   2 +-
>   lkcd_vmdump_v2_v3.h |   2 +-
>   netdump.c           |   9 ++-
>   ramdump.c           |   2 +
>   riscv64.c           |  56 ++++++++++++++++
>   symbols.c           |  10 +++
>   11 files changed, 285 insertions(+), 10 deletions(-)
>   create mode 100644 riscv64.c
> 
> diff --git a/Makefile b/Makefile
> index 162c2ba..54ebb43 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -64,7 +64,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 \
>   	printk.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 \
>   	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_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 \
>   	build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
>   	printk.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 \
>   	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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
> @@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
>   mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
>   	${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>   
> +riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
> +	${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
> +
>   sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
>   	${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>   
> diff --git a/README b/README
> index 5abbce1..5ac5b60 100644
> --- a/README
> +++ b/README
> @@ -37,7 +37,7 @@
>     These are the current prerequisites:
>   
>     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 architectures
>        may be addressed in the future.
>   
>     o  One size fits all -- the utility can be run on any Linux kernel version

For README, please append a description of x86_64 binary for riscv64
dumpfiles here:
---
   o  On an x86_64 host, an x86_64 binary that can be used to analyze
      ppc64le dumpfiles may be built by typing "make target=PPC64".

   Traditionally when vmcores are compressed via the makedumpfile(8) facility
---

> diff --git a/configure.c b/configure.c
> index 5188851..0d216d1 100644
> --- a/configure.c
> +++ b/configure.c
> @@ -107,6 +107,7 @@ void add_extra_lib(char *);
>   #undef MIPS
>   #undef SPARC64
>   #undef MIPS64
> +#undef RISCV64
>   
>   #define UNKNOWN 0
>   #define X86     1
> @@ -122,6 +123,7 @@ void add_extra_lib(char *);
>   #define MIPS    11
>   #define SPARC64 12
>   #define MIPS64  13
> +#define RISCV64 14
>   
>   #define TARGET_X86    "TARGET=X86"
>   #define TARGET_ALPHA  "TARGET=ALPHA"
> @@ -136,6 +138,7 @@ void add_extra_lib(char *);
>   #define TARGET_MIPS   "TARGET=MIPS"
>   #define TARGET_MIPS64 "TARGET=MIPS64"
>   #define TARGET_SPARC64 "TARGET=SPARC64"
> +#define TARGET_RISCV64 "TARGET=RISCV64"
>   
>   #define TARGET_CFLAGS_X86    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
>   #define TARGET_CFLAGS_ALPHA  "TARGET_CFLAGS="
> @@ -158,6 +161,8 @@ 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_RISCV64         "TARGET_CFLAGS="
> +#define TARGET_CFLAGS_RISCV64_ON_X86_64	"TARGET_CFLAGS="
>   
>   #define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
>   #define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
> @@ -168,6 +173,7 @@ void add_extra_lib(char *);
>   #define GDB_TARGET_PPC64_ON_X86_64  "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
>   #define GDB_TARGET_MIPS_ON_X86     "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
>   #define GDB_TARGET_MIPS_ON_X86_64  "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
> +#define GDB_TARGET_RISCV64_ON_X86_64  "GDB_CONF_FLAGS=--target=riscv64-unknown-linux-gnu"
>        
>   /*
>    *  The original plan was to allow the use of a particular version
> @@ -404,6 +410,9 @@ get_current_configuration(struct supported_gdb_version *sp)
>   #ifdef __sparc_v9__
>   	target_data.target = SPARC64;
>   #endif
> +#ifdef __riscv64__
> +	target_data.target = RISCV64;
> +#endif
>   
>   	set_initial_target(sp);
>   
> @@ -457,6 +466,12 @@ get_current_configuration(struct supported_gdb_version *sp)
>   			if ((target_data.initial_gdb_target != UNKNOWN) &&
>   			    (target_data.host != target_data.initial_gdb_target))
>   				arch_mismatch(sp);
> +		} else if ((target_data.target == X86_64) &&
> +			(name_to_target((char *)target_data.target_as_param) == RISCV64)) {
> +			/*
> +			 *  Build an RISCV64 crash binary on an X86_64 host.
> +			 */
> +			target_data.target = RISCV64;
>   		} else {
>   			fprintf(stderr,
>   			    "\ntarget=%s is not supported on the %s host architecture\n\n",
> @@ -497,6 +512,10 @@ get_current_configuration(struct supported_gdb_version *sp)
>   		    (target_data.target != MIPS64))
>   			arch_mismatch(sp);
>   
> +		if ((target_data.initial_gdb_target == RISCV64) &&
> +		    (target_data.target != RISCV64))
> +			arch_mismatch(sp);
> +

Please add the case where target_data.target is X86_64.  Otherwise,
the "sticky" target for build on x86_64 will not work:

$ make

The initial build in this source tree was for the RISCV64 architecture.

In order to build a crash binary for the X86_64 architecture:
  1. remove the gdb-10.2 subdirectory
  2. perform a "make clean"
  3. retry the build

make: *** [Makefile:252: all] Error 1

>   		if ((target_data.initial_gdb_target == X86) &&
>   		    (target_data.target != X86)) {
>   			if (target_data.target == X86_64)
> @@ -660,6 +679,9 @@ show_configuration(void)
>   	case SPARC64:
>   		printf("TARGET: SPARC64\n");
>   		break;
> +	case RISCV64:
> +		printf("TARGET: RISCV64\n");
> +		break;
>   	}
>   
>   	if (strlen(target_data.program)) {
> @@ -777,6 +799,14 @@ build_configure(struct supported_gdb_version *sp)
>   		target = TARGET_SPARC64;
>   		target_CFLAGS = TARGET_CFLAGS_SPARC64;
>   		break;
> +	case RISCV64:
> +		target = TARGET_RISCV64;
> +		if (target_data.host == X86_64) {
> +			target_CFLAGS = TARGET_CFLAGS_RISCV64_ON_X86_64;
> +			gdb_conf_flags = GDB_TARGET_RISCV64_ON_X86_64;
> +		} else
> +			target_CFLAGS = TARGET_CFLAGS_RISCV64;
> +		break;
>   	}
>   
>   	ldflags = get_extra_flags("LDFLAGS.extra", NULL);
> @@ -1374,7 +1404,7 @@ make_spec_file(struct supported_gdb_version *sp)
>   	printf("Vendor: Red Hat, Inc.\n");
>   	printf("Packager: Dave Anderson <anderson@redhat.com>\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("Buildroot: %%{_tmppath}/%%{name}-root\n");
>   	printf("BuildRequires: ncurses-devel zlib-devel bison\n");
>   	printf("Requires: binutils\n");
> @@ -1613,6 +1643,8 @@ set_initial_target(struct supported_gdb_version *sp)
>   		target_data.initial_gdb_target = MIPS;
>   	else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
>   		target_data.initial_gdb_target = SPARC64;
> +	else if (strncmp(buf, "RISCV64", strlen("RISCV64")) == 0)
> +		target_data.initial_gdb_target = RISCV64;
>   }
>   
>   char *
> @@ -1633,6 +1665,7 @@ target_to_name(int target)
>   	case MIPS:   return("MIPS");
>   	case MIPS64: return("MIPS64");
>   	case SPARC64: return("SPARC64");
> +	case RISCV64: return("RISCV64");
>   	}
>   
>   	return "UNKNOWN";
> @@ -1697,6 +1730,10 @@ name_to_target(char *name)
>   		return MIPS64;
>   	else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
>   		return SPARC64;
> +	else if (strncmp(name, "RISCV64", strlen("RISCV64")) == 0)
> +		return RISCV64;
> +	else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
> +		return RISCV64;
>   
>   	return UNKNOWN;
>   }
> diff --git a/defs.h b/defs.h
> index 9b1b69a..42ffba3 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -76,7 +76,7 @@
>   #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
>       !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
>       !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
> -    !defined(SPARC64)
> +    !defined(RISCV64) && !defined(SPARC64)
>   #ifdef __alpha__
>   #define ALPHA
>   #endif
> @@ -118,6 +118,9 @@
>   #ifdef __sparc_v9__
>   #define SPARC64
>   #endif
> +#ifdef __riscv64__
> +#define RISCV64
> +#endif
>   #endif
>   
>   #ifdef X86
> @@ -159,6 +162,9 @@
>   #ifdef SPARC64
>   #define NR_CPUS  (4096)
>   #endif
> +#ifdef RISCV64
> +#define NR_CPUS  (256)
> +#endif
>   
>   #define NR_DEVICE_DUMPS (64)
>   
> @@ -3484,6 +3490,63 @@ struct arm64_stackframe {
>   #define _MAX_PHYSMEM_BITS       48
>   #endif  /* MIPS64 */
>   
> +#ifdef RISCV64
> +#define _64BIT_
> +#define MACHINE_TYPE		"RISCV64"
> +
> +/*
> + * Direct memory mapping
> + */
> +#define PTOV(X)										\
> +	(((unsigned long)(X)+(machdep->kvbase)) - machdep->machspec->phys_base)
> +#define VTOP(X)	({									\
> +	ulong _X = X;									\
> +	(THIS_KERNEL_VERSION >= 0x50D00 &&						\

Please use LINUX(x,y,z) macro.

> +		(_X) >= machdep->machspec->kernel_link_addr) ?				\
> +		(((unsigned long)(_X)-(machdep->machspec->kernel_link_addr)) +		\
> +		 machdep->machspec->phys_base):						\
> +		(((unsigned long)(_X)-(machdep->kvbase)) +				\
> +		 machdep->machspec->phys_base);						\
> +	})
> +#define PAGEBASE(X)		(((ulong)(X)) & (ulong)machdep->pagemask)
> +
> +/*
> + * Stack size order
> + */
> +#define THREAD_SIZE_ORDER       2
> +
> +#define PAGE_OFFSET		(machdep->machspec->page_offset)
> +#define VMALLOC_START		(machdep->machspec->vmalloc_start_addr)
> +#define VMALLOC_END		(machdep->machspec->vmalloc_end)
> +#define VMEMMAP_VADDR		(machdep->machspec->vmemmap_vaddr)
> +#define VMEMMAP_END		(machdep->machspec->vmemmap_end)
> +#define MODULES_VADDR		(machdep->machspec->modules_vaddr)
> +#define MODULES_END		(machdep->machspec->modules_end)
> +#define IS_VMALLOC_ADDR(X)	riscv64_IS_VMALLOC_ADDR((ulong)(X))
> +
> +/* from arch/riscv/include/asm/pgtable.h */
> +#define __SWP_TYPE_SHIFT        6
> +#define __SWP_TYPE_BITS         5
> +#define __SWP_TYPE_MASK         ((1UL << __SWP_TYPE_BITS) - 1)
> +#define __SWP_OFFSET_SHIFT      (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
> +
> +#define MAX_SWAPFILES_CHECK()   BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
> +
> +#define SWP_TYPE(entry)		(((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
> +#define SWP_OFFSET(entry)	((entry) >> __SWP_OFFSET_SHIFT)
> +#define __swp_type(entry)       SWP_TYPE(entry)
> +#define __swp_offset(entry)     SWP_OFFSET(entry)
> +
> +#define TIF_SIGPENDING          (THIS_KERNEL_VERSION >= LINUX(2,6,23) ? 1 : 2)
> +
> +/* from arch/riscv/include/asm/sparsemem.h */
> +#define _SECTION_SIZE_BITS      27
> +#define _MAX_PHYSMEM_BITS       56 /* 56-bit physical address supported */
> +#define PHYS_MASK_SHIFT		_MAX_PHYSMEM_BITS
> +#define PHYS_MASK		(((1UL) << PHYS_MASK_SHIFT) - 1)
> +
> +#endif  /* RISCV64 */

Spaces and tabs for indent are mixed in this ifdef block, please use
tabs usually if you have no intention.

Thanks,
Kazu

> +
>   #ifdef X86
>   #define _32BIT_
>   #define MACHINE_TYPE       "X86"
> @@ -4532,6 +4595,10 @@ struct machine_specific {
>   #define MAX_HEXADDR_STRLEN (16)
>   #define UVADDR_PRLEN      (16)
>   #endif
> +#ifdef RISCV64
> +#define MAX_HEXADDR_STRLEN (16)
> +#define UVADDR_PRLEN       (16)
> +#endif
>   
>   #define BADADDR  ((ulong)(-1))
>   #define BADVAL   ((ulong)(-1))
> @@ -5126,6 +5193,9 @@ void dump_build_data(void);
>   #ifdef MIPS64
>   #define machdep_init(X) mips64_init(X)
>   #endif
> +#ifdef RISCV64
> +#define machdep_init(X) riscv64_init(X)
> +#endif
>   #ifdef SPARC64
>   #define machdep_init(X) sparc64_init(X)
>   #endif
> @@ -5606,6 +5676,9 @@ void display_help_screen(char *);
>   #ifdef SPARC64
>   #define dump_machdep_table(X) sparc64_dump_machdep_table(X)
>   #endif
> +#ifdef RISCV64
> +#define dump_machdep_table(X) riscv64_dump_machdep_table(X)
> +#endif
>   extern char *help_pointer[];
>   extern char *help_alias[];
>   extern char *help_ascii[];
> @@ -6682,6 +6755,86 @@ struct machine_specific {
>   
>   #endif /* MIPS64 */
>   
> +/*
> + * riscv64.c
> + */
> +void riscv64_display_regs_from_elf_notes(int, FILE *);
> +
> +#ifdef RISCV64
> +void riscv64_init(int);
> +void riscv64_dump_machdep_table(ulong);
> +int riscv64_IS_VMALLOC_ADDR(ulong);
> +
> +#define display_idt_table() \
> +	error(FATAL, "-d option is not applicable to RISCV64 architecture\n")
> +
> +/* from arch/riscv/include/asm/ptrace.h */
> +struct riscv64_register {
> +	ulong regs[36];
> +};
> +
> +struct riscv64_pt_regs {
> +	ulong badvaddr;
> +	ulong cause;
> +	ulong epc;
> +};
> +
> +struct riscv64_unwind_frame {
> +	ulong fp;
> +	ulong sp;
> +	ulong pc;
> +};
> +
> +#define KSYMS_START	(0x1)
> +
> +struct machine_specific {
> +	ulong phys_base;
> +	ulong page_offset;
> +	ulong vmalloc_start_addr;
> +	ulong vmalloc_end;
> +	ulong vmemmap_vaddr;
> +	ulong vmemmap_end;
> +	ulong modules_vaddr;
> +	ulong modules_end;
> +	ulong kernel_link_addr;
> +	ulong address_space_end;
> +
> +	ulong _page_present;
> +	ulong _page_read;
> +	ulong _page_write;
> +	ulong _page_exec;
> +	ulong _page_user;
> +	ulong _page_global;
> +	ulong _page_accessed;
> +	ulong _page_dirty;
> +	ulong _page_soft;
> +
> +	ulong _pfn_shift;
> +
> +	struct riscv64_register *crash_task_regs;
> +};
> +/* from arch/riscv/include/asm/pgtable-bits.h */
> +#define 	_PAGE_PRESENT	(machdep->machspec->_page_present)
> +#define 	_PAGE_READ	(machdep->machspec->_page_read)
> +#define 	_PAGE_WRITE	(machdep->machspec->_page_write)
> +#define 	_PAGE_EXEC	(machdep->machspec->_page_exec)
> +#define 	_PAGE_USER	(machdep->machspec->_page_user)
> +#define 	_PAGE_GLOBAL	(machdep->machspec->_page_global)
> +#define 	_PAGE_ACCESSED	(machdep->machspec->_page_accessed)
> +#define 	_PAGE_DIRTY	(machdep->machspec->_page_dirty)
> +#define 	_PAGE_SOFT	(machdep->machspec->_page_soft)
> +#define 	_PAGE_SEC	(machdep->machspec->_page_sec)
> +#define 	_PAGE_SHARE	(machdep->machspec->_page_share)
> +#define 	_PAGE_BUF	(machdep->machspec->_page_buf)
> +#define 	_PAGE_CACHE	(machdep->machspec->_page_cache)
> +#define 	_PAGE_SO	(machdep->machspec->_page_so)
> +#define 	_PAGE_SPECIAL	_PAGE_SOFT
> +#define		_PAGE_TABLE	_PAGE_PRESENT
> +#define 	_PAGE_PROT_NONE	_PAGE_READ
> +#define 	_PAGE_PFN_SHIFT	10
> +
> +#endif /* RISCV64 */
> +
>   /*
>    * sparc64.c
>    */
> diff --git a/diskdump.c b/diskdump.c
> index 2c1f9be..28503bc 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -622,6 +622,9 @@ restart:
>   	else if (STRNEQ(header->utsname.machine, "aarch64") &&
>   	    machine_type_mismatch(file, "ARM64", NULL, 0))
>   		goto err;
> +	else if (STRNEQ(header->utsname.machine, "riscv64") &&
> +	    machine_type_mismatch(file, "RISCV64", NULL, 0))
> +		goto err;
>   
>   	if (header->block_size != block_size) {
>   		block_size = header->block_size;
> @@ -780,6 +783,8 @@ restart:
>   		dd->machine_type = EM_AARCH64;
>   	else if (machine_type("SPARC64"))
>   		dd->machine_type = EM_SPARCV9;
> +	else if (machine_type("RISCV64"))
> +		dd->machine_type = EM_RISCV;
>   	else {
>   		error(INFO, "%s: unsupported machine type: %s\n",
>   			DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
> @@ -1751,7 +1756,8 @@ dump_note_offsets(FILE *fp)
>   			qemu = FALSE;
>   			if (machine_type("X86_64") || machine_type("S390X") ||
>   			    machine_type("ARM64") || machine_type("PPC64") ||
> -			    machine_type("SPARC64") || machine_type("MIPS64")) {
> +			    machine_type("SPARC64") || machine_type("MIPS64") ||
> +			    machine_type("RISCV64")) {
>   				note64 = (void *)dd->notes_buf + tot;
>   				len = sizeof(Elf64_Nhdr);
>   				if (STRNEQ((char *)note64 + len, "QEMU"))
> @@ -2558,7 +2564,8 @@ dump_registers_for_compressed_kdump(void)
>   	if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
>   	    !(machine_type("X86") || machine_type("X86_64") ||
>   	      machine_type("ARM64") || machine_type("PPC64") ||
> -	      machine_type("MIPS") || machine_type("MIPS64")))
> +	      machine_type("MIPS") || machine_type("MIPS64") ||
> +	      machine_type("RISCV64")))
>   		error(FATAL, "-r option not supported for this dumpfile\n");
>   
>   	if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
> diff --git a/help.c b/help.c
> index 99214c1..253c71b 100644
> --- a/help.c
> +++ b/help.c
> @@ -9512,7 +9512,7 @@ char *README[] = {
>   "  These are the current prerequisites: ",
>   "",
>   "  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 architectures",
>   "     may be addressed in the future.",
>   "",
>   "  o  One size fits all -- the utility can be run on any Linux kernel version",
> diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
> index 984c2c2..7fa70b9 100644
> --- a/lkcd_vmdump_v2_v3.h
> +++ b/lkcd_vmdump_v2_v3.h
> @@ -37,7 +37,7 @@
>   
>   #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
>   	defined(S390X) || defined(ARM64) || defined(MIPS) || \
> -	defined(MIPS64) || defined(SPARC64)
> +	defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
>   
>   /*
>    * Kernel header file for Linux crash dumps.
> diff --git a/netdump.c b/netdump.c
> index ff273b4..4ec12a0 100644
> --- a/netdump.c
> +++ b/netdump.c
> @@ -300,6 +300,12 @@ is_netdump(char *file, ulong source_query)
>   				goto bailout;
>   			break;
>   
> +		case EM_RISCV:
> +			if (machine_type_mismatch(file, "RISCV64", NULL,
> +			    source_query))
> +				goto bailout;
> +			break;
> +
>   		default:
>   			if (machine_type_mismatch(file, "(unknown)", NULL,
>   			    source_query))
> @@ -2935,7 +2941,8 @@ dump_registers_for_elf_dumpfiles(void)
>   
>           if (!(machine_type("X86") || machine_type("X86_64") ||
>   	    machine_type("ARM64") || machine_type("PPC64") ||
> -	    machine_type("MIPS") || machine_type("MIPS64")))
> +	    machine_type("MIPS") || machine_type("MIPS64") ||
> +	    machine_type("RISCV64")))
>                   error(FATAL, "-r option not supported for this dumpfile\n");
>   
>   	if (NETDUMP_DUMPFILE()) {
> diff --git a/ramdump.c b/ramdump.c
> index a206fcb..d2bd7ff 100644
> --- a/ramdump.c
> +++ b/ramdump.c
> @@ -188,6 +188,8 @@ char *ramdump_to_elf(void)
>   		e_machine = EM_MIPS;
>   	else if (machine_type("X86_64"))
>   		e_machine = EM_X86_64;
> +	else if (machine_type("RISCV64"))
> +		e_machine = EM_RISCV;
>   	else
>   		error(FATAL, "ramdump: unsupported machine type: %s\n",
>   			MACHINE_TYPE);
> diff --git a/riscv64.c b/riscv64.c
> new file mode 100644
> index 0000000..c7df857
> --- /dev/null
> +++ b/riscv64.c
> @@ -0,0 +1,56 @@
> +/* riscv64.c - core analysis suite
> + *
> + * Copyright (C) 2022 Alibaba Group Holding Limited.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 General Public License for more details.
> + */
> +#ifdef RISCV64
> +
> +#include <elf.h>
> +#include "defs.h"
> +
> +void
> +riscv64_dump_machdep_table(ulong arg)
> +{
> +}
> +
> +/*
> + *  Include both vmalloc'd and module address space as VMALLOC space.
> + */
> +int
> +riscv64_IS_VMALLOC_ADDR(ulong vaddr)
> +{
> +	return ((vaddr >= VMALLOC_START && vaddr <= VMALLOC_END) ||
> +		(vaddr >= VMEMMAP_VADDR && vaddr <= VMEMMAP_END) ||
> +		(vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
> +}
> +
> +void
> +riscv64_init(int when)
> +{
> +}
> +
> +void
> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
> +{
> +}
> +
> +#else /* !RISCV64 */
> +
> +#include "defs.h"
> +
> +void
> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
> +{
> +	return;
> +}
> +
> +#endif /* !RISCV64 */
> diff --git a/symbols.c b/symbols.c
> index bee1faf..ea9e83e 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -3743,6 +3743,11 @@ is_kernel(char *file)
>   				goto bailout;
>   			break;
>   
> +		case EM_RISCV:
> +			if (machine_type_mismatch(file, "RISCV64", NULL, 0))
> +				goto bailout;
> +			break;
> +
>   		default:
>   			if (machine_type_mismatch(file, "(unknown)", NULL, 0))
>   				goto bailout;
> @@ -4002,6 +4007,11 @@ is_shared_object(char *file)
>   			if (machine_type("MIPS64"))
>   				return TRUE;
>   			break;
> +
> +		case EM_RISCV:
> +			if (machine_type("RISCV64"))
> +				return TRUE;
> +			break;
>   		}
>   
>   		if (CRASHDEBUG(1))
Heinrich Schuchardt July 21, 2022, 8:57 a.m. UTC | #2
On 7/21/22 10:17, HAGIO KAZUHITO(萩尾 一仁) wrote:
> On 2022/07/18 11:53, Xianting Tian wrote:
>> This patch mainly added some environment configurations, macro definitions,
>> specific architecture structures and some function declarations supported
>> by the RISCV64 architecture.
>>
>> We can use the build command to get the simplest version crash tool:
>> 	make target=RISCV64 -j2
>>
>> Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
>> ---
>>    Makefile            |   7 +-
>>    README              |   2 +-
>>    configure.c         |  39 ++++++++++-
>>    defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
>>    diskdump.c          |  11 +++-
>>    help.c              |   2 +-
>>    lkcd_vmdump_v2_v3.h |   2 +-
>>    netdump.c           |   9 ++-
>>    ramdump.c           |   2 +
>>    riscv64.c           |  56 ++++++++++++++++
>>    symbols.c           |  10 +++
>>    11 files changed, 285 insertions(+), 10 deletions(-)
>>    create mode 100644 riscv64.c
>>
>> diff --git a/Makefile b/Makefile
>> index 162c2ba..54ebb43 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -64,7 +64,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 \
>>    	printk.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 \
>>    	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_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 \
>>    	build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
>>    	printk.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 \
>>    	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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
>> @@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
>>    mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
>>    	${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>    
>> +riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
>> +	${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>> +
>>    sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
>>    	${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>    
>> diff --git a/README b/README
>> index 5abbce1..5ac5b60 100644
>> --- a/README
>> +++ b/README
>> @@ -37,7 +37,7 @@
>>      These are the current prerequisites:
>>    
>>      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 architectures
>>         may be addressed in the future.
>>    
>>      o  One size fits all -- the utility can be run on any Linux kernel version
> 
> For README, please append a description of x86_64 binary for riscv64
> dumpfiles here:
> ---
>     o  On an x86_64 host, an x86_64 binary that can be used to analyze
>        ppc64le dumpfiles may be built by typing "make target=PPC64".

Shouldn't debugging of a riscv64 crash binary also be possible on riscv64?

Best regards

Heinrich
HAGIO KAZUHITO(萩尾 一仁) July 21, 2022, 9:22 a.m. UTC | #3
On 2022/07/21 17:57, Heinrich Schuchardt wrote:
> On 7/21/22 10:17, HAGIO KAZUHITO(萩尾 一仁) wrote:
>> On 2022/07/18 11:53, Xianting Tian wrote:
>>> This patch mainly added some environment configurations, macro definitions,
>>> specific architecture structures and some function declarations supported
>>> by the RISCV64 architecture.
>>>
>>> We can use the build command to get the simplest version crash tool:
>>>     make target=RISCV64 -j2
>>>
>>> Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
>>> ---
>>>    Makefile            |   7 +-
>>>    README              |   2 +-
>>>    configure.c         |  39 ++++++++++-
>>>    defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
>>>    diskdump.c          |  11 +++-
>>>    help.c              |   2 +-
>>>    lkcd_vmdump_v2_v3.h |   2 +-
>>>    netdump.c           |   9 ++-
>>>    ramdump.c           |   2 +
>>>    riscv64.c           |  56 ++++++++++++++++
>>>    symbols.c           |  10 +++
>>>    11 files changed, 285 insertions(+), 10 deletions(-)
>>>    create mode 100644 riscv64.c
>>>
>>> diff --git a/Makefile b/Makefile
>>> index 162c2ba..54ebb43 100644
>>> --- a/Makefile
>>> +++ b/Makefile
>>> @@ -64,7 +64,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 \
>>>        printk.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 \
>>>        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_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 \
>>>        build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
>>>        printk.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 \
>>>        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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
>>> @@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
>>>    mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
>>>        ${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>> +riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
>>> +    ${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>> +
>>>    sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
>>>        ${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>> diff --git a/README b/README
>>> index 5abbce1..5ac5b60 100644
>>> --- a/README
>>> +++ b/README
>>> @@ -37,7 +37,7 @@
>>>      These are the current prerequisites:
>>>      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 architectures
>>>         may be addressed in the future.
>>>      o  One size fits all -- the utility can be run on any Linux kernel version
>>
>> For README, please append a description of x86_64 binary for riscv64
>> dumpfiles here:
>> ---
>>     o  On an x86_64 host, an x86_64 binary that can be used to analyze
>>        ppc64le dumpfiles may be built by typing "make target=PPC64".
> 
> Shouldn't debugging of a riscv64 crash binary also be possible on riscv64?

Yes, my comment is an additional request about the README file.
Does this answer your question?

Thanks,
Kazu
Yixun Lan July 27, 2022, 2:33 p.m. UTC | #4
On Mon, Jul 18, 2022 at 2:55 AM Xianting Tian
<xianting.tian@linux.alibaba.com> wrote:
>
> This patch mainly added some environment configurations, macro definitions,
> specific architecture structures and some function declarations supported
> by the RISCV64 architecture.
>
> We can use the build command to get the simplest version crash tool:
>         make target=RISCV64 -j2
>
> Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
> ---
>  Makefile            |   7 +-
>  README              |   2 +-
>  configure.c         |  39 ++++++++++-
>  defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
>  diskdump.c          |  11 +++-
>  help.c              |   2 +-
>  lkcd_vmdump_v2_v3.h |   2 +-
>  netdump.c           |   9 ++-
>  ramdump.c           |   2 +
>  riscv64.c           |  56 ++++++++++++++++
>  symbols.c           |  10 +++
>  11 files changed, 285 insertions(+), 10 deletions(-)
>  create mode 100644 riscv64.c
>
> diff --git a/Makefile b/Makefile
> index 162c2ba..54ebb43 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -64,7 +64,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 \
>         printk.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 \
>         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_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 \
>         build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
>         printk.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 \
>         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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
> @@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
>  mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
>         ${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>
> +riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
> +       ${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
> +
>  sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
>         ${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>
> diff --git a/README b/README
> index 5abbce1..5ac5b60 100644
> --- a/README
> +++ b/README
> @@ -37,7 +37,7 @@
>    These are the current prerequisites:
>
>    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 architectures
>       may be addressed in the future.
>
>    o  One size fits all -- the utility can be run on any Linux kernel version
> diff --git a/configure.c b/configure.c
> index 5188851..0d216d1 100644
> --- a/configure.c
> +++ b/configure.c
> @@ -107,6 +107,7 @@ void add_extra_lib(char *);
>  #undef MIPS
>  #undef SPARC64
>  #undef MIPS64
> +#undef RISCV64
>
>  #define UNKNOWN 0
>  #define X86     1
> @@ -122,6 +123,7 @@ void add_extra_lib(char *);
>  #define MIPS    11
>  #define SPARC64 12
>  #define MIPS64  13
> +#define RISCV64 14
>
>  #define TARGET_X86    "TARGET=X86"
>  #define TARGET_ALPHA  "TARGET=ALPHA"
> @@ -136,6 +138,7 @@ void add_extra_lib(char *);
>  #define TARGET_MIPS   "TARGET=MIPS"
>  #define TARGET_MIPS64 "TARGET=MIPS64"
>  #define TARGET_SPARC64 "TARGET=SPARC64"
> +#define TARGET_RISCV64 "TARGET=RISCV64"
>
>  #define TARGET_CFLAGS_X86    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
>  #define TARGET_CFLAGS_ALPHA  "TARGET_CFLAGS="
> @@ -158,6 +161,8 @@ 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_RISCV64         "TARGET_CFLAGS="
> +#define TARGET_CFLAGS_RISCV64_ON_X86_64        "TARGET_CFLAGS="
>
>  #define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
>  #define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
> @@ -168,6 +173,7 @@ void add_extra_lib(char *);
>  #define GDB_TARGET_PPC64_ON_X86_64  "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
>  #define GDB_TARGET_MIPS_ON_X86     "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
>  #define GDB_TARGET_MIPS_ON_X86_64  "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
> +#define GDB_TARGET_RISCV64_ON_X86_64  "GDB_CONF_FLAGS=--target=riscv64-unknown-linux-gnu"
>
>  /*
>   *  The original plan was to allow the use of a particular version
> @@ -404,6 +410,9 @@ get_current_configuration(struct supported_gdb_version *sp)
>  #ifdef __sparc_v9__
>         target_data.target = SPARC64;
>  #endif
> +#ifdef __riscv64__
> +       target_data.target = RISCV64;
> +#endif
>
>         set_initial_target(sp);
>
> @@ -457,6 +466,12 @@ get_current_configuration(struct supported_gdb_version *sp)
>                         if ((target_data.initial_gdb_target != UNKNOWN) &&
>                             (target_data.host != target_data.initial_gdb_target))
>                                 arch_mismatch(sp);
> +               } else if ((target_data.target == X86_64) &&
> +                       (name_to_target((char *)target_data.target_as_param) == RISCV64)) {
> +                       /*
> +                        *  Build an RISCV64 crash binary on an X86_64 host.
> +                        */
> +                       target_data.target = RISCV64;
>                 } else {
>                         fprintf(stderr,
>                             "\ntarget=%s is not supported on the %s host architecture\n\n",
> @@ -497,6 +512,10 @@ get_current_configuration(struct supported_gdb_version *sp)
>                     (target_data.target != MIPS64))
>                         arch_mismatch(sp);
>
> +               if ((target_data.initial_gdb_target == RISCV64) &&
> +                   (target_data.target != RISCV64))
> +                       arch_mismatch(sp);
> +
>                 if ((target_data.initial_gdb_target == X86) &&
>                     (target_data.target != X86)) {
>                         if (target_data.target == X86_64)
> @@ -660,6 +679,9 @@ show_configuration(void)
>         case SPARC64:
>                 printf("TARGET: SPARC64\n");
>                 break;
> +       case RISCV64:
> +               printf("TARGET: RISCV64\n");
> +               break;
>         }
>
>         if (strlen(target_data.program)) {
> @@ -777,6 +799,14 @@ build_configure(struct supported_gdb_version *sp)
>                 target = TARGET_SPARC64;
>                 target_CFLAGS = TARGET_CFLAGS_SPARC64;
>                 break;
> +       case RISCV64:
> +               target = TARGET_RISCV64;
> +               if (target_data.host == X86_64) {
> +                       target_CFLAGS = TARGET_CFLAGS_RISCV64_ON_X86_64;
> +                       gdb_conf_flags = GDB_TARGET_RISCV64_ON_X86_64;
> +               } else
> +                       target_CFLAGS = TARGET_CFLAGS_RISCV64;
> +               break;
>         }
>
>         ldflags = get_extra_flags("LDFLAGS.extra", NULL);
> @@ -1374,7 +1404,7 @@ make_spec_file(struct supported_gdb_version *sp)
>         printf("Vendor: Red Hat, Inc.\n");
>         printf("Packager: Dave Anderson <anderson@redhat.com>\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("Buildroot: %%{_tmppath}/%%{name}-root\n");
>         printf("BuildRequires: ncurses-devel zlib-devel bison\n");
>         printf("Requires: binutils\n");
> @@ -1613,6 +1643,8 @@ set_initial_target(struct supported_gdb_version *sp)
>                 target_data.initial_gdb_target = MIPS;
>         else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
>                 target_data.initial_gdb_target = SPARC64;
> +       else if (strncmp(buf, "RISCV64", strlen("RISCV64")) == 0)
> +               target_data.initial_gdb_target = RISCV64;
>  }
>
>  char *
> @@ -1633,6 +1665,7 @@ target_to_name(int target)
>         case MIPS:   return("MIPS");
>         case MIPS64: return("MIPS64");
>         case SPARC64: return("SPARC64");
> +       case RISCV64: return("RISCV64");
>         }
>
>         return "UNKNOWN";
> @@ -1697,6 +1730,10 @@ name_to_target(char *name)
>                 return MIPS64;
>         else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
>                 return SPARC64;
> +       else if (strncmp(name, "RISCV64", strlen("RISCV64")) == 0)
> +               return RISCV64;
> +       else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
> +               return RISCV64;
>
>         return UNKNOWN;
>  }
> diff --git a/defs.h b/defs.h
> index 9b1b69a..42ffba3 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -76,7 +76,7 @@
>  #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
>      !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
>      !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
> -    !defined(SPARC64)
> +    !defined(RISCV64) && !defined(SPARC64)
>  #ifdef __alpha__
>  #define ALPHA
>  #endif
> @@ -118,6 +118,9 @@
>  #ifdef __sparc_v9__
>  #define SPARC64
>  #endif
> +#ifdef __riscv64__
this is wrong, should be
 #if defined(__riscv) && (__riscv_xlen == 64)

> +#define RISCV64
> +#endif
>  #endif
>
>  #ifdef X86
> @@ -159,6 +162,9 @@
>  #ifdef SPARC64
>  #define NR_CPUS  (4096)
>  #endif
> +#ifdef RISCV64
> +#define NR_CPUS  (256)
> +#endif
>
>  #define NR_DEVICE_DUMPS (64)
>
> @@ -3484,6 +3490,63 @@ struct arm64_stackframe {
>  #define _MAX_PHYSMEM_BITS       48
>  #endif  /* MIPS64 */
>
> +#ifdef RISCV64
> +#define _64BIT_
> +#define MACHINE_TYPE           "RISCV64"
> +
> +/*
> + * Direct memory mapping
> + */
> +#define PTOV(X)                                                                                \
> +       (((unsigned long)(X)+(machdep->kvbase)) - machdep->machspec->phys_base)
> +#define VTOP(X)        ({                                                                      \
> +       ulong _X = X;                                                                   \
> +       (THIS_KERNEL_VERSION >= 0x50D00 &&                                              \
> +               (_X) >= machdep->machspec->kernel_link_addr) ?                          \
> +               (((unsigned long)(_X)-(machdep->machspec->kernel_link_addr)) +          \
> +                machdep->machspec->phys_base):                                         \
> +               (((unsigned long)(_X)-(machdep->kvbase)) +                              \
> +                machdep->machspec->phys_base);                                         \
> +       })
> +#define PAGEBASE(X)            (((ulong)(X)) & (ulong)machdep->pagemask)
> +
> +/*
> + * Stack size order
> + */
> +#define THREAD_SIZE_ORDER       2
> +
> +#define PAGE_OFFSET            (machdep->machspec->page_offset)
> +#define VMALLOC_START          (machdep->machspec->vmalloc_start_addr)
> +#define VMALLOC_END            (machdep->machspec->vmalloc_end)
> +#define VMEMMAP_VADDR          (machdep->machspec->vmemmap_vaddr)
> +#define VMEMMAP_END            (machdep->machspec->vmemmap_end)
> +#define MODULES_VADDR          (machdep->machspec->modules_vaddr)
> +#define MODULES_END            (machdep->machspec->modules_end)
> +#define IS_VMALLOC_ADDR(X)     riscv64_IS_VMALLOC_ADDR((ulong)(X))
> +
> +/* from arch/riscv/include/asm/pgtable.h */
> +#define __SWP_TYPE_SHIFT        6
> +#define __SWP_TYPE_BITS         5
> +#define __SWP_TYPE_MASK         ((1UL << __SWP_TYPE_BITS) - 1)
> +#define __SWP_OFFSET_SHIFT      (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
> +
> +#define MAX_SWAPFILES_CHECK()   BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
> +
> +#define SWP_TYPE(entry)                (((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
> +#define SWP_OFFSET(entry)      ((entry) >> __SWP_OFFSET_SHIFT)
> +#define __swp_type(entry)       SWP_TYPE(entry)
> +#define __swp_offset(entry)     SWP_OFFSET(entry)
> +
> +#define TIF_SIGPENDING          (THIS_KERNEL_VERSION >= LINUX(2,6,23) ? 1 : 2)
> +
> +/* from arch/riscv/include/asm/sparsemem.h */
> +#define _SECTION_SIZE_BITS      27
> +#define _MAX_PHYSMEM_BITS       56 /* 56-bit physical address supported */
> +#define PHYS_MASK_SHIFT                _MAX_PHYSMEM_BITS
> +#define PHYS_MASK              (((1UL) << PHYS_MASK_SHIFT) - 1)
> +
> +#endif  /* RISCV64 */
> +
>  #ifdef X86
>  #define _32BIT_
>  #define MACHINE_TYPE       "X86"
> @@ -4532,6 +4595,10 @@ struct machine_specific {
>  #define MAX_HEXADDR_STRLEN (16)
>  #define UVADDR_PRLEN      (16)
>  #endif
> +#ifdef RISCV64
> +#define MAX_HEXADDR_STRLEN (16)
> +#define UVADDR_PRLEN       (16)
> +#endif
>
>  #define BADADDR  ((ulong)(-1))
>  #define BADVAL   ((ulong)(-1))
> @@ -5126,6 +5193,9 @@ void dump_build_data(void);
>  #ifdef MIPS64
>  #define machdep_init(X) mips64_init(X)
>  #endif
> +#ifdef RISCV64
> +#define machdep_init(X) riscv64_init(X)
> +#endif
>  #ifdef SPARC64
>  #define machdep_init(X) sparc64_init(X)
>  #endif
> @@ -5606,6 +5676,9 @@ void display_help_screen(char *);
>  #ifdef SPARC64
>  #define dump_machdep_table(X) sparc64_dump_machdep_table(X)
>  #endif
> +#ifdef RISCV64
> +#define dump_machdep_table(X) riscv64_dump_machdep_table(X)
> +#endif
>  extern char *help_pointer[];
>  extern char *help_alias[];
>  extern char *help_ascii[];
> @@ -6682,6 +6755,86 @@ struct machine_specific {
>
>  #endif /* MIPS64 */
>
> +/*
> + * riscv64.c
> + */
> +void riscv64_display_regs_from_elf_notes(int, FILE *);
> +
> +#ifdef RISCV64
> +void riscv64_init(int);
> +void riscv64_dump_machdep_table(ulong);
> +int riscv64_IS_VMALLOC_ADDR(ulong);
> +
> +#define display_idt_table() \
> +       error(FATAL, "-d option is not applicable to RISCV64 architecture\n")
> +
> +/* from arch/riscv/include/asm/ptrace.h */
> +struct riscv64_register {
> +       ulong regs[36];
> +};
> +
> +struct riscv64_pt_regs {
> +       ulong badvaddr;
> +       ulong cause;
> +       ulong epc;
> +};
> +
> +struct riscv64_unwind_frame {
> +       ulong fp;
> +       ulong sp;
> +       ulong pc;
> +};
> +
> +#define KSYMS_START    (0x1)
> +
> +struct machine_specific {
> +       ulong phys_base;
> +       ulong page_offset;
> +       ulong vmalloc_start_addr;
> +       ulong vmalloc_end;
> +       ulong vmemmap_vaddr;
> +       ulong vmemmap_end;
> +       ulong modules_vaddr;
> +       ulong modules_end;
> +       ulong kernel_link_addr;
> +       ulong address_space_end;
> +
> +       ulong _page_present;
> +       ulong _page_read;
> +       ulong _page_write;
> +       ulong _page_exec;
> +       ulong _page_user;
> +       ulong _page_global;
> +       ulong _page_accessed;
> +       ulong _page_dirty;
> +       ulong _page_soft;
> +
> +       ulong _pfn_shift;
> +
> +       struct riscv64_register *crash_task_regs;
> +};
> +/* from arch/riscv/include/asm/pgtable-bits.h */
> +#define        _PAGE_PRESENT   (machdep->machspec->_page_present)
> +#define        _PAGE_READ      (machdep->machspec->_page_read)
> +#define        _PAGE_WRITE     (machdep->machspec->_page_write)
> +#define        _PAGE_EXEC      (machdep->machspec->_page_exec)
> +#define        _PAGE_USER      (machdep->machspec->_page_user)
> +#define        _PAGE_GLOBAL    (machdep->machspec->_page_global)
> +#define        _PAGE_ACCESSED  (machdep->machspec->_page_accessed)
> +#define        _PAGE_DIRTY     (machdep->machspec->_page_dirty)
> +#define        _PAGE_SOFT      (machdep->machspec->_page_soft)
> +#define        _PAGE_SEC       (machdep->machspec->_page_sec)
> +#define        _PAGE_SHARE     (machdep->machspec->_page_share)
> +#define        _PAGE_BUF       (machdep->machspec->_page_buf)
> +#define        _PAGE_CACHE     (machdep->machspec->_page_cache)
> +#define        _PAGE_SO        (machdep->machspec->_page_so)
> +#define        _PAGE_SPECIAL   _PAGE_SOFT
> +#define                _PAGE_TABLE     _PAGE_PRESENT
> +#define        _PAGE_PROT_NONE _PAGE_READ
> +#define        _PAGE_PFN_SHIFT 10
> +
> +#endif /* RISCV64 */
> +
>  /*
>   * sparc64.c
>   */
> diff --git a/diskdump.c b/diskdump.c
> index 2c1f9be..28503bc 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -622,6 +622,9 @@ restart:
>         else if (STRNEQ(header->utsname.machine, "aarch64") &&
>             machine_type_mismatch(file, "ARM64", NULL, 0))
>                 goto err;
> +       else if (STRNEQ(header->utsname.machine, "riscv64") &&
> +           machine_type_mismatch(file, "RISCV64", NULL, 0))
> +               goto err;
>
>         if (header->block_size != block_size) {
>                 block_size = header->block_size;
> @@ -780,6 +783,8 @@ restart:
>                 dd->machine_type = EM_AARCH64;
>         else if (machine_type("SPARC64"))
>                 dd->machine_type = EM_SPARCV9;
> +       else if (machine_type("RISCV64"))
> +               dd->machine_type = EM_RISCV;
>         else {
>                 error(INFO, "%s: unsupported machine type: %s\n",
>                         DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
> @@ -1751,7 +1756,8 @@ dump_note_offsets(FILE *fp)
>                         qemu = FALSE;
>                         if (machine_type("X86_64") || machine_type("S390X") ||
>                             machine_type("ARM64") || machine_type("PPC64") ||
> -                           machine_type("SPARC64") || machine_type("MIPS64")) {
> +                           machine_type("SPARC64") || machine_type("MIPS64") ||
> +                           machine_type("RISCV64")) {
>                                 note64 = (void *)dd->notes_buf + tot;
>                                 len = sizeof(Elf64_Nhdr);
>                                 if (STRNEQ((char *)note64 + len, "QEMU"))
> @@ -2558,7 +2564,8 @@ dump_registers_for_compressed_kdump(void)
>         if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
>             !(machine_type("X86") || machine_type("X86_64") ||
>               machine_type("ARM64") || machine_type("PPC64") ||
> -             machine_type("MIPS") || machine_type("MIPS64")))
> +             machine_type("MIPS") || machine_type("MIPS64") ||
> +             machine_type("RISCV64")))
>                 error(FATAL, "-r option not supported for this dumpfile\n");
>
>         if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
> diff --git a/help.c b/help.c
> index 99214c1..253c71b 100644
> --- a/help.c
> +++ b/help.c
> @@ -9512,7 +9512,7 @@ char *README[] = {
>  "  These are the current prerequisites: ",
>  "",
>  "  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 architectures",
>  "     may be addressed in the future.",
>  "",
>  "  o  One size fits all -- the utility can be run on any Linux kernel version",
> diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
> index 984c2c2..7fa70b9 100644
> --- a/lkcd_vmdump_v2_v3.h
> +++ b/lkcd_vmdump_v2_v3.h
> @@ -37,7 +37,7 @@
>
>  #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
>         defined(S390X) || defined(ARM64) || defined(MIPS) || \
> -       defined(MIPS64) || defined(SPARC64)
> +       defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
>
>  /*
>   * Kernel header file for Linux crash dumps.
> diff --git a/netdump.c b/netdump.c
> index ff273b4..4ec12a0 100644
> --- a/netdump.c
> +++ b/netdump.c
> @@ -300,6 +300,12 @@ is_netdump(char *file, ulong source_query)
>                                 goto bailout;
>                         break;
>
> +               case EM_RISCV:
> +                       if (machine_type_mismatch(file, "RISCV64", NULL,
> +                           source_query))
> +                               goto bailout;
> +                       break;
> +
>                 default:
>                         if (machine_type_mismatch(file, "(unknown)", NULL,
>                             source_query))
> @@ -2935,7 +2941,8 @@ dump_registers_for_elf_dumpfiles(void)
>
>          if (!(machine_type("X86") || machine_type("X86_64") ||
>             machine_type("ARM64") || machine_type("PPC64") ||
> -           machine_type("MIPS") || machine_type("MIPS64")))
> +           machine_type("MIPS") || machine_type("MIPS64") ||
> +           machine_type("RISCV64")))
>                  error(FATAL, "-r option not supported for this dumpfile\n");
>
>         if (NETDUMP_DUMPFILE()) {
> diff --git a/ramdump.c b/ramdump.c
> index a206fcb..d2bd7ff 100644
> --- a/ramdump.c
> +++ b/ramdump.c
> @@ -188,6 +188,8 @@ char *ramdump_to_elf(void)
>                 e_machine = EM_MIPS;
>         else if (machine_type("X86_64"))
>                 e_machine = EM_X86_64;
> +       else if (machine_type("RISCV64"))
> +               e_machine = EM_RISCV;
>         else
>                 error(FATAL, "ramdump: unsupported machine type: %s\n",
>                         MACHINE_TYPE);
> diff --git a/riscv64.c b/riscv64.c
> new file mode 100644
> index 0000000..c7df857
> --- /dev/null
> +++ b/riscv64.c
> @@ -0,0 +1,56 @@
> +/* riscv64.c - core analysis suite
> + *
> + * Copyright (C) 2022 Alibaba Group Holding Limited.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 General Public License for more details.
> + */
> +#ifdef RISCV64
> +
> +#include <elf.h>
> +#include "defs.h"
> +
> +void
> +riscv64_dump_machdep_table(ulong arg)
> +{
> +}
> +
> +/*
> + *  Include both vmalloc'd and module address space as VMALLOC space.
> + */
> +int
> +riscv64_IS_VMALLOC_ADDR(ulong vaddr)
> +{
> +       return ((vaddr >= VMALLOC_START && vaddr <= VMALLOC_END) ||
> +               (vaddr >= VMEMMAP_VADDR && vaddr <= VMEMMAP_END) ||
> +               (vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
> +}
> +
> +void
> +riscv64_init(int when)
> +{
> +}
> +
> +void
> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
> +{
> +}
> +
> +#else /* !RISCV64 */
> +
> +#include "defs.h"
> +
> +void
> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
> +{
> +       return;
> +}
> +
> +#endif /* !RISCV64 */
> diff --git a/symbols.c b/symbols.c
> index bee1faf..ea9e83e 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -3743,6 +3743,11 @@ is_kernel(char *file)
>                                 goto bailout;
>                         break;
>
> +               case EM_RISCV:
> +                       if (machine_type_mismatch(file, "RISCV64", NULL, 0))
> +                               goto bailout;
> +                       break;
> +
>                 default:
>                         if (machine_type_mismatch(file, "(unknown)", NULL, 0))
>                                 goto bailout;
> @@ -4002,6 +4007,11 @@ is_shared_object(char *file)
>                         if (machine_type("MIPS64"))
>                                 return TRUE;
>                         break;
> +
> +               case EM_RISCV:
> +                       if (machine_type("RISCV64"))
> +                               return TRUE;
> +                       break;
>                 }
>
>                 if (CRASHDEBUG(1))
> --
> 2.17.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
Xianting Tian July 28, 2022, 12:02 p.m. UTC | #5
在 2022/7/27 下午10:33, Yixun Lan 写道:
> On Mon, Jul 18, 2022 at 2:55 AM Xianting Tian
> <xianting.tian@linux.alibaba.com> wrote:
>> This patch mainly added some environment configurations, macro definitions,
>> specific architecture structures and some function declarations supported
>> by the RISCV64 architecture.
>>
>> We can use the build command to get the simplest version crash tool:
>>          make target=RISCV64 -j2
>>
>> Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
>> ---
>>   Makefile            |   7 +-
>>   README              |   2 +-
>>   configure.c         |  39 ++++++++++-
>>   defs.h              | 155 +++++++++++++++++++++++++++++++++++++++++++-
>>   diskdump.c          |  11 +++-
>>   help.c              |   2 +-
>>   lkcd_vmdump_v2_v3.h |   2 +-
>>   netdump.c           |   9 ++-
>>   ramdump.c           |   2 +
>>   riscv64.c           |  56 ++++++++++++++++
>>   symbols.c           |  10 +++
>>   11 files changed, 285 insertions(+), 10 deletions(-)
>>   create mode 100644 riscv64.c
>>
>> diff --git a/Makefile b/Makefile
>> index 162c2ba..54ebb43 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -64,7 +64,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 \
>>          printk.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 \
>>          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_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 \
>>          build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
>>          printk.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 \
>>          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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
>> @@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
>>   mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
>>          ${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>
>> +riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
>> +       ${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>> +
>>   sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
>>          ${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
>>
>> diff --git a/README b/README
>> index 5abbce1..5ac5b60 100644
>> --- a/README
>> +++ b/README
>> @@ -37,7 +37,7 @@
>>     These are the current prerequisites:
>>
>>     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 architectures
>>        may be addressed in the future.
>>
>>     o  One size fits all -- the utility can be run on any Linux kernel version
>> diff --git a/configure.c b/configure.c
>> index 5188851..0d216d1 100644
>> --- a/configure.c
>> +++ b/configure.c
>> @@ -107,6 +107,7 @@ void add_extra_lib(char *);
>>   #undef MIPS
>>   #undef SPARC64
>>   #undef MIPS64
>> +#undef RISCV64
>>
>>   #define UNKNOWN 0
>>   #define X86     1
>> @@ -122,6 +123,7 @@ void add_extra_lib(char *);
>>   #define MIPS    11
>>   #define SPARC64 12
>>   #define MIPS64  13
>> +#define RISCV64 14
>>
>>   #define TARGET_X86    "TARGET=X86"
>>   #define TARGET_ALPHA  "TARGET=ALPHA"
>> @@ -136,6 +138,7 @@ void add_extra_lib(char *);
>>   #define TARGET_MIPS   "TARGET=MIPS"
>>   #define TARGET_MIPS64 "TARGET=MIPS64"
>>   #define TARGET_SPARC64 "TARGET=SPARC64"
>> +#define TARGET_RISCV64 "TARGET=RISCV64"
>>
>>   #define TARGET_CFLAGS_X86    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
>>   #define TARGET_CFLAGS_ALPHA  "TARGET_CFLAGS="
>> @@ -158,6 +161,8 @@ 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_RISCV64         "TARGET_CFLAGS="
>> +#define TARGET_CFLAGS_RISCV64_ON_X86_64        "TARGET_CFLAGS="
>>
>>   #define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
>>   #define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
>> @@ -168,6 +173,7 @@ void add_extra_lib(char *);
>>   #define GDB_TARGET_PPC64_ON_X86_64  "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
>>   #define GDB_TARGET_MIPS_ON_X86     "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
>>   #define GDB_TARGET_MIPS_ON_X86_64  "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
>> +#define GDB_TARGET_RISCV64_ON_X86_64  "GDB_CONF_FLAGS=--target=riscv64-unknown-linux-gnu"
>>
>>   /*
>>    *  The original plan was to allow the use of a particular version
>> @@ -404,6 +410,9 @@ get_current_configuration(struct supported_gdb_version *sp)
>>   #ifdef __sparc_v9__
>>          target_data.target = SPARC64;
>>   #endif
>> +#ifdef __riscv64__
>> +       target_data.target = RISCV64;
>> +#endif
>>
>>          set_initial_target(sp);
>>
>> @@ -457,6 +466,12 @@ get_current_configuration(struct supported_gdb_version *sp)
>>                          if ((target_data.initial_gdb_target != UNKNOWN) &&
>>                              (target_data.host != target_data.initial_gdb_target))
>>                                  arch_mismatch(sp);
>> +               } else if ((target_data.target == X86_64) &&
>> +                       (name_to_target((char *)target_data.target_as_param) == RISCV64)) {
>> +                       /*
>> +                        *  Build an RISCV64 crash binary on an X86_64 host.
>> +                        */
>> +                       target_data.target = RISCV64;
>>                  } else {
>>                          fprintf(stderr,
>>                              "\ntarget=%s is not supported on the %s host architecture\n\n",
>> @@ -497,6 +512,10 @@ get_current_configuration(struct supported_gdb_version *sp)
>>                      (target_data.target != MIPS64))
>>                          arch_mismatch(sp);
>>
>> +               if ((target_data.initial_gdb_target == RISCV64) &&
>> +                   (target_data.target != RISCV64))
>> +                       arch_mismatch(sp);
>> +
>>                  if ((target_data.initial_gdb_target == X86) &&
>>                      (target_data.target != X86)) {
>>                          if (target_data.target == X86_64)
>> @@ -660,6 +679,9 @@ show_configuration(void)
>>          case SPARC64:
>>                  printf("TARGET: SPARC64\n");
>>                  break;
>> +       case RISCV64:
>> +               printf("TARGET: RISCV64\n");
>> +               break;
>>          }
>>
>>          if (strlen(target_data.program)) {
>> @@ -777,6 +799,14 @@ build_configure(struct supported_gdb_version *sp)
>>                  target = TARGET_SPARC64;
>>                  target_CFLAGS = TARGET_CFLAGS_SPARC64;
>>                  break;
>> +       case RISCV64:
>> +               target = TARGET_RISCV64;
>> +               if (target_data.host == X86_64) {
>> +                       target_CFLAGS = TARGET_CFLAGS_RISCV64_ON_X86_64;
>> +                       gdb_conf_flags = GDB_TARGET_RISCV64_ON_X86_64;
>> +               } else
>> +                       target_CFLAGS = TARGET_CFLAGS_RISCV64;
>> +               break;
>>          }
>>
>>          ldflags = get_extra_flags("LDFLAGS.extra", NULL);
>> @@ -1374,7 +1404,7 @@ make_spec_file(struct supported_gdb_version *sp)
>>          printf("Vendor: Red Hat, Inc.\n");
>>          printf("Packager: Dave Anderson <anderson@redhat.com>\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("Buildroot: %%{_tmppath}/%%{name}-root\n");
>>          printf("BuildRequires: ncurses-devel zlib-devel bison\n");
>>          printf("Requires: binutils\n");
>> @@ -1613,6 +1643,8 @@ set_initial_target(struct supported_gdb_version *sp)
>>                  target_data.initial_gdb_target = MIPS;
>>          else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
>>                  target_data.initial_gdb_target = SPARC64;
>> +       else if (strncmp(buf, "RISCV64", strlen("RISCV64")) == 0)
>> +               target_data.initial_gdb_target = RISCV64;
>>   }
>>
>>   char *
>> @@ -1633,6 +1665,7 @@ target_to_name(int target)
>>          case MIPS:   return("MIPS");
>>          case MIPS64: return("MIPS64");
>>          case SPARC64: return("SPARC64");
>> +       case RISCV64: return("RISCV64");
>>          }
>>
>>          return "UNKNOWN";
>> @@ -1697,6 +1730,10 @@ name_to_target(char *name)
>>                  return MIPS64;
>>          else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
>>                  return SPARC64;
>> +       else if (strncmp(name, "RISCV64", strlen("RISCV64")) == 0)
>> +               return RISCV64;
>> +       else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
>> +               return RISCV64;
>>
>>          return UNKNOWN;
>>   }
>> diff --git a/defs.h b/defs.h
>> index 9b1b69a..42ffba3 100644
>> --- a/defs.h
>> +++ b/defs.h
>> @@ -76,7 +76,7 @@
>>   #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
>>       !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
>>       !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
>> -    !defined(SPARC64)
>> +    !defined(RISCV64) && !defined(SPARC64)
>>   #ifdef __alpha__
>>   #define ALPHA
>>   #endif
>> @@ -118,6 +118,9 @@
>>   #ifdef __sparc_v9__
>>   #define SPARC64
>>   #endif
>> +#ifdef __riscv64__
> this is wrong, should be
>   #if defined(__riscv) && (__riscv_xlen == 64)
thanks, will fix it in V2
>
>> +#define RISCV64
>> +#endif
>>   #endif
>>
>>   #ifdef X86
>> @@ -159,6 +162,9 @@
>>   #ifdef SPARC64
>>   #define NR_CPUS  (4096)
>>   #endif
>> +#ifdef RISCV64
>> +#define NR_CPUS  (256)
>> +#endif
>>
>>   #define NR_DEVICE_DUMPS (64)
>>
>> @@ -3484,6 +3490,63 @@ struct arm64_stackframe {
>>   #define _MAX_PHYSMEM_BITS       48
>>   #endif  /* MIPS64 */
>>
>> +#ifdef RISCV64
>> +#define _64BIT_
>> +#define MACHINE_TYPE           "RISCV64"
>> +
>> +/*
>> + * Direct memory mapping
>> + */
>> +#define PTOV(X)                                                                                \
>> +       (((unsigned long)(X)+(machdep->kvbase)) - machdep->machspec->phys_base)
>> +#define VTOP(X)        ({                                                                      \
>> +       ulong _X = X;                                                                   \
>> +       (THIS_KERNEL_VERSION >= 0x50D00 &&                                              \
>> +               (_X) >= machdep->machspec->kernel_link_addr) ?                          \
>> +               (((unsigned long)(_X)-(machdep->machspec->kernel_link_addr)) +          \
>> +                machdep->machspec->phys_base):                                         \
>> +               (((unsigned long)(_X)-(machdep->kvbase)) +                              \
>> +                machdep->machspec->phys_base);                                         \
>> +       })
>> +#define PAGEBASE(X)            (((ulong)(X)) & (ulong)machdep->pagemask)
>> +
>> +/*
>> + * Stack size order
>> + */
>> +#define THREAD_SIZE_ORDER       2
>> +
>> +#define PAGE_OFFSET            (machdep->machspec->page_offset)
>> +#define VMALLOC_START          (machdep->machspec->vmalloc_start_addr)
>> +#define VMALLOC_END            (machdep->machspec->vmalloc_end)
>> +#define VMEMMAP_VADDR          (machdep->machspec->vmemmap_vaddr)
>> +#define VMEMMAP_END            (machdep->machspec->vmemmap_end)
>> +#define MODULES_VADDR          (machdep->machspec->modules_vaddr)
>> +#define MODULES_END            (machdep->machspec->modules_end)
>> +#define IS_VMALLOC_ADDR(X)     riscv64_IS_VMALLOC_ADDR((ulong)(X))
>> +
>> +/* from arch/riscv/include/asm/pgtable.h */
>> +#define __SWP_TYPE_SHIFT        6
>> +#define __SWP_TYPE_BITS         5
>> +#define __SWP_TYPE_MASK         ((1UL << __SWP_TYPE_BITS) - 1)
>> +#define __SWP_OFFSET_SHIFT      (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
>> +
>> +#define MAX_SWAPFILES_CHECK()   BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
>> +
>> +#define SWP_TYPE(entry)                (((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
>> +#define SWP_OFFSET(entry)      ((entry) >> __SWP_OFFSET_SHIFT)
>> +#define __swp_type(entry)       SWP_TYPE(entry)
>> +#define __swp_offset(entry)     SWP_OFFSET(entry)
>> +
>> +#define TIF_SIGPENDING          (THIS_KERNEL_VERSION >= LINUX(2,6,23) ? 1 : 2)
>> +
>> +/* from arch/riscv/include/asm/sparsemem.h */
>> +#define _SECTION_SIZE_BITS      27
>> +#define _MAX_PHYSMEM_BITS       56 /* 56-bit physical address supported */
>> +#define PHYS_MASK_SHIFT                _MAX_PHYSMEM_BITS
>> +#define PHYS_MASK              (((1UL) << PHYS_MASK_SHIFT) - 1)
>> +
>> +#endif  /* RISCV64 */
>> +
>>   #ifdef X86
>>   #define _32BIT_
>>   #define MACHINE_TYPE       "X86"
>> @@ -4532,6 +4595,10 @@ struct machine_specific {
>>   #define MAX_HEXADDR_STRLEN (16)
>>   #define UVADDR_PRLEN      (16)
>>   #endif
>> +#ifdef RISCV64
>> +#define MAX_HEXADDR_STRLEN (16)
>> +#define UVADDR_PRLEN       (16)
>> +#endif
>>
>>   #define BADADDR  ((ulong)(-1))
>>   #define BADVAL   ((ulong)(-1))
>> @@ -5126,6 +5193,9 @@ void dump_build_data(void);
>>   #ifdef MIPS64
>>   #define machdep_init(X) mips64_init(X)
>>   #endif
>> +#ifdef RISCV64
>> +#define machdep_init(X) riscv64_init(X)
>> +#endif
>>   #ifdef SPARC64
>>   #define machdep_init(X) sparc64_init(X)
>>   #endif
>> @@ -5606,6 +5676,9 @@ void display_help_screen(char *);
>>   #ifdef SPARC64
>>   #define dump_machdep_table(X) sparc64_dump_machdep_table(X)
>>   #endif
>> +#ifdef RISCV64
>> +#define dump_machdep_table(X) riscv64_dump_machdep_table(X)
>> +#endif
>>   extern char *help_pointer[];
>>   extern char *help_alias[];
>>   extern char *help_ascii[];
>> @@ -6682,6 +6755,86 @@ struct machine_specific {
>>
>>   #endif /* MIPS64 */
>>
>> +/*
>> + * riscv64.c
>> + */
>> +void riscv64_display_regs_from_elf_notes(int, FILE *);
>> +
>> +#ifdef RISCV64
>> +void riscv64_init(int);
>> +void riscv64_dump_machdep_table(ulong);
>> +int riscv64_IS_VMALLOC_ADDR(ulong);
>> +
>> +#define display_idt_table() \
>> +       error(FATAL, "-d option is not applicable to RISCV64 architecture\n")
>> +
>> +/* from arch/riscv/include/asm/ptrace.h */
>> +struct riscv64_register {
>> +       ulong regs[36];
>> +};
>> +
>> +struct riscv64_pt_regs {
>> +       ulong badvaddr;
>> +       ulong cause;
>> +       ulong epc;
>> +};
>> +
>> +struct riscv64_unwind_frame {
>> +       ulong fp;
>> +       ulong sp;
>> +       ulong pc;
>> +};
>> +
>> +#define KSYMS_START    (0x1)
>> +
>> +struct machine_specific {
>> +       ulong phys_base;
>> +       ulong page_offset;
>> +       ulong vmalloc_start_addr;
>> +       ulong vmalloc_end;
>> +       ulong vmemmap_vaddr;
>> +       ulong vmemmap_end;
>> +       ulong modules_vaddr;
>> +       ulong modules_end;
>> +       ulong kernel_link_addr;
>> +       ulong address_space_end;
>> +
>> +       ulong _page_present;
>> +       ulong _page_read;
>> +       ulong _page_write;
>> +       ulong _page_exec;
>> +       ulong _page_user;
>> +       ulong _page_global;
>> +       ulong _page_accessed;
>> +       ulong _page_dirty;
>> +       ulong _page_soft;
>> +
>> +       ulong _pfn_shift;
>> +
>> +       struct riscv64_register *crash_task_regs;
>> +};
>> +/* from arch/riscv/include/asm/pgtable-bits.h */
>> +#define        _PAGE_PRESENT   (machdep->machspec->_page_present)
>> +#define        _PAGE_READ      (machdep->machspec->_page_read)
>> +#define        _PAGE_WRITE     (machdep->machspec->_page_write)
>> +#define        _PAGE_EXEC      (machdep->machspec->_page_exec)
>> +#define        _PAGE_USER      (machdep->machspec->_page_user)
>> +#define        _PAGE_GLOBAL    (machdep->machspec->_page_global)
>> +#define        _PAGE_ACCESSED  (machdep->machspec->_page_accessed)
>> +#define        _PAGE_DIRTY     (machdep->machspec->_page_dirty)
>> +#define        _PAGE_SOFT      (machdep->machspec->_page_soft)
>> +#define        _PAGE_SEC       (machdep->machspec->_page_sec)
>> +#define        _PAGE_SHARE     (machdep->machspec->_page_share)
>> +#define        _PAGE_BUF       (machdep->machspec->_page_buf)
>> +#define        _PAGE_CACHE     (machdep->machspec->_page_cache)
>> +#define        _PAGE_SO        (machdep->machspec->_page_so)
>> +#define        _PAGE_SPECIAL   _PAGE_SOFT
>> +#define                _PAGE_TABLE     _PAGE_PRESENT
>> +#define        _PAGE_PROT_NONE _PAGE_READ
>> +#define        _PAGE_PFN_SHIFT 10
>> +
>> +#endif /* RISCV64 */
>> +
>>   /*
>>    * sparc64.c
>>    */
>> diff --git a/diskdump.c b/diskdump.c
>> index 2c1f9be..28503bc 100644
>> --- a/diskdump.c
>> +++ b/diskdump.c
>> @@ -622,6 +622,9 @@ restart:
>>          else if (STRNEQ(header->utsname.machine, "aarch64") &&
>>              machine_type_mismatch(file, "ARM64", NULL, 0))
>>                  goto err;
>> +       else if (STRNEQ(header->utsname.machine, "riscv64") &&
>> +           machine_type_mismatch(file, "RISCV64", NULL, 0))
>> +               goto err;
>>
>>          if (header->block_size != block_size) {
>>                  block_size = header->block_size;
>> @@ -780,6 +783,8 @@ restart:
>>                  dd->machine_type = EM_AARCH64;
>>          else if (machine_type("SPARC64"))
>>                  dd->machine_type = EM_SPARCV9;
>> +       else if (machine_type("RISCV64"))
>> +               dd->machine_type = EM_RISCV;
>>          else {
>>                  error(INFO, "%s: unsupported machine type: %s\n",
>>                          DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
>> @@ -1751,7 +1756,8 @@ dump_note_offsets(FILE *fp)
>>                          qemu = FALSE;
>>                          if (machine_type("X86_64") || machine_type("S390X") ||
>>                              machine_type("ARM64") || machine_type("PPC64") ||
>> -                           machine_type("SPARC64") || machine_type("MIPS64")) {
>> +                           machine_type("SPARC64") || machine_type("MIPS64") ||
>> +                           machine_type("RISCV64")) {
>>                                  note64 = (void *)dd->notes_buf + tot;
>>                                  len = sizeof(Elf64_Nhdr);
>>                                  if (STRNEQ((char *)note64 + len, "QEMU"))
>> @@ -2558,7 +2564,8 @@ dump_registers_for_compressed_kdump(void)
>>          if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
>>              !(machine_type("X86") || machine_type("X86_64") ||
>>                machine_type("ARM64") || machine_type("PPC64") ||
>> -             machine_type("MIPS") || machine_type("MIPS64")))
>> +             machine_type("MIPS") || machine_type("MIPS64") ||
>> +             machine_type("RISCV64")))
>>                  error(FATAL, "-r option not supported for this dumpfile\n");
>>
>>          if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
>> diff --git a/help.c b/help.c
>> index 99214c1..253c71b 100644
>> --- a/help.c
>> +++ b/help.c
>> @@ -9512,7 +9512,7 @@ char *README[] = {
>>   "  These are the current prerequisites: ",
>>   "",
>>   "  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 architectures",
>>   "     may be addressed in the future.",
>>   "",
>>   "  o  One size fits all -- the utility can be run on any Linux kernel version",
>> diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
>> index 984c2c2..7fa70b9 100644
>> --- a/lkcd_vmdump_v2_v3.h
>> +++ b/lkcd_vmdump_v2_v3.h
>> @@ -37,7 +37,7 @@
>>
>>   #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
>>          defined(S390X) || defined(ARM64) || defined(MIPS) || \
>> -       defined(MIPS64) || defined(SPARC64)
>> +       defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
>>
>>   /*
>>    * Kernel header file for Linux crash dumps.
>> diff --git a/netdump.c b/netdump.c
>> index ff273b4..4ec12a0 100644
>> --- a/netdump.c
>> +++ b/netdump.c
>> @@ -300,6 +300,12 @@ is_netdump(char *file, ulong source_query)
>>                                  goto bailout;
>>                          break;
>>
>> +               case EM_RISCV:
>> +                       if (machine_type_mismatch(file, "RISCV64", NULL,
>> +                           source_query))
>> +                               goto bailout;
>> +                       break;
>> +
>>                  default:
>>                          if (machine_type_mismatch(file, "(unknown)", NULL,
>>                              source_query))
>> @@ -2935,7 +2941,8 @@ dump_registers_for_elf_dumpfiles(void)
>>
>>           if (!(machine_type("X86") || machine_type("X86_64") ||
>>              machine_type("ARM64") || machine_type("PPC64") ||
>> -           machine_type("MIPS") || machine_type("MIPS64")))
>> +           machine_type("MIPS") || machine_type("MIPS64") ||
>> +           machine_type("RISCV64")))
>>                   error(FATAL, "-r option not supported for this dumpfile\n");
>>
>>          if (NETDUMP_DUMPFILE()) {
>> diff --git a/ramdump.c b/ramdump.c
>> index a206fcb..d2bd7ff 100644
>> --- a/ramdump.c
>> +++ b/ramdump.c
>> @@ -188,6 +188,8 @@ char *ramdump_to_elf(void)
>>                  e_machine = EM_MIPS;
>>          else if (machine_type("X86_64"))
>>                  e_machine = EM_X86_64;
>> +       else if (machine_type("RISCV64"))
>> +               e_machine = EM_RISCV;
>>          else
>>                  error(FATAL, "ramdump: unsupported machine type: %s\n",
>>                          MACHINE_TYPE);
>> diff --git a/riscv64.c b/riscv64.c
>> new file mode 100644
>> index 0000000..c7df857
>> --- /dev/null
>> +++ b/riscv64.c
>> @@ -0,0 +1,56 @@
>> +/* riscv64.c - core analysis suite
>> + *
>> + * Copyright (C) 2022 Alibaba Group Holding Limited.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program 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 General Public License for more details.
>> + */
>> +#ifdef RISCV64
>> +
>> +#include <elf.h>
>> +#include "defs.h"
>> +
>> +void
>> +riscv64_dump_machdep_table(ulong arg)
>> +{
>> +}
>> +
>> +/*
>> + *  Include both vmalloc'd and module address space as VMALLOC space.
>> + */
>> +int
>> +riscv64_IS_VMALLOC_ADDR(ulong vaddr)
>> +{
>> +       return ((vaddr >= VMALLOC_START && vaddr <= VMALLOC_END) ||
>> +               (vaddr >= VMEMMAP_VADDR && vaddr <= VMEMMAP_END) ||
>> +               (vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
>> +}
>> +
>> +void
>> +riscv64_init(int when)
>> +{
>> +}
>> +
>> +void
>> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
>> +{
>> +}
>> +
>> +#else /* !RISCV64 */
>> +
>> +#include "defs.h"
>> +
>> +void
>> +riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
>> +{
>> +       return;
>> +}
>> +
>> +#endif /* !RISCV64 */
>> diff --git a/symbols.c b/symbols.c
>> index bee1faf..ea9e83e 100644
>> --- a/symbols.c
>> +++ b/symbols.c
>> @@ -3743,6 +3743,11 @@ is_kernel(char *file)
>>                                  goto bailout;
>>                          break;
>>
>> +               case EM_RISCV:
>> +                       if (machine_type_mismatch(file, "RISCV64", NULL, 0))
>> +                               goto bailout;
>> +                       break;
>> +
>>                  default:
>>                          if (machine_type_mismatch(file, "(unknown)", NULL, 0))
>>                                  goto bailout;
>> @@ -4002,6 +4007,11 @@ is_shared_object(char *file)
>>                          if (machine_type("MIPS64"))
>>                                  return TRUE;
>>                          break;
>> +
>> +               case EM_RISCV:
>> +                       if (machine_type("RISCV64"))
>> +                               return TRUE;
>> +                       break;
>>                  }
>>
>>                  if (CRASHDEBUG(1))
>> --
>> 2.17.1
>>
>>
>> _______________________________________________
>> linux-riscv mailing list
>> linux-riscv@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-riscv
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 162c2ba..54ebb43 100644
--- a/Makefile
+++ b/Makefile
@@ -64,7 +64,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 \
 	printk.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 \
 	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_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 \
 	build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
 	printk.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 \
 	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_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
@@ -438,6 +438,9 @@  mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
 mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
 	${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
+riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
+	${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+
 sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
 	${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
diff --git a/README b/README
index 5abbce1..5ac5b60 100644
--- a/README
+++ b/README
@@ -37,7 +37,7 @@ 
   These are the current prerequisites: 
 
   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 architectures
      may be addressed in the future.
 
   o  One size fits all -- the utility can be run on any Linux kernel version
diff --git a/configure.c b/configure.c
index 5188851..0d216d1 100644
--- a/configure.c
+++ b/configure.c
@@ -107,6 +107,7 @@  void add_extra_lib(char *);
 #undef MIPS
 #undef SPARC64
 #undef MIPS64
+#undef RISCV64
 
 #define UNKNOWN 0
 #define X86     1
@@ -122,6 +123,7 @@  void add_extra_lib(char *);
 #define MIPS    11
 #define SPARC64 12
 #define MIPS64  13
+#define RISCV64 14
 
 #define TARGET_X86    "TARGET=X86"
 #define TARGET_ALPHA  "TARGET=ALPHA"
@@ -136,6 +138,7 @@  void add_extra_lib(char *);
 #define TARGET_MIPS   "TARGET=MIPS"
 #define TARGET_MIPS64 "TARGET=MIPS64"
 #define TARGET_SPARC64 "TARGET=SPARC64"
+#define TARGET_RISCV64 "TARGET=RISCV64"
 
 #define TARGET_CFLAGS_X86    "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
 #define TARGET_CFLAGS_ALPHA  "TARGET_CFLAGS="
@@ -158,6 +161,8 @@  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_RISCV64         "TARGET_CFLAGS="
+#define TARGET_CFLAGS_RISCV64_ON_X86_64	"TARGET_CFLAGS="
 
 #define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
 #define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
@@ -168,6 +173,7 @@  void add_extra_lib(char *);
 #define GDB_TARGET_PPC64_ON_X86_64  "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
 #define GDB_TARGET_MIPS_ON_X86     "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
 #define GDB_TARGET_MIPS_ON_X86_64  "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
+#define GDB_TARGET_RISCV64_ON_X86_64  "GDB_CONF_FLAGS=--target=riscv64-unknown-linux-gnu"
      
 /*
  *  The original plan was to allow the use of a particular version
@@ -404,6 +410,9 @@  get_current_configuration(struct supported_gdb_version *sp)
 #ifdef __sparc_v9__
 	target_data.target = SPARC64;
 #endif
+#ifdef __riscv64__
+	target_data.target = RISCV64;
+#endif
 
 	set_initial_target(sp);
 
@@ -457,6 +466,12 @@  get_current_configuration(struct supported_gdb_version *sp)
 			if ((target_data.initial_gdb_target != UNKNOWN) &&
 			    (target_data.host != target_data.initial_gdb_target))
 				arch_mismatch(sp);
+		} else if ((target_data.target == X86_64) &&
+			(name_to_target((char *)target_data.target_as_param) == RISCV64)) {
+			/*
+			 *  Build an RISCV64 crash binary on an X86_64 host.
+			 */
+			target_data.target = RISCV64;
 		} else {
 			fprintf(stderr,
 			    "\ntarget=%s is not supported on the %s host architecture\n\n",
@@ -497,6 +512,10 @@  get_current_configuration(struct supported_gdb_version *sp)
 		    (target_data.target != MIPS64))
 			arch_mismatch(sp);
 
+		if ((target_data.initial_gdb_target == RISCV64) &&
+		    (target_data.target != RISCV64))
+			arch_mismatch(sp);
+
 		if ((target_data.initial_gdb_target == X86) &&
 		    (target_data.target != X86)) {
 			if (target_data.target == X86_64) 
@@ -660,6 +679,9 @@  show_configuration(void)
 	case SPARC64:
 		printf("TARGET: SPARC64\n");
 		break;
+	case RISCV64:
+		printf("TARGET: RISCV64\n");
+		break;
 	}
 
 	if (strlen(target_data.program)) {
@@ -777,6 +799,14 @@  build_configure(struct supported_gdb_version *sp)
 		target = TARGET_SPARC64;
 		target_CFLAGS = TARGET_CFLAGS_SPARC64;
 		break;
+	case RISCV64:
+		target = TARGET_RISCV64;
+		if (target_data.host == X86_64) {
+			target_CFLAGS = TARGET_CFLAGS_RISCV64_ON_X86_64;
+			gdb_conf_flags = GDB_TARGET_RISCV64_ON_X86_64;
+		} else
+			target_CFLAGS = TARGET_CFLAGS_RISCV64;
+		break;
 	}
 
 	ldflags = get_extra_flags("LDFLAGS.extra", NULL);
@@ -1374,7 +1404,7 @@  make_spec_file(struct supported_gdb_version *sp)
 	printf("Vendor: Red Hat, Inc.\n");
 	printf("Packager: Dave Anderson <anderson@redhat.com>\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("Buildroot: %%{_tmppath}/%%{name}-root\n");
 	printf("BuildRequires: ncurses-devel zlib-devel bison\n");
 	printf("Requires: binutils\n");
@@ -1613,6 +1643,8 @@  set_initial_target(struct supported_gdb_version *sp)
 		target_data.initial_gdb_target = MIPS;
 	else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
 		target_data.initial_gdb_target = SPARC64;
+	else if (strncmp(buf, "RISCV64", strlen("RISCV64")) == 0)
+		target_data.initial_gdb_target = RISCV64;
 }
 
 char *
@@ -1633,6 +1665,7 @@  target_to_name(int target)
 	case MIPS:   return("MIPS");
 	case MIPS64: return("MIPS64");
 	case SPARC64: return("SPARC64");
+	case RISCV64: return("RISCV64");
 	}
 
 	return "UNKNOWN";
@@ -1697,6 +1730,10 @@  name_to_target(char *name)
 		return MIPS64;
 	else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
 		return SPARC64;
+	else if (strncmp(name, "RISCV64", strlen("RISCV64")) == 0)
+		return RISCV64;
+	else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
+		return RISCV64;
 
 	return UNKNOWN;
 }
diff --git a/defs.h b/defs.h
index 9b1b69a..42ffba3 100644
--- a/defs.h
+++ b/defs.h
@@ -76,7 +76,7 @@ 
 #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
     !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
     !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
-    !defined(SPARC64)
+    !defined(RISCV64) && !defined(SPARC64)
 #ifdef __alpha__
 #define ALPHA
 #endif
@@ -118,6 +118,9 @@ 
 #ifdef __sparc_v9__
 #define SPARC64
 #endif
+#ifdef __riscv64__
+#define RISCV64
+#endif
 #endif
 
 #ifdef X86
@@ -159,6 +162,9 @@ 
 #ifdef SPARC64
 #define NR_CPUS  (4096)
 #endif
+#ifdef RISCV64
+#define NR_CPUS  (256)
+#endif
 
 #define NR_DEVICE_DUMPS (64)
 
@@ -3484,6 +3490,63 @@  struct arm64_stackframe {
 #define _MAX_PHYSMEM_BITS       48
 #endif  /* MIPS64 */
 
+#ifdef RISCV64
+#define _64BIT_
+#define MACHINE_TYPE		"RISCV64"
+
+/*
+ * Direct memory mapping
+ */
+#define PTOV(X)										\
+	(((unsigned long)(X)+(machdep->kvbase)) - machdep->machspec->phys_base)
+#define VTOP(X)	({									\
+	ulong _X = X;									\
+	(THIS_KERNEL_VERSION >= 0x50D00 &&						\
+		(_X) >= machdep->machspec->kernel_link_addr) ?				\
+		(((unsigned long)(_X)-(machdep->machspec->kernel_link_addr)) +		\
+		 machdep->machspec->phys_base):						\
+		(((unsigned long)(_X)-(machdep->kvbase)) +				\
+		 machdep->machspec->phys_base);						\
+	})
+#define PAGEBASE(X)		(((ulong)(X)) & (ulong)machdep->pagemask)
+
+/*
+ * Stack size order
+ */
+#define THREAD_SIZE_ORDER       2
+
+#define PAGE_OFFSET		(machdep->machspec->page_offset)
+#define VMALLOC_START		(machdep->machspec->vmalloc_start_addr)
+#define VMALLOC_END		(machdep->machspec->vmalloc_end)
+#define VMEMMAP_VADDR		(machdep->machspec->vmemmap_vaddr)
+#define VMEMMAP_END		(machdep->machspec->vmemmap_end)
+#define MODULES_VADDR		(machdep->machspec->modules_vaddr)
+#define MODULES_END		(machdep->machspec->modules_end)
+#define IS_VMALLOC_ADDR(X)	riscv64_IS_VMALLOC_ADDR((ulong)(X))
+
+/* from arch/riscv/include/asm/pgtable.h */
+#define __SWP_TYPE_SHIFT        6
+#define __SWP_TYPE_BITS         5
+#define __SWP_TYPE_MASK         ((1UL << __SWP_TYPE_BITS) - 1)
+#define __SWP_OFFSET_SHIFT      (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
+
+#define MAX_SWAPFILES_CHECK()   BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
+
+#define SWP_TYPE(entry)		(((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
+#define SWP_OFFSET(entry)	((entry) >> __SWP_OFFSET_SHIFT)
+#define __swp_type(entry)       SWP_TYPE(entry)
+#define __swp_offset(entry)     SWP_OFFSET(entry)
+
+#define TIF_SIGPENDING          (THIS_KERNEL_VERSION >= LINUX(2,6,23) ? 1 : 2)
+
+/* from arch/riscv/include/asm/sparsemem.h */
+#define _SECTION_SIZE_BITS      27
+#define _MAX_PHYSMEM_BITS       56 /* 56-bit physical address supported */
+#define PHYS_MASK_SHIFT		_MAX_PHYSMEM_BITS
+#define PHYS_MASK		(((1UL) << PHYS_MASK_SHIFT) - 1)
+
+#endif  /* RISCV64 */
+
 #ifdef X86
 #define _32BIT_
 #define MACHINE_TYPE       "X86"
@@ -4532,6 +4595,10 @@  struct machine_specific {
 #define MAX_HEXADDR_STRLEN (16)
 #define UVADDR_PRLEN      (16)
 #endif
+#ifdef RISCV64
+#define MAX_HEXADDR_STRLEN (16)
+#define UVADDR_PRLEN       (16)
+#endif
 
 #define BADADDR  ((ulong)(-1))
 #define BADVAL   ((ulong)(-1))
@@ -5126,6 +5193,9 @@  void dump_build_data(void);
 #ifdef MIPS64
 #define machdep_init(X) mips64_init(X)
 #endif
+#ifdef RISCV64
+#define machdep_init(X) riscv64_init(X)
+#endif
 #ifdef SPARC64
 #define machdep_init(X) sparc64_init(X)
 #endif
@@ -5606,6 +5676,9 @@  void display_help_screen(char *);
 #ifdef SPARC64
 #define dump_machdep_table(X) sparc64_dump_machdep_table(X)
 #endif
+#ifdef RISCV64
+#define dump_machdep_table(X) riscv64_dump_machdep_table(X)
+#endif
 extern char *help_pointer[];
 extern char *help_alias[];
 extern char *help_ascii[];
@@ -6682,6 +6755,86 @@  struct machine_specific {
 
 #endif /* MIPS64 */
 
+/*
+ * riscv64.c
+ */
+void riscv64_display_regs_from_elf_notes(int, FILE *);
+
+#ifdef RISCV64
+void riscv64_init(int);
+void riscv64_dump_machdep_table(ulong);
+int riscv64_IS_VMALLOC_ADDR(ulong);
+
+#define display_idt_table() \
+	error(FATAL, "-d option is not applicable to RISCV64 architecture\n")
+
+/* from arch/riscv/include/asm/ptrace.h */
+struct riscv64_register {
+	ulong regs[36];
+};
+
+struct riscv64_pt_regs {
+	ulong badvaddr;
+	ulong cause;
+	ulong epc;
+};
+
+struct riscv64_unwind_frame {
+	ulong fp;
+	ulong sp;
+	ulong pc;
+};
+
+#define KSYMS_START	(0x1)
+
+struct machine_specific {
+	ulong phys_base;
+	ulong page_offset;
+	ulong vmalloc_start_addr;
+	ulong vmalloc_end;
+	ulong vmemmap_vaddr;
+	ulong vmemmap_end;
+	ulong modules_vaddr;
+	ulong modules_end;
+	ulong kernel_link_addr;
+	ulong address_space_end;
+
+	ulong _page_present;
+	ulong _page_read;
+	ulong _page_write;
+	ulong _page_exec;
+	ulong _page_user;
+	ulong _page_global;
+	ulong _page_accessed;
+	ulong _page_dirty;
+	ulong _page_soft;
+
+	ulong _pfn_shift;
+
+	struct riscv64_register *crash_task_regs;
+};
+/* from arch/riscv/include/asm/pgtable-bits.h */
+#define 	_PAGE_PRESENT	(machdep->machspec->_page_present)
+#define 	_PAGE_READ	(machdep->machspec->_page_read)
+#define 	_PAGE_WRITE	(machdep->machspec->_page_write)
+#define 	_PAGE_EXEC	(machdep->machspec->_page_exec)
+#define 	_PAGE_USER	(machdep->machspec->_page_user)
+#define 	_PAGE_GLOBAL	(machdep->machspec->_page_global)
+#define 	_PAGE_ACCESSED	(machdep->machspec->_page_accessed)
+#define 	_PAGE_DIRTY	(machdep->machspec->_page_dirty)
+#define 	_PAGE_SOFT	(machdep->machspec->_page_soft)
+#define 	_PAGE_SEC	(machdep->machspec->_page_sec)
+#define 	_PAGE_SHARE	(machdep->machspec->_page_share)
+#define 	_PAGE_BUF	(machdep->machspec->_page_buf)
+#define 	_PAGE_CACHE	(machdep->machspec->_page_cache)
+#define 	_PAGE_SO	(machdep->machspec->_page_so)
+#define 	_PAGE_SPECIAL	_PAGE_SOFT
+#define		_PAGE_TABLE	_PAGE_PRESENT
+#define 	_PAGE_PROT_NONE	_PAGE_READ
+#define 	_PAGE_PFN_SHIFT	10
+
+#endif /* RISCV64 */
+
 /*
  * sparc64.c
  */
diff --git a/diskdump.c b/diskdump.c
index 2c1f9be..28503bc 100644
--- a/diskdump.c
+++ b/diskdump.c
@@ -622,6 +622,9 @@  restart:
 	else if (STRNEQ(header->utsname.machine, "aarch64") &&
 	    machine_type_mismatch(file, "ARM64", NULL, 0))
 		goto err;
+	else if (STRNEQ(header->utsname.machine, "riscv64") &&
+	    machine_type_mismatch(file, "RISCV64", NULL, 0))
+		goto err;
 
 	if (header->block_size != block_size) {
 		block_size = header->block_size;
@@ -780,6 +783,8 @@  restart:
 		dd->machine_type = EM_AARCH64;
 	else if (machine_type("SPARC64"))
 		dd->machine_type = EM_SPARCV9;
+	else if (machine_type("RISCV64"))
+		dd->machine_type = EM_RISCV;
 	else {
 		error(INFO, "%s: unsupported machine type: %s\n", 
 			DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
@@ -1751,7 +1756,8 @@  dump_note_offsets(FILE *fp)
 			qemu = FALSE;
 			if (machine_type("X86_64") || machine_type("S390X") ||
 			    machine_type("ARM64") || machine_type("PPC64") ||
-			    machine_type("SPARC64") || machine_type("MIPS64")) {
+			    machine_type("SPARC64") || machine_type("MIPS64") ||
+			    machine_type("RISCV64")) {
 				note64 = (void *)dd->notes_buf + tot;
 				len = sizeof(Elf64_Nhdr);
 				if (STRNEQ((char *)note64 + len, "QEMU"))
@@ -2558,7 +2564,8 @@  dump_registers_for_compressed_kdump(void)
 	if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
 	    !(machine_type("X86") || machine_type("X86_64") ||
 	      machine_type("ARM64") || machine_type("PPC64") ||
-	      machine_type("MIPS") || machine_type("MIPS64")))
+	      machine_type("MIPS") || machine_type("MIPS64") ||
+	      machine_type("RISCV64")))
 		error(FATAL, "-r option not supported for this dumpfile\n");
 
 	if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
diff --git a/help.c b/help.c
index 99214c1..253c71b 100644
--- a/help.c
+++ b/help.c
@@ -9512,7 +9512,7 @@  char *README[] = {
 "  These are the current prerequisites: ",
 "",
 "  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 architectures",
 "     may be addressed in the future.",
 "",
 "  o  One size fits all -- the utility can be run on any Linux kernel version",
diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
index 984c2c2..7fa70b9 100644
--- a/lkcd_vmdump_v2_v3.h
+++ b/lkcd_vmdump_v2_v3.h
@@ -37,7 +37,7 @@ 
 
 #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
 	defined(S390X) || defined(ARM64) || defined(MIPS) || \
-	defined(MIPS64) || defined(SPARC64)
+	defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
 
 /*
  * Kernel header file for Linux crash dumps.
diff --git a/netdump.c b/netdump.c
index ff273b4..4ec12a0 100644
--- a/netdump.c
+++ b/netdump.c
@@ -300,6 +300,12 @@  is_netdump(char *file, ulong source_query)
 				goto bailout;
 			break;
 
+		case EM_RISCV:
+			if (machine_type_mismatch(file, "RISCV64", NULL,
+			    source_query))
+				goto bailout;
+			break;
+
 		default:
 			if (machine_type_mismatch(file, "(unknown)", NULL,
 			    source_query))
@@ -2935,7 +2941,8 @@  dump_registers_for_elf_dumpfiles(void)
 
         if (!(machine_type("X86") || machine_type("X86_64") || 
 	    machine_type("ARM64") || machine_type("PPC64") ||
-	    machine_type("MIPS") || machine_type("MIPS64")))
+	    machine_type("MIPS") || machine_type("MIPS64") ||
+	    machine_type("RISCV64")))
                 error(FATAL, "-r option not supported for this dumpfile\n");
 
 	if (NETDUMP_DUMPFILE()) {
diff --git a/ramdump.c b/ramdump.c
index a206fcb..d2bd7ff 100644
--- a/ramdump.c
+++ b/ramdump.c
@@ -188,6 +188,8 @@  char *ramdump_to_elf(void)
 		e_machine = EM_MIPS;
 	else if (machine_type("X86_64"))
 		e_machine = EM_X86_64;
+	else if (machine_type("RISCV64"))
+		e_machine = EM_RISCV;
 	else
 		error(FATAL, "ramdump: unsupported machine type: %s\n", 
 			MACHINE_TYPE);
diff --git a/riscv64.c b/riscv64.c
new file mode 100644
index 0000000..c7df857
--- /dev/null
+++ b/riscv64.c
@@ -0,0 +1,56 @@ 
+/* riscv64.c - core analysis suite
+ *
+ * Copyright (C) 2022 Alibaba Group Holding Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ */
+#ifdef RISCV64
+
+#include <elf.h>
+#include "defs.h"
+
+void
+riscv64_dump_machdep_table(ulong arg)
+{
+}
+
+/*
+ *  Include both vmalloc'd and module address space as VMALLOC space.
+ */
+int
+riscv64_IS_VMALLOC_ADDR(ulong vaddr)
+{
+	return ((vaddr >= VMALLOC_START && vaddr <= VMALLOC_END) ||
+		(vaddr >= VMEMMAP_VADDR && vaddr <= VMEMMAP_END) ||
+		(vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
+}
+
+void
+riscv64_init(int when)
+{
+}
+
+void
+riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
+{
+}
+
+#else /* !RISCV64 */
+
+#include "defs.h"
+
+void
+riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
+{
+	return;
+}
+
+#endif /* !RISCV64 */
diff --git a/symbols.c b/symbols.c
index bee1faf..ea9e83e 100644
--- a/symbols.c
+++ b/symbols.c
@@ -3743,6 +3743,11 @@  is_kernel(char *file)
 				goto bailout;
 			break;
 
+		case EM_RISCV:
+			if (machine_type_mismatch(file, "RISCV64", NULL, 0))
+				goto bailout;
+			break;
+
 		default:
 			if (machine_type_mismatch(file, "(unknown)", NULL, 0))
 				goto bailout;
@@ -4002,6 +4007,11 @@  is_shared_object(char *file)
 			if (machine_type("MIPS64"))
 				return TRUE;
 			break;
+
+		case EM_RISCV:
+			if (machine_type("RISCV64"))
+				return TRUE;
+			break;
 		}
 
 		if (CRASHDEBUG(1))