ia64 Kexec/Kdump patch for 2.6.18
> ia64 Kexec/Kdump patch for 2.6.18
>
> Fixes since last patch:
>
> 1. Check val in kdump_init_notifier.
> 2. write EOI to clean in-service flag to make kdump work when crash
> happen inside irq handler.
> 3. Make CONFIG_KEXEC and CONFIG_CRASH_DUMP depends on !CONFIG_HP_SIM.
>
> Signed-off-by: Zou Nan hai <[EMAIL PROTECTED]>
Incremental version of this patch
Signed-off-by: Simon Horman <[EMAIL PROTECTED]>
Index: linux-2.6/arch/ia64/Kconfig
===================================================================
--- linux-2.6.orig/arch/ia64/Kconfig 2006-09-22 12:55:26.000000000 +0900
+++ linux-2.6/arch/ia64/Kconfig 2006-09-22 12:55:46.000000000 +0900
@@ -433,7 +433,7 @@
config KEXEC
bool "kexec system call (EXPERIMENTAL)"
- depends on EXPERIMENTAL
+ depends on EXPERIMENTAL && !IA64_HP_SIM
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
@@ -450,7 +450,7 @@
config CRASH_DUMP
bool "kernel crash dumps (EXPERIMENTAL)"
- depends on EXPERIMENTAL && IA64_MCA_RECOVERY
+ depends on EXPERIMENTAL && IA64_MCA_RECOVERY && !IA64_HP_SIM
help
Generate crash dump after being started by kexec.
Index: linux-2.6/arch/ia64/kernel/crash.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/crash.c 2006-09-22 12:55:26.000000000
+0900
+++ linux-2.6/arch/ia64/kernel/crash.c 2006-09-22 12:55:27.000000000 +0900
@@ -25,7 +25,7 @@
atomic_t kdump_cpu_freezed;
int kdump_on_init = 1;
-ssize_t
+ssize_t
copy_oldmem_page(unsigned long pfn, char *buf,
size_t csize, unsigned long offset, int userbuf)
{
@@ -131,7 +131,7 @@
#endif
}
-static void
+static void
machine_kdump_on_init(void)
{
local_irq_disable();
@@ -160,6 +160,10 @@
if (!kdump_on_init)
return NOTIFY_DONE;
+
+ if (val != DIE_INIT_MONARCH_ENTER && val != DIE_INIT_SLAVE_ENTER)
+ return NOTIFY_DONE;
+
nd = (struct ia64_mca_notify_die *)args->err;
/* Reason code 1 means machine check rendezous*/
if (nd->sos->rv_rc == 1)
@@ -168,7 +172,7 @@
switch (val) {
case DIE_INIT_MONARCH_ENTER:
machine_kdump_on_init();
- break;
+ break;
case DIE_INIT_SLAVE_ENTER:
unw_init_running(kdump_cpu_freeze, NULL);
break;
@@ -178,12 +182,12 @@
#ifdef CONFIG_SYSCTL
static ctl_table kdump_on_init_table[] = {
- {
- .ctl_name = KERN_KDUMP_ON_INIT,
+ {
+ .ctl_name = KERN_KDUMP_ON_INIT,
.procname = "kdump_on_init",
- .data = &kdump_on_init,
+ .data = &kdump_on_init,
.maxlen = sizeof(int),
- .mode = 0644,
+ .mode = 0644,
.proc_handler = &proc_dointvec,
},
{ .ctl_name = 0 }
@@ -191,9 +195,9 @@
static ctl_table sys_table[] = {
{
- .ctl_name = CTL_KERN,
+ .ctl_name = CTL_KERN,
.procname = "kernel",
- .mode = 0555,
+ .mode = 0555,
.child = kdump_on_init_table,
},
{ .ctl_name = 0 }
@@ -214,9 +218,8 @@
if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0)
return ret;
#ifdef CONFIG_SYSCTL
- if ((ret = register_sysctl_table(sys_table, 0)) != 0)
- return ret;
-#endif
+ register_sysctl_table(sys_table, 0);
+#endif
return 0;
}
Index: linux-2.6/arch/ia64/kernel/efi.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/efi.c 2006-09-22 12:55:26.000000000
+0900
+++ linux-2.6/arch/ia64/kernel/efi.c 2006-09-22 12:55:27.000000000 +0900
@@ -1126,7 +1126,7 @@
#ifdef CONFIG_KEXEC
insert_resource(res, &efi_memmap_res);
insert_resource(res, &boot_param_res);
- if (crashk_res.end > crashk_res.start)
+ if (crashk_res.end > crashk_res.start)
insert_resource(res, &crashk_res);
#endif
}
@@ -1137,12 +1137,12 @@
/* find a block of memory aligned to 64M exclude reserved regions
rsvd_regions are sorted
*/
-unsigned long
-kdump_find_rsvd_region (unsigned long size,
+unsigned long
+kdump_find_rsvd_region (unsigned long size,
struct rsvd_region *r, int n)
{
int i;
- u64 start, end;
+ u64 start, end;
u64 alignment = 1UL << _PAGE_SIZE_64M;
void *efi_map_start, *efi_map_end, *p;
efi_memory_desc_t *md;
@@ -1173,8 +1173,8 @@
return start;
}
- printk(KERN_WARNING "Cannot reserve 0x%lx byte of memory for crashdump\n",
+ printk(KERN_WARNING "Cannot reserve 0x%lx byte of memory for crashdump\n",
size);
return ~0UL;
}
-#endif
+#endif
Index: linux-2.6/arch/ia64/kernel/iosapic.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/iosapic.c 2006-09-22 12:55:26.000000000
+0900
+++ linux-2.6/arch/ia64/kernel/iosapic.c 2006-09-22 12:55:27.000000000
+0900
@@ -301,7 +301,7 @@
list_for_each_entry(rte, &info->rtes,
rte_list) {
iosapic_write(rte->addr,
- IOSAPIC_RTE_LOW(rte->rte_index),
+ IOSAPIC_RTE_LOW(rte->rte_index),
IOSAPIC_MASK);
iosapic_eoi(rte->addr, vec);
}
Index: linux-2.6/arch/ia64/kernel/machine_kexec.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/machine_kexec.c 2006-09-22
12:55:26.000000000 +0900
+++ linux-2.6/arch/ia64/kernel/machine_kexec.c 2006-09-22 12:55:27.000000000
+0900
@@ -87,13 +87,14 @@
* We are past the point of no return, committed to rebooting now.
*/
extern void *efi_get_pal_addr(void);
-static void ia64_machine_kexec(struct unw_frame_info *info, void *arg)
+static void ia64_machine_kexec(struct unw_frame_info *info, void *arg)
{
struct kimage *image = arg;
relocate_new_kernel_t rnk;
void *pal_addr = efi_get_pal_addr();
unsigned long code_addr = (unsigned
long)page_address(image->control_code_page);
unsigned long vector;
+ int ii;
if (image->type == KEXEC_TYPE_CRASH) {
crash_save_this_cpu();
@@ -102,7 +103,7 @@
/* Interrupts aren't acceptable while we reboot */
local_irq_disable();
-
+
/* Mask CMC and Performance Monitor interrupts */
ia64_setreg(_IA64_REG_CR_PMV, 1 << 16);
ia64_setreg(_IA64_REG_CR_CMCV, 1 << 16);
@@ -112,6 +113,10 @@
ia64_set_lrr0(1 << 16);
ia64_set_lrr1(1 << 16);
+ /* terminate possible nested in-service interrupts */
+ for (ii = 0; ii < 16; ii++)
+ ia64_eoi();
+
/* unmask TPR and clear any pending interrupts */
ia64_setreg(_IA64_REG_CR_TPR, 0);
ia64_srlz_d();
@@ -124,7 +129,7 @@
(*rnk)(image->head, image->start, ia64_boot_param,
GRANULEROUNDDOWN((unsigned long) pal_addr));
BUG();
-}
+}
void machine_kexec(struct kimage *image)
{
Index: linux-2.6/arch/ia64/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/setup.c 2006-09-22 12:55:26.000000000
+0900
+++ linux-2.6/arch/ia64/kernel/setup.c 2006-09-22 12:55:27.000000000 +0900
@@ -258,10 +258,9 @@
#ifdef CONFIG_KEXEC
/* [EMAIL PROTECTED] specifies the size to reserve for a crash
* kernel.(offset is ingored for keep compatibility with other archs)
- * By reserving this memory we guarantee that linux
- * never set's it up as a DMA target.
- * Useful for holding code to do something appropriate
- * after a kernel panic.
+ * By reserving this memory we guarantee that linux never set's it
+ * up as a DMA target.Useful for holding code to do something
+ * appropriate after a kernel panic.
*/
{
char *from = strstr(saved_command_line, "crashkernel=");
@@ -270,7 +269,7 @@
size = memparse(from + 12, &from);
if (size) {
sort_regions(rsvd_region, n);
- base = kdump_find_rsvd_region(size,
+ base = kdump_find_rsvd_region(size,
rsvd_region, n);
if (base != ~0UL) {
rsvd_region[n].start =
Index: linux-2.6/include/asm-ia64/kexec.h
===================================================================
--- linux-2.6.orig/include/asm-ia64/kexec.h 2006-09-22 12:55:26.000000000
+0900
+++ linux-2.6/include/asm-ia64/kexec.h 2006-09-22 12:55:27.000000000 +0900
@@ -44,7 +44,7 @@
extern void kexec_disable_iosapic(void);
extern void crash_save_this_cpu(void);
struct rsvd_region;
-extern unsigned long kdump_find_rsvd_region(unsigned long size,
+extern unsigned long kdump_find_rsvd_region(unsigned long size,
struct rsvd_region *rsvd_regions, int n);
extern void kdump_cpu_freeze(struct unw_frame_info *info, void *arg);
extern int kdump_status[];
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot