aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2014-04-11 02:43:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-04-12 20:58:48 -0400
commit18aa0da33e18cb2037932f7ad5c7d51f22e012f5 (patch)
treeac0c95d25744e58cee9b075816347b279a9727f3 /arch/powerpc
parentd7e8af1afeffb03ab250b91cd70ba8c701f0f2b7 (diff)
powerpc: Don't try to set LPCR unless we're in hypervisor mode
Commit 8f619b5429d9 ("powerpc/ppc64: Do not turn AIL (reloc-on interrupts) too early") added code to set the AIL bit in the LPCR without checking whether the kernel is running in hypervisor mode. The result is that when the kernel is running as a guest (i.e., under PowerKVM or PowerVM), the processor takes a privileged instruction interrupt at that point, causing a panic. The visible result is that the kernel hangs after printing "returning from prom_init". This fixes it by checking for hypervisor mode being available before setting LPCR. If we are not in hypervisor mode, we enable relocation-on interrupts later in pSeries_setup_arch using the H_SET_MODE hcall. Signed-off-by: Paul Mackerras <paulus@samba.org> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/kernel/setup_64.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 3d7a50a08f5e..fbe24377eda3 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -201,7 +201,8 @@ static void cpu_ready_for_interrupts(void)
201 get_paca()->kernel_msr = MSR_KERNEL; 201 get_paca()->kernel_msr = MSR_KERNEL;
202 202
203 /* Enable AIL if supported */ 203 /* Enable AIL if supported */
204 if (cpu_has_feature(CPU_FTR_ARCH_207S)) { 204 if (cpu_has_feature(CPU_FTR_HVMODE) &&
205 cpu_has_feature(CPU_FTR_ARCH_207S)) {
205 unsigned long lpcr = mfspr(SPRN_LPCR); 206 unsigned long lpcr = mfspr(SPRN_LPCR);
206 mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3); 207 mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
207 } 208 }