diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2007-12-20 23:39:21 -0500 |
---|---|---|
committer | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2007-12-23 14:11:59 -0500 |
commit | 47c0bd1ae24c34e851cf0f2b02ef2a6847d7ae15 (patch) | |
tree | 86fab68618a4afa03660cc576c9e7da3e5a0b520 /arch/powerpc/kernel/head_44x.S | |
parent | c2a7dcad9f0d92d7a96e735abb8bec7b9c621536 (diff) |
[POWERPC] Reworking machine check handling and Fix 440/440A
This adds a cputable function pointer for the CPU-side machine
check handling. The semantic is still the same as the old one,
the one in ppc_md. overrides the one in cputable, though
ultimately we'll want to change that so the CPU gets first.
This removes CONFIG_440A which was a problem for multiplatform
kernels and instead fixes up the IVOR at runtime from a setup_cpu
function. The "A" version of the machine check also tweaks the
regs->trap value to differenciate the 2 versions at the C level.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Diffstat (limited to 'arch/powerpc/kernel/head_44x.S')
-rw-r--r-- | arch/powerpc/kernel/head_44x.S | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 56aba84c1f6e..ad071a146a8d 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S | |||
@@ -289,11 +289,8 @@ interrupt_base: | |||
289 | CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception) | 289 | CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception) |
290 | 290 | ||
291 | /* Machine Check Interrupt */ | 291 | /* Machine Check Interrupt */ |
292 | #ifdef CONFIG_440A | ||
293 | MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception) | ||
294 | #else | ||
295 | CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception) | 292 | CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception) |
296 | #endif | 293 | MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception) |
297 | 294 | ||
298 | /* Data Storage Interrupt */ | 295 | /* Data Storage Interrupt */ |
299 | START_EXCEPTION(DataStorage) | 296 | START_EXCEPTION(DataStorage) |
@@ -674,6 +671,15 @@ finish_tlb_load: | |||
674 | */ | 671 | */ |
675 | 672 | ||
676 | /* | 673 | /* |
674 | * Adjust the machine check IVOR on 440A cores | ||
675 | */ | ||
676 | _GLOBAL(__fixup_440A_mcheck) | ||
677 | li r3,MachineCheckA@l | ||
678 | mtspr SPRN_IVOR1,r3 | ||
679 | sync | ||
680 | blr | ||
681 | |||
682 | /* | ||
677 | * extern void giveup_altivec(struct task_struct *prev) | 683 | * extern void giveup_altivec(struct task_struct *prev) |
678 | * | 684 | * |
679 | * The 44x core does not have an AltiVec unit. | 685 | * The 44x core does not have an AltiVec unit. |