linux-riscv.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] RISC-V: Add kexec/kdump support
@ 2020-04-24 17:12 Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 1/3] RISC-V: Add kexec support Nick Kossifidis
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-04-24 17:12 UTC (permalink / raw)
  To: linux-riscv
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, palmer,
	paul.walmsley, Nick Kossifidis

This patch series adds kexec/kdump and crash kernel
support on RISC-V. For testing the patches a patched
version of kexec-tools is needed. The patch is still
a work in progress but a draft version can be found at:

http://riscv.ics.forth.gr/kexec-tools.patch

Nick Kossifidis (3):
  RISC-V: Add kexec support
  RISC-V: Add kdump support
  RISC-V: Add crash kernel support

 arch/riscv/Kconfig                  |  24 +++
 arch/riscv/include/asm/kexec.h      |  54 +++++++
 arch/riscv/include/uapi/asm/elf.h   |   6 +
 arch/riscv/kernel/Makefile          |   3 +-
 arch/riscv/kernel/crash_dump.c      |  46 ++++++
 arch/riscv/kernel/crash_save_regs.S |  56 +++++++
 arch/riscv/kernel/kexec_relocate.S  | 217 ++++++++++++++++++++++++++++
 arch/riscv/kernel/machine_kexec.c   | 193 +++++++++++++++++++++++++
 arch/riscv/kernel/setup.c           |  63 ++++++++
 arch/riscv/mm/init.c                | 173 ++++++++++++++++++++++
 include/uapi/linux/kexec.h          |   1 +
 11 files changed, 835 insertions(+), 1 deletion(-)
 create mode 100644 arch/riscv/include/asm/kexec.h
 create mode 100644 arch/riscv/kernel/crash_dump.c
 create mode 100644 arch/riscv/kernel/crash_save_regs.S
 create mode 100644 arch/riscv/kernel/kexec_relocate.S
 create mode 100644 arch/riscv/kernel/machine_kexec.c

-- 
2.24.1



^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/3] RISC-V: Add kexec support
  2020-04-24 17:12 [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
@ 2020-04-24 17:12 ` Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 2/3] RISC-V: Add kdump support Nick Kossifidis
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-04-24 17:12 UTC (permalink / raw)
  To: linux-riscv
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, palmer,
	paul.walmsley, Nick Kossifidis

This patch adds support for kexec on RISC-V. On SMP systems it depends
on HOTPLUG_CPU in order to be able to bring up all harts after kexec.
It also needs a recent OpenSBI version that supports the HSM extension.
I tested it on riscv64 QEMU on both an smp and a non-smp system.

Note that on my tests although all harts seem to go down properly,
when using more than 2 harts on qemu, they don't seem to come back
as expected.

The older version of this patch can be found at:
https://patchwork.kernel.org/patch/11486653/

v3:
 * Use the new smp_shutdown_nonboot_cpus() call.
 * Move riscv_kexec_relocate to .rodata

v2:
 * Pass needed parameters as arguments to riscv_kexec_relocate
   instead of using global variables.
 * Use kimage_arch to hold the fdt address of the included fdt.
 * Use SYM_* macros on kexec_relocate.S.
 * Compatibility with STRICT_KERNEL_RWX.
 * Compatibility with HOTPLUG_CPU for SMP
 * Small cleanups

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
---
 arch/riscv/Kconfig                 |  14 +++
 arch/riscv/include/asm/kexec.h     |  47 ++++++++
 arch/riscv/kernel/Makefile         |   1 +
 arch/riscv/kernel/kexec_relocate.S | 158 ++++++++++++++++++++++++
 arch/riscv/kernel/machine_kexec.c  | 188 +++++++++++++++++++++++++++++
 include/uapi/linux/kexec.h         |   1 +
 6 files changed, 409 insertions(+)
 create mode 100644 arch/riscv/include/asm/kexec.h
 create mode 100644 arch/riscv/kernel/kexec_relocate.S
 create mode 100644 arch/riscv/kernel/machine_kexec.c

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index cbc652754..4934b2f62 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -331,6 +331,20 @@ config RISCV_SBI_V01
 	help
 	  This config allows kernel to use SBI v0.1 APIs. This will be
 	  deprecated in future once legacy M-mode software are no longer in use.
+
+config KEXEC
+	bool "Kexec system call"
+	select KEXEC_CORE
+	select HOTPLUG_CPU if SMP
+	help
+	  kexec is a system call that implements the ability to shutdown your
+	  current kernel, and to start another kernel. It is like a reboot
+	  but it is independent of the system firmware. And like a reboot
+	  you can start any kernel with it, not just Linux.
+
+	  The name comes from the similarity to the exec system call.
+
+
 endmenu
 
 menu "Boot options"
diff --git a/arch/riscv/include/asm/kexec.h b/arch/riscv/include/asm/kexec.h
new file mode 100644
index 000000000..edff8a84a
--- /dev/null
+++ b/arch/riscv/include/asm/kexec.h
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
+ */
+
+#ifndef _RISCV_KEXEC_H
+#define _RISCV_KEXEC_H
+
+/* Maximum physical address we can use pages from */
+#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+
+/* Maximum address we can reach in physical address mode */
+#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
+
+/* Maximum address we can use for the control code buffer */
+#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
+
+/* Reserve a page for the control code buffer */
+#define KEXEC_CONTROL_PAGE_SIZE 4096
+
+#define KEXEC_ARCH KEXEC_ARCH_RISCV
+
+static inline void
+crash_setup_regs(struct pt_regs *newregs,
+		 struct pt_regs *oldregs)
+{
+	/* Dummy implementation for now */
+}
+
+
+#define ARCH_HAS_KIMAGE_ARCH
+
+struct kimage_arch {
+	unsigned long fdt_addr;
+};
+
+const extern unsigned char riscv_kexec_relocate[];
+const extern unsigned int riscv_kexec_relocate_size;
+
+typedef void (*riscv_kexec_do_relocate)(unsigned long first_ind_entry,
+					unsigned long jump_addr,
+					unsigned long fdt_addr,
+					unsigned long hartid,
+					unsigned long va_pa_off);
+
+#endif
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 86c830810..28dccbbe6 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -51,5 +51,6 @@ ifeq ($(CONFIG_RISCV_SBI), y)
 obj-$(CONFIG_SMP) += cpu_ops_sbi.o
 endif
 obj-$(CONFIG_HOTPLUG_CPU)	+= cpu-hotplug.o
+obj-${CONFIG_KEXEC}		+= kexec_relocate.o machine_kexec.o
 
 clean:
diff --git a/arch/riscv/kernel/kexec_relocate.S b/arch/riscv/kernel/kexec_relocate.S
new file mode 100644
index 000000000..d26e38157
--- /dev/null
+++ b/arch/riscv/kernel/kexec_relocate.S
@@ -0,0 +1,158 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
+ */
+
+#include <asm/asm.h>	/* For RISCV_* and REG_* macros */
+#include <asm/page.h>	/* For PAGE_SHIFT */
+#include <linux/linkage.h> /* For SYM_* macros */
+
+.section ".rodata"
+SYM_CODE_START(riscv_kexec_relocate)
+
+	/*
+	 * s0: Pointer to the current entry
+	 * s1: (const) Phys address to jump to after relocation
+	 * s2: (const) Phys address of the FDT image
+	 * s3: (const) The hartid of the current hart
+	 * s4: Pointer to the destination address for the relocation
+	 * s5: (const) Number of words per page
+	 * s6: (const) 1, used for subtraction
+	 * s7: (const) va_pa_offset, used when switching MMU off
+	 * s8: (const) Physical address of the main loop
+	 * s9: (debug) indirection page counter
+	 * s10: (debug) entry counter
+	 * s11: (debug) copied words counter
+	 */
+	mv	s0, a0
+	mv	s1, a1
+	mv	s2, a2
+	mv	s3, a3
+	mv	s4, zero
+	li	s5, ((1 << PAGE_SHIFT) / RISCV_SZPTR)
+	li	s6, 1
+	mv	s7, a4
+	mv	s8, zero
+	mv	s9, zero
+	mv	s10, zero
+	mv	s11, zero
+
+	/* Disable / cleanup interrupts */
+	csrw	sie, zero
+	csrw	sip, zero
+
+	/*
+	 * When we switch SATP.MODE to "Bare" we'll only
+	 * play with physical addresses. However the first time
+	 * we try to jump somewhere, the offset on the jump
+	 * will be relative to pc which will still be on VA. To
+	 * deal with this we set stvec to the physical address at
+	 * the start of the loop below so that we jump there in
+	 * any case.
+	 */
+	la	s8, 1f
+	sub	s8, s8, s7
+	csrw	stvec, s8
+
+	/* Process entries in a loop */
+1:
+	addi	s10, s10, 1
+	REG_L	t0, 0(s0)		/* t0 = *image->entry */
+	addi	s0, s0, RISCV_SZPTR	/* image->entry++ */
+
+	/* IND_DESTINATION entry ? -> save destination address */
+	andi	t1, t0, 0x1
+	beqz	t1, 2f
+	andi	s4, t0, ~0x1
+	j	1b
+
+2:
+	/* IND_INDIRECTION entry ? -> update next entry ptr (PA) */
+	andi	t1, t0, 0x2
+	beqz	t1, 2f
+	andi	s0, t0, ~0x2
+	addi	s9, s9, 1
+	csrw	sptbr, zero
+	jalr	zero, s8, 0
+
+2:
+	/* IND_DONE entry ? -> jump to done label */
+	andi	t1, t0, 0x4
+	beqz	t1, 2f
+	j	4f
+
+2:
+	/*
+	 * IND_SOURCE entry ? -> copy page word by word to the
+	 * destination address we got from IND_DESTINATION
+	 */
+	andi	t1, t0, 0x8
+	beqz	t1, 1b		/* Unknown entry type, ignore it */
+	andi	t0, t0, ~0x8
+	mv	t3, s5		/* i = num words per page */
+3:	/* copy loop */
+	REG_L	t1, (t0)	/* t1 = *src_ptr */
+	REG_S	t1, (s4)	/* *dst_ptr = *src_ptr */
+	addi	t0, t0, RISCV_SZPTR /* stc_ptr++ */
+	addi	s4, s4, RISCV_SZPTR /* dst_ptr++ */
+	sub	t3, t3, s6	/* i-- */
+	addi	s11, s11, 1	/* c++ */
+	beqz	t3, 1b		/* copy done ? */
+	j	3b
+
+4:
+	/* Wait for the relocation to be visible by other harts */
+	fence	w,w
+
+	/* Pass the arguments to the next kernel  / Cleanup*/
+	mv	a0, s3
+	mv	a1, s2
+	mv	a2, s1
+
+	/* Cleanup */
+	mv	a3, zero
+	mv	a4, zero
+	mv	a5, zero
+	mv	a6, zero
+	mv	a7, zero
+
+	mv	s0, zero
+	mv	s1, zero
+	mv	s2, zero
+	mv	s3, zero
+	mv	s4, zero
+	mv	s5, zero
+	mv	s6, zero
+	mv	s7, zero
+	mv	s8, zero
+	mv	s9, zero
+	mv	s10, zero
+	mv	s11, zero
+
+	mv	t0, zero
+	mv	t1, zero
+	mv	t2, zero
+	mv	t3, zero
+	mv	t4, zero
+	mv	t5, zero
+	mv	t6, zero
+	csrw	sepc, zero
+	csrw	scause, zero
+	csrw	sscratch, zero
+
+	/*
+	 * Make sure the relocated code is visible
+	 * and jump to the new kernel
+	 */
+	fence.i
+
+	jalr	zero, a2, 0
+
+SYM_CODE_END(riscv_kexec_relocate)
+riscv_kexec_relocate_end:
+
+	.section ".rodata"
+SYM_DATA(riscv_kexec_relocate_size,
+	.long riscv_kexec_relocate_end - riscv_kexec_relocate)
+
diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c
new file mode 100644
index 000000000..b9fc735c3
--- /dev/null
+++ b/arch/riscv/kernel/machine_kexec.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
+ */
+
+#include <linux/kexec.h>
+#include <asm/kexec.h>		/* For riscv_kexec_* symbol defines */
+#include <linux/smp.h>		/* For smp_send_stop () */
+#include <asm/cacheflush.h>	/* For local_flush_icache_all() */
+#include <asm/barrier.h>	/* For smp_wmb() */
+#include <asm/page.h>		/* For PAGE_MASK */
+#include <linux/libfdt.h>	/* For fdt_check_header() */
+#include <asm/set_memory.h>	/* For set_memory_x() */
+#include <linux/compiler.h>	/* For unreachable() */
+#include <linux/cpu.h>		/* For cpu_down() */
+
+/**
+ * kexec_image_info - Print received image details
+ */
+static void
+kexec_image_info(const struct kimage *image)
+{
+	unsigned long i;
+
+	pr_debug("Kexec image info:\n");
+	pr_debug("\ttype:        %d\n", image->type);
+	pr_debug("\tstart:       %lx\n", image->start);
+	pr_debug("\thead:        %lx\n", image->head);
+	pr_debug("\tnr_segments: %lu\n", image->nr_segments);
+
+	for (i = 0; i < image->nr_segments; i++) {
+		pr_debug("\t    segment[%lu]: %016lx - %016lx", i,
+			image->segment[i].mem,
+			image->segment[i].mem + image->segment[i].memsz);
+		pr_debug("\t\t0x%lx bytes, %lu pages\n",
+			(unsigned long) image->segment[i].memsz,
+			(unsigned long) image->segment[i].memsz /  PAGE_SIZE);
+	}
+}
+
+/**
+ * machine_kexec_prepare - Initialize kexec
+ *
+ * This function is called from do_kexec_load, when the user has
+ * provided us with an image to be loaded. Its goal is to validate
+ * the image and prepare the control code buffer as needed.
+ * Note that kimage_alloc_init has already been called and the
+ * control buffer has already been allocated.
+ */
+int
+machine_kexec_prepare(struct kimage *image)
+{
+	struct kimage_arch *internal = &image->arch;
+	struct fdt_header fdt = {0};
+	void *control_code_buffer = NULL;
+	int i = 0;
+
+	kexec_image_info(image);
+
+	if (image->type == KEXEC_TYPE_CRASH) {
+		pr_warn("Loading a crash kernel is unsupported for now.\n");
+		return -EINVAL;
+	}
+
+	/* Find the Flattened Device Tree and save its physical address */
+	for (i = 0; i < image->nr_segments; i++) {
+		if (image->segment[i].memsz <= sizeof(fdt))
+			continue;
+
+		if (copy_from_user(&fdt, image->segment[i].buf, sizeof(fdt)))
+			continue;
+
+		if (fdt_check_header(&fdt))
+			continue;
+
+		internal->fdt_addr = (unsigned long) image->segment[i].mem;
+		break;
+	}
+
+	if (!internal->fdt_addr) {
+		pr_err("Device tree not included in the provided image\n");
+		return -EINVAL;
+	}
+
+	/* Copy the assembler code for relocation to the control page */
+	control_code_buffer = page_address(image->control_code_page);
+	memcpy(control_code_buffer, riscv_kexec_relocate,
+		riscv_kexec_relocate_size);
+
+	/* Mark the control page executable */
+	set_memory_x((unsigned long) control_code_buffer, 1);
+
+#ifdef CONFIG_SMP
+	/*
+	 * Make sure other harts see the copied data
+	 * if they try to read the control buffer
+	 */
+	smp_wmb();
+#endif
+
+	return 0;
+}
+
+
+/**
+ * machine_kexec_cleanup - Cleanup any leftovers from
+ *			   machine_kexec_prepare
+ *
+ * This function is called by kimage_free to handle any arch-specific
+ * allocations done on machine_kexec_prepare. Since we didn't do any
+ * allocations there, this is just an empty function. Note that the
+ * control buffer is freed by kimage_free.
+ */
+void
+machine_kexec_cleanup(struct kimage *image)
+{
+}
+
+
+/*
+ * machine_shutdown - Prepare for a kexec reboot
+ *
+ * This function is called by kernel_kexec just before machine_kexec
+ * below. Its goal is to prepare the rest of the system (the other
+ * harts and possibly devices etc) for a kexec reboot.
+ */
+void machine_shutdown(void)
+{
+	/*
+	 * No more interrupts on this hart
+	 * until we are back up.
+	 */
+	local_irq_disable();
+
+#if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP)
+	smp_shutdown_nonboot_cpus(smp_processor_id());
+#endif
+}
+
+/**
+ * machine_crash_shutdown - Prepare to kexec after a kernel crash
+ *
+ * This function is called by crash_kexec just before machine_kexec
+ * below and its goal is similar to machine_shutdown, but in case of
+ * a kernel crash. Since we don't handle such cases yet, this function
+ * is empty.
+ */
+void
+machine_crash_shutdown(struct pt_regs *regs)
+{
+}
+
+/**
+ * machine_kexec - Jump to the loaded kimage
+ *
+ * This function is called by kernel_kexec which is called by the
+ * reboot system call when the reboot cmd is LINUX_REBOOT_CMD_KEXEC,
+ * or by crash_kernel which is called by the kernel's arch-specific
+ * trap handler in case of a kernel panic. It's the final stage of
+ * the kexec process where the pre-loaded kimage is ready to be
+ * executed. We assume at this point that all other harts are
+ * suspended and this hart will be the new boot hart.
+ */
+void __noreturn
+machine_kexec(struct kimage *image)
+{
+	struct kimage_arch *internal = &image->arch;
+	unsigned long jump_addr = (unsigned long) image->start;
+	unsigned long first_ind_entry = (unsigned long) &image->head;
+	unsigned long this_hart_id = raw_smp_processor_id();
+	unsigned long fdt_addr = internal->fdt_addr;
+	void *control_code_buffer = page_address(image->control_code_page);
+	riscv_kexec_do_relocate do_relocate = control_code_buffer;
+
+	pr_notice("Will call new kernel at %08lx from hart id %lx\n",
+		  jump_addr, this_hart_id);
+	pr_notice("FDT image at %08lx\n", fdt_addr);
+
+	/* Make sure the relocation code is visible to the hart */
+	local_flush_icache_all();
+
+	/* Jump to the relocation code */
+	pr_notice("Bye...\n");
+	do_relocate(first_ind_entry, jump_addr, fdt_addr,
+		    this_hart_id, va_pa_offset);
+	unreachable();
+}
diff --git a/include/uapi/linux/kexec.h b/include/uapi/linux/kexec.h
index 05669c87a..778dc191c 100644
--- a/include/uapi/linux/kexec.h
+++ b/include/uapi/linux/kexec.h
@@ -42,6 +42,7 @@
 #define KEXEC_ARCH_MIPS_LE (10 << 16)
 #define KEXEC_ARCH_MIPS    ( 8 << 16)
 #define KEXEC_ARCH_AARCH64 (183 << 16)
+#define KEXEC_ARCH_RISCV   (243 << 16)
 
 /* The artificial cap on the number of segments passed to kexec_load. */
 #define KEXEC_SEGMENT_MAX 16
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/3] RISC-V: Add kdump support
  2020-04-24 17:12 [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 1/3] RISC-V: Add kexec support Nick Kossifidis
@ 2020-04-24 17:12 ` Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 3/3] RISC-V: Add crash kernel support Nick Kossifidis
  2020-05-21 18:42 ` [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
  3 siblings, 0 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-04-24 17:12 UTC (permalink / raw)
  To: linux-riscv
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, palmer,
	paul.walmsley, Nick Kossifidis

This patch adds support for kdump, the kernel will reserve a
region for the crash kernel and jump there on panic. In order
for userspace tools (kexec-tools) to prepare the crash kernel
kexec image, we also need to expose some information on
/proc/iomem for the memory regions used by the kernel and for
the region reserved for crash kernel. Note that on userspace
the device tree is used to determine the system's memory
layout so the "System RAM" on /proc/iomem is ignored. I just
put it there for compatibility with other archs.

I tested this on riscv64 qemu and works as expected, you may
test it by triggering a crash through /proc/sysrq_trigger:

echo c > /proc/sysrq_trigger

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
---
 arch/riscv/include/asm/kexec.h      | 19 ++++---
 arch/riscv/include/uapi/asm/elf.h   |  6 +++
 arch/riscv/kernel/Makefile          |  2 +-
 arch/riscv/kernel/crash_save_regs.S | 56 +++++++++++++++++++++
 arch/riscv/kernel/kexec_relocate.S  | 61 +++++++++++++++++++++-
 arch/riscv/kernel/machine_kexec.c   | 31 +++++++-----
 arch/riscv/kernel/setup.c           | 50 ++++++++++++++++++
 arch/riscv/mm/init.c                | 78 +++++++++++++++++++++++++++++
 8 files changed, 282 insertions(+), 21 deletions(-)
 create mode 100644 arch/riscv/kernel/crash_save_regs.S

diff --git a/arch/riscv/include/asm/kexec.h b/arch/riscv/include/asm/kexec.h
index edff8a84a..5bfb3431f 100644
--- a/arch/riscv/include/asm/kexec.h
+++ b/arch/riscv/include/asm/kexec.h
@@ -21,11 +21,16 @@
 
 #define KEXEC_ARCH KEXEC_ARCH_RISCV
 
+extern void riscv_crash_save_regs(struct pt_regs *newregs);
+
 static inline void
 crash_setup_regs(struct pt_regs *newregs,
 		 struct pt_regs *oldregs)
 {
-	/* Dummy implementation for now */
+	if (oldregs)
+		memcpy(newregs, oldregs, sizeof(struct pt_regs));
+	else
+		riscv_crash_save_regs(newregs);
 }
 
 
@@ -38,10 +43,12 @@ struct kimage_arch {
 const extern unsigned char riscv_kexec_relocate[];
 const extern unsigned int riscv_kexec_relocate_size;
 
-typedef void (*riscv_kexec_do_relocate)(unsigned long first_ind_entry,
-					unsigned long jump_addr,
-					unsigned long fdt_addr,
-					unsigned long hartid,
-					unsigned long va_pa_off);
+typedef void (*riscv_kexec_method)(unsigned long first_ind_entry,
+				   unsigned long jump_addr,
+				   unsigned long fdt_addr,
+				   unsigned long hartid,
+				   unsigned long va_pa_off);
+
+extern riscv_kexec_method riscv_kexec_norelocate;
 
 #endif
diff --git a/arch/riscv/include/uapi/asm/elf.h b/arch/riscv/include/uapi/asm/elf.h
index d696d6610..5b19f5547 100644
--- a/arch/riscv/include/uapi/asm/elf.h
+++ b/arch/riscv/include/uapi/asm/elf.h
@@ -19,6 +19,12 @@ typedef unsigned long elf_greg_t;
 typedef struct user_regs_struct elf_gregset_t;
 #define ELF_NGREG (sizeof(elf_gregset_t) / sizeof(elf_greg_t))
 
+#define ELF_CORE_COPY_REGS(dest, regs)			\
+do {							\
+	*(struct user_regs_struct *)&(dest) =		\
+		*(struct user_regs_struct *)regs;	\
+} while (0);
+
 /* We don't support f without d, or q.  */
 typedef __u64 elf_fpreg_t;
 typedef union __riscv_fp_state elf_fpregset_t;
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 28dccbbe6..65f6c9f1d 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -51,6 +51,6 @@ ifeq ($(CONFIG_RISCV_SBI), y)
 obj-$(CONFIG_SMP) += cpu_ops_sbi.o
 endif
 obj-$(CONFIG_HOTPLUG_CPU)	+= cpu-hotplug.o
-obj-${CONFIG_KEXEC}		+= kexec_relocate.o machine_kexec.o
+obj-${CONFIG_KEXEC}		+= kexec_relocate.o crash_save_regs.o machine_kexec.o
 
 clean:
diff --git a/arch/riscv/kernel/crash_save_regs.S b/arch/riscv/kernel/crash_save_regs.S
new file mode 100644
index 000000000..ce5948097
--- /dev/null
+++ b/arch/riscv/kernel/crash_save_regs.S
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
+ */
+
+#include <asm/asm.h>    	/* For RISCV_* and REG_* macros */
+#include <asm/csr.h>		/* For CSR_* macros */
+#include <asm/asm-offsets.h>	/* For offsets on pt_regs */
+#include <linux/linkage.h>	/* For SYM_* macros */
+
+.section ".text"
+SYM_CODE_START(riscv_crash_save_regs)
+	REG_S ra,  PT_RA(a0)	/* x1 */
+	REG_S sp,  PT_SP(a0)	/* x2 */
+	REG_S gp,  PT_GP(a0)	/* x3 */
+	REG_S tp,  PT_TP(a0)	/* x4 */
+	REG_S t0,  PT_T0(a0)	/* x5 */
+	REG_S t1,  PT_T1(a0)	/* x6 */
+	REG_S t2,  PT_T2(a0)	/* x7 */
+	REG_S s0,  PT_S0(a0)	/* x8/fp */
+	REG_S s1,  PT_S1(a0)	/* x9 */
+	REG_S a0,  PT_A0(a0)	/* x10 */
+	REG_S a1,  PT_A1(a0)	/* x11 */
+	REG_S a2,  PT_A2(a0)	/* x12 */
+	REG_S a3,  PT_A3(a0)	/* x13 */
+	REG_S a4,  PT_A4(a0)	/* x14 */
+	REG_S a5,  PT_A5(a0)	/* x15 */
+	REG_S a6,  PT_A6(a0)	/* x16 */
+	REG_S a7,  PT_A7(a0)	/* x17 */
+	REG_S s2,  PT_S2(a0)	/* x18 */
+	REG_S s3,  PT_S3(a0)	/* x19 */
+	REG_S s4,  PT_S4(a0)	/* x20 */
+	REG_S s5,  PT_S5(a0)	/* x21 */
+	REG_S s6,  PT_S6(a0)	/* x22 */
+	REG_S s7,  PT_S7(a0)	/* x23 */
+	REG_S s8,  PT_S8(a0)	/* x24 */
+	REG_S s9,  PT_S9(a0)	/* x25 */
+	REG_S s10, PT_S10(a0)	/* x26 */
+	REG_S s11, PT_S11(a0)	/* x27 */
+	REG_S t3,  PT_T3(a0)	/* x28 */
+	REG_S t4,  PT_T4(a0)	/* x29 */
+	REG_S t5,  PT_T5(a0)	/* x30 */
+	REG_S t6,  PT_T6(a0)	/* x31 */
+
+	csrr t1, CSR_STATUS
+	csrr t2, CSR_EPC
+	csrr t3, CSR_TVAL
+	csrr t4, CSR_CAUSE
+
+	REG_S t1, PT_STATUS(a0)
+	REG_S t2, PT_EPC(a0)
+	REG_S t3, PT_BADADDR(a0)
+	REG_S t4, PT_CAUSE(a0)
+	ret
+SYM_CODE_END(riscv_crash_save_regs)
diff --git a/arch/riscv/kernel/kexec_relocate.S b/arch/riscv/kernel/kexec_relocate.S
index d26e38157..aa4a9a95c 100644
--- a/arch/riscv/kernel/kexec_relocate.S
+++ b/arch/riscv/kernel/kexec_relocate.S
@@ -152,7 +152,66 @@ SYM_CODE_START(riscv_kexec_relocate)
 SYM_CODE_END(riscv_kexec_relocate)
 riscv_kexec_relocate_end:
 
-	.section ".rodata"
+
+/* Used for jumping to crashkernel */
+.section ".text"
+SYM_CODE_START(riscv_kexec_norelocate)
+	/*
+	 * s0: (const) Phys address to jump to
+	 * s1: (const) Phys address of the FDT image
+	 * s2: (const) The hartid of the current hart
+	 */
+	mv	s0, a1
+	mv	s1, a2
+	mv	s2, a3
+
+	/* Disable / cleanup interrupts */
+	csrw	sie, zero
+	csrw	sip, zero
+
+	/* Switch to physical addressing */
+	csrw	sptbr, zero
+
+	/* Pass the arguments to the next kernel  / Cleanup*/
+	mv	a0, s2
+	mv	a1, s1
+	mv	a2, s0
+
+	/* Cleanup */
+	mv	a3, zero
+	mv	a4, zero
+	mv	a5, zero
+	mv	a6, zero
+	mv	a7, zero
+
+	mv	s0, zero
+	mv	s1, zero
+	mv	s2, zero
+	mv	s3, zero
+	mv	s4, zero
+	mv	s5, zero
+	mv	s6, zero
+	mv	s7, zero
+	mv	s8, zero
+	mv	s9, zero
+	mv	s10, zero
+	mv	s11, zero
+
+	mv	t0, zero
+	mv	t1, zero
+	mv	t2, zero
+	mv	t3, zero
+	mv	t4, zero
+	mv	t5, zero
+	mv	t6, zero
+	csrw	sepc, zero
+	csrw	scause, zero
+	csrw	sscratch, zero
+
+	jalr	zero, a2, 0
+SYM_CODE_END(riscv_kexec_norelocate)
+
+.section ".rodata"
 SYM_DATA(riscv_kexec_relocate_size,
 	.long riscv_kexec_relocate_end - riscv_kexec_relocate)
 
diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c
index b9fc735c3..14e9622eb 100644
--- a/arch/riscv/kernel/machine_kexec.c
+++ b/arch/riscv/kernel/machine_kexec.c
@@ -58,11 +58,6 @@ machine_kexec_prepare(struct kimage *image)
 
 	kexec_image_info(image);
 
-	if (image->type == KEXEC_TYPE_CRASH) {
-		pr_warn("Loading a crash kernel is unsupported for now.\n");
-		return -EINVAL;
-	}
-
 	/* Find the Flattened Device Tree and save its physical address */
 	for (i = 0; i < image->nr_segments; i++) {
 		if (image->segment[i].memsz <= sizeof(fdt))
@@ -84,12 +79,14 @@ machine_kexec_prepare(struct kimage *image)
 	}
 
 	/* Copy the assembler code for relocation to the control page */
-	control_code_buffer = page_address(image->control_code_page);
-	memcpy(control_code_buffer, riscv_kexec_relocate,
-		riscv_kexec_relocate_size);
+	if (image->type != KEXEC_TYPE_CRASH) {
+		control_code_buffer = page_address(image->control_code_page);
+		memcpy(control_code_buffer, riscv_kexec_relocate,
+		       riscv_kexec_relocate_size);
 
-	/* Mark the control page executable */
-	set_memory_x((unsigned long) control_code_buffer, 1);
+		/* Mark the control page executable */
+		set_memory_x((unsigned long) control_code_buffer, 1);
+	}
 
 #ifdef CONFIG_SMP
 	/*
@@ -149,6 +146,9 @@ void machine_shutdown(void)
 void
 machine_crash_shutdown(struct pt_regs *regs)
 {
+	machine_shutdown();
+	crash_save_cpu(regs, smp_processor_id());
+	pr_info("Starting crashdump kernel...\n");
 }
 
 /**
@@ -171,7 +171,12 @@ machine_kexec(struct kimage *image)
 	unsigned long this_hart_id = raw_smp_processor_id();
 	unsigned long fdt_addr = internal->fdt_addr;
 	void *control_code_buffer = page_address(image->control_code_page);
-	riscv_kexec_do_relocate do_relocate = control_code_buffer;
+	riscv_kexec_method kexec_method = NULL;
+
+	if (image->type != KEXEC_TYPE_CRASH)
+		kexec_method = control_code_buffer;
+	else
+		kexec_method = (riscv_kexec_method) &riscv_kexec_norelocate;
 
 	pr_notice("Will call new kernel at %08lx from hart id %lx\n",
 		  jump_addr, this_hart_id);
@@ -182,7 +187,7 @@ machine_kexec(struct kimage *image)
 
 	/* Jump to the relocation code */
 	pr_notice("Bye...\n");
-	do_relocate(first_ind_entry, jump_addr, fdt_addr,
-		    this_hart_id, va_pa_offset);
+	kexec_method(first_ind_entry, jump_addr, fdt_addr,
+		     this_hart_id, va_pa_offset);
 	unreachable();
 }
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 3e528312f..52d057bde 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -4,6 +4,8 @@
  *  Chen Liqin <liqin.chen@sunplusct.com>
  *  Lennox Wu <lennox.wu@sunplusct.com>
  * Copyright (C) 2012 Regents of the University of California
+ * Copyright (C) 2020 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
  */
 
 #include <linux/init.h>
@@ -17,6 +19,7 @@
 #include <linux/sched/task.h>
 #include <linux/swiotlb.h>
 #include <linux/smp.h>
+#include <linux/crash_dump.h>
 
 #include <asm/clint.h>
 #include <asm/cpu_ops.h>
@@ -50,6 +53,52 @@ atomic_t hart_lottery __section(.sdata);
 unsigned long boot_cpu_hartid;
 static DEFINE_PER_CPU(struct cpu, cpu_devices);
 
+/*
+ * Place kernel memory regions on the resource tree so that
+ * userspace tools such as kexec-tools can retrieve them from
+ * /proc/iomem. While there also add "System RAM" region for
+ * compatibility with other archs.
+ */
+static struct resource sysram_res = { .name = "System RAM", };
+static struct resource code_res = { .name = "Kernel code", };
+static struct resource data_res = { .name = "Kernel data", };
+static struct resource rodata_res = { .name = "Kernel rodata", };
+static struct resource bss_res = { .name = "Kernel bss", };
+
+static void __init kdump_resource_init(void)
+{
+	sysram_res.start = memblock_start_of_DRAM();
+	sysram_res.end = memblock_end_of_DRAM() - 1;
+	sysram_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+	insert_resource(&iomem_resource, &sysram_res);
+
+	code_res.start = __pa_symbol(_text);
+	code_res.end = __pa_symbol(_etext) - 1;
+	code_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+	insert_resource(&sysram_res, &code_res);
+
+	rodata_res.start = __pa_symbol(__start_rodata);
+	rodata_res.end = __pa_symbol(__end_rodata) - 1;
+	rodata_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+	insert_resource(&sysram_res, &rodata_res);
+
+	data_res.start = __pa_symbol(_data);
+	data_res.end = __pa_symbol(_edata) - 1;
+	data_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+	insert_resource(&sysram_res, &data_res);
+
+	bss_res.start = __pa_symbol(__bss_start);
+	bss_res.end = __pa_symbol(__bss_stop) - 1;
+	bss_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+	insert_resource(&sysram_res, &bss_res);
+
+#ifdef CONFIG_KEXEC_CORE
+	/* Add crash kernel region if present */
+	if (crashk_res.end > crashk_res.start)
+		insert_resource(&sysram_res, &crashk_res);
+#endif
+}
+
 void __init parse_dtb(void)
 {
 	if (early_init_dt_scan(dtb_early_va))
@@ -75,6 +124,7 @@ void __init setup_arch(char **cmdline_p)
 
 	setup_bootmem();
 	paging_init();
+	kdump_resource_init();
 #if IS_ENABLED(CONFIG_BUILTIN_DTB)
 	unflatten_and_copy_device_tree();
 #else
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index 9d7dfc986..1c4461590 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -2,6 +2,8 @@
 /*
  * Copyright (C) 2012 Regents of the University of California
  * Copyright (C) 2019 Western Digital Corporation or its affiliates.
+ * Copyright (C) 2020 FORTH-ICS/CARV
+ *  Nick Kossifidis <mick@ics.forth.gr>
  */
 
 #include <linux/init.h>
@@ -13,6 +15,7 @@
 #include <linux/of_fdt.h>
 #include <linux/libfdt.h>
 #include <linux/set_memory.h>
+#include <linux/crash_dump.h>
 
 #include <asm/fixmap.h>
 #include <asm/tlbflush.h>
@@ -541,6 +544,78 @@ void mark_rodata_ro(void)
 }
 #endif
 
+#ifdef CONFIG_KEXEC_CORE
+/*
+ * reserve_crashkernel() - reserves memory for crash kernel
+ *
+ * This function reserves memory area given in "crashkernel=" kernel command
+ * line parameter. The memory reserved is used by dump capture kernel when
+ * primary kernel is crashing.
+ */
+static void __init reserve_crashkernel(void)
+{
+	unsigned long long crash_base = 0;
+	unsigned long long crash_size = 0;
+	unsigned long start_pfn = find_min_pfn_with_active_regions();
+	unsigned long search_start = start_pfn << PAGE_SHIFT;
+	unsigned long search_end = (unsigned long) PFN_PHYS(max_low_pfn) - 1;
+
+	int ret = 0;
+
+	ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
+				&crash_size, &crash_base);
+	if (ret || !crash_size)
+		return;
+
+	crash_size = PAGE_ALIGN(crash_size);
+
+	if (crash_base == 0) {
+		/*
+		 * Current riscv boot protocol requires 2MB alignment for
+		 * RV64 and 4MB alignment for RV32 (hugepage size)
+		 */
+		crash_base = memblock_find_in_range(search_start, search_end,
+#ifdef CONFIG_64BIT
+						    crash_size, SZ_2M);
+#else
+						    crash_size, SZ_4M);
+#endif
+		if (crash_base == 0) {
+			pr_warn("crashkernel: couldn't allocate %lldKB\n",
+				crash_size >> 10);
+			return;
+		}
+	} else {
+		/* User specifies base address explicitly. */
+		if (!memblock_is_region_memory(crash_base, crash_size)) {
+			pr_warn("crashkernel: requested region is not memory\n");
+			return;
+		}
+
+		if (memblock_is_region_reserved(crash_base, crash_size)) {
+			pr_warn("crashkernel: requested region is reserved\n");
+			return;
+		}
+
+#ifdef CONFIG_64BIT
+		if (!IS_ALIGNED(crash_base, SZ_2M)) {
+#else
+		if (!IS_ALIGNED(crash_base, SZ_4M)) {
+#endif
+			pr_warn("crashkernel: requested region is misaligned\n");
+			return;
+		}
+	}
+	memblock_reserve(crash_base, crash_size);
+
+	pr_info("crashkernel: reserved 0x%016llx - 0x%016llx (%lld MB)\n",
+		crash_base, crash_base + crash_size, crash_size >> 20);
+
+	crashk_res.start = crash_base;
+	crashk_res.end = crash_base + crash_size - 1;
+}
+#endif
+
 void __init paging_init(void)
 {
 	setup_vm_final();
@@ -548,6 +623,9 @@ void __init paging_init(void)
 	sparse_init();
 	setup_zero_page();
 	zone_sizes_init();
+#ifdef CONFIG_KEXEC_CORE
+	reserve_crashkernel();
+#endif
 }
 
 #ifdef CONFIG_SPARSEMEM_VMEMMAP
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/3] RISC-V: Add crash kernel support
  2020-04-24 17:12 [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 1/3] RISC-V: Add kexec support Nick Kossifidis
  2020-04-24 17:12 ` [PATCH 2/3] RISC-V: Add kdump support Nick Kossifidis
@ 2020-04-24 17:12 ` Nick Kossifidis
  2020-05-21 18:42 ` [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
  3 siblings, 0 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-04-24 17:12 UTC (permalink / raw)
  To: linux-riscv
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, palmer,
	paul.walmsley, Nick Kossifidis

This patch allows Linux to act as a crash kernel for use with
kdump. Userspace will let the crash kernel know about the
memory region it can use through linux,usable-memory-range
property, and about the memory region where the elf core
header of the previous kernel is saved, through the
linux,elfcorehdr property (both on /chosen). These dtb bindings
are also used on arm64.

I tested this on riscv64 qemu and it works as expected, you
may test it by retrieving the dmesg of the previous kernel
through /proc/vmcore, using the vmcore-dmesg utility from
kexec-tools.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
---
 arch/riscv/Kconfig             | 10 ++++
 arch/riscv/kernel/Makefile     |  4 +-
 arch/riscv/kernel/crash_dump.c | 46 ++++++++++++++++
 arch/riscv/kernel/setup.c      | 13 +++++
 arch/riscv/mm/init.c           | 97 +++++++++++++++++++++++++++++++++-
 5 files changed, 167 insertions(+), 3 deletions(-)
 create mode 100644 arch/riscv/kernel/crash_dump.c

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 4934b2f62..3802c8888 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -344,6 +344,16 @@ config KEXEC
 
 	  The name comes from the similarity to the exec system call.
 
+config CRASH_DUMP
+	bool "Build kdump crash kernel"
+	help
+	  Generate crash dump after being started by kexec. This should
+	  be normally only set in special crash dump kernels which are
+	  loaded in the main kernel with kexec-tools into a specially
+	  reserved region and then later executed after a crash by
+	  kdump/kexec.
+
+	  For more details see Documentation/admin-guide/kdump/kdump.rst
 
 endmenu
 
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 65f6c9f1d..6374b0db5 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -51,6 +51,6 @@ ifeq ($(CONFIG_RISCV_SBI), y)
 obj-$(CONFIG_SMP) += cpu_ops_sbi.o
 endif
 obj-$(CONFIG_HOTPLUG_CPU)	+= cpu-hotplug.o
-obj-${CONFIG_KEXEC}		+= kexec_relocate.o crash_save_regs.o machine_kexec.o
-
+obj-$(CONFIG_KEXEC)		+= kexec_relocate.o crash_save_regs.o machine_kexec.o
+obj-$(CONFIG_CRASH_DUMP)	+= crash_dump.o
 clean:
diff --git a/arch/riscv/kernel/crash_dump.c b/arch/riscv/kernel/crash_dump.c
new file mode 100644
index 000000000..81b9d2a71
--- /dev/null
+++ b/arch/riscv/kernel/crash_dump.c
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This code is taken from arch/arm64/kernel/crash_dump.c
+ * Created by: AKASHI Takahiro <takahiro.akashi@linaro.org>
+ * Copyright (C) 2017 Linaro Limited
+ */
+
+#include <linux/crash_dump.h>
+#include <linux/io.h>
+
+/**
+ * copy_oldmem_page() - copy one page from old kernel memory
+ * @pfn: page frame number to be copied
+ * @buf: buffer where the copied page is placed
+ * @csize: number of bytes to copy
+ * @offset: offset in bytes into the page
+ * @userbuf: if set, @buf is in a user address space
+ *
+ * This function copies one page from old kernel memory into buffer pointed by
+ * @buf. If @buf is in userspace, set @userbuf to %1. Returns number of bytes
+ * copied or negative error in case of failure.
+ */
+ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
+			 size_t csize, unsigned long offset,
+			 int userbuf)
+{
+	void *vaddr;
+
+	if (!csize)
+		return 0;
+
+	vaddr = memremap(__pfn_to_phys(pfn), PAGE_SIZE, MEMREMAP_WB);
+	if (!vaddr)
+		return -ENOMEM;
+
+	if (userbuf) {
+		if (copy_to_user((char __user *)buf, vaddr + offset, csize)) {
+			memunmap(vaddr);
+			return -EFAULT;
+		}
+	} else
+		memcpy(buf, vaddr + offset, csize);
+
+	memunmap(vaddr);
+	return csize;
+}
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 52d057bde..cbd8c8ba6 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -64,6 +64,9 @@ static struct resource code_res = { .name = "Kernel code", };
 static struct resource data_res = { .name = "Kernel data", };
 static struct resource rodata_res = { .name = "Kernel rodata", };
 static struct resource bss_res = { .name = "Kernel bss", };
+#ifdef CONFIG_CRASH_DUMP
+static struct resource elfcorehdr_res = { .name = "ELF Core hdr", };
+#endif
 
 static void __init kdump_resource_init(void)
 {
@@ -97,6 +100,16 @@ static void __init kdump_resource_init(void)
 	if (crashk_res.end > crashk_res.start)
 		insert_resource(&sysram_res, &crashk_res);
 #endif
+
+#ifdef CONFIG_CRASH_DUMP
+	if (elfcorehdr_size) {
+		elfcorehdr_res.start = elfcorehdr_addr;
+		elfcorehdr_res.end = elfcorehdr_addr + elfcorehdr_size;
+		elfcorehdr_res.flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+		insert_resource(&sysram_res, &elfcorehdr_res);
+	}
+#endif
+
 }
 
 void __init parse_dtb(void)
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index 1c4461590..93cd434c5 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -123,6 +123,80 @@ static void __init setup_initrd(void)
 }
 #endif /* CONFIG_BLK_DEV_INITRD */
 
+#ifdef CONFIG_CRASH_DUMP
+/*
+ * These come from arm64
+ */
+static int __init early_init_dt_scan_elfcorehdr(unsigned long node,
+		const char *uname, int depth, void *data)
+{
+	struct memblock_region *elfcorehdr_mem = data;
+	const __be32 *reg;
+	int len;
+
+	if (depth != 1 || strcmp(uname, "chosen") != 0)
+		return 0;
+
+	reg = of_get_flat_dt_prop(node, "linux,elfcorehdr", &len);
+	if (!reg || (len < (dt_root_addr_cells + dt_root_size_cells)))
+		return 1;
+
+	elfcorehdr_mem->base = dt_mem_next_cell(dt_root_addr_cells, &reg);
+	elfcorehdr_mem->size = dt_mem_next_cell(dt_root_size_cells, &reg);
+
+	return 1;
+}
+
+static void __init reserve_elfcorehdr(void)
+{
+	struct memblock_region elfcorehdr_region = {0};
+
+	of_scan_flat_dt(early_init_dt_scan_elfcorehdr, &elfcorehdr_region);
+
+	if (elfcorehdr_region.size) {
+		memblock_reserve(elfcorehdr_region.base,
+				 elfcorehdr_region.size);
+
+		pr_info("Reserving %lldKB of memory at 0x%llx for elfcorehdr\n",
+			elfcorehdr_region.size >> 10, elfcorehdr_region.base);
+
+		elfcorehdr_addr = elfcorehdr_region.base;
+		elfcorehdr_size = elfcorehdr_region.size;
+	}
+}
+
+static int __init early_init_dt_scan_usablemem(unsigned long node,
+		const char *uname, int depth, void *data)
+{
+	struct memblock_region *usable_mem = data;
+	const __be32 *reg;
+	int len;
+
+	if (depth != 1 || strcmp(uname, "chosen") != 0)
+		return 0;
+
+	reg = of_get_flat_dt_prop(node, "linux,usable-memory-range", &len);
+	if (!reg || (len < (dt_root_addr_cells + dt_root_size_cells)))
+		return 1;
+
+	usable_mem->base = dt_mem_next_cell(dt_root_addr_cells, &reg);
+	usable_mem->size = dt_mem_next_cell(dt_root_size_cells, &reg);
+
+	return 1;
+}
+
+static void __init fdt_enforce_memory_region(void)
+{
+	struct memblock_region usablemem_region = {0};
+
+	of_scan_flat_dt(early_init_dt_scan_usablemem, &usablemem_region);
+
+	if (usablemem_region.size)
+		memblock_cap_memory_range(usablemem_region.base,
+					  usablemem_region.size);
+}
+#endif
+
 static phys_addr_t dtb_early_pa __initdata;
 
 void __init setup_bootmem(void)
@@ -132,6 +206,9 @@ void __init setup_bootmem(void)
 	phys_addr_t vmlinux_end = __pa_symbol(&_end);
 	phys_addr_t vmlinux_start = __pa_symbol(&_start);
 
+#ifdef CONFIG_CRASH_DUMP
+	fdt_enforce_memory_region();
+#endif
 	/* Find the memory region containing the kernel */
 	for_each_memblock(memory, reg) {
 		phys_addr_t end = reg->base + reg->size;
@@ -166,6 +243,13 @@ void __init setup_bootmem(void)
 	 */
 	memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
 
+	/*
+	 * We need to reserve elfcorehdr here so that it doesn't
+	 * get overwritten later on.
+	 */
+#ifdef CONFIG_CRASH_DUMP
+	reserve_elfcorehdr();
+#endif
 	early_init_fdt_scan_reserved_mem();
 	memblock_allow_resize();
 	memblock_dump_all();
@@ -559,9 +643,20 @@ static void __init reserve_crashkernel(void)
 	unsigned long start_pfn = find_min_pfn_with_active_regions();
 	unsigned long search_start = start_pfn << PAGE_SHIFT;
 	unsigned long search_end = (unsigned long) PFN_PHYS(max_low_pfn) - 1;
-
 	int ret = 0;
 
+	/*
+	 * Don't reserve a region for a crash kernel on a crash kernel
+	 * since it doesn't make much sense and we have limited memory
+	 * resources.
+	 */
+#ifdef CONFIG_CRASH_DUMP
+	if (is_kdump_kernel()) {
+		pr_info("crashkernel: ignore reservation request\n");
+		return;
+	}
+#endif
+
 	ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
 				&crash_size, &crash_base);
 	if (ret || !crash_size)
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-04-24 17:12 [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
                   ` (2 preceding siblings ...)
  2020-04-24 17:12 ` [PATCH 3/3] RISC-V: Add crash kernel support Nick Kossifidis
@ 2020-05-21 18:42 ` Nick Kossifidis
  2020-06-11 19:09   ` Nick Kossifidis
  3 siblings, 1 reply; 13+ messages in thread
From: Nick Kossifidis @ 2020-05-21 18:42 UTC (permalink / raw)
  To: palmer, linux-riscv
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, paul.walmsley, mick

Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
> This patch series adds kexec/kdump and crash kernel
> support on RISC-V. For testing the patches a patched
> version of kexec-tools is needed. The patch is still
> a work in progress but a draft version can be found at:
> 
> http://riscv.ics.forth.gr/kexec-tools.patch
> 

Any comments / feedback on this ? Should we get it in ?

Regards,
Nick


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-05-21 18:42 ` [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
@ 2020-06-11 19:09   ` Nick Kossifidis
  2020-06-11 19:39     ` Palmer Dabbelt
  0 siblings, 1 reply; 13+ messages in thread
From: Nick Kossifidis @ 2020-06-11 19:09 UTC (permalink / raw)
  To: Nick Kossifidis
  Cc: david.abdurachmanov, anup, atish.patra, yibin_liu, palmer,
	paul.walmsley, linux-riscv

Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>> This patch series adds kexec/kdump and crash kernel
>> support on RISC-V. For testing the patches a patched
>> version of kexec-tools is needed. The patch is still
>> a work in progress but a draft version can be found at:
>> 
>> http://riscv.ics.forth.gr/kexec-tools.patch
>> 
> 
> Any comments / feedback on this ? Should we get it in ?
> 
> Regards,
> Nick

Anyone ?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-11 19:09   ` Nick Kossifidis
@ 2020-06-11 19:39     ` Palmer Dabbelt
  2020-06-13  7:24       ` Nick Kossifidis
  0 siblings, 1 reply; 13+ messages in thread
From: Palmer Dabbelt @ 2020-06-11 19:39 UTC (permalink / raw)
  To: mick
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu, Paul Walmsley,
	mick, linux-riscv

On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>>> This patch series adds kexec/kdump and crash kernel
>>> support on RISC-V. For testing the patches a patched
>>> version of kexec-tools is needed. The patch is still
>>> a work in progress but a draft version can be found at:
>>>
>>> http://riscv.ics.forth.gr/kexec-tools.patch
>>>
>>
>> Any comments / feedback on this ? Should we get it in ?
>>
>> Regards,
>> Nick
>
> Anyone ?

Sorry, I dropped the ball on this one.  After the CPU hotplug breakage I
decided I need to get a pre-merge test for all these new features, and I
haven't gotten around to actually doing so yet.  The merge window is closing
right now, so with any luck I'll have some time to get around to my patch
backlog -- first I need to go spin up some better testing, though.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-11 19:39     ` Palmer Dabbelt
@ 2020-06-13  7:24       ` Nick Kossifidis
  2020-06-13  8:17         ` Anup Patel
  2020-06-18 23:06         ` Palmer Dabbelt
  0 siblings, 2 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-06-13  7:24 UTC (permalink / raw)
  To: Palmer Dabbelt
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu, Paul Walmsley,
	mick, linux-riscv

Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
> On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
>> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
>>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>>>> This patch series adds kexec/kdump and crash kernel
>>>> support on RISC-V. For testing the patches a patched
>>>> version of kexec-tools is needed. The patch is still
>>>> a work in progress but a draft version can be found at:
>>>> 
>>>> http://riscv.ics.forth.gr/kexec-tools.patch
>>>> 
>>> 
>>> Any comments / feedback on this ? Should we get it in ?
>>> 
>>> Regards,
>>> Nick
>> 
>> Anyone ?
> 
> Sorry, I dropped the ball on this one.  After the CPU hotplug breakage 
> I
> decided I need to get a pre-merge test for all these new features, and 
> I
> haven't gotten around to actually doing so yet.  The merge window is 
> closing
> right now, so with any luck I'll have some time to get around to my 
> patch
> backlog -- first I need to go spin up some better testing, though.

Anything I can do to help ? I have a bunch of hw available (unleashed, 
genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably 
also need to have a CI flow for the stuff I do internally.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-13  7:24       ` Nick Kossifidis
@ 2020-06-13  8:17         ` Anup Patel
  2020-06-13  8:21           ` Nick Kossifidis
  2020-06-18 23:06         ` Palmer Dabbelt
  1 sibling, 1 reply; 13+ messages in thread
From: Anup Patel @ 2020-06-13  8:17 UTC (permalink / raw)
  To: Nick Kossifidis, Palmer Dabbelt
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu, Paul Walmsley,
	linux-riscv



> -----Original Message-----
> From: linux-riscv <linux-riscv-bounces@lists.infradead.org> On Behalf Of Nick
> Kossifidis
> Sent: 13 June 2020 12:54
> To: Palmer Dabbelt <palmer@dabbelt.com>
> Cc: david.abdurachmanov@sifive.com; anup@brainfault.org; Atish Patra
> <Atish.Patra@wdc.com>; yibin_liu@c-sky.com; Paul Walmsley
> <paul.walmsley@sifive.com>; mick@ics.forth.gr; linux-
> riscv@lists.infradead.org
> Subject: Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
> 
> Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
> > On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
> >> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
> >>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
> >>>> This patch series adds kexec/kdump and crash kernel support on
> >>>> RISC-V. For testing the patches a patched version of kexec-tools is
> >>>> needed. The patch is still a work in progress but a draft version
> >>>> can be found at:
> >>>>
> >>>> http://riscv.ics.forth.gr/kexec-tools.patch
> >>>>
> >>>
> >>> Any comments / feedback on this ? Should we get it in ?
> >>>
> >>> Regards,
> >>> Nick
> >>
> >> Anyone ?
> >
> > Sorry, I dropped the ball on this one.  After the CPU hotplug breakage
> > I decided I need to get a pre-merge test for all these new features,
> > and I haven't gotten around to actually doing so yet.  The merge
> > window is closing right now, so with any luck I'll have some time to
> > get around to my patch backlog -- first I need to go spin up some
> > better testing, though.
> 
> Anything I can do to help ? I have a bunch of hw available (unleashed,
> genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably also
> need to have a CI flow for the stuff I do internally.

I had send-out a fix for CPU hotplug which can be taken for
any of the Linux-5.8-rcX.

These patches should be based upon the CPU hotplug fix.

Regards,
Anup


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-13  8:17         ` Anup Patel
@ 2020-06-13  8:21           ` Nick Kossifidis
  0 siblings, 0 replies; 13+ messages in thread
From: Nick Kossifidis @ 2020-06-13  8:21 UTC (permalink / raw)
  To: Anup Patel
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu,
	Palmer Dabbelt, Paul Walmsley, Nick Kossifidis, linux-riscv

Στις 2020-06-13 11:17, Anup Patel έγραψε:
>> -----Original Message-----
>> From: linux-riscv <linux-riscv-bounces@lists.infradead.org> On Behalf 
>> Of Nick
>> Kossifidis
>> Sent: 13 June 2020 12:54
>> To: Palmer Dabbelt <palmer@dabbelt.com>
>> Cc: david.abdurachmanov@sifive.com; anup@brainfault.org; Atish Patra
>> <Atish.Patra@wdc.com>; yibin_liu@c-sky.com; Paul Walmsley
>> <paul.walmsley@sifive.com>; mick@ics.forth.gr; linux-
>> riscv@lists.infradead.org
>> Subject: Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
>> 
>> Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
>> > On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
>> >> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
>> >>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>> >>>> This patch series adds kexec/kdump and crash kernel support on
>> >>>> RISC-V. For testing the patches a patched version of kexec-tools is
>> >>>> needed. The patch is still a work in progress but a draft version
>> >>>> can be found at:
>> >>>>
>> >>>> http://riscv.ics.forth.gr/kexec-tools.patch
>> >>>>
>> >>>
>> >>> Any comments / feedback on this ? Should we get it in ?
>> >>>
>> >>> Regards,
>> >>> Nick
>> >>
>> >> Anyone ?
>> >
>> > Sorry, I dropped the ball on this one.  After the CPU hotplug breakage
>> > I decided I need to get a pre-merge test for all these new features,
>> > and I haven't gotten around to actually doing so yet.  The merge
>> > window is closing right now, so with any luck I'll have some time to
>> > get around to my patch backlog -- first I need to go spin up some
>> > better testing, though.
>> 
>> Anything I can do to help ? I have a bunch of hw available (unleashed,
>> genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably 
>> also
>> need to have a CI flow for the stuff I do internally.
> 
> I had send-out a fix for CPU hotplug which can be taken for
> any of the Linux-5.8-rcX.
> 
> These patches should be based upon the CPU hotplug fix.
> 
> Regards,
> Anup

I only call smp_shutdown_nonboot_cpus(), the patches shouldn't need any 
updates but I'll do a re-check just in case.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-13  7:24       ` Nick Kossifidis
  2020-06-13  8:17         ` Anup Patel
@ 2020-06-18 23:06         ` Palmer Dabbelt
  2020-06-19  8:27           ` Nick Kossifidis
  1 sibling, 1 reply; 13+ messages in thread
From: Palmer Dabbelt @ 2020-06-18 23:06 UTC (permalink / raw)
  To: mick
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu, Paul Walmsley,
	mick, linux-riscv

On Sat, 13 Jun 2020 00:24:01 PDT (-0700), mick@ics.forth.gr wrote:
> Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
>> On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
>>> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
>>>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>>>>> This patch series adds kexec/kdump and crash kernel
>>>>> support on RISC-V. For testing the patches a patched
>>>>> version of kexec-tools is needed. The patch is still
>>>>> a work in progress but a draft version can be found at:
>>>>>
>>>>> http://riscv.ics.forth.gr/kexec-tools.patch
>>>>>
>>>>
>>>> Any comments / feedback on this ? Should we get it in ?
>>>>
>>>> Regards,
>>>> Nick
>>>
>>> Anyone ?
>>
>> Sorry, I dropped the ball on this one.  After the CPU hotplug breakage
>> I
>> decided I need to get a pre-merge test for all these new features, and
>> I
>> haven't gotten around to actually doing so yet.  The merge window is
>> closing
>> right now, so with any luck I'll have some time to get around to my
>> patch
>> backlog -- first I need to go spin up some better testing, though.
>
> Anything I can do to help ? I have a bunch of hw available (unleashed,
> genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably
> also need to have a CI flow for the stuff I do internally.

Well, getting CI up and running would be great -- specifically, running stress
tests on real hardware is something we're missing.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-18 23:06         ` Palmer Dabbelt
@ 2020-06-19  8:27           ` Nick Kossifidis
  2020-06-19 17:23             ` Atish Patra
  0 siblings, 1 reply; 13+ messages in thread
From: Nick Kossifidis @ 2020-06-19  8:27 UTC (permalink / raw)
  To: Palmer Dabbelt
  Cc: david.abdurachmanov, anup, Atish Patra, yibin_liu, Paul Walmsley,
	mick, linux-riscv

Στις 2020-06-19 02:06, Palmer Dabbelt έγραψε:
> On Sat, 13 Jun 2020 00:24:01 PDT (-0700), mick@ics.forth.gr wrote:
>> Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
>>> On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
>>>> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
>>>>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
>>>>>> This patch series adds kexec/kdump and crash kernel
>>>>>> support on RISC-V. For testing the patches a patched
>>>>>> version of kexec-tools is needed. The patch is still
>>>>>> a work in progress but a draft version can be found at:
>>>>>> 
>>>>>> http://riscv.ics.forth.gr/kexec-tools.patch
>>>>>> 
>>>>> 
>>>>> Any comments / feedback on this ? Should we get it in ?
>>>>> 
>>>>> Regards,
>>>>> Nick
>>>> 
>>>> Anyone ?
>>> 
>>> Sorry, I dropped the ball on this one.  After the CPU hotplug 
>>> breakage
>>> I
>>> decided I need to get a pre-merge test for all these new features, 
>>> and
>>> I
>>> haven't gotten around to actually doing so yet.  The merge window is
>>> closing
>>> right now, so with any luck I'll have some time to get around to my
>>> patch
>>> backlog -- first I need to go spin up some better testing, though.
>> 
>> Anything I can do to help ? I have a bunch of hw available (unleashed,
>> genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably
>> also need to have a CI flow for the stuff I do internally.
> 
> Well, getting CI up and running would be great -- specifically, running 
> stress
> tests on real hardware is something we're missing.

Any particular tests / test suites in mind ?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/3] RISC-V: Add kexec/kdump support
  2020-06-19  8:27           ` Nick Kossifidis
@ 2020-06-19 17:23             ` Atish Patra
  0 siblings, 0 replies; 13+ messages in thread
From: Atish Patra @ 2020-06-19 17:23 UTC (permalink / raw)
  To: Nick Kossifidis, Kevin Hilman
  Cc: David Abdurachmanov, Anup Patel, Atish Patra, Liu Yibin,
	Palmer Dabbelt, Paul Walmsley, linux-riscv

On Fri, Jun 19, 2020 at 1:27 AM Nick Kossifidis <mick@ics.forth.gr> wrote:
>
> Στις 2020-06-19 02:06, Palmer Dabbelt έγραψε:
> > On Sat, 13 Jun 2020 00:24:01 PDT (-0700), mick@ics.forth.gr wrote:
> >> Στις 2020-06-11 22:39, Palmer Dabbelt έγραψε:
> >>> On Thu, 11 Jun 2020 12:09:08 PDT (-0700), mick@ics.forth.gr wrote:
> >>>> Στις 2020-05-21 21:42, Nick Kossifidis έγραψε:
> >>>>> Στις 2020-04-24 20:12, Nick Kossifidis έγραψε:
> >>>>>> This patch series adds kexec/kdump and crash kernel
> >>>>>> support on RISC-V. For testing the patches a patched
> >>>>>> version of kexec-tools is needed. The patch is still
> >>>>>> a work in progress but a draft version can be found at:
> >>>>>>
> >>>>>> http://riscv.ics.forth.gr/kexec-tools.patch
> >>>>>>
> >>>>>
> >>>>> Any comments / feedback on this ? Should we get it in ?
> >>>>>
> >>>>> Regards,
> >>>>> Nick
> >>>>
> >>>> Anyone ?
> >>>
> >>> Sorry, I dropped the ball on this one.  After the CPU hotplug
> >>> breakage
> >>> I
> >>> decided I need to get a pre-merge test for all these new features,
> >>> and
> >>> I
> >>> haven't gotten around to actually doing so yet.  The merge window is
> >>> closing
> >>> right now, so with any luck I'll have some time to get around to my
> >>> patch
> >>> backlog -- first I need to go spin up some better testing, though.
> >>
> >> Anything I can do to help ? I have a bunch of hw available (unleashed,
> >> genesys2 and nexys 2 ddr for Ariane / LowRISC SoC) and I'll probably
> >> also need to have a CI flow for the stuff I do internally.
> >
> > Well, getting CI up and running would be great -- specifically, running
> > stress
> > tests on real hardware is something we're missing.
>
> Any particular tests / test suites in mind ?
>

I quickly checked kerneci project. They regularly build and does a boot test on
HiFive unleashed. Here is the log for the last successful boot test on 5.8-rc1.
https://kernelci.org/test/case/id/5ee3959b44cd149f2b97bf1b/

Can we leverage the same setup locally ?

+kevin

Is there any way to add more tests (lkp test may be ?) for riscv to
kernelci infrastructure ?

-- 
Regards,
Atish


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2020-06-19 17:23 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-24 17:12 [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
2020-04-24 17:12 ` [PATCH 1/3] RISC-V: Add kexec support Nick Kossifidis
2020-04-24 17:12 ` [PATCH 2/3] RISC-V: Add kdump support Nick Kossifidis
2020-04-24 17:12 ` [PATCH 3/3] RISC-V: Add crash kernel support Nick Kossifidis
2020-05-21 18:42 ` [PATCH 0/3] RISC-V: Add kexec/kdump support Nick Kossifidis
2020-06-11 19:09   ` Nick Kossifidis
2020-06-11 19:39     ` Palmer Dabbelt
2020-06-13  7:24       ` Nick Kossifidis
2020-06-13  8:17         ` Anup Patel
2020-06-13  8:21           ` Nick Kossifidis
2020-06-18 23:06         ` Palmer Dabbelt
2020-06-19  8:27           ` Nick Kossifidis
2020-06-19 17:23             ` Atish Patra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).