Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45a98fc6 authored by Horms's avatar Horms Committed by Tony Luck
Browse files

[IA64] CONFIG_KEXEC/CONFIG_CRASH_DUMP permutations



Actually, on reflection I think that there is a good case for
keeping the options separate. I am thinking particularly of people
who want a very small crashdump kernel and thus don't want to compile
in kexec.

The patch below should fix things up so that all valid combinations of
KEXEC, CRASH_DUMP and VMCORE compile cleanly - VMCORE depends on
CRASH_DUMP which is why I said valid combinations. In a nutshell
it just untangles unrelated code and switches around a few defines.

Please note that it creats a new file, arch/ia64/kernel/crash_dump.c
This is in keeping with the i386 implementation.

Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent adf142e3
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ obj-$(CONFIG_CPU_FREQ) += cpufreq/
obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o
obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o
obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o
obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o
obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o crash.o
obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o crash.o
obj-$(CONFIG_CRASH_DUMP)	+= crash_dump.o
obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)	+= uncached.o
obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)	+= uncached.o
obj-$(CONFIG_AUDIT)		+= audit.o
obj-$(CONFIG_AUDIT)		+= audit.o
obj-$(CONFIG_PCI_MSI)		+= msi_ia64.o
obj-$(CONFIG_PCI_MSI)		+= msi_ia64.o
+0 −22
Original line number Original line Diff line number Diff line
@@ -19,29 +19,11 @@


#include <asm/kdebug.h>
#include <asm/kdebug.h>
#include <asm/mca.h>
#include <asm/mca.h>
#include <asm/uaccess.h>


int kdump_status[NR_CPUS];
int kdump_status[NR_CPUS];
atomic_t kdump_cpu_freezed;
atomic_t kdump_cpu_freezed;
atomic_t kdump_in_progress;
atomic_t kdump_in_progress;
int kdump_on_init = 1;
int kdump_on_init = 1;
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 = __va(pfn<<PAGE_SHIFT);
	if (userbuf) {
		if (copy_to_user(buf, (vaddr + offset), csize)) {
			return -EFAULT;
		}
	} else
		memcpy(buf, (vaddr + offset), csize);
	return csize;
}


static inline Elf64_Word
static inline Elf64_Word
*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
@@ -225,14 +207,10 @@ static ctl_table sys_table[] = {
static int
static int
machine_crash_setup(void)
machine_crash_setup(void)
{
{
	char *from = strstr(saved_command_line, "elfcorehdr=");
	static struct notifier_block kdump_init_notifier_nb = {
	static struct notifier_block kdump_init_notifier_nb = {
		.notifier_call = kdump_init_notifier,
		.notifier_call = kdump_init_notifier,
	};
	};
	int ret;
	int ret;
	if (from)
		elfcorehdr_addr = memparse(from+11, &from);
	saved_max_pfn = (unsigned long)-1;
	if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0)
	if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0)
		return ret;
		return ret;
#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL
+48 −0
Original line number Original line Diff line number Diff line
/*
 *	kernel/crash_dump.c - Memory preserving reboot related code.
 *
 *	Created by: Simon Horman <horms@verge.net.au>
 *	Original code moved from kernel/crash.c
 *	Original code comment copied from the i386 version of this file
 */

#include <linux/errno.h>
#include <linux/types.h>

#include <linux/uaccess.h>

/**
 * copy_oldmem_page - copy one page from "oldmem"
 * @pfn: page frame number to be copied
 * @buf: target memory address for the copy; this can be in kernel address
 *	space or user address space (see @userbuf)
 * @csize: number of bytes to copy
 * @offset: offset in bytes into the page (based on pfn) to begin the copy
 * @userbuf: if set, @buf is in user address space, use copy_to_user(),
 *	otherwise @buf is in kernel address space, use memcpy().
 *
 * Copy a page from "oldmem". For this page, there is no pte mapped
 * in the current kernel. We stitch up a pte, similar to kmap_atomic.
 *
 * Calling copy_to_user() in atomic context is not desirable. Hence first
 * copying the data to a pre-allocated kernel page and then copying to user
 * space in non-atomic context.
 */
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 = __va(pfn<<PAGE_SHIFT);
	if (userbuf) {
		if (copy_to_user(buf, (vaddr + offset), csize)) {
			return -EFAULT;
		}
	} else
		memcpy(buf, (vaddr + offset), csize);
	return csize;
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -1239,7 +1239,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
	} else {
	} else {
		/* Dump buffered message to console */
		/* Dump buffered message to console */
		ia64_mlogbuf_finish(1);
		ia64_mlogbuf_finish(1);
#ifdef CONFIG_CRASH_DUMP
#ifdef CONFIG_KEXEC
		atomic_set(&kdump_in_progress, 1);
		atomic_set(&kdump_in_progress, 1);
		monarch_cpu = -1;
		monarch_cpu = -1;
#endif
#endif
+15 −0
Original line number Original line Diff line number Diff line
@@ -434,6 +434,21 @@ static __init int setup_nomca(char *s)
}
}
early_param("nomca", setup_nomca);
early_param("nomca", setup_nomca);


#ifdef CONFIG_PROC_VMCORE
/* elfcorehdr= specifies the location of elf core header
 * stored by the crashed kernel.
 */
static int __init parse_elfcorehdr(char *arg)
{
	if (!arg)
		return -EINVAL;

        elfcorehdr_addr = memparse(arg, &arg);
	return 0;
}
early_param("elfcorehdr", parse_elfcorehdr);
#endif /* CONFIG_PROC_VMCORE */

void __init
void __init
setup_arch (char **cmdline_p)
setup_arch (char **cmdline_p)
{
{
Loading