Commit 96eea642 authored by Tiejun Chen's avatar Tiejun Chen Committed by Scott Wood

powerpc/book3e-64: Enable kexec

Allow KEXEC for book3e, and bypass or convert non-book3e stuff
in kexec code.
Signed-off-by: default avatarTiejun Chen <tiejun.chen@windriver.com>
[scottwood@freescale.com: move code to minimize diff, and cleanup]
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent ae73e4cc
...@@ -419,7 +419,7 @@ config PPC64_SUPPORTS_MEMORY_FAILURE ...@@ -419,7 +419,7 @@ config PPC64_SUPPORTS_MEMORY_FAILURE
config KEXEC config KEXEC
bool "kexec system call" bool "kexec system call"
depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP)) depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP)) || PPC_BOOK3E
select KEXEC_CORE select KEXEC_CORE
help help
kexec is a system call that implements the ability to shutdown your kexec is a system call that implements the ability to shutdown your
......
...@@ -30,6 +30,21 @@ ...@@ -30,6 +30,21 @@
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/hw_breakpoint.h> #include <asm/hw_breakpoint.h>
#ifdef CONFIG_PPC_BOOK3E
int default_machine_kexec_prepare(struct kimage *image)
{
int i;
/*
* Since we use the kernel fault handlers and paging code to
* handle the virtual mode, we must make sure no destination
* overlaps kernel static data or bss.
*/
for (i = 0; i < image->nr_segments; i++)
if (image->segment[i].mem < __pa(_end))
return -ETXTBSY;
return 0;
}
#else
int default_machine_kexec_prepare(struct kimage *image) int default_machine_kexec_prepare(struct kimage *image)
{ {
int i; int i;
...@@ -95,6 +110,7 @@ int default_machine_kexec_prepare(struct kimage *image) ...@@ -95,6 +110,7 @@ int default_machine_kexec_prepare(struct kimage *image)
return 0; return 0;
} }
#endif /* !CONFIG_PPC_BOOK3E */
static void copy_segments(unsigned long ind) static void copy_segments(unsigned long ind)
{ {
...@@ -365,6 +381,7 @@ void default_machine_kexec(struct kimage *image) ...@@ -365,6 +381,7 @@ void default_machine_kexec(struct kimage *image)
/* NOTREACHED */ /* NOTREACHED */
} }
#ifndef CONFIG_PPC_BOOK3E
/* Values we need to export to the second kernel via the device tree. */ /* Values we need to export to the second kernel via the device tree. */
static unsigned long htab_base; static unsigned long htab_base;
static unsigned long htab_size; static unsigned long htab_size;
...@@ -411,3 +428,4 @@ static int __init export_htab_values(void) ...@@ -411,3 +428,4 @@ static int __init export_htab_values(void)
return 0; return 0;
} }
late_initcall(export_htab_values); late_initcall(export_htab_values);
#endif /* !CONFIG_PPC_BOOK3E */
...@@ -631,9 +631,13 @@ _GLOBAL(kexec_sequence) ...@@ -631,9 +631,13 @@ _GLOBAL(kexec_sequence)
lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */ lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */
/* disable interrupts, we are overwriting kernel data next */ /* disable interrupts, we are overwriting kernel data next */
#ifdef CONFIG_PPC_BOOK3E
wrteei 0
#else
mfmsr r3 mfmsr r3
rlwinm r3,r3,0,17,15 rlwinm r3,r3,0,17,15
mtmsrd r3,1 mtmsrd r3,1
#endif
/* copy dest pages, flush whole dest image */ /* copy dest pages, flush whole dest image */
mr r3,r29 mr r3,r29
...@@ -655,6 +659,7 @@ _GLOBAL(kexec_sequence) ...@@ -655,6 +659,7 @@ _GLOBAL(kexec_sequence)
li r6,1 li r6,1
stw r6,kexec_flag-1b(5) stw r6,kexec_flag-1b(5)
#ifndef CONFIG_PPC_BOOK3E
/* clear out hardware hash page table and tlb */ /* clear out hardware hash page table and tlb */
#if !defined(_CALL_ELF) || _CALL_ELF != 2 #if !defined(_CALL_ELF) || _CALL_ELF != 2
ld r12,0(r27) /* deref function descriptor */ ld r12,0(r27) /* deref function descriptor */
...@@ -663,6 +668,7 @@ _GLOBAL(kexec_sequence) ...@@ -663,6 +668,7 @@ _GLOBAL(kexec_sequence)
#endif #endif
mtctr r12 mtctr r12
bctrl /* ppc_md.hpte_clear_all(void); */ bctrl /* ppc_md.hpte_clear_all(void); */
#endif /* !CONFIG_PPC_BOOK3E */
/* /*
* kexec image calling is: * kexec image calling is:
......
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