Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge master.kernel.org:/home/rmk/linux-2.6-arm

* master.kernel.org:/home/rmk/linux-2.6-arm:
[ARM] 3761/1: fix armv4t breakage after adding thumb interworking to userspace helpers
[ARM] Add Integrator support for glibc outb() and friends
[ARM] Move prototype for register_isa_ports to asm/io.h
[ARM] Arrange for isa.c to use named initialisers
[ARM] 3741/1: remove sa1111.c build warning on non-sa1100 systems
[ARM] 3760/1: This patch adds timeouts while working with SSP registers. Such timeouts were en
[ARM] 3758/1: Preserve signalling NaNs in conversion
[ARM] 3749/3: Correct VFP single/double conversion emulation
[ARM] 3748/3: Correct error check in vfp_raise_exceptions

+207 -81
+2 -1
arch/arm/Makefile
··· 47 47 # testing for a specific architecture or later rather impossible. 48 48 arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6) 49 49 arch-$(CONFIG_CPU_32v6K) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k) 50 - arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4) 50 + arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4t) 51 + arch-$(CONFIG_CPU_32v4T) :=-D__LINUX_ARM_ARCH__=4 -march=armv4t 51 52 arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4 52 53 arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3 53 54
+5 -1
arch/arm/common/sa1111.c
··· 618 618 { 619 619 struct sa1111 *sachip; 620 620 unsigned long id; 621 - unsigned int has_devs, val; 621 + unsigned int has_devs; 622 622 int i, ret = -ENODEV; 623 623 624 624 sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL); ··· 669 669 sa1111_wake(sachip); 670 670 671 671 #ifdef CONFIG_ARCH_SA1100 672 + { 673 + unsigned int val; 674 + 672 675 /* 673 676 * The SDRAM configuration of the SA1110 and the SA1111 must 674 677 * match. This is very important to ensure that SA1111 accesses ··· 695 692 * Enable the SA1110 memory bus request and grant signals. 696 693 */ 697 694 sa1110_mb_enable(); 695 + } 698 696 #endif 699 697 700 698 /*
+1 -2
arch/arm/kernel/Makefile
··· 13 13 obj-$(CONFIG_APM) += apm.o 14 14 obj-$(CONFIG_ISA_DMA_API) += dma.o 15 15 obj-$(CONFIG_ARCH_ACORN) += ecard.o 16 - obj-$(CONFIG_FOOTBRIDGE) += isa.o 17 16 obj-$(CONFIG_FIQ) += fiq.o 18 17 obj-$(CONFIG_MODULES) += armksyms.o module.o 19 18 obj-$(CONFIG_ARTHUR) += arthur.o 20 19 obj-$(CONFIG_ISA_DMA) += dma-isa.o 21 - obj-$(CONFIG_PCI) += bios32.o 20 + obj-$(CONFIG_PCI) += bios32.o isa.o 22 21 obj-$(CONFIG_SMP) += smp.o 23 22 obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o 24 23
+42 -21
arch/arm/kernel/isa.c
··· 3 3 * 4 4 * Copyright (C) 1999 Phil Blundell 5 5 * 6 - * ISA shared memory and I/O port support 7 - */ 8 - 9 - /* 10 6 * This program is free software; you can redistribute it and/or 11 7 * modify it under the terms of the GNU General Public License 12 8 * as published by the Free Software Foundation; either version 13 9 * 2 of the License, or (at your option) any later version. 10 + * 11 + * ISA shared memory and I/O port support, and is required to support 12 + * iopl, inb, outb and friends in userspace via glibc emulation. 14 13 */ 15 - 16 - /* 17 - * Nothing about this is actually ARM specific. One day we could move 18 - * it into kernel/resource.c or some place like that. 19 - */ 20 - 21 14 #include <linux/stddef.h> 22 15 #include <linux/types.h> 23 16 #include <linux/fs.h> ··· 20 27 static unsigned int isa_membase, isa_portbase, isa_portshift; 21 28 22 29 static ctl_table ctl_isa_vars[4] = { 23 - {BUS_ISA_MEM_BASE, "membase", &isa_membase, 24 - sizeof(isa_membase), 0444, NULL, &proc_dointvec}, 25 - {BUS_ISA_PORT_BASE, "portbase", &isa_portbase, 26 - sizeof(isa_portbase), 0444, NULL, &proc_dointvec}, 27 - {BUS_ISA_PORT_SHIFT, "portshift", &isa_portshift, 28 - sizeof(isa_portshift), 0444, NULL, &proc_dointvec}, 29 - {0} 30 + { 31 + .ctl_name = BUS_ISA_MEM_BASE, 32 + .procname = "membase", 33 + .data = &isa_membase, 34 + .maxlen = sizeof(isa_membase), 35 + .mode = 0444, 36 + .proc_handler = &proc_dointvec, 37 + }, { 38 + .ctl_name = BUS_ISA_PORT_BASE, 39 + .procname = "portbase", 40 + .data = &isa_portbase, 41 + .maxlen = sizeof(isa_portbase), 42 + .mode = 0444, 43 + .proc_handler = &proc_dointvec, 44 + }, { 45 + .ctl_name = BUS_ISA_PORT_SHIFT, 46 + .procname = "portshift", 47 + .data = &isa_portshift, 48 + .maxlen = sizeof(isa_portshift), 49 + .mode = 0444, 50 + .proc_handler = &proc_dointvec, 51 + }, {0} 30 52 }; 31 53 32 54 static struct ctl_table_header *isa_sysctl_header; 33 55 34 - static ctl_table ctl_isa[2] = {{CTL_BUS_ISA, "isa", NULL, 0, 0555, ctl_isa_vars}, 35 - {0}}; 36 - static ctl_table ctl_bus[2] = {{CTL_BUS, "bus", NULL, 0, 0555, ctl_isa}, 37 - {0}}; 56 + static ctl_table ctl_isa[2] = { 57 + { 58 + .ctl_name = CTL_BUS_ISA, 59 + .procname = "isa", 60 + .mode = 0555, 61 + .child = ctl_isa_vars, 62 + }, {0} 63 + }; 64 + 65 + static ctl_table ctl_bus[2] = { 66 + { 67 + .ctl_name = CTL_BUS, 68 + .procname = "bus", 69 + .mode = 0555, 70 + .child = ctl_isa, 71 + }, {0} 72 + }; 38 73 39 74 void __init 40 75 register_isa_ports(unsigned int membase, unsigned int portbase, unsigned int portshift)
-1
arch/arm/mach-footbridge/dc21285.c
··· 35 35 36 36 extern int setup_arm_irq(int, struct irqaction *); 37 37 extern void pcibios_report_status(u_int status_mask, int warn); 38 - extern void register_isa_ports(unsigned int, unsigned int, unsigned int); 39 38 40 39 static unsigned long 41 40 dc21285_base_address(struct pci_bus *bus, unsigned int devfn)
+2
arch/arm/mach-integrator/pci_v3.c
··· 600 600 printk(KERN_ERR "PCI: unable to grab local bus timeout " 601 601 "interrupt: %d\n", ret); 602 602 #endif 603 + 604 + register_isa_ports(PHYS_PCI_MEM_BASE, PHYS_PCI_IO_BASE, 0); 603 605 }
+12 -8
arch/arm/mach-pxa/corgi_ssp.c
··· 47 47 */ 48 48 unsigned long corgi_ssp_ads7846_putget(ulong data) 49 49 { 50 - unsigned long ret,flag; 50 + unsigned long flag; 51 + u32 ret = 0; 51 52 52 53 spin_lock_irqsave(&corgi_ssp_lock, flag); 53 54 if (ssp_machinfo->cs_ads7846 >= 0) 54 55 GPCR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); 55 56 56 57 ssp_write_word(&corgi_ssp_dev,data); 57 - ret = ssp_read_word(&corgi_ssp_dev); 58 + ssp_read_word(&corgi_ssp_dev, &ret); 58 59 59 60 if (ssp_machinfo->cs_ads7846 >= 0) 60 61 GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846); ··· 89 88 90 89 unsigned long corgi_ssp_ads7846_get(void) 91 90 { 92 - return ssp_read_word(&corgi_ssp_dev); 91 + u32 ret = 0; 92 + ssp_read_word(&corgi_ssp_dev, &ret); 93 + return ret; 93 94 } 94 95 95 96 EXPORT_SYMBOL(corgi_ssp_ads7846_putget); ··· 107 104 unsigned long corgi_ssp_dac_put(ulong data) 108 105 { 109 106 unsigned long flag, sscr1 = SSCR1_SPH; 107 + u32 tmp; 110 108 111 109 spin_lock_irqsave(&corgi_ssp_lock, flag); 112 110 ··· 122 118 GPCR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); 123 119 ssp_write_word(&corgi_ssp_dev,data); 124 120 /* Read null data back from device to prevent SSP overflow */ 125 - ssp_read_word(&corgi_ssp_dev); 121 + ssp_read_word(&corgi_ssp_dev, &tmp); 126 122 if (ssp_machinfo->cs_lcdcon >= 0) 127 123 GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); 128 124 ··· 154 150 int corgi_ssp_max1111_get(ulong data) 155 151 { 156 152 unsigned long flag; 157 - int voltage,voltage1,voltage2; 153 + long voltage = 0, voltage1 = 0, voltage2 = 0; 158 154 159 155 spin_lock_irqsave(&corgi_ssp_lock, flag); 160 156 if (ssp_machinfo->cs_max1111 >= 0) ··· 167 163 168 164 /* TB1/RB1 */ 169 165 ssp_write_word(&corgi_ssp_dev,data); 170 - ssp_read_word(&corgi_ssp_dev); /* null read */ 166 + ssp_read_word(&corgi_ssp_dev, (u32*)&voltage1); /* null read */ 171 167 172 168 /* TB12/RB2 */ 173 169 ssp_write_word(&corgi_ssp_dev,0); 174 - voltage1=ssp_read_word(&corgi_ssp_dev); 170 + ssp_read_word(&corgi_ssp_dev, (u32*)&voltage1); 175 171 176 172 /* TB13/RB3*/ 177 173 ssp_write_word(&corgi_ssp_dev,0); 178 - voltage2=ssp_read_word(&corgi_ssp_dev); 174 + ssp_read_word(&corgi_ssp_dev, (u32*)&voltage2); 179 175 180 176 ssp_disable(&corgi_ssp_dev); 181 177 ssp_config(&corgi_ssp_dev, (SSCR0_National | (SSCR0_DSS & 0x0b )), 0, 0, SSCR0_SerClkDiv(ssp_machinfo->clk_ads7846));
+29 -8
arch/arm/mach-pxa/ssp.c
··· 40 40 41 41 #define PXA_SSP_PORTS 3 42 42 43 + #define TIMEOUT 100000 44 + 43 45 struct ssp_info_ { 44 46 int irq; 45 47 u32 clock; ··· 94 92 * The caller is expected to perform the necessary locking. 95 93 * 96 94 * Returns: 97 - * %-ETIMEDOUT timeout occurred (for future) 95 + * %-ETIMEDOUT timeout occurred 98 96 * 0 success 99 97 */ 100 98 int ssp_write_word(struct ssp_dev *dev, u32 data) 101 99 { 102 - while (!(SSSR_P(dev->port) & SSSR_TNF)) 100 + int timeout = TIMEOUT; 101 + 102 + while (!(SSSR_P(dev->port) & SSSR_TNF)) { 103 + if (!--timeout) 104 + return -ETIMEDOUT; 103 105 cpu_relax(); 106 + } 104 107 105 108 SSDR_P(dev->port) = data; 106 109 ··· 124 117 * The caller is expected to perform the necessary locking. 125 118 * 126 119 * Returns: 127 - * %-ETIMEDOUT timeout occurred (for future) 120 + * %-ETIMEDOUT timeout occurred 128 121 * 32-bit data success 129 122 */ 130 - int ssp_read_word(struct ssp_dev *dev) 123 + int ssp_read_word(struct ssp_dev *dev, u32 *data) 131 124 { 132 - while (!(SSSR_P(dev->port) & SSSR_RNE)) 133 - cpu_relax(); 125 + int timeout = TIMEOUT; 134 126 135 - return SSDR_P(dev->port); 127 + while (!(SSSR_P(dev->port) & SSSR_RNE)) { 128 + if (!--timeout) 129 + return -ETIMEDOUT; 130 + cpu_relax(); 131 + } 132 + 133 + *data = SSDR_P(dev->port); 134 + return 0; 136 135 } 137 136 138 137 /** ··· 149 136 * 150 137 * The caller is expected to perform the necessary locking. 151 138 */ 152 - void ssp_flush(struct ssp_dev *dev) 139 + int ssp_flush(struct ssp_dev *dev) 153 140 { 141 + int timeout = TIMEOUT * 2; 142 + 154 143 do { 155 144 while (SSSR_P(dev->port) & SSSR_RNE) { 145 + if (!--timeout) 146 + return -ETIMEDOUT; 156 147 (void) SSDR_P(dev->port); 157 148 } 149 + if (!--timeout) 150 + return -ETIMEDOUT; 158 151 } while (SSSR_P(dev->port) & SSSR_BSY); 152 + 153 + return 0; 159 154 } 160 155 161 156 /**
+39 -9
arch/arm/mach-sa1100/ssp.c
··· 23 23 #include <asm/hardware.h> 24 24 #include <asm/hardware/ssp.h> 25 25 26 + #define TIMEOUT 100000 27 + 26 28 static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs) 27 29 { 28 30 unsigned int status = Ser4SSSR; ··· 49 47 * The caller is expected to perform the necessary locking. 50 48 * 51 49 * Returns: 52 - * %-ETIMEDOUT timeout occurred (for future) 50 + * %-ETIMEDOUT timeout occurred 53 51 * 0 success 54 52 */ 55 53 int ssp_write_word(u16 data) 56 54 { 57 - while (!(Ser4SSSR & SSSR_TNF)) 55 + int timeout = TIMEOUT; 56 + 57 + while (!(Ser4SSSR & SSSR_TNF)) { 58 + if (!--timeout) 59 + return -ETIMEDOUT; 58 60 cpu_relax(); 61 + } 59 62 60 63 Ser4SSDR = data; 61 64 62 - while (!(Ser4SSSR & SSSR_BSY)) 65 + timeout = TIMEOUT; 66 + while (!(Ser4SSSR & SSSR_BSY)) { 67 + if (!--timeout) 68 + return -ETIMEDOUT; 63 69 cpu_relax(); 70 + } 64 71 65 72 return 0; 66 73 } ··· 86 75 * The caller is expected to perform the necessary locking. 87 76 * 88 77 * Returns: 89 - * %-ETIMEDOUT timeout occurred (for future) 78 + * %-ETIMEDOUT timeout occurred 90 79 * 16-bit data success 91 80 */ 92 - int ssp_read_word(void) 81 + int ssp_read_word(u16 *data) 93 82 { 94 - while (!(Ser4SSSR & SSSR_RNE)) 95 - cpu_relax(); 83 + int timeout = TIMEOUT; 96 84 97 - return Ser4SSDR; 85 + while (!(Ser4SSSR & SSSR_RNE)) { 86 + if (!--timeout) 87 + return -ETIMEDOUT; 88 + cpu_relax(); 89 + } 90 + 91 + *data = (u16)Ser4SSDR; 92 + 93 + return 0; 98 94 } 99 95 100 96 /** ··· 111 93 * is empty. 112 94 * 113 95 * The caller is expected to perform the necessary locking. 96 + * 97 + * Returns: 98 + * %-ETIMEDOUT timeout occurred 99 + * 0 success 114 100 */ 115 - void ssp_flush(void) 101 + int ssp_flush(void) 116 102 { 103 + int timeout = TIMEOUT * 2; 104 + 117 105 do { 118 106 while (Ser4SSSR & SSSR_RNE) { 107 + if (!--timeout) 108 + return -ETIMEDOUT; 119 109 (void) Ser4SSDR; 120 110 } 111 + if (!--timeout) 112 + return -ETIMEDOUT; 121 113 } while (Ser4SSSR & SSSR_BSY); 114 + 115 + return 0; 122 116 } 123 117 124 118 /**
+9 -4
arch/arm/mm/Kconfig
··· 46 46 config CPU_ARM720T 47 47 bool "Support ARM720T processor" if !ARCH_CLPS711X && !ARCH_L7200 && !ARCH_CDB89712 && ARCH_INTEGRATOR 48 48 default y if ARCH_CLPS711X || ARCH_L7200 || ARCH_CDB89712 || ARCH_H720X 49 - select CPU_32v4 49 + select CPU_32v4T 50 50 select CPU_ABRT_LV4T 51 51 select CPU_CACHE_V4 52 52 select CPU_CACHE_VIVT ··· 64 64 bool "Support ARM920T processor" 65 65 depends on ARCH_EP93XX || ARCH_INTEGRATOR || CPU_S3C2410 || CPU_S3C2440 || CPU_S3C2442 || ARCH_IMX || ARCH_AAEC2000 || ARCH_AT91RM9200 66 66 default y if CPU_S3C2410 || CPU_S3C2440 || CPU_S3C2442 || ARCH_AT91RM9200 67 - select CPU_32v4 67 + select CPU_32v4T 68 68 select CPU_ABRT_EV4T 69 69 select CPU_CACHE_V4WT 70 70 select CPU_CACHE_VIVT ··· 85 85 bool "Support ARM922T processor" if ARCH_INTEGRATOR 86 86 depends on ARCH_LH7A40X || ARCH_INTEGRATOR 87 87 default y if ARCH_LH7A40X 88 - select CPU_32v4 88 + select CPU_32v4T 89 89 select CPU_ABRT_EV4T 90 90 select CPU_CACHE_V4WT 91 91 select CPU_CACHE_VIVT ··· 104 104 bool "Support ARM925T processor" if ARCH_OMAP1 105 105 depends on ARCH_OMAP15XX 106 106 default y if ARCH_OMAP15XX 107 - select CPU_32v4 107 + select CPU_32v4T 108 108 select CPU_ABRT_EV4T 109 109 select CPU_CACHE_V4WT 110 110 select CPU_CACHE_VIVT ··· 281 281 select NEEDS_SYSCALL_FOR_CMPXCHG if SMP 282 282 283 283 config CPU_32v4 284 + bool 285 + select TLS_REG_EMUL if SMP || !MMU 286 + select NEEDS_SYSCALL_FOR_CMPXCHG if SMP 287 + 288 + config CPU_32v4T 284 289 bool 285 290 select TLS_REG_EMUL if SMP || !MMU 286 291 select NEEDS_SYSCALL_FOR_CMPXCHG if SMP
+8
arch/arm/vfp/vfp.h
··· 353 353 * A special flag to tell the normalisation code not to normalise. 354 354 */ 355 355 #define VFP_NAN_FLAG 0x100 356 + 357 + /* 358 + * A bit pattern used to indicate the initial (unset) value of the 359 + * exception mask, in case nothing handles an instruction. This 360 + * doesn't include the NAN flag, which get masked out before 361 + * we check for an error. 362 + */ 363 + #define VFP_EXCEPTION_ERROR ((u32)-1 & ~VFP_NAN_FLAG)
+22 -8
arch/arm/vfp/vfpdouble.c
··· 465 465 */ 466 466 if (tm & (VFP_INFINITY|VFP_NAN)) { 467 467 vsd.exponent = 255; 468 - if (tm & VFP_NAN) 468 + if (tm == VFP_QNAN) 469 469 vsd.significand |= VFP_SINGLE_SIGNIFICAND_QNAN; 470 470 goto pack_nan; 471 471 } else if (tm & VFP_ZERO) ··· 1127 1127 { 1128 1128 u32 op = inst & FOP_MASK; 1129 1129 u32 exceptions = 0; 1130 - unsigned int dd = vfp_get_dd(inst); 1130 + unsigned int dest; 1131 1131 unsigned int dn = vfp_get_dn(inst); 1132 1132 unsigned int dm = vfp_get_dm(inst); 1133 1133 unsigned int vecitr, veclen, vecstride; ··· 1137 1137 vecstride = (1 + ((fpscr & FPSCR_STRIDE_MASK) == FPSCR_STRIDE_MASK)) * 2; 1138 1138 1139 1139 /* 1140 + * fcvtds takes an sN register number as destination, not dN. 1141 + * It also always operates on scalars. 1142 + */ 1143 + if ((inst & FEXT_MASK) == FEXT_FCVT) { 1144 + veclen = 0; 1145 + dest = vfp_get_sd(inst); 1146 + } else 1147 + dest = vfp_get_dd(inst); 1148 + 1149 + /* 1140 1150 * If destination bank is zero, vector length is always '1'. 1141 1151 * ARM DDI0100F C5.1.3, C5.3.2. 1142 1152 */ 1143 - if (FREG_BANK(dd) == 0) 1153 + if (FREG_BANK(dest) == 0) 1144 1154 veclen = 0; 1145 1155 1146 1156 pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, ··· 1163 1153 for (vecitr = 0; vecitr <= veclen; vecitr += 1 << FPSCR_LENGTH_BIT) { 1164 1154 u32 except; 1165 1155 1166 - if (op == FOP_EXT) 1156 + if (op == FOP_EXT && (inst & FEXT_MASK) == FEXT_FCVT) 1157 + pr_debug("VFP: itr%d (s%u) = op[%u] (d%u)\n", 1158 + vecitr >> FPSCR_LENGTH_BIT, 1159 + dest, dn, dm); 1160 + else if (op == FOP_EXT) 1167 1161 pr_debug("VFP: itr%d (d%u) = op[%u] (d%u)\n", 1168 1162 vecitr >> FPSCR_LENGTH_BIT, 1169 - dd, dn, dm); 1163 + dest, dn, dm); 1170 1164 else 1171 1165 pr_debug("VFP: itr%d (d%u) = (d%u) op[%u] (d%u)\n", 1172 1166 vecitr >> FPSCR_LENGTH_BIT, 1173 - dd, dn, FOP_TO_IDX(op), dm); 1167 + dest, dn, FOP_TO_IDX(op), dm); 1174 1168 1175 - except = fop(dd, dn, dm, fpscr); 1169 + except = fop(dest, dn, dm, fpscr); 1176 1170 pr_debug("VFP: itr%d: exceptions=%08x\n", 1177 1171 vecitr >> FPSCR_LENGTH_BIT, except); 1178 1172 ··· 1194 1180 * we encounter an exception. We continue. 1195 1181 */ 1196 1182 1197 - dd = FREG_BANK(dd) + ((FREG_IDX(dd) + vecstride) & 6); 1183 + dest = FREG_BANK(dest) + ((FREG_IDX(dest) + vecstride) & 6); 1198 1184 dn = FREG_BANK(dn) + ((FREG_IDX(dn) + vecstride) & 6); 1199 1185 if (FREG_BANK(dm) != 0) 1200 1186 dm = FREG_BANK(dm) + ((FREG_IDX(dm) + vecstride) & 6);
+2 -2
arch/arm/vfp/vfpmodule.c
··· 131 131 132 132 pr_debug("VFP: raising exceptions %08x\n", exceptions); 133 133 134 - if (exceptions == (u32)-1) { 134 + if (exceptions == VFP_EXCEPTION_ERROR) { 135 135 vfp_panic("unhandled bounce"); 136 136 vfp_raise_sigfpe(0, regs); 137 137 return; ··· 170 170 */ 171 171 static u32 vfp_emulate_instruction(u32 inst, u32 fpscr, struct pt_regs *regs) 172 172 { 173 - u32 exceptions = (u32)-1; 173 + u32 exceptions = VFP_EXCEPTION_ERROR; 174 174 175 175 pr_debug("VFP: emulate: INST=0x%08x SCR=0x%08x\n", inst, fpscr); 176 176
+23 -12
arch/arm/vfp/vfpsingle.c
··· 506 506 */ 507 507 if (tm & (VFP_INFINITY|VFP_NAN)) { 508 508 vdd.exponent = 2047; 509 - if (tm & VFP_NAN) 509 + if (tm == VFP_QNAN) 510 510 vdd.significand |= VFP_DOUBLE_SIGNIFICAND_QNAN; 511 511 goto pack_nan; 512 512 } else if (tm & VFP_ZERO) ··· 514 514 else 515 515 vdd.exponent = vsm.exponent + (1023 - 127); 516 516 517 - /* 518 - * Technically, if bit 0 of dd is set, this is an invalid 519 - * instruction. However, we ignore this for efficiency. 520 - */ 521 517 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fcvtd"); 522 518 523 519 pack_nan: ··· 1170 1174 { 1171 1175 u32 op = inst & FOP_MASK; 1172 1176 u32 exceptions = 0; 1173 - unsigned int sd = vfp_get_sd(inst); 1177 + unsigned int dest; 1174 1178 unsigned int sn = vfp_get_sn(inst); 1175 1179 unsigned int sm = vfp_get_sm(inst); 1176 1180 unsigned int vecitr, veclen, vecstride; ··· 1180 1184 vecstride = 1 + ((fpscr & FPSCR_STRIDE_MASK) == FPSCR_STRIDE_MASK); 1181 1185 1182 1186 /* 1187 + * fcvtsd takes a dN register number as destination, not sN. 1188 + * Technically, if bit 0 of dd is set, this is an invalid 1189 + * instruction. However, we ignore this for efficiency. 1190 + * It also only operates on scalars. 1191 + */ 1192 + if ((inst & FEXT_MASK) == FEXT_FCVT) { 1193 + veclen = 0; 1194 + dest = vfp_get_dd(inst); 1195 + } else 1196 + dest = vfp_get_sd(inst); 1197 + 1198 + /* 1183 1199 * If destination bank is zero, vector length is always '1'. 1184 1200 * ARM DDI0100F C5.1.3, C5.3.2. 1185 1201 */ 1186 - if (FREG_BANK(sd) == 0) 1202 + if (FREG_BANK(dest) == 0) 1187 1203 veclen = 0; 1188 1204 1189 1205 pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, ··· 1209 1201 s32 m = vfp_get_float(sm); 1210 1202 u32 except; 1211 1203 1212 - if (op == FOP_EXT) 1204 + if (op == FOP_EXT && (inst & FEXT_MASK) == FEXT_FCVT) 1205 + pr_debug("VFP: itr%d (d%u) = op[%u] (s%u=%08x)\n", 1206 + vecitr >> FPSCR_LENGTH_BIT, dest, sn, sm, m); 1207 + else if (op == FOP_EXT) 1213 1208 pr_debug("VFP: itr%d (s%u) = op[%u] (s%u=%08x)\n", 1214 - vecitr >> FPSCR_LENGTH_BIT, sd, sn, sm, m); 1209 + vecitr >> FPSCR_LENGTH_BIT, dest, sn, sm, m); 1215 1210 else 1216 1211 pr_debug("VFP: itr%d (s%u) = (s%u) op[%u] (s%u=%08x)\n", 1217 - vecitr >> FPSCR_LENGTH_BIT, sd, sn, 1212 + vecitr >> FPSCR_LENGTH_BIT, dest, sn, 1218 1213 FOP_TO_IDX(op), sm, m); 1219 1214 1220 - except = fop(sd, sn, m, fpscr); 1215 + except = fop(dest, sn, m, fpscr); 1221 1216 pr_debug("VFP: itr%d: exceptions=%08x\n", 1222 1217 vecitr >> FPSCR_LENGTH_BIT, except); 1223 1218 ··· 1238 1227 * we encounter an exception. We continue. 1239 1228 */ 1240 1229 1241 - sd = FREG_BANK(sd) + ((FREG_IDX(sd) + vecstride) & 7); 1230 + dest = FREG_BANK(dest) + ((FREG_IDX(dest) + vecstride) & 7); 1242 1231 sn = FREG_BANK(sn) + ((FREG_IDX(sn) + vecstride) & 7); 1243 1232 if (FREG_BANK(sm) != 0) 1244 1233 sm = FREG_BANK(sm) + ((FREG_IDX(sm) + vecstride) & 7);
+2 -2
include/asm-arm/arch-pxa/ssp.h
··· 40 40 }; 41 41 42 42 int ssp_write_word(struct ssp_dev *dev, u32 data); 43 - int ssp_read_word(struct ssp_dev *dev); 44 - void ssp_flush(struct ssp_dev *dev); 43 + int ssp_read_word(struct ssp_dev *dev, u32 *data); 44 + int ssp_flush(struct ssp_dev *dev); 45 45 void ssp_enable(struct ssp_dev *dev); 46 46 void ssp_disable(struct ssp_dev *dev); 47 47 void ssp_save_state(struct ssp_dev *dev, struct ssp_state *ssp);
+2 -2
include/asm-arm/hardware/ssp.h
··· 16 16 }; 17 17 18 18 int ssp_write_word(u16 data); 19 - int ssp_read_word(void); 20 - void ssp_flush(void); 19 + int ssp_read_word(u16 *data); 20 + int ssp_flush(void); 21 21 void ssp_enable(void); 22 22 void ssp_disable(void); 23 23 void ssp_save_state(struct ssp_state *ssp);
+7
include/asm-arm/io.h
··· 291 291 */ 292 292 #define xlate_dev_kmem_ptr(p) p 293 293 294 + /* 295 + * Register ISA memory and port locations for glibc iopl/inb/outb 296 + * emulation. 297 + */ 298 + extern void register_isa_ports(unsigned int mmio, unsigned int io, 299 + unsigned int io_shift); 300 + 294 301 #endif /* __KERNEL__ */ 295 302 #endif /* __ASM_ARM_IO_H */