diff options
| -rw-r--r-- | arch/powerpc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_32.S | 7 | ||||
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 2 | ||||
| -rw-r--r-- | include/asm-powerpc/cputable.h | 10 |
5 files changed, 19 insertions, 4 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 291c95ac4b31..0b2d05da89d7 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -706,7 +706,7 @@ config FORCE_MAX_ZONEORDER | |||
| 706 | 706 | ||
| 707 | config MATH_EMULATION | 707 | config MATH_EMULATION |
| 708 | bool "Math emulation" | 708 | bool "Math emulation" |
| 709 | depends on 4xx || 8xx || E200 || E500 | 709 | depends on 4xx || 8xx || E200 || PPC_83xx || E500 |
| 710 | ---help--- | 710 | ---help--- |
| 711 | Some PowerPC chips designed for embedded applications do not have | 711 | Some PowerPC chips designed for embedded applications do not have |
| 712 | a floating-point unit and therefore do not implement the | 712 | a floating-point unit and therefore do not implement the |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 9d1614c3ce67..11bfbaf655b5 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -833,7 +833,7 @@ static struct cpu_spec cpu_specs[] = { | |||
| 833 | .pvr_mask = 0x7fff0000, | 833 | .pvr_mask = 0x7fff0000, |
| 834 | .pvr_value = 0x00840000, | 834 | .pvr_value = 0x00840000, |
| 835 | .cpu_name = "e300c2", | 835 | .cpu_name = "e300c2", |
| 836 | .cpu_features = CPU_FTRS_E300, | 836 | .cpu_features = CPU_FTRS_E300C2, |
| 837 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, | 837 | .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, |
| 838 | .icache_bsize = 32, | 838 | .icache_bsize = 32, |
| 839 | .dcache_bsize = 32, | 839 | .dcache_bsize = 32, |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index d88e182e40b3..9417cf5b4b7e 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
| @@ -437,6 +437,13 @@ Alignment: | |||
| 437 | /* Floating-point unavailable */ | 437 | /* Floating-point unavailable */ |
| 438 | . = 0x800 | 438 | . = 0x800 |
| 439 | FPUnavailable: | 439 | FPUnavailable: |
| 440 | BEGIN_FTR_SECTION | ||
| 441 | /* | ||
| 442 | * Certain Freescale cores don't have a FPU and treat fp instructions | ||
| 443 | * as a FP Unavailable exception. Redirect to illegal/emulation handling. | ||
| 444 | */ | ||
| 445 | b ProgramCheck | ||
| 446 | END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE) | ||
| 440 | EXCEPTION_PROLOG | 447 | EXCEPTION_PROLOG |
| 441 | bne load_up_fpu /* if from user, just load it up */ | 448 | bne load_up_fpu /* if from user, just load it up */ |
| 442 | addi r3,r1,STACK_FRAME_OVERHEAD | 449 | addi r3,r1,STACK_FRAME_OVERHEAD |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 0d4e203fa7a0..fde820e52d03 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -782,6 +782,8 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
| 782 | unsigned int reason = get_reason(regs); | 782 | unsigned int reason = get_reason(regs); |
| 783 | extern int do_mathemu(struct pt_regs *regs); | 783 | extern int do_mathemu(struct pt_regs *regs); |
| 784 | 784 | ||
| 785 | /* We can now get here via a FP Unavailable exception if the core | ||
| 786 | * has no FPU, in that case no reason flags will be set */ | ||
| 785 | #ifdef CONFIG_MATH_EMULATION | 787 | #ifdef CONFIG_MATH_EMULATION |
| 786 | /* (reason & REASON_ILLEGAL) would be the obvious thing here, | 788 | /* (reason & REASON_ILLEGAL) would be the obvious thing here, |
| 787 | * but there seems to be a hardware bug on the 405GP (RevD) | 789 | * but there seems to be a hardware bug on the 405GP (RevD) |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 6fe5c9d4ca3b..aca72f90849e 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
| @@ -126,6 +126,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, | |||
| 126 | #define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000) | 126 | #define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000) |
| 127 | #define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) | 127 | #define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) |
| 128 | #define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) | 128 | #define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) |
| 129 | #define CPU_FTR_FPU_UNAVAILABLE ASM_CONST(0x0000000000800000) | ||
| 129 | 130 | ||
| 130 | /* | 131 | /* |
| 131 | * Add the 64-bit processor unique features in the top half of the word; | 132 | * Add the 64-bit processor unique features in the top half of the word; |
| @@ -295,6 +296,9 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, | |||
| 295 | #define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ | 296 | #define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ |
| 296 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \ | 297 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \ |
| 297 | CPU_FTR_COMMON) | 298 | CPU_FTR_COMMON) |
| 299 | #define CPU_FTRS_E300C2 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ | ||
| 300 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \ | ||
| 301 | CPU_FTR_COMMON | CPU_FTR_FPU_UNAVAILABLE) | ||
| 298 | #define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ | 302 | #define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
| 299 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) | 303 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) |
| 300 | #define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB) | 304 | #define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB) |
| @@ -364,7 +368,8 @@ enum { | |||
| 364 | CPU_FTRS_7450_21 | CPU_FTRS_7450_23 | CPU_FTRS_7455_1 | | 368 | CPU_FTRS_7450_21 | CPU_FTRS_7450_23 | CPU_FTRS_7455_1 | |
| 365 | CPU_FTRS_7455_20 | CPU_FTRS_7455 | CPU_FTRS_7447_10 | | 369 | CPU_FTRS_7455_20 | CPU_FTRS_7455 | CPU_FTRS_7447_10 | |
| 366 | CPU_FTRS_7447 | CPU_FTRS_7447A | CPU_FTRS_82XX | | 370 | CPU_FTRS_7447 | CPU_FTRS_7447A | CPU_FTRS_82XX | |
| 367 | CPU_FTRS_G2_LE | CPU_FTRS_E300 | CPU_FTRS_CLASSIC32 | | 371 | CPU_FTRS_G2_LE | CPU_FTRS_E300 | CPU_FTRS_E300C2 | |
| 372 | CPU_FTRS_CLASSIC32 | | ||
| 368 | #else | 373 | #else |
| 369 | CPU_FTRS_GENERIC_32 | | 374 | CPU_FTRS_GENERIC_32 | |
| 370 | #endif | 375 | #endif |
| @@ -403,7 +408,8 @@ enum { | |||
| 403 | CPU_FTRS_7450_21 & CPU_FTRS_7450_23 & CPU_FTRS_7455_1 & | 408 | CPU_FTRS_7450_21 & CPU_FTRS_7450_23 & CPU_FTRS_7455_1 & |
| 404 | CPU_FTRS_7455_20 & CPU_FTRS_7455 & CPU_FTRS_7447_10 & | 409 | CPU_FTRS_7455_20 & CPU_FTRS_7455 & CPU_FTRS_7447_10 & |
| 405 | CPU_FTRS_7447 & CPU_FTRS_7447A & CPU_FTRS_82XX & | 410 | CPU_FTRS_7447 & CPU_FTRS_7447A & CPU_FTRS_82XX & |
| 406 | CPU_FTRS_G2_LE & CPU_FTRS_E300 & CPU_FTRS_CLASSIC32 & | 411 | CPU_FTRS_G2_LE & CPU_FTRS_E300 & CPU_FTRS_E300C2 & |
| 412 | CPU_FTRS_CLASSIC32 & | ||
| 407 | #else | 413 | #else |
| 408 | CPU_FTRS_GENERIC_32 & | 414 | CPU_FTRS_GENERIC_32 & |
| 409 | #endif | 415 | #endif |
