diff options
Diffstat (limited to 'arch/ia64/kernel/machine_kexec.c')
-rw-r--r-- | arch/ia64/kernel/machine_kexec.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c index 0823de1f6ebe..3d3aeef46947 100644 --- a/arch/ia64/kernel/machine_kexec.c +++ b/arch/ia64/kernel/machine_kexec.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <asm/delay.h> | 24 | #include <asm/delay.h> |
25 | #include <asm/meminit.h> | 25 | #include <asm/meminit.h> |
26 | #include <asm/processor.h> | 26 | #include <asm/processor.h> |
27 | #include <asm/sal.h> | ||
28 | #include <asm/mca.h> | ||
27 | 29 | ||
28 | typedef NORET_TYPE void (*relocate_new_kernel_t)( | 30 | typedef NORET_TYPE void (*relocate_new_kernel_t)( |
29 | unsigned long indirection_page, | 31 | unsigned long indirection_page, |
@@ -85,13 +87,26 @@ static void ia64_machine_kexec(struct unw_frame_info *info, void *arg) | |||
85 | void *pal_addr = efi_get_pal_addr(); | 87 | void *pal_addr = efi_get_pal_addr(); |
86 | unsigned long code_addr = (unsigned long)page_address(image->control_code_page); | 88 | unsigned long code_addr = (unsigned long)page_address(image->control_code_page); |
87 | int ii; | 89 | int ii; |
90 | u64 fp, gp; | ||
91 | ia64_fptr_t *init_handler = (ia64_fptr_t *)ia64_os_init_on_kdump; | ||
88 | 92 | ||
89 | BUG_ON(!image); | 93 | BUG_ON(!image); |
90 | if (image->type == KEXEC_TYPE_CRASH) { | 94 | if (image->type == KEXEC_TYPE_CRASH) { |
91 | crash_save_this_cpu(); | 95 | crash_save_this_cpu(); |
92 | current->thread.ksp = (__u64)info->sw - 16; | 96 | current->thread.ksp = (__u64)info->sw - 16; |
97 | |||
98 | /* Register noop init handler */ | ||
99 | fp = ia64_tpa(init_handler->fp); | ||
100 | gp = ia64_tpa(ia64_getreg(_IA64_REG_GP)); | ||
101 | ia64_sal_set_vectors(SAL_VECTOR_OS_INIT, fp, gp, 0, fp, gp, 0); | ||
102 | } else { | ||
103 | /* Unregister init handlers of current kernel */ | ||
104 | ia64_sal_set_vectors(SAL_VECTOR_OS_INIT, 0, 0, 0, 0, 0, 0); | ||
93 | } | 105 | } |
94 | 106 | ||
107 | /* Unregister mca handler - No more recovery on current kernel */ | ||
108 | ia64_sal_set_vectors(SAL_VECTOR_OS_MCA, 0, 0, 0, 0, 0, 0); | ||
109 | |||
95 | /* Interrupts aren't acceptable while we reboot */ | 110 | /* Interrupts aren't acceptable while we reboot */ |
96 | local_irq_disable(); | 111 | local_irq_disable(); |
97 | 112 | ||