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

[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
...@@ -29,6 +29,7 @@ obj-$(CONFIG_CPU_FREQ) += cpufreq/ ...@@ -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
......
...@@ -19,29 +19,11 @@ ...@@ -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[] = { ...@@ -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
......
/*
* 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;
}
...@@ -1239,7 +1239,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, ...@@ -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
......
...@@ -434,6 +434,21 @@ static __init int setup_nomca(char *s) ...@@ -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)
{ {
......
...@@ -157,7 +157,7 @@ handle_IPI (int irq, void *dev_id) ...@@ -157,7 +157,7 @@ handle_IPI (int irq, void *dev_id)
case IPI_CPU_STOP: case IPI_CPU_STOP:
stop_this_cpu(); stop_this_cpu();
break; break;
#ifdef CONFIG_CRASH_DUMP #ifdef CONFIG_KEXEC
case IPI_KDUMP_CPU_STOP: case IPI_KDUMP_CPU_STOP:
unw_init_running(kdump_cpu_freeze, NULL); unw_init_running(kdump_cpu_freeze, NULL);
break; break;
...@@ -219,7 +219,7 @@ send_IPI_self (int op) ...@@ -219,7 +219,7 @@ send_IPI_self (int op)
send_IPI_single(smp_processor_id(), op); send_IPI_single(smp_processor_id(), op);
} }
#ifdef CONFIG_CRASH_DUMP #ifdef CONFIG_KEXEC
void void
kdump_smp_send_stop() kdump_smp_send_stop()
{ {
......
...@@ -174,6 +174,12 @@ find_memory (void) ...@@ -174,6 +174,12 @@ find_memory (void)
reserve_bootmem(bootmap_start, bootmap_size); reserve_bootmem(bootmap_start, bootmap_size);
find_initrd(); find_initrd();
#ifdef CONFIG_CRASH_DUMP
/* If we are doing a crash dump, we still need to know the real mem
* size before original memory map is * reset. */
saved_max_pfn = max_pfn;
#endif
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment