Commit 418173ee authored by Youling Tang's avatar Youling Tang Committed by Hongchen Zhang
Browse files

LoongArch: kdump: Add memory reservation for old kernel

LoongArch inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I736HO



--------------------------------

After moving the old kernel memory reservation to elfcorehdr operation, avoid
the elfcorehdr space from being destroyed.

Signed-off-by: default avatarYouling Tang <tangyouling@loongson.cn>
Change-Id: I94d5c38e24dd6d3ab3fddc3945580780d81e6922
parent 37b09006
Loading
Loading
Loading
Loading
+35 −10
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@ EXPORT_SYMBOL(cpu_data);
struct loongson_board_info b_info;
static const char dmi_empty_string[] = "        ";

static phys_addr_t crashmem_start, crashmem_size;

/*
 * Setup information
 *
@@ -180,6 +182,15 @@ static int __init early_parse_mem(char *p)
		return -EINVAL;
	}

	start = 0;
	size = memparse(p, &p);
	if (*p == '@')
		start = memparse(p + 1, &p);
	else {
		pr_err("Invalid format!\n");
		return -EINVAL;
	}

	/*
	 * If a user specifies memory size, we
	 * blow away any automatically generated
@@ -187,16 +198,14 @@ static int __init early_parse_mem(char *p)
	 */
	if (usermem == 0) {
		usermem = 1;
		if (!strstr(boot_command_line, "elfcorehdr")) {
			memblock_remove(memblock_start_of_DRAM(),
				memblock_end_of_DRAM() - memblock_start_of_DRAM());
		} else {
			crashmem_start = start;
			crashmem_size = size;
			return 0;
		}
	start = 0;
	size = memparse(p, &p);
	if (*p == '@')
		start = memparse(p + 1, &p);
	else {
		pr_err("Invalid format!\n");
		return -EINVAL;
	}

	if (!IS_ENABLED(CONFIG_NUMA))
@@ -282,10 +291,26 @@ static void __init arch_parse_crashkernel(void)
#endif
}

/*
 * After the kdump operation is performed to enter the capture kernel, the
 * memory area used by the previous production kernel should be reserved to
 * avoid destroy to the captured data.
 */
static void reserve_oldmem_region(void)
{
#ifdef CONFIG_CRASH_DUMP
	if (!is_kdump_kernel())
		return;

	memblock_cap_memory_range(crashmem_start, crashmem_size);
#endif
}

void __init platform_init(void)
{
	arch_reserve_vmcore();
	arch_parse_crashkernel();
	reserve_oldmem_region();

#ifdef CONFIG_ACPI_TABLE_UPGRADE
	acpi_table_upgrade();