diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-23 19:48:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-23 19:48:56 -0400 |
commit | db725c88c74669603239a757761a2aecc390f55d (patch) | |
tree | 7e549a6d102bd6044cc87082a7c9cb2b4c7951ef | |
parent | 1aae31c8306e5f1bdeafd87b2cd9e3f0df3709e5 (diff) | |
parent | 556d3f7f4d791cae54fd24ef28296e666f4c96a6 (diff) |
Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
Pull ARM fixes from Russell King:
"Various fixes and post-merge window updates. Included here are:
- ensure Kconfig things which should be sorted remain sorted
- fix three big-endian bugs which crept in during the last merge
window
- add the renameat2 syscall
- fix big.LITTLE switcher initialisation checks
- fix kdump vmcore for LPAE kernels"
* 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm:
ARM: add renameat2 syscall
ARM: keep arch/arm/Kconfig and arch/arm/mm/Kconfig select entries sorted
ARM: 8033/1: fix big endian __pv_phys_pfn_offset size related issue
ARM: 8032/1: bL_switcher: fix validation check before its activation
ARM: 8030/1: ARM : kdump : add arch_crash_save_vmcoreinfo
ARM: 8027/1: fix do_div() bug in big-endian systems
ARM: 8026/1: Fix emulation of multiply accumulate instructions
ARM: 8024/1: Keep DEBUG_UART_{PHYS,VIRT} entries sorted
-rw-r--r-- | arch/arm/Kconfig | 10 | ||||
-rw-r--r-- | arch/arm/Kconfig.debug | 12 | ||||
-rw-r--r-- | arch/arm/common/bL_switcher.c | 6 | ||||
-rw-r--r-- | arch/arm/common/mcpm_entry.c | 5 | ||||
-rw-r--r-- | arch/arm/include/asm/div64.h | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/mcpm.h | 7 | ||||
-rw-r--r-- | arch/arm/include/uapi/asm/unistd.h | 1 | ||||
-rw-r--r-- | arch/arm/kernel/calls.S | 1 | ||||
-rw-r--r-- | arch/arm/kernel/head.S | 2 | ||||
-rw-r--r-- | arch/arm/kernel/machine_kexec.c | 7 | ||||
-rw-r--r-- | arch/arm/mm/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/vfp/vfpdouble.c | 2 | ||||
-rw-r--r-- | arch/arm/vfp/vfpsingle.c | 2 |
13 files changed, 44 insertions, 21 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ab438cb5af55..53e99eb543d9 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -30,9 +30,9 @@ config ARM | |||
30 | select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) | 30 | select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) |
31 | select HAVE_ARCH_TRACEHOOK | 31 | select HAVE_ARCH_TRACEHOOK |
32 | select HAVE_BPF_JIT | 32 | select HAVE_BPF_JIT |
33 | select HAVE_CC_STACKPROTECTOR | ||
33 | select HAVE_CONTEXT_TRACKING | 34 | select HAVE_CONTEXT_TRACKING |
34 | select HAVE_C_RECORDMCOUNT | 35 | select HAVE_C_RECORDMCOUNT |
35 | select HAVE_CC_STACKPROTECTOR | ||
36 | select HAVE_DEBUG_KMEMLEAK | 36 | select HAVE_DEBUG_KMEMLEAK |
37 | select HAVE_DMA_API_DEBUG | 37 | select HAVE_DMA_API_DEBUG |
38 | select HAVE_DMA_ATTRS | 38 | select HAVE_DMA_ATTRS |
@@ -422,8 +422,8 @@ config ARCH_EFM32 | |||
422 | bool "Energy Micro efm32" | 422 | bool "Energy Micro efm32" |
423 | depends on !MMU | 423 | depends on !MMU |
424 | select ARCH_REQUIRE_GPIOLIB | 424 | select ARCH_REQUIRE_GPIOLIB |
425 | select AUTO_ZRELADDR | ||
426 | select ARM_NVIC | 425 | select ARM_NVIC |
426 | select AUTO_ZRELADDR | ||
427 | select CLKSRC_OF | 427 | select CLKSRC_OF |
428 | select COMMON_CLK | 428 | select COMMON_CLK |
429 | select CPU_V7M | 429 | select CPU_V7M |
@@ -511,8 +511,8 @@ config ARCH_IXP4XX | |||
511 | bool "IXP4xx-based" | 511 | bool "IXP4xx-based" |
512 | depends on MMU | 512 | depends on MMU |
513 | select ARCH_HAS_DMA_SET_COHERENT_MASK | 513 | select ARCH_HAS_DMA_SET_COHERENT_MASK |
514 | select ARCH_SUPPORTS_BIG_ENDIAN | ||
515 | select ARCH_REQUIRE_GPIOLIB | 514 | select ARCH_REQUIRE_GPIOLIB |
515 | select ARCH_SUPPORTS_BIG_ENDIAN | ||
516 | select CLKSRC_MMIO | 516 | select CLKSRC_MMIO |
517 | select CPU_XSCALE | 517 | select CPU_XSCALE |
518 | select DMABOUNCE if PCI | 518 | select DMABOUNCE if PCI |
@@ -1575,8 +1575,8 @@ config BIG_LITTLE | |||
1575 | config BL_SWITCHER | 1575 | config BL_SWITCHER |
1576 | bool "big.LITTLE switcher support" | 1576 | bool "big.LITTLE switcher support" |
1577 | depends on BIG_LITTLE && MCPM && HOTPLUG_CPU | 1577 | depends on BIG_LITTLE && MCPM && HOTPLUG_CPU |
1578 | select CPU_PM | ||
1579 | select ARM_CPU_SUSPEND | 1578 | select ARM_CPU_SUSPEND |
1579 | select CPU_PM | ||
1580 | help | 1580 | help |
1581 | The big.LITTLE "switcher" provides the core functionality to | 1581 | The big.LITTLE "switcher" provides the core functionality to |
1582 | transparently handle transition between a cluster of A15's | 1582 | transparently handle transition between a cluster of A15's |
@@ -1920,9 +1920,9 @@ config XEN | |||
1920 | depends on CPU_V7 && !CPU_V6 | 1920 | depends on CPU_V7 && !CPU_V6 |
1921 | depends on !GENERIC_ATOMIC64 | 1921 | depends on !GENERIC_ATOMIC64 |
1922 | depends on MMU | 1922 | depends on MMU |
1923 | select ARCH_DMA_ADDR_T_64BIT | ||
1923 | select ARM_PSCI | 1924 | select ARM_PSCI |
1924 | select SWIOTLB_XEN | 1925 | select SWIOTLB_XEN |
1925 | select ARCH_DMA_ADDR_T_64BIT | ||
1926 | help | 1926 | help |
1927 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. | 1927 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. |
1928 | 1928 | ||
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 4a2fc0bf6fc9..eab8ecbe69c1 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
@@ -1030,9 +1030,9 @@ config DEBUG_UART_PHYS | |||
1030 | default 0x40100000 if DEBUG_PXA_UART1 | 1030 | default 0x40100000 if DEBUG_PXA_UART1 |
1031 | default 0x42000000 if ARCH_GEMINI | 1031 | default 0x42000000 if ARCH_GEMINI |
1032 | default 0x7c0003f8 if FOOTBRIDGE | 1032 | default 0x7c0003f8 if FOOTBRIDGE |
1033 | default 0x80230000 if DEBUG_PICOXCELL_UART | ||
1034 | default 0x80070000 if DEBUG_IMX23_UART | 1033 | default 0x80070000 if DEBUG_IMX23_UART |
1035 | default 0x80074000 if DEBUG_IMX28_UART | 1034 | default 0x80074000 if DEBUG_IMX28_UART |
1035 | default 0x80230000 if DEBUG_PICOXCELL_UART | ||
1036 | default 0x808c0000 if ARCH_EP93XX | 1036 | default 0x808c0000 if ARCH_EP93XX |
1037 | default 0x90020000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART | 1037 | default 0x90020000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART |
1038 | default 0xb0090000 if DEBUG_VEXPRESS_UART0_CRX | 1038 | default 0xb0090000 if DEBUG_VEXPRESS_UART0_CRX |
@@ -1096,22 +1096,22 @@ config DEBUG_UART_VIRT | |||
1096 | default 0xfeb26000 if DEBUG_RK3X_UART1 | 1096 | default 0xfeb26000 if DEBUG_RK3X_UART1 |
1097 | default 0xfeb30c00 if DEBUG_KEYSTONE_UART0 | 1097 | default 0xfeb30c00 if DEBUG_KEYSTONE_UART0 |
1098 | default 0xfeb31000 if DEBUG_KEYSTONE_UART1 | 1098 | default 0xfeb31000 if DEBUG_KEYSTONE_UART1 |
1099 | default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE | ||
1100 | default 0xfed60000 if DEBUG_RK29_UART0 | ||
1101 | default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2 | ||
1102 | default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3 | ||
1103 | default 0xfec02000 if DEBUG_SOCFPGA_UART | 1099 | default 0xfec02000 if DEBUG_SOCFPGA_UART |
1100 | default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE | ||
1104 | default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0 | 1101 | default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0 |
1105 | default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1 | 1102 | default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1 |
1106 | default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2 | 1103 | default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2 |
1107 | default 0xfed12000 if ARCH_KIRKWOOD | 1104 | default 0xfed12000 if ARCH_KIRKWOOD |
1105 | default 0xfed60000 if DEBUG_RK29_UART0 | ||
1106 | default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2 | ||
1107 | default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3 | ||
1108 | default 0xfedc0000 if ARCH_EP93XX | 1108 | default 0xfedc0000 if ARCH_EP93XX |
1109 | default 0xfee003f8 if FOOTBRIDGE | 1109 | default 0xfee003f8 if FOOTBRIDGE |
1110 | default 0xfee20000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART | 1110 | default 0xfee20000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART |
1111 | default 0xfef36000 if DEBUG_HIGHBANK_UART | ||
1112 | default 0xfee82340 if ARCH_IOP13XX | 1111 | default 0xfee82340 if ARCH_IOP13XX |
1113 | default 0xfef00000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN | 1112 | default 0xfef00000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN |
1114 | default 0xfef00003 if ARCH_IXP4XX && CPU_BIG_ENDIAN | 1113 | default 0xfef00003 if ARCH_IXP4XX && CPU_BIG_ENDIAN |
1114 | default 0xfef36000 if DEBUG_HIGHBANK_UART | ||
1115 | default 0xfefff700 if ARCH_IOP33X | 1115 | default 0xfefff700 if ARCH_IOP33X |
1116 | default 0xff003000 if DEBUG_U300_UART | 1116 | default 0xff003000 if DEBUG_U300_UART |
1117 | default DEBUG_UART_PHYS if !MMU | 1117 | default DEBUG_UART_PHYS if !MMU |
diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c index 5774b6ea7ad5..f01c0ee0c87e 100644 --- a/arch/arm/common/bL_switcher.c +++ b/arch/arm/common/bL_switcher.c | |||
@@ -797,10 +797,8 @@ static int __init bL_switcher_init(void) | |||
797 | { | 797 | { |
798 | int ret; | 798 | int ret; |
799 | 799 | ||
800 | if (MAX_NR_CLUSTERS != 2) { | 800 | if (!mcpm_is_available()) |
801 | pr_err("%s: only dual cluster systems are supported\n", __func__); | 801 | return -ENODEV; |
802 | return -EINVAL; | ||
803 | } | ||
804 | 802 | ||
805 | cpu_notifier(bL_switcher_hotplug_callback, 0); | 803 | cpu_notifier(bL_switcher_hotplug_callback, 0); |
806 | 804 | ||
diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c index 1e361abc29eb..86fd60fefbc9 100644 --- a/arch/arm/common/mcpm_entry.c +++ b/arch/arm/common/mcpm_entry.c | |||
@@ -48,6 +48,11 @@ int __init mcpm_platform_register(const struct mcpm_platform_ops *ops) | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | bool mcpm_is_available(void) | ||
52 | { | ||
53 | return (platform_ops) ? true : false; | ||
54 | } | ||
55 | |||
51 | int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) | 56 | int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) |
52 | { | 57 | { |
53 | if (!platform_ops) | 58 | if (!platform_ops) |
diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h index 191ada6e4d2d..662c7bd06108 100644 --- a/arch/arm/include/asm/div64.h +++ b/arch/arm/include/asm/div64.h | |||
@@ -156,7 +156,7 @@ | |||
156 | /* Select the best insn combination to perform the */ \ | 156 | /* Select the best insn combination to perform the */ \ |
157 | /* actual __m * __n / (__p << 64) operation. */ \ | 157 | /* actual __m * __n / (__p << 64) operation. */ \ |
158 | if (!__c) { \ | 158 | if (!__c) { \ |
159 | asm ( "umull %Q0, %R0, %1, %Q2\n\t" \ | 159 | asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \ |
160 | "mov %Q0, #0" \ | 160 | "mov %Q0, #0" \ |
161 | : "=&r" (__res) \ | 161 | : "=&r" (__res) \ |
162 | : "r" (__m), "r" (__n) \ | 162 | : "r" (__m), "r" (__n) \ |
diff --git a/arch/arm/include/asm/mcpm.h b/arch/arm/include/asm/mcpm.h index 608516ebabfe..a5ff410dcdb6 100644 --- a/arch/arm/include/asm/mcpm.h +++ b/arch/arm/include/asm/mcpm.h | |||
@@ -54,6 +54,13 @@ void mcpm_set_early_poke(unsigned cpu, unsigned cluster, | |||
54 | */ | 54 | */ |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * mcpm_is_available - returns whether MCPM is initialized and available | ||
58 | * | ||
59 | * This returns true or false accordingly. | ||
60 | */ | ||
61 | bool mcpm_is_available(void); | ||
62 | |||
63 | /** | ||
57 | * mcpm_cpu_power_up - make given CPU in given cluster runable | 64 | * mcpm_cpu_power_up - make given CPU in given cluster runable |
58 | * | 65 | * |
59 | * @cpu: CPU number within given cluster | 66 | * @cpu: CPU number within given cluster |
diff --git a/arch/arm/include/uapi/asm/unistd.h b/arch/arm/include/uapi/asm/unistd.h index fb5584d0cc05..ba94446c72d9 100644 --- a/arch/arm/include/uapi/asm/unistd.h +++ b/arch/arm/include/uapi/asm/unistd.h | |||
@@ -408,6 +408,7 @@ | |||
408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) | 408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) |
409 | #define __NR_sched_setattr (__NR_SYSCALL_BASE+380) | 409 | #define __NR_sched_setattr (__NR_SYSCALL_BASE+380) |
410 | #define __NR_sched_getattr (__NR_SYSCALL_BASE+381) | 410 | #define __NR_sched_getattr (__NR_SYSCALL_BASE+381) |
411 | #define __NR_renameat2 (__NR_SYSCALL_BASE+382) | ||
411 | 412 | ||
412 | /* | 413 | /* |
413 | * This may need to be greater than __NR_last_syscall+1 in order to | 414 | * This may need to be greater than __NR_last_syscall+1 in order to |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 166e945de832..8f51bdcdacbb 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -391,6 +391,7 @@ | |||
391 | CALL(sys_finit_module) | 391 | CALL(sys_finit_module) |
392 | /* 380 */ CALL(sys_sched_setattr) | 392 | /* 380 */ CALL(sys_sched_setattr) |
393 | CALL(sys_sched_getattr) | 393 | CALL(sys_sched_getattr) |
394 | CALL(sys_renameat2) | ||
394 | #ifndef syscalls_counted | 395 | #ifndef syscalls_counted |
395 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 396 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
396 | #define syscalls_counted | 397 | #define syscalls_counted |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index f8c08839edf3..591d6e4a6492 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -587,7 +587,7 @@ __fixup_pv_table: | |||
587 | add r6, r6, r3 @ adjust __pv_phys_pfn_offset address | 587 | add r6, r6, r3 @ adjust __pv_phys_pfn_offset address |
588 | add r7, r7, r3 @ adjust __pv_offset address | 588 | add r7, r7, r3 @ adjust __pv_offset address |
589 | mov r0, r8, lsr #12 @ convert to PFN | 589 | mov r0, r8, lsr #12 @ convert to PFN |
590 | str r0, [r6, #LOW_OFFSET] @ save computed PHYS_OFFSET to __pv_phys_pfn_offset | 590 | str r0, [r6] @ save computed PHYS_OFFSET to __pv_phys_pfn_offset |
591 | strcc ip, [r7, #HIGH_OFFSET] @ save to __pv_offset high bits | 591 | strcc ip, [r7, #HIGH_OFFSET] @ save to __pv_offset high bits |
592 | mov r6, r3, lsr #24 @ constant for add/sub instructions | 592 | mov r6, r3, lsr #24 @ constant for add/sub instructions |
593 | teq r3, r6, lsl #24 @ must be 16MiB aligned | 593 | teq r3, r6, lsl #24 @ must be 16MiB aligned |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index f0d180d8b29f..8cf0996aa1a8 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -184,3 +184,10 @@ void machine_kexec(struct kimage *image) | |||
184 | 184 | ||
185 | soft_restart(reboot_entry_phys); | 185 | soft_restart(reboot_entry_phys); |
186 | } | 186 | } |
187 | |||
188 | void arch_crash_save_vmcoreinfo(void) | ||
189 | { | ||
190 | #ifdef CONFIG_ARM_LPAE | ||
191 | VMCOREINFO_CONFIG(ARM_LPAE); | ||
192 | #endif | ||
193 | } | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index f5ad9ee70426..5bf7c3c3b301 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -420,29 +420,29 @@ config CPU_32v3 | |||
420 | bool | 420 | bool |
421 | select CPU_USE_DOMAINS if MMU | 421 | select CPU_USE_DOMAINS if MMU |
422 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 422 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
423 | select TLS_REG_EMUL if SMP || !MMU | ||
424 | select NEED_KUSER_HELPERS | 423 | select NEED_KUSER_HELPERS |
424 | select TLS_REG_EMUL if SMP || !MMU | ||
425 | 425 | ||
426 | config CPU_32v4 | 426 | config CPU_32v4 |
427 | bool | 427 | bool |
428 | select CPU_USE_DOMAINS if MMU | 428 | select CPU_USE_DOMAINS if MMU |
429 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 429 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
430 | select TLS_REG_EMUL if SMP || !MMU | ||
431 | select NEED_KUSER_HELPERS | 430 | select NEED_KUSER_HELPERS |
431 | select TLS_REG_EMUL if SMP || !MMU | ||
432 | 432 | ||
433 | config CPU_32v4T | 433 | config CPU_32v4T |
434 | bool | 434 | bool |
435 | select CPU_USE_DOMAINS if MMU | 435 | select CPU_USE_DOMAINS if MMU |
436 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 436 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
437 | select TLS_REG_EMUL if SMP || !MMU | ||
438 | select NEED_KUSER_HELPERS | 437 | select NEED_KUSER_HELPERS |
438 | select TLS_REG_EMUL if SMP || !MMU | ||
439 | 439 | ||
440 | config CPU_32v5 | 440 | config CPU_32v5 |
441 | bool | 441 | bool |
442 | select CPU_USE_DOMAINS if MMU | 442 | select CPU_USE_DOMAINS if MMU |
443 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 443 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
444 | select TLS_REG_EMUL if SMP || !MMU | ||
445 | select NEED_KUSER_HELPERS | 444 | select NEED_KUSER_HELPERS |
445 | select TLS_REG_EMUL if SMP || !MMU | ||
446 | 446 | ||
447 | config CPU_32v6 | 447 | config CPU_32v6 |
448 | bool | 448 | bool |
diff --git a/arch/arm/vfp/vfpdouble.c b/arch/arm/vfp/vfpdouble.c index 6cac43bd1d86..423f56dd4028 100644 --- a/arch/arm/vfp/vfpdouble.c +++ b/arch/arm/vfp/vfpdouble.c | |||
@@ -866,6 +866,8 @@ vfp_double_multiply_accumulate(int dd, int dn, int dm, u32 fpscr, u32 negate, ch | |||
866 | vdp.sign = vfp_sign_negate(vdp.sign); | 866 | vdp.sign = vfp_sign_negate(vdp.sign); |
867 | 867 | ||
868 | vfp_double_unpack(&vdn, vfp_get_double(dd)); | 868 | vfp_double_unpack(&vdn, vfp_get_double(dd)); |
869 | if (vdn.exponent == 0 && vdn.significand) | ||
870 | vfp_double_normalise_denormal(&vdn); | ||
869 | if (negate & NEG_SUBTRACT) | 871 | if (negate & NEG_SUBTRACT) |
870 | vdn.sign = vfp_sign_negate(vdn.sign); | 872 | vdn.sign = vfp_sign_negate(vdn.sign); |
871 | 873 | ||
diff --git a/arch/arm/vfp/vfpsingle.c b/arch/arm/vfp/vfpsingle.c index b252631b406b..4f96c1617aae 100644 --- a/arch/arm/vfp/vfpsingle.c +++ b/arch/arm/vfp/vfpsingle.c | |||
@@ -915,6 +915,8 @@ vfp_single_multiply_accumulate(int sd, int sn, s32 m, u32 fpscr, u32 negate, cha | |||
915 | v = vfp_get_float(sd); | 915 | v = vfp_get_float(sd); |
916 | pr_debug("VFP: s%u = %08x\n", sd, v); | 916 | pr_debug("VFP: s%u = %08x\n", sd, v); |
917 | vfp_single_unpack(&vsn, v); | 917 | vfp_single_unpack(&vsn, v); |
918 | if (vsn.exponent == 0 && vsn.significand) | ||
919 | vfp_single_normalise_denormal(&vsn); | ||
918 | if (negate & NEG_SUBTRACT) | 920 | if (negate & NEG_SUBTRACT) |
919 | vsn.sign = vfp_sign_negate(vsn.sign); | 921 | vsn.sign = vfp_sign_negate(vsn.sign); |
920 | 922 | ||