aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2006-02-10 00:51:29 -0500
committerPaul Mackerras <paulus@samba.org>2006-02-10 00:51:29 -0500
commitd6d93856cb90eeb07062ad938bd26f554bf1b9b9 (patch)
treeeeec5011a42f38d3dfe7b61788b7ac1cc890edeb /arch
parent8f75015f33c3005e0bbf83ffc0d5e0b4262cc03d (diff)
parentad71f123a9e9b809f6c829db1222ce0423a1153c (diff)
Merge ../powerpc-merge
Diffstat (limited to 'arch')
-rw-r--r--arch/alpha/kernel/smp.c25
-rw-r--r--arch/arm/Kconfig49
-rw-r--r--arch/arm/configs/enp2611_defconfig2
-rw-r--r--arch/arm/configs/ixdp2400_defconfig2
-rw-r--r--arch/arm/configs/ixdp2401_defconfig2
-rw-r--r--arch/arm/configs/ixdp2801_defconfig2
-rw-r--r--arch/arm/configs/s3c2410_defconfig51
-rw-r--r--arch/arm/kernel/calls.S8
-rw-r--r--arch/arm/kernel/entry-armv.S17
-rw-r--r--arch/arm/kernel/sys_oabi-compat.c71
-rw-r--r--arch/arm/mach-clps711x/Kconfig2
-rw-r--r--arch/arm/mach-imx/mx1ads.c1
-rw-r--r--arch/arm/mach-ixp2000/enp2611.c1
-rw-r--r--arch/arm/mach-ixp2000/ixdp2400.c1
-rw-r--r--arch/arm/mach-ixp2000/ixdp2x01.c5
-rw-r--r--arch/arm/mach-omap1/board-generic.c3
-rw-r--r--arch/arm/mach-omap1/board-h2.c3
-rw-r--r--arch/arm/mach-omap1/board-h3.c3
-rw-r--r--arch/arm/mach-omap1/board-innovator.c3
-rw-r--r--arch/arm/mach-omap1/board-netstar.c3
-rw-r--r--arch/arm/mach-omap1/board-osk.c3
-rw-r--r--arch/arm/mach-omap1/board-palmte.c3
-rw-r--r--arch/arm/mach-omap1/board-perseus2.c3
-rw-r--r--arch/arm/mach-omap1/board-voiceblue.c3
-rw-r--r--arch/arm/mach-omap1/io.c42
-rw-r--r--arch/arm/mach-omap2/board-generic.c3
-rw-r--r--arch/arm/mach-omap2/board-h4.c3
-rw-r--r--arch/arm/mach-realview/core.c2
-rw-r--r--arch/arm/mach-s3c2410/clock.c43
-rw-r--r--arch/arm/mach-s3c2410/clock.h1
-rw-r--r--arch/arm/mach-s3c2410/devs.c5
-rw-r--r--arch/arm/plat-omap/sram.c9
-rw-r--r--arch/cris/Makefile2
-rw-r--r--arch/cris/arch-v10/kernel/ptrace.c8
-rw-r--r--arch/cris/kernel/setup.c1
-rw-r--r--arch/i386/kernel/apic.c2
-rw-r--r--arch/i386/kernel/syscall_table.S1
-rw-r--r--arch/ia64/Kconfig4
-rw-r--r--arch/ia64/dig/setup.c10
-rw-r--r--arch/ia64/ia32/ia32_signal.c1
-rw-r--r--arch/ia64/kernel/efi.c16
-rw-r--r--arch/ia64/kernel/entry.S16
-rw-r--r--arch/ia64/kernel/fsys.S29
-rw-r--r--arch/ia64/kernel/head.S1
-rw-r--r--arch/ia64/kernel/mca_drv.c3
-rw-r--r--arch/ia64/kernel/sal.c75
-rw-r--r--arch/ia64/kernel/setup.c4
-rw-r--r--arch/ia64/kernel/time.c27
-rw-r--r--arch/ia64/sn/Makefile2
-rw-r--r--arch/ia64/sn/kernel/Makefile2
-rw-r--r--arch/ia64/sn/kernel/bte.c17
-rw-r--r--arch/ia64/sn/kernel/io_init.c17
-rw-r--r--arch/ia64/sn/kernel/irq.c25
-rw-r--r--arch/ia64/sn/kernel/klconflib.c29
-rw-r--r--arch/ia64/sn/kernel/mca.c5
-rw-r--r--arch/ia64/sn/kernel/setup.c73
-rw-r--r--arch/ia64/sn/kernel/sn2/Makefile2
-rw-r--r--arch/ia64/sn/kernel/sn2/sn2_smp.c196
-rw-r--r--arch/ia64/sn/kernel/sn2/sn_hwperf.c5
-rw-r--r--arch/ia64/sn/kernel/xpc_main.c19
-rw-r--r--arch/ia64/sn/pci/Makefile2
-rw-r--r--arch/ia64/sn/pci/pcibr/Makefile2
-rw-r--r--arch/m32r/kernel/m32r_ksyms.c5
-rw-r--r--arch/m32r/kernel/setup.c6
-rw-r--r--arch/m68knommu/kernel/process.c8
-rw-r--r--arch/mips/Kconfig1
-rw-r--r--arch/mips/Makefile25
-rw-r--r--arch/mips/au1000/common/reset.c2
-rw-r--r--arch/mips/au1000/common/setup.c3
-rw-r--r--arch/mips/cobalt/int-handler.S2
-rw-r--r--arch/mips/cobalt/irq.c2
-rw-r--r--arch/mips/cobalt/reset.c2
-rw-r--r--arch/mips/cobalt/setup.c9
-rw-r--r--arch/mips/configs/ip32_defconfig1
-rw-r--r--arch/mips/configs/qemu_defconfig78
-rw-r--r--arch/mips/ddb5xxx/ddb5074/setup.c3
-rw-r--r--arch/mips/ddb5xxx/ddb5476/setup.c3
-rw-r--r--arch/mips/ddb5xxx/ddb5477/setup.c3
-rw-r--r--arch/mips/dec/setup.c3
-rw-r--r--arch/mips/gt64120/ev64120/setup.c4
-rw-r--r--arch/mips/gt64120/momenco_ocelot/setup.c6
-rw-r--r--arch/mips/ite-boards/generic/it8172_setup.c3
-rw-r--r--arch/mips/jazz/setup.c4
-rw-r--r--arch/mips/jmr3927/rbhma3100/setup.c3
-rw-r--r--arch/mips/kernel/cpu-probe.c7
-rw-r--r--arch/mips/kernel/genex.S2
-rw-r--r--arch/mips/kernel/process.c5
-rw-r--r--arch/mips/kernel/ptrace32.c22
-rw-r--r--arch/mips/kernel/reset.c18
-rw-r--r--arch/mips/kernel/rtlx.c4
-rw-r--r--arch/mips/kernel/scall32-o32.S17
-rw-r--r--arch/mips/kernel/scall64-64.S17
-rw-r--r--arch/mips/kernel/scall64-n32.S17
-rw-r--r--arch/mips/kernel/scall64-o32.S17
-rw-r--r--arch/mips/kernel/signal-common.h8
-rw-r--r--arch/mips/kernel/signal.c104
-rw-r--r--arch/mips/kernel/signal32.c67
-rw-r--r--arch/mips/kernel/signal_n32.c14
-rw-r--r--arch/mips/kernel/syscall.c48
-rw-r--r--arch/mips/kernel/traps.c2
-rw-r--r--arch/mips/kernel/vmlinux.lds.S11
-rw-r--r--arch/mips/lasat/reset.c5
-rw-r--r--arch/mips/lasat/setup.c4
-rw-r--r--arch/mips/lib-32/dump_tlb.c33
-rw-r--r--arch/mips/math-emu/dp_simple.c14
-rw-r--r--arch/mips/math-emu/sp_simple.c14
-rw-r--r--arch/mips/mips-boards/atlas/atlas_setup.c4
-rw-r--r--arch/mips/mips-boards/generic/reset.c5
-rw-r--r--arch/mips/mips-boards/sead/sead_setup.c4
-rw-r--r--arch/mips/mips-boards/sim/sim_setup.c4
-rw-r--r--arch/mips/mm/c-r4k.c7
-rw-r--r--arch/mips/mm/cache.c5
-rw-r--r--arch/mips/mm/init.c16
-rw-r--r--arch/mips/momentum/jaguar_atx/ja-console.c2
-rw-r--r--arch/mips/momentum/jaguar_atx/setup.c3
-rw-r--r--arch/mips/momentum/ocelot_3/setup.c4
-rw-r--r--arch/mips/momentum/ocelot_c/setup.c4
-rw-r--r--arch/mips/momentum/ocelot_g/setup.c4
-rw-r--r--arch/mips/oprofile/Makefile1
-rw-r--r--arch/mips/oprofile/common.c3
-rw-r--r--arch/mips/oprofile/op_model_mipsxx.c11
-rw-r--r--arch/mips/pci/Makefile1
-rw-r--r--arch/mips/pci/fixup-cobalt.c6
-rw-r--r--arch/mips/pci/ops-gt64111.c2
-rw-r--r--arch/mips/pci/pci-bcm1480.c2
-rw-r--r--arch/mips/philips/pnx8550/common/platform.c8
-rw-r--r--arch/mips/philips/pnx8550/common/setup.c3
-rw-r--r--arch/mips/pmc-sierra/yosemite/prom.c3
-rw-r--r--arch/mips/pmc-sierra/yosemite/setup.c2
-rw-r--r--arch/mips/sgi-ip22/ip22-reset.c55
-rw-r--r--arch/mips/sgi-ip22/ip22-setup.c10
-rw-r--r--arch/mips/sgi-ip27/ip27-reset.c5
-rw-r--r--arch/mips/sgi-ip32/ip32-reset.c3
-rw-r--r--arch/mips/sgi-ip32/ip32-setup.c13
-rw-r--r--arch/mips/sibyte/cfe/setup.c3
-rw-r--r--arch/mips/sibyte/sb1250/prom.c3
-rw-r--r--arch/mips/sibyte/sb1250/setup.c36
-rw-r--r--arch/mips/sni/setup.c5
-rw-r--r--arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_prom.c10
-rw-r--r--arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c140
-rw-r--r--arch/mips/tx4938/toshiba_rbtx4938/setup.c4
-rw-r--r--arch/mips/vr41xx/common/pmu.c3
-rw-r--r--arch/parisc/hpux/sys_hpux.c10
-rw-r--r--arch/powerpc/kernel/Makefile6
-rw-r--r--arch/powerpc/kernel/signal_32.c18
-rw-r--r--arch/powerpc/kernel/signal_64.c4
-rw-r--r--arch/powerpc/kernel/systbl.S3
-rw-r--r--arch/powerpc/platforms/powermac/low_i2c.c3
-rw-r--r--arch/powerpc/platforms/powermac/pci.c89
-rw-r--r--arch/powerpc/platforms/powermac/setup.c2
-rw-r--r--arch/powerpc/platforms/pseries/eeh_driver.c8
-rw-r--r--arch/powerpc/sysdev/dart_iommu.c2
-rw-r--r--arch/ppc/kernel/misc.S283
-rw-r--r--arch/ppc/kernel/ppc_ksyms.c4
-rw-r--r--arch/ppc/platforms/4xx/bamboo.c4
-rw-r--r--arch/ppc/platforms/4xx/bubinga.c4
-rw-r--r--arch/ppc/platforms/4xx/ebony.c4
-rw-r--r--arch/ppc/platforms/4xx/luan.c4
-rw-r--r--arch/ppc/platforms/4xx/ocotea.c4
-rw-r--r--arch/ppc/platforms/4xx/yucca.c4
-rw-r--r--arch/ppc/platforms/83xx/mpc834x_sys.c4
-rw-r--r--arch/ppc/platforms/85xx/mpc8540_ads.c4
-rw-r--r--arch/ppc/platforms/85xx/mpc85xx_cds_common.c4
-rw-r--r--arch/ppc/platforms/85xx/sbc8560.c2
-rw-r--r--arch/ppc/platforms/85xx/tqm85xx.c4
-rw-r--r--arch/ppc/platforms/chestnut.c2
-rw-r--r--arch/ppc/platforms/ev64260.c2
-rw-r--r--arch/ppc/platforms/radstone_ppc7d.c2
-rw-r--r--arch/ppc/platforms/spruce.c4
-rw-r--r--arch/ppc/syslib/ocp.c4
-rw-r--r--arch/ppc/syslib/ppc83xx_setup.c2
-rw-r--r--arch/ppc/syslib/ppc85xx_setup.c2
-rw-r--r--arch/s390/kernel/compat_linux.c83
-rw-r--r--arch/s390/kernel/sys_s390.c4
-rw-r--r--arch/s390/kernel/traps.c2
-rw-r--r--arch/s390/mm/cmm.c10
-rw-r--r--arch/sh/boards/renesas/rts7751r2d/io.c30
-rw-r--r--arch/sh64/kernel/sh_ksyms.c8
-rw-r--r--arch/sparc/kernel/entry.S2
-rw-r--r--arch/sparc/kernel/process.c2
-rw-r--r--arch/sparc/kernel/systbls.S3
-rw-r--r--arch/sparc64/defconfig5
-rw-r--r--arch/sparc64/kernel/entry.S2
-rw-r--r--arch/sparc64/kernel/systbls.S7
-rw-r--r--arch/sparc64/solaris/systbl.S29
-rw-r--r--arch/um/drivers/chan_user.c15
-rw-r--r--arch/um/drivers/net_kern.c29
-rw-r--r--arch/um/include/registers.h2
-rw-r--r--arch/um/kernel/skas/process.c569
-rw-r--r--arch/um/kernel/um_arch.c18
-rw-r--r--arch/um/os-Linux/drivers/tuntap_user.c4
-rw-r--r--arch/um/os-Linux/skas/mem.c2
-rw-r--r--arch/um/os-Linux/skas/process.c21
-rw-r--r--arch/um/os-Linux/start_up.c1
-rw-r--r--arch/um/os-Linux/sys-i386/registers.c5
-rw-r--r--arch/um/os-Linux/sys-x86_64/registers.c5
-rw-r--r--arch/um/sys-x86_64/ptrace_user.c7
-rw-r--r--arch/um/sys-x86_64/user-offsets.c2
-rw-r--r--arch/x86_64/ia32/ia32entry.S3
-rw-r--r--arch/x86_64/kernel/setup.c2
-rw-r--r--arch/x86_64/kernel/smpboot.c3
-rw-r--r--arch/x86_64/kernel/time.c2
-rw-r--r--arch/x86_64/kernel/x8664_ksyms.c5
-rw-r--r--arch/x86_64/pci/mmconfig.c2
204 files changed, 1505 insertions, 1861 deletions
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index 4b873527ce1c..02c2db08114a 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -73,9 +73,6 @@ cpumask_t cpu_online_map;
73 73
74EXPORT_SYMBOL(cpu_online_map); 74EXPORT_SYMBOL(cpu_online_map);
75 75
76/* cpus reported in the hwrpb */
77static unsigned long hwrpb_cpu_present_mask __initdata = 0;
78
79int smp_num_probed; /* Internal processor count */ 76int smp_num_probed; /* Internal processor count */
80int smp_num_cpus = 1; /* Number that came online. */ 77int smp_num_cpus = 1; /* Number that came online. */
81 78
@@ -442,7 +439,7 @@ setup_smp(void)
442 if ((cpu->flags & 0x1cc) == 0x1cc) { 439 if ((cpu->flags & 0x1cc) == 0x1cc) {
443 smp_num_probed++; 440 smp_num_probed++;
444 /* Assume here that "whami" == index */ 441 /* Assume here that "whami" == index */
445 hwrpb_cpu_present_mask |= (1UL << i); 442 cpu_set(i, cpu_possible_map);
446 cpu->pal_revision = boot_cpu_palrev; 443 cpu->pal_revision = boot_cpu_palrev;
447 } 444 }
448 445
@@ -453,12 +450,12 @@ setup_smp(void)
453 } 450 }
454 } else { 451 } else {
455 smp_num_probed = 1; 452 smp_num_probed = 1;
456 hwrpb_cpu_present_mask = (1UL << boot_cpuid); 453 cpu_set(boot_cpuid, cpu_possible_map);
457 } 454 }
458 cpu_present_mask = cpumask_of_cpu(boot_cpuid); 455 cpu_present_mask = cpumask_of_cpu(boot_cpuid);
459 456
460 printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", 457 printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
461 smp_num_probed, hwrpb_cpu_present_mask); 458 smp_num_probed, cpu_possible_map.bits[0]);
462} 459}
463 460
464/* 461/*
@@ -467,8 +464,6 @@ setup_smp(void)
467void __init 464void __init
468smp_prepare_cpus(unsigned int max_cpus) 465smp_prepare_cpus(unsigned int max_cpus)
469{ 466{
470 int cpu_count, i;
471
472 /* Take care of some initial bookkeeping. */ 467 /* Take care of some initial bookkeeping. */
473 memset(ipi_data, 0, sizeof(ipi_data)); 468 memset(ipi_data, 0, sizeof(ipi_data));
474 469
@@ -486,19 +481,7 @@ smp_prepare_cpus(unsigned int max_cpus)
486 481
487 printk(KERN_INFO "SMP starting up secondaries.\n"); 482 printk(KERN_INFO "SMP starting up secondaries.\n");
488 483
489 cpu_count = 1; 484 smp_num_cpus = smp_num_probed;
490 for (i = 0; (i < NR_CPUS) && (cpu_count < max_cpus); i++) {
491 if (i == boot_cpuid)
492 continue;
493
494 if (((hwrpb_cpu_present_mask >> i) & 1) == 0)
495 continue;
496
497 cpu_set(i, cpu_possible_map);
498 cpu_count++;
499 }
500
501 smp_num_cpus = cpu_count;
502} 485}
503 486
504void __devinit 487void __devinit
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 5959e36c3b4c..15dc1a0dffbb 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -10,9 +10,9 @@ config ARM
10 default y 10 default y
11 help 11 help
12 The ARM series is a line of low-power-consumption RISC chip designs 12 The ARM series is a line of low-power-consumption RISC chip designs
13 licensed by ARM ltd and targeted at embedded applications and 13 licensed by ARM Ltd and targeted at embedded applications and
14 handhelds such as the Compaq IPAQ. ARM-based PCs are no longer 14 handhelds such as the Compaq IPAQ. ARM-based PCs are no longer
15 manufactured, but legacy ARM-based PC hardware remains popular in 15 manufactured, but legacy ARM-based PC hardware remains popular in
16 Europe. There is an ARM Linux project with a web page at 16 Europe. There is an ARM Linux project with a web page at
17 <http://www.arm.linux.org.uk/>. 17 <http://www.arm.linux.org.uk/>.
18 18
@@ -69,6 +69,9 @@ config GENERIC_ISA_DMA
69config FIQ 69config FIQ
70 bool 70 bool
71 71
72config ARCH_MTD_XIP
73 bool
74
72source "init/Kconfig" 75source "init/Kconfig"
73 76
74menu "System Type" 77menu "System Type"
@@ -81,45 +84,62 @@ config ARCH_CLPS7500
81 bool "Cirrus-CL-PS7500FE" 84 bool "Cirrus-CL-PS7500FE"
82 select TIMER_ACORN 85 select TIMER_ACORN
83 select ISA 86 select ISA
87 help
88 Support for the Cirrus Logic PS7500FE system-on-a-chip.
84 89
85config ARCH_CLPS711X 90config ARCH_CLPS711X
86 bool "CLPS711x/EP721x-based" 91 bool "CLPS711x/EP721x-based"
92 help
93 Support for Cirrus Logic 711x/721x based boards.
87 94
88config ARCH_CO285 95config ARCH_CO285
89 bool "Co-EBSA285" 96 bool "Co-EBSA285"
90 select FOOTBRIDGE 97 select FOOTBRIDGE
91 select FOOTBRIDGE_ADDIN 98 select FOOTBRIDGE_ADDIN
99 help
100 Support for Intel's EBSA285 companion chip.
92 101
93config ARCH_EBSA110 102config ARCH_EBSA110
94 bool "EBSA-110" 103 bool "EBSA-110"
95 select ISA 104 select ISA
96 help 105 help
97 This is an evaluation board for the StrongARM processor available 106 This is an evaluation board for the StrongARM processor available
98 from Digital. It has limited hardware on-board, including an onboard 107 from Digital. It has limited hardware on-board, including an
99 Ethernet interface, two PCMCIA sockets, two serial ports and a 108 Ethernet interface, two PCMCIA sockets, two serial ports and a
100 parallel port. 109 parallel port.
101 110
102config ARCH_FOOTBRIDGE 111config ARCH_FOOTBRIDGE
103 bool "FootBridge" 112 bool "FootBridge"
104 select FOOTBRIDGE 113 select FOOTBRIDGE
114 help
115 Support for systems based on the DC21285 companion chip
116 ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
105 117
106config ARCH_INTEGRATOR 118config ARCH_INTEGRATOR
107 bool "Integrator" 119 bool "Integrator"
108 select ARM_AMBA 120 select ARM_AMBA
109 select ICST525 121 select ICST525
122 help
123 Support for ARM's Integrator platform.
110 124
111config ARCH_IOP3XX 125config ARCH_IOP3XX
112 bool "IOP3xx-based" 126 bool "IOP3xx-based"
113 select PCI 127 select PCI
128 help
129 Support for Intel's IOP3XX (XScale) family of processors.
114 130
115config ARCH_IXP4XX 131config ARCH_IXP4XX
116 bool "IXP4xx-based" 132 bool "IXP4xx-based"
117 select DMABOUNCE 133 select DMABOUNCE
118 select PCI 134 select PCI
135 help
136 Support for Intel's IXP4XX (XScale) family of processors.
119 137
120config ARCH_IXP2000 138config ARCH_IXP2000
121 bool "IXP2400/2800-based" 139 bool "IXP2400/2800-based"
122 select PCI 140 select PCI
141 help
142 Support for Intel's IXP2400/2800 (XScale) family of processors.
123 143
124config ARCH_L7200 144config ARCH_L7200
125 bool "LinkUp-L7200" 145 bool "LinkUp-L7200"
@@ -136,6 +156,9 @@ config ARCH_L7200
136 156
137config ARCH_PXA 157config ARCH_PXA
138 bool "PXA2xx-based" 158 bool "PXA2xx-based"
159 select ARCH_MTD_XIP
160 help
161 Support for Intel's PXA2XX processor line.
139 162
140config ARCH_RPC 163config ARCH_RPC
141 bool "RiscPC" 164 bool "RiscPC"
@@ -152,19 +175,25 @@ config ARCH_SA1100
152 bool "SA1100-based" 175 bool "SA1100-based"
153 select ISA 176 select ISA
154 select ARCH_DISCONTIGMEM_ENABLE 177 select ARCH_DISCONTIGMEM_ENABLE
178 select ARCH_MTD_XIP
179 help
180 Support for StrongARM 11x0 based boards.
155 181
156config ARCH_S3C2410 182config ARCH_S3C2410
157 bool "Samsung S3C2410" 183 bool "Samsung S3C2410"
158 help 184 help
159 Samsung S3C2410X CPU based systems, such as the Simtec Electronics 185 Samsung S3C2410X CPU based systems, such as the Simtec Electronics
160 BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or 186 BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
161 the Samsung SMDK2410 development board (and derviatives). 187 the Samsung SMDK2410 development board (and derivatives).
162 188
163config ARCH_SHARK 189config ARCH_SHARK
164 bool "Shark" 190 bool "Shark"
165 select ISA 191 select ISA
166 select ISA_DMA 192 select ISA_DMA
167 select PCI 193 select PCI
194 help
195 Support for the StrongARM based Digital DNARD machine, also known
196 as "Shark" (<http://www.shark-linux.de/shark.html>).
168 197
169config ARCH_LH7A40X 198config ARCH_LH7A40X
170 bool "Sharp LH7A40X" 199 bool "Sharp LH7A40X"
@@ -176,6 +205,8 @@ config ARCH_LH7A40X
176 205
177config ARCH_OMAP 206config ARCH_OMAP
178 bool "TI OMAP" 207 bool "TI OMAP"
208 help
209 Support for TI's OMAP platform (OMAP1 and OMAP2).
179 210
180config ARCH_VERSATILE 211config ARCH_VERSATILE
181 bool "Versatile" 212 bool "Versatile"
@@ -194,6 +225,8 @@ config ARCH_REALVIEW
194 225
195config ARCH_IMX 226config ARCH_IMX
196 bool "IMX" 227 bool "IMX"
228 help
229 Support for Motorola's i.MX family of processors (MX1, MXL).
197 230
198config ARCH_H720X 231config ARCH_H720X
199 bool "Hynix-HMS720x-based" 232 bool "Hynix-HMS720x-based"
@@ -210,8 +243,8 @@ config ARCH_AAEC2000
210config ARCH_AT91RM9200 243config ARCH_AT91RM9200
211 bool "AT91RM9200" 244 bool "AT91RM9200"
212 help 245 help
213 Say Y here if you intend to run this kernel on an AT91RM9200-based 246 Say Y here if you intend to run this kernel on an Atmel
214 board. 247 AT91RM9200-based board.
215 248
216endchoice 249endchoice
217 250
@@ -417,8 +450,8 @@ config AEABI
417 To use this you need GCC version 4.0.0 or later. 450 To use this you need GCC version 4.0.0 or later.
418 451
419config OABI_COMPAT 452config OABI_COMPAT
420 bool "Allow old ABI binaries to run with this kernel" 453 bool "Allow old ABI binaries to run with this kernel (EXPERIMENTAL)"
421 depends on AEABI 454 depends on AEABI && EXPERIMENTAL
422 default y 455 default y
423 help 456 help
424 This option preserves the old syscall interface along with the 457 This option preserves the old syscall interface along with the
diff --git a/arch/arm/configs/enp2611_defconfig b/arch/arm/configs/enp2611_defconfig
index 9592e3925c79..5fdaf3ce9d56 100644
--- a/arch/arm/configs/enp2611_defconfig
+++ b/arch/arm/configs/enp2611_defconfig
@@ -171,7 +171,7 @@ CONFIG_ALIGNMENT_TRAP=y
171# 171#
172CONFIG_ZBOOT_ROM_TEXT=0x0 172CONFIG_ZBOOT_ROM_TEXT=0x0
173CONFIG_ZBOOT_ROM_BSS=0x0 173CONFIG_ZBOOT_ROM_BSS=0x0
174CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" 174CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
175# CONFIG_XIP_KERNEL is not set 175# CONFIG_XIP_KERNEL is not set
176 176
177# 177#
diff --git a/arch/arm/configs/ixdp2400_defconfig b/arch/arm/configs/ixdp2400_defconfig
index d9d6bb86a6fa..c67fc449a11f 100644
--- a/arch/arm/configs/ixdp2400_defconfig
+++ b/arch/arm/configs/ixdp2400_defconfig
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
172# 172#
173CONFIG_ZBOOT_ROM_TEXT=0x0 173CONFIG_ZBOOT_ROM_TEXT=0x0
174CONFIG_ZBOOT_ROM_BSS=0x0 174CONFIG_ZBOOT_ROM_BSS=0x0
175CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" 175CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
176# CONFIG_XIP_KERNEL is not set 176# CONFIG_XIP_KERNEL is not set
177 177
178# 178#
diff --git a/arch/arm/configs/ixdp2401_defconfig b/arch/arm/configs/ixdp2401_defconfig
index 2dc9d499c7d7..60d66e82c51f 100644
--- a/arch/arm/configs/ixdp2401_defconfig
+++ b/arch/arm/configs/ixdp2401_defconfig
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
172# 172#
173CONFIG_ZBOOT_ROM_TEXT=0x0 173CONFIG_ZBOOT_ROM_TEXT=0x0
174CONFIG_ZBOOT_ROM_BSS=0x0 174CONFIG_ZBOOT_ROM_BSS=0x0
175CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" 175CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
176# CONFIG_XIP_KERNEL is not set 176# CONFIG_XIP_KERNEL is not set
177 177
178# 178#
diff --git a/arch/arm/configs/ixdp2801_defconfig b/arch/arm/configs/ixdp2801_defconfig
index ea8f4b478fa3..f54f3dcc5b33 100644
--- a/arch/arm/configs/ixdp2801_defconfig
+++ b/arch/arm/configs/ixdp2801_defconfig
@@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
172# 172#
173CONFIG_ZBOOT_ROM_TEXT=0x0 173CONFIG_ZBOOT_ROM_TEXT=0x0
174CONFIG_ZBOOT_ROM_BSS=0x0 174CONFIG_ZBOOT_ROM_BSS=0x0
175CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware ixdp2x01_clock=50000000" 175CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
176# CONFIG_XIP_KERNEL is not set 176# CONFIG_XIP_KERNEL is not set
177 177
178# 178#
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig
index 1964ccd8a71f..6695b07cf1ba 100644
--- a/arch/arm/configs/s3c2410_defconfig
+++ b/arch/arm/configs/s3c2410_defconfig
@@ -1,11 +1,10 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.15-rc1 3# Linux kernel version: 2.6.16-rc2
4# Sun Nov 13 17:41:24 2005 4# Mon Feb 6 11:17:23 2006
5# 5#
6CONFIG_ARM=y 6CONFIG_ARM=y
7CONFIG_MMU=y 7CONFIG_MMU=y
8CONFIG_UID16=y
9CONFIG_RWSEM_GENERIC_SPINLOCK=y 8CONFIG_RWSEM_GENERIC_SPINLOCK=y
10CONFIG_GENERIC_CALIBRATE_DELAY=y 9CONFIG_GENERIC_CALIBRATE_DELAY=y
11 10
@@ -28,27 +27,31 @@ CONFIG_SYSVIPC=y
28# CONFIG_BSD_PROCESS_ACCT is not set 27# CONFIG_BSD_PROCESS_ACCT is not set
29CONFIG_SYSCTL=y 28CONFIG_SYSCTL=y
30# CONFIG_AUDIT is not set 29# CONFIG_AUDIT is not set
31# CONFIG_HOTPLUG is not set
32CONFIG_KOBJECT_UEVENT=y
33# CONFIG_IKCONFIG is not set 30# CONFIG_IKCONFIG is not set
34CONFIG_INITRAMFS_SOURCE="" 31CONFIG_INITRAMFS_SOURCE=""
32CONFIG_UID16=y
33CONFIG_CC_OPTIMIZE_FOR_SIZE=y
35# CONFIG_EMBEDDED is not set 34# CONFIG_EMBEDDED is not set
36CONFIG_KALLSYMS=y 35CONFIG_KALLSYMS=y
37# CONFIG_KALLSYMS_ALL is not set 36# CONFIG_KALLSYMS_ALL is not set
38# CONFIG_KALLSYMS_EXTRA_PASS is not set 37# CONFIG_KALLSYMS_EXTRA_PASS is not set
38CONFIG_HOTPLUG=y
39CONFIG_PRINTK=y 39CONFIG_PRINTK=y
40CONFIG_BUG=y 40CONFIG_BUG=y
41CONFIG_ELF_CORE=y
41CONFIG_BASE_FULL=y 42CONFIG_BASE_FULL=y
42CONFIG_FUTEX=y 43CONFIG_FUTEX=y
43CONFIG_EPOLL=y 44CONFIG_EPOLL=y
44CONFIG_CC_OPTIMIZE_FOR_SIZE=y
45CONFIG_SHMEM=y 45CONFIG_SHMEM=y
46CONFIG_CC_ALIGN_FUNCTIONS=0 46CONFIG_CC_ALIGN_FUNCTIONS=0
47CONFIG_CC_ALIGN_LABELS=0 47CONFIG_CC_ALIGN_LABELS=0
48CONFIG_CC_ALIGN_LOOPS=0 48CONFIG_CC_ALIGN_LOOPS=0
49CONFIG_CC_ALIGN_JUMPS=0 49CONFIG_CC_ALIGN_JUMPS=0
50CONFIG_SLAB=y
50# CONFIG_TINY_SHMEM is not set 51# CONFIG_TINY_SHMEM is not set
51CONFIG_BASE_SMALL=0 52CONFIG_BASE_SMALL=0
53# CONFIG_SLOB is not set
54CONFIG_OBSOLETE_INTERMODULE=y
52 55
53# 56#
54# Loadable module support 57# Loadable module support
@@ -102,6 +105,7 @@ CONFIG_ARCH_S3C2410=y
102# CONFIG_ARCH_IMX is not set 105# CONFIG_ARCH_IMX is not set
103# CONFIG_ARCH_H720X is not set 106# CONFIG_ARCH_H720X is not set
104# CONFIG_ARCH_AAEC2000 is not set 107# CONFIG_ARCH_AAEC2000 is not set
108# CONFIG_ARCH_AT91RM9200 is not set
105 109
106# 110#
107# S3C24XX Implementations 111# S3C24XX Implementations
@@ -160,7 +164,6 @@ CONFIG_CPU_TLB_V4WBI=y
160# Bus support 164# Bus support
161# 165#
162CONFIG_ISA=y 166CONFIG_ISA=y
163CONFIG_ISA_DMA_API=y
164 167
165# 168#
166# PCCARD (PCMCIA/CardBus) support 169# PCCARD (PCMCIA/CardBus) support
@@ -172,6 +175,7 @@ CONFIG_ISA_DMA_API=y
172# 175#
173# CONFIG_PREEMPT is not set 176# CONFIG_PREEMPT is not set
174# CONFIG_NO_IDLE_HZ is not set 177# CONFIG_NO_IDLE_HZ is not set
178# CONFIG_AEABI is not set
175# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set 179# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
176CONFIG_SELECT_MEMORY_MODEL=y 180CONFIG_SELECT_MEMORY_MODEL=y
177CONFIG_FLATMEM_MANUAL=y 181CONFIG_FLATMEM_MANUAL=y
@@ -214,6 +218,8 @@ CONFIG_BINFMT_AOUT=y
214# Power management options 218# Power management options
215# 219#
216CONFIG_PM=y 220CONFIG_PM=y
221CONFIG_PM_LEGACY=y
222# CONFIG_PM_DEBUG is not set
217CONFIG_APM=y 223CONFIG_APM=y
218 224
219# 225#
@@ -259,6 +265,11 @@ CONFIG_TCP_CONG_BIC=y
259# SCTP Configuration (EXPERIMENTAL) 265# SCTP Configuration (EXPERIMENTAL)
260# 266#
261# CONFIG_IP_SCTP is not set 267# CONFIG_IP_SCTP is not set
268
269#
270# TIPC Configuration (EXPERIMENTAL)
271#
272# CONFIG_TIPC is not set
262# CONFIG_ATM is not set 273# CONFIG_ATM is not set
263# CONFIG_BRIDGE is not set 274# CONFIG_BRIDGE is not set
264# CONFIG_VLAN_8021Q is not set 275# CONFIG_VLAN_8021Q is not set
@@ -276,7 +287,6 @@ CONFIG_TCP_CONG_BIC=y
276# QoS and/or fair queueing 287# QoS and/or fair queueing
277# 288#
278# CONFIG_NET_SCHED is not set 289# CONFIG_NET_SCHED is not set
279# CONFIG_NET_CLS_ROUTE is not set
280 290
281# 291#
282# Network testing 292# Network testing
@@ -300,6 +310,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
300# CONFIG_DEBUG_DRIVER is not set 310# CONFIG_DEBUG_DRIVER is not set
301 311
302# 312#
313# Connector - unified userspace <-> kernelspace linker
314#
315# CONFIG_CONNECTOR is not set
316
317#
303# Memory Technology Devices (MTD) 318# Memory Technology Devices (MTD)
304# 319#
305CONFIG_MTD=y 320CONFIG_MTD=y
@@ -412,8 +427,6 @@ CONFIG_PARPORT_1284=y
412# 427#
413# Block devices 428# Block devices
414# 429#
415# CONFIG_BLK_DEV_XD is not set
416# CONFIG_PARIDE is not set
417# CONFIG_BLK_DEV_COW_COMMON is not set 430# CONFIG_BLK_DEV_COW_COMMON is not set
418CONFIG_BLK_DEV_LOOP=y 431CONFIG_BLK_DEV_LOOP=y
419# CONFIG_BLK_DEV_CRYPTOLOOP is not set 432# CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -502,7 +515,6 @@ CONFIG_NETDEVICES=y
502CONFIG_NET_ETHERNET=y 515CONFIG_NET_ETHERNET=y
503CONFIG_MII=y 516CONFIG_MII=y
504# CONFIG_NET_VENDOR_3COM is not set 517# CONFIG_NET_VENDOR_3COM is not set
505# CONFIG_LANCE is not set
506# CONFIG_NET_VENDOR_SMC is not set 518# CONFIG_NET_VENDOR_SMC is not set
507# CONFIG_SMC91X is not set 519# CONFIG_SMC91X is not set
508CONFIG_DM9000=y 520CONFIG_DM9000=y
@@ -607,11 +619,11 @@ CONFIG_SERIAL_NONSTANDARD=y
607# CONFIG_ROCKETPORT is not set 619# CONFIG_ROCKETPORT is not set
608# CONFIG_CYCLADES is not set 620# CONFIG_CYCLADES is not set
609# CONFIG_DIGIEPCA is not set 621# CONFIG_DIGIEPCA is not set
610# CONFIG_ESPSERIAL is not set
611# CONFIG_MOXA_INTELLIO is not set 622# CONFIG_MOXA_INTELLIO is not set
612# CONFIG_MOXA_SMARTIO is not set 623# CONFIG_MOXA_SMARTIO is not set
613# CONFIG_ISI is not set 624# CONFIG_ISI is not set
614# CONFIG_SYNCLINKMP is not set 625# CONFIG_SYNCLINKMP is not set
626# CONFIG_SYNCLINK_GT is not set
615# CONFIG_N_HDLC is not set 627# CONFIG_N_HDLC is not set
616# CONFIG_RISCOM8 is not set 628# CONFIG_RISCOM8 is not set
617# CONFIG_SPECIALIX is not set 629# CONFIG_SPECIALIX is not set
@@ -625,6 +637,7 @@ CONFIG_SERIAL_NONSTANDARD=y
625CONFIG_SERIAL_8250=y 637CONFIG_SERIAL_8250=y
626CONFIG_SERIAL_8250_CONSOLE=y 638CONFIG_SERIAL_8250_CONSOLE=y
627CONFIG_SERIAL_8250_NR_UARTS=8 639CONFIG_SERIAL_8250_NR_UARTS=8
640CONFIG_SERIAL_8250_RUNTIME_UARTS=4
628CONFIG_SERIAL_8250_EXTENDED=y 641CONFIG_SERIAL_8250_EXTENDED=y
629CONFIG_SERIAL_8250_MANY_PORTS=y 642CONFIG_SERIAL_8250_MANY_PORTS=y
630CONFIG_SERIAL_8250_SHARE_IRQ=y 643CONFIG_SERIAL_8250_SHARE_IRQ=y
@@ -687,6 +700,7 @@ CONFIG_S3C2410_RTC=y
687# 700#
688# TPM devices 701# TPM devices
689# 702#
703# CONFIG_TCG_TPM is not set
690# CONFIG_TELCLOCK is not set 704# CONFIG_TELCLOCK is not set
691 705
692# 706#
@@ -731,6 +745,12 @@ CONFIG_SENSORS_EEPROM=m
731# CONFIG_I2C_DEBUG_CHIP is not set 745# CONFIG_I2C_DEBUG_CHIP is not set
732 746
733# 747#
748# SPI support
749#
750# CONFIG_SPI is not set
751# CONFIG_SPI_MASTER is not set
752
753#
734# Hardware Monitoring support 754# Hardware Monitoring support
735# 755#
736CONFIG_HWMON=y 756CONFIG_HWMON=y
@@ -863,6 +883,7 @@ CONFIG_FS_MBCACHE=y
863# CONFIG_JFS_FS is not set 883# CONFIG_JFS_FS is not set
864# CONFIG_FS_POSIX_ACL is not set 884# CONFIG_FS_POSIX_ACL is not set
865# CONFIG_XFS_FS is not set 885# CONFIG_XFS_FS is not set
886# CONFIG_OCFS2_FS is not set
866# CONFIG_MINIX_FS is not set 887# CONFIG_MINIX_FS is not set
867CONFIG_ROMFS_FS=y 888CONFIG_ROMFS_FS=y
868CONFIG_INOTIFY=y 889CONFIG_INOTIFY=y
@@ -897,6 +918,7 @@ CONFIG_SYSFS=y
897# CONFIG_HUGETLB_PAGE is not set 918# CONFIG_HUGETLB_PAGE is not set
898CONFIG_RAMFS=y 919CONFIG_RAMFS=y
899# CONFIG_RELAYFS_FS is not set 920# CONFIG_RELAYFS_FS is not set
921# CONFIG_CONFIGFS_FS is not set
900 922
901# 923#
902# Miscellaneous filesystems 924# Miscellaneous filesystems
@@ -965,6 +987,7 @@ CONFIG_SOLARIS_X86_PARTITION=y
965# CONFIG_SGI_PARTITION is not set 987# CONFIG_SGI_PARTITION is not set
966# CONFIG_ULTRIX_PARTITION is not set 988# CONFIG_ULTRIX_PARTITION is not set
967# CONFIG_SUN_PARTITION is not set 989# CONFIG_SUN_PARTITION is not set
990# CONFIG_KARMA_PARTITION is not set
968# CONFIG_EFI_PARTITION is not set 991# CONFIG_EFI_PARTITION is not set
969 992
970# 993#
@@ -1020,12 +1043,13 @@ CONFIG_NLS_DEFAULT="iso8859-1"
1020# Kernel hacking 1043# Kernel hacking
1021# 1044#
1022# CONFIG_PRINTK_TIME is not set 1045# CONFIG_PRINTK_TIME is not set
1023CONFIG_DEBUG_KERNEL=y
1024CONFIG_MAGIC_SYSRQ=y 1046CONFIG_MAGIC_SYSRQ=y
1047CONFIG_DEBUG_KERNEL=y
1025CONFIG_LOG_BUF_SHIFT=16 1048CONFIG_LOG_BUF_SHIFT=16
1026CONFIG_DETECT_SOFTLOCKUP=y 1049CONFIG_DETECT_SOFTLOCKUP=y
1027# CONFIG_SCHEDSTATS is not set 1050# CONFIG_SCHEDSTATS is not set
1028# CONFIG_DEBUG_SLAB is not set 1051# CONFIG_DEBUG_SLAB is not set
1052CONFIG_DEBUG_MUTEXES=y
1029# CONFIG_DEBUG_SPINLOCK is not set 1053# CONFIG_DEBUG_SPINLOCK is not set
1030# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 1054# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1031# CONFIG_DEBUG_KOBJECT is not set 1055# CONFIG_DEBUG_KOBJECT is not set
@@ -1034,6 +1058,7 @@ CONFIG_DEBUG_INFO=y
1034# CONFIG_DEBUG_FS is not set 1058# CONFIG_DEBUG_FS is not set
1035# CONFIG_DEBUG_VM is not set 1059# CONFIG_DEBUG_VM is not set
1036CONFIG_FRAME_POINTER=y 1060CONFIG_FRAME_POINTER=y
1061CONFIG_FORCED_INLINING=y
1037# CONFIG_RCU_TORTURE_TEST is not set 1062# CONFIG_RCU_TORTURE_TEST is not set
1038CONFIG_DEBUG_USER=y 1063CONFIG_DEBUG_USER=y
1039# CONFIG_DEBUG_WAITQ is not set 1064# CONFIG_DEBUG_WAITQ is not set
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
index d058e7c12568..8c3035d5ffc9 100644
--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -291,21 +291,21 @@
291 CALL(sys_mq_getsetattr) 291 CALL(sys_mq_getsetattr)
292/* 280 */ CALL(sys_waitid) 292/* 280 */ CALL(sys_waitid)
293 CALL(sys_socket) 293 CALL(sys_socket)
294 CALL(sys_bind) 294 CALL(ABI(sys_bind, sys_oabi_bind))
295 CALL(sys_connect) 295 CALL(ABI(sys_connect, sys_oabi_connect))
296 CALL(sys_listen) 296 CALL(sys_listen)
297/* 285 */ CALL(sys_accept) 297/* 285 */ CALL(sys_accept)
298 CALL(sys_getsockname) 298 CALL(sys_getsockname)
299 CALL(sys_getpeername) 299 CALL(sys_getpeername)
300 CALL(sys_socketpair) 300 CALL(sys_socketpair)
301 CALL(sys_send) 301 CALL(sys_send)
302/* 290 */ CALL(sys_sendto) 302/* 290 */ CALL(ABI(sys_sendto, sys_oabi_sendto))
303 CALL(sys_recv) 303 CALL(sys_recv)
304 CALL(sys_recvfrom) 304 CALL(sys_recvfrom)
305 CALL(sys_shutdown) 305 CALL(sys_shutdown)
306 CALL(sys_setsockopt) 306 CALL(sys_setsockopt)
307/* 295 */ CALL(sys_getsockopt) 307/* 295 */ CALL(sys_getsockopt)
308 CALL(sys_sendmsg) 308 CALL(ABI(sys_sendmsg, sys_oabi_sendmsg))
309 CALL(sys_recvmsg) 309 CALL(sys_recvmsg)
310 CALL(ABI(sys_semop, sys_oabi_semop)) 310 CALL(ABI(sys_semop, sys_oabi_semop))
311 CALL(sys_semget) 311 CALL(sys_semget)
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index d401d908c463..964cd717506b 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -333,10 +333,14 @@ __pabt_svc:
333 @ from the exception stack 333 @ from the exception stack
334 334
335#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG) 335#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
336#ifndef CONFIG_MMU
337#warning "NPTL on non MMU needs fixing"
338#else
336 @ make sure our user space atomic helper is aborted 339 @ make sure our user space atomic helper is aborted
337 cmp r2, #TASK_SIZE 340 cmp r2, #TASK_SIZE
338 bichs r3, r3, #PSR_Z_BIT 341 bichs r3, r3, #PSR_Z_BIT
339#endif 342#endif
343#endif
340 344
341 @ 345 @
342 @ We are now ready to fill in the remaining blanks on the stack: 346 @ We are now ready to fill in the remaining blanks on the stack:
@@ -705,7 +709,12 @@ __kuser_memory_barrier: @ 0xffff0fa0
705 * The C flag is also set if *ptr was changed to allow for assembly 709 * The C flag is also set if *ptr was changed to allow for assembly
706 * optimization in the calling code. 710 * optimization in the calling code.
707 * 711 *
708 * Note: this routine already includes memory barriers as needed. 712 * Notes:
713 *
714 * - This routine already includes memory barriers as needed.
715 *
716 * - A failure might be transient, i.e. it is possible, although unlikely,
717 * that "failure" be returned even if *ptr == oldval.
709 * 718 *
710 * For example, a user space atomic_add implementation could look like this: 719 * For example, a user space atomic_add implementation could look like this:
711 * 720 *
@@ -756,12 +765,18 @@ __kuser_cmpxchg: @ 0xffff0fc0
756 * exception happening just after the str instruction which would 765 * exception happening just after the str instruction which would
757 * clear the Z flag although the exchange was done. 766 * clear the Z flag although the exchange was done.
758 */ 767 */
768#ifdef CONFIG_MMU
759 teq ip, ip @ set Z flag 769 teq ip, ip @ set Z flag
760 ldr ip, [r2] @ load current val 770 ldr ip, [r2] @ load current val
761 add r3, r2, #1 @ prepare store ptr 771 add r3, r2, #1 @ prepare store ptr
762 teqeq ip, r0 @ compare with oldval if still allowed 772 teqeq ip, r0 @ compare with oldval if still allowed
763 streq r1, [r3, #-1]! @ store newval if still allowed 773 streq r1, [r3, #-1]! @ store newval if still allowed
764 subs r0, r2, r3 @ if r2 == r3 the str occured 774 subs r0, r2, r3 @ if r2 == r3 the str occured
775#else
776#warning "NPTL on non MMU needs fixing"
777 mov r0, #-1
778 adds r0, r0, #0
779#endif
765 mov pc, lr 780 mov pc, lr
766 781
767#else 782#else
diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c
index eafa8e5284af..9d4b76409c64 100644
--- a/arch/arm/kernel/sys_oabi-compat.c
+++ b/arch/arm/kernel/sys_oabi-compat.c
@@ -59,6 +59,16 @@
59 * struct sembuf loses its padding with EABI. Since arrays of them are 59 * struct sembuf loses its padding with EABI. Since arrays of them are
60 * used they have to be copyed to remove the padding. Compatibility wrappers 60 * used they have to be copyed to remove the padding. Compatibility wrappers
61 * provided below. 61 * provided below.
62 *
63 * sys_bind:
64 * sys_connect:
65 * sys_sendmsg:
66 * sys_sendto:
67 *
68 * struct sockaddr_un loses its padding with EABI. Since the size of the
69 * structure is used as a validation test in unix_mkname(), we need to
70 * change the length argument to 110 whenever it is 112. Compatibility
71 * wrappers provided below.
62 */ 72 */
63 73
64#include <linux/syscalls.h> 74#include <linux/syscalls.h>
@@ -67,6 +77,7 @@
67#include <linux/fcntl.h> 77#include <linux/fcntl.h>
68#include <linux/eventpoll.h> 78#include <linux/eventpoll.h>
69#include <linux/sem.h> 79#include <linux/sem.h>
80#include <linux/socket.h>
70#include <asm/ipc.h> 81#include <asm/ipc.h>
71#include <asm/uaccess.h> 82#include <asm/uaccess.h>
72 83
@@ -337,3 +348,63 @@ asmlinkage int sys_oabi_ipc(uint call, int first, int second, int third,
337 return sys_ipc(call, first, second, third, ptr, fifth); 348 return sys_ipc(call, first, second, third, ptr, fifth);
338 } 349 }
339} 350}
351
352asmlinkage long sys_oabi_bind(int fd, struct sockaddr __user *addr, int addrlen)
353{
354 sa_family_t sa_family;
355 if (addrlen == 112 &&
356 get_user(sa_family, &addr->sa_family) == 0 &&
357 sa_family == AF_UNIX)
358 addrlen = 110;
359 return sys_bind(fd, addr, addrlen);
360}
361
362asmlinkage long sys_oabi_connect(int fd, struct sockaddr __user *addr, int addrlen)
363{
364 sa_family_t sa_family;
365 if (addrlen == 112 &&
366 get_user(sa_family, &addr->sa_family) == 0 &&
367 sa_family == AF_UNIX)
368 addrlen = 110;
369 return sys_connect(fd, addr, addrlen);
370}
371
372asmlinkage long sys_oabi_sendto(int fd, void __user *buff,
373 size_t len, unsigned flags,
374 struct sockaddr __user *addr,
375 int addrlen)
376{
377 sa_family_t sa_family;
378 if (addrlen == 112 &&
379 get_user(sa_family, &addr->sa_family) == 0 &&
380 sa_family == AF_UNIX)
381 addrlen = 110;
382 return sys_sendto(fd, buff, len, flags, addr, addrlen);
383}
384
385asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
386{
387 struct sockaddr __user *addr;
388 int msg_namelen;
389 sa_family_t sa_family;
390 if (msg &&
391 get_user(msg_namelen, &msg->msg_namelen) == 0 &&
392 msg_namelen == 112 &&
393 get_user(addr, &msg->msg_name) == 0 &&
394 get_user(sa_family, &addr->sa_family) == 0 &&
395 sa_family == AF_UNIX)
396 {
397 /*
398 * HACK ALERT: there is a limit to how much backward bending
399 * we should do for what is actually a transitional
400 * compatibility layer. This already has known flaws with
401 * a few ioctls that we don't intend to fix. Therefore
402 * consider this blatent hack as another one... and take care
403 * to run for cover. In most cases it will "just work fine".
404 * If it doesn't, well, tough.
405 */
406 put_user(110, &msg->msg_namelen);
407 }
408 return sys_sendmsg(fd, msg, flags);
409}
410
diff --git a/arch/arm/mach-clps711x/Kconfig b/arch/arm/mach-clps711x/Kconfig
index 0793dcf54f2e..0e2b641268ad 100644
--- a/arch/arm/mach-clps711x/Kconfig
+++ b/arch/arm/mach-clps711x/Kconfig
@@ -24,6 +24,8 @@ config ARCH_CEIVA
24 24
25config ARCH_CLEP7312 25config ARCH_CLEP7312
26 bool "CLEP7312" 26 bool "CLEP7312"
27 help
28 Boards based on the Cirrus Logic 7212/7312 chips.
27 29
28config ARCH_EDB7211 30config ARCH_EDB7211
29 bool "EDB7211" 31 bool "EDB7211"
diff --git a/arch/arm/mach-imx/mx1ads.c b/arch/arm/mach-imx/mx1ads.c
index dc31e3fd6c57..8ab1b040288c 100644
--- a/arch/arm/mach-imx/mx1ads.c
+++ b/arch/arm/mach-imx/mx1ads.c
@@ -27,7 +27,6 @@
27#include <asm/mach/arch.h> 27#include <asm/mach/arch.h>
28#include <linux/interrupt.h> 28#include <linux/interrupt.h>
29#include "generic.h" 29#include "generic.h"
30#include <asm/serial.h>
31 30
32static struct resource cs89x0_resources[] = { 31static struct resource cs89x0_resources[] = {
33 [0] = { 32 [0] = {
diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c
index 9e5a13bb39d0..52fac89e95b5 100644
--- a/arch/arm/mach-ixp2000/enp2611.c
+++ b/arch/arm/mach-ixp2000/enp2611.c
@@ -106,6 +106,7 @@ static void __init enp2611_pci_preinit(void)
106{ 106{
107 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000); 107 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
108 ixp2000_pci_preinit(); 108 ixp2000_pci_preinit();
109 pcibios_setup("firmware");
109} 110}
110 111
111static inline int enp2611_pci_valid_device(struct pci_bus *bus, 112static inline int enp2611_pci_valid_device(struct pci_bus *bus,
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c
index 7c782403042a..09101271298e 100644
--- a/arch/arm/mach-ixp2000/ixdp2400.c
+++ b/arch/arm/mach-ixp2000/ixdp2400.c
@@ -68,6 +68,7 @@ void __init ixdp2400_pci_preinit(void)
68{ 68{
69 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000); 69 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
70 ixp2000_pci_preinit(); 70 ixp2000_pci_preinit();
71 pcibios_setup("firmware");
71} 72}
72 73
73int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys) 74int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys)
diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c
index 10f06606d460..150519fb38ec 100644
--- a/arch/arm/mach-ixp2000/ixdp2x01.c
+++ b/arch/arm/mach-ixp2000/ixdp2x01.c
@@ -212,6 +212,7 @@ void __init ixdp2x01_pci_preinit(void)
212{ 212{
213 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00000000); 213 ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00000000);
214 ixp2000_pci_preinit(); 214 ixp2000_pci_preinit();
215 pcibios_setup("firmware");
215} 216}
216 217
217#define DEVPIN(dev, pin) ((pin) | ((dev) << 3)) 218#define DEVPIN(dev, pin) ((pin) | ((dev) << 3))
@@ -299,7 +300,9 @@ struct hw_pci ixdp2x01_pci __initdata = {
299 300
300int __init ixdp2x01_pci_init(void) 301int __init ixdp2x01_pci_init(void)
301{ 302{
302 pci_common_init(&ixdp2x01_pci); 303 if (machine_is_ixdp2401() || machine_is_ixdp2801())
304 pci_common_init(&ixdp2x01_pci);
305
303 return 0; 306 return 0;
304} 307}
305 308
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c
index bdc20b51b076..a177e78b2b87 100644
--- a/arch/arm/mach-omap1/board-generic.c
+++ b/arch/arm/mach-omap1/board-generic.c
@@ -30,6 +30,7 @@
30 30
31static void __init omap_generic_init_irq(void) 31static void __init omap_generic_init_irq(void)
32{ 32{
33 omap1_init_common_hw();
33 omap_init_irq(); 34 omap_init_irq();
34} 35}
35 36
@@ -104,7 +105,7 @@ static void __init omap_generic_init(void)
104 105
105static void __init omap_generic_map_io(void) 106static void __init omap_generic_map_io(void)
106{ 107{
107 omap_map_common_io(); 108 omap1_map_common_io();
108} 109}
109 110
110MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") 111MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c
index 9533c36a92df..89f0cc74a519 100644
--- a/arch/arm/mach-omap1/board-h2.c
+++ b/arch/arm/mach-omap1/board-h2.c
@@ -128,6 +128,7 @@ static void __init h2_init_smc91x(void)
128 128
129static void __init h2_init_irq(void) 129static void __init h2_init_irq(void)
130{ 130{
131 omap1_init_common_hw();
131 omap_init_irq(); 132 omap_init_irq();
132 omap_gpio_init(); 133 omap_gpio_init();
133 h2_init_smc91x(); 134 h2_init_smc91x();
@@ -194,7 +195,7 @@ static void __init h2_init(void)
194 195
195static void __init h2_map_io(void) 196static void __init h2_map_io(void)
196{ 197{
197 omap_map_common_io(); 198 omap1_map_common_io();
198} 199}
199 200
200MACHINE_START(OMAP_H2, "TI-H2") 201MACHINE_START(OMAP_H2, "TI-H2")
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index d665efc1c344..d9f386265996 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -203,6 +203,7 @@ static void __init h3_init_smc91x(void)
203 203
204void h3_init_irq(void) 204void h3_init_irq(void)
205{ 205{
206 omap1_init_common_hw();
206 omap_init_irq(); 207 omap_init_irq();
207 omap_gpio_init(); 208 omap_gpio_init();
208 h3_init_smc91x(); 209 h3_init_smc91x();
@@ -210,7 +211,7 @@ void h3_init_irq(void)
210 211
211static void __init h3_map_io(void) 212static void __init h3_map_io(void)
212{ 213{
213 omap_map_common_io(); 214 omap1_map_common_io();
214} 215}
215 216
216MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") 217MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c
index 652f37c7f906..a04e4332915e 100644
--- a/arch/arm/mach-omap1/board-innovator.c
+++ b/arch/arm/mach-omap1/board-innovator.c
@@ -181,6 +181,7 @@ static void __init innovator_init_smc91x(void)
181 181
182void innovator_init_irq(void) 182void innovator_init_irq(void)
183{ 183{
184 omap1_init_common_hw();
184 omap_init_irq(); 185 omap_init_irq();
185 omap_gpio_init(); 186 omap_gpio_init();
186#ifdef CONFIG_ARCH_OMAP15XX 187#ifdef CONFIG_ARCH_OMAP15XX
@@ -285,7 +286,7 @@ static void __init innovator_init(void)
285 286
286static void __init innovator_map_io(void) 287static void __init innovator_map_io(void)
287{ 288{
288 omap_map_common_io(); 289 omap1_map_common_io();
289 290
290#ifdef CONFIG_ARCH_OMAP15XX 291#ifdef CONFIG_ARCH_OMAP15XX
291 if (cpu_is_omap1510()) { 292 if (cpu_is_omap1510()) {
diff --git a/arch/arm/mach-omap1/board-netstar.c b/arch/arm/mach-omap1/board-netstar.c
index 58f783930d45..60d5f8a3339c 100644
--- a/arch/arm/mach-omap1/board-netstar.c
+++ b/arch/arm/mach-omap1/board-netstar.c
@@ -65,6 +65,7 @@ static struct omap_board_config_kernel netstar_config[] = {
65 65
66static void __init netstar_init_irq(void) 66static void __init netstar_init_irq(void)
67{ 67{
68 omap1_init_common_hw();
68 omap_init_irq(); 69 omap_init_irq();
69 omap_gpio_init(); 70 omap_gpio_init();
70} 71}
@@ -108,7 +109,7 @@ static void __init netstar_init(void)
108 109
109static void __init netstar_map_io(void) 110static void __init netstar_map_io(void)
110{ 111{
111 omap_map_common_io(); 112 omap1_map_common_io();
112} 113}
113 114
114#define MACHINE_PANICED 1 115#define MACHINE_PANICED 1
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c
index e5d126e8f276..543fa136106d 100644
--- a/arch/arm/mach-omap1/board-osk.c
+++ b/arch/arm/mach-omap1/board-osk.c
@@ -169,6 +169,7 @@ static void __init osk_init_cf(void)
169 169
170static void __init osk_init_irq(void) 170static void __init osk_init_irq(void)
171{ 171{
172 omap1_init_common_hw();
172 omap_init_irq(); 173 omap_init_irq();
173 omap_gpio_init(); 174 omap_gpio_init();
174 osk_init_smc91x(); 175 osk_init_smc91x();
@@ -269,7 +270,7 @@ static void __init osk_init(void)
269 270
270static void __init osk_map_io(void) 271static void __init osk_map_io(void)
271{ 272{
272 omap_map_common_io(); 273 omap1_map_common_io();
273} 274}
274 275
275MACHINE_START(OMAP_OSK, "TI-OSK") 276MACHINE_START(OMAP_OSK, "TI-OSK")
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c
index 67fada207622..e488f7236775 100644
--- a/arch/arm/mach-omap1/board-palmte.c
+++ b/arch/arm/mach-omap1/board-palmte.c
@@ -34,6 +34,7 @@
34 34
35static void __init omap_generic_init_irq(void) 35static void __init omap_generic_init_irq(void)
36{ 36{
37 omap1_init_common_hw();
37 omap_init_irq(); 38 omap_init_irq();
38} 39}
39 40
@@ -72,7 +73,7 @@ static void __init omap_generic_init(void)
72 73
73static void __init omap_generic_map_io(void) 74static void __init omap_generic_map_io(void)
74{ 75{
75 omap_map_common_io(); 76 omap1_map_common_io();
76} 77}
77 78
78MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E") 79MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c
index 88708a0c52a2..3913a3cc0ce6 100644
--- a/arch/arm/mach-omap1/board-perseus2.c
+++ b/arch/arm/mach-omap1/board-perseus2.c
@@ -144,6 +144,7 @@ static void __init perseus2_init_smc91x(void)
144 144
145void omap_perseus2_init_irq(void) 145void omap_perseus2_init_irq(void)
146{ 146{
147 omap1_init_common_hw();
147 omap_init_irq(); 148 omap_init_irq();
148 omap_gpio_init(); 149 omap_gpio_init();
149 perseus2_init_smc91x(); 150 perseus2_init_smc91x();
@@ -160,7 +161,7 @@ static struct map_desc omap_perseus2_io_desc[] __initdata = {
160 161
161static void __init omap_perseus2_map_io(void) 162static void __init omap_perseus2_map_io(void)
162{ 163{
163 omap_map_common_io(); 164 omap1_map_common_io();
164 iotable_init(omap_perseus2_io_desc, 165 iotable_init(omap_perseus2_io_desc,
165 ARRAY_SIZE(omap_perseus2_io_desc)); 166 ARRAY_SIZE(omap_perseus2_io_desc));
166 167
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c
index 959b4b847c87..bfd5fdd1a875 100644
--- a/arch/arm/mach-omap1/board-voiceblue.c
+++ b/arch/arm/mach-omap1/board-voiceblue.c
@@ -162,6 +162,7 @@ static struct omap_board_config_kernel voiceblue_config[] = {
162 162
163static void __init voiceblue_init_irq(void) 163static void __init voiceblue_init_irq(void)
164{ 164{
165 omap1_init_common_hw();
165 omap_init_irq(); 166 omap_init_irq();
166 omap_gpio_init(); 167 omap_gpio_init();
167} 168}
@@ -206,7 +207,7 @@ static void __init voiceblue_init(void)
206 207
207static void __init voiceblue_map_io(void) 208static void __init voiceblue_map_io(void)
208{ 209{
209 omap_map_common_io(); 210 omap1_map_common_io();
210} 211}
211 212
212#define MACHINE_PANICED 1 213#define MACHINE_PANICED 1
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c
index a7a19f75b9e1..82d556be79c5 100644
--- a/arch/arm/mach-omap1/io.c
+++ b/arch/arm/mach-omap1/io.c
@@ -13,6 +13,7 @@
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <linux/init.h> 14#include <linux/init.h>
15 15
16#include <asm/tlb.h>
16#include <asm/mach/map.h> 17#include <asm/mach/map.h>
17#include <asm/io.h> 18#include <asm/io.h>
18#include <asm/arch/mux.h> 19#include <asm/arch/mux.h>
@@ -83,15 +84,24 @@ static struct map_desc omap16xx_io_desc[] __initdata = {
83}; 84};
84#endif 85#endif
85 86
86static int initialized = 0; 87/*
87 88 * Maps common IO regions for omap1. This should only get called from
88static void __init _omap_map_io(void) 89 * board specific init.
90 */
91void __init omap1_map_common_io(void)
89{ 92{
90 initialized = 1;
91
92 /* We have to initialize the IO space mapping before we can run
93 * cpu_is_omapxxx() macros. */
94 iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc)); 93 iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc));
94
95 /* Normally devicemaps_init() would flush caches and tlb after
96 * mdesc->map_io(), but we must also do it here because of the CPU
97 * revision check below.
98 */
99 local_flush_tlb_all();
100 flush_cache_all();
101
102 /* We want to check CPU revision early for cpu_is_omapxxxx() macros.
103 * IO space mapping must be initialized before we can do that.
104 */
95 omap_check_revision(); 105 omap_check_revision();
96 106
97#ifdef CONFIG_ARCH_OMAP730 107#ifdef CONFIG_ARCH_OMAP730
@@ -111,7 +121,14 @@ static void __init _omap_map_io(void)
111#endif 121#endif
112 122
113 omap_sram_init(); 123 omap_sram_init();
124}
114 125
126/*
127 * Common low-level hardware init for omap1. This should only get called from
128 * board specific init.
129 */
130void __init omap1_init_common_hw()
131{
115 /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort 132 /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
116 * on a Posted Write in the TIPB Bridge". 133 * on a Posted Write in the TIPB Bridge".
117 */ 134 */
@@ -121,16 +138,7 @@ static void __init _omap_map_io(void)
121 /* Must init clocks early to assure that timer interrupt works 138 /* Must init clocks early to assure that timer interrupt works
122 */ 139 */
123 omap1_clk_init(); 140 omap1_clk_init();
124}
125 141
126/* 142 omap1_mux_init();
127 * This should only get called from board specific init
128 */
129void __init omap_map_common_io(void)
130{
131 if (!initialized) {
132 _omap_map_io();
133 omap1_mux_init();
134 }
135} 143}
136 144
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index b937123e5c65..eaecbf422d8c 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -33,6 +33,7 @@
33 33
34static void __init omap_generic_init_irq(void) 34static void __init omap_generic_init_irq(void)
35{ 35{
36 omap2_init_common_hw();
36 omap_init_irq(); 37 omap_init_irq();
37} 38}
38 39
@@ -64,7 +65,7 @@ static void __init omap_generic_init(void)
64 65
65static void __init omap_generic_map_io(void) 66static void __init omap_generic_map_io(void)
66{ 67{
67 omap_map_common_io(); 68 omap2_map_common_io();
68} 69}
69 70
70MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx") 71MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c
index c3c35d40378a..a300d634d8a5 100644
--- a/arch/arm/mach-omap2/board-h4.c
+++ b/arch/arm/mach-omap2/board-h4.c
@@ -136,6 +136,7 @@ static inline void __init h4_init_smc91x(void)
136 136
137static void __init omap_h4_init_irq(void) 137static void __init omap_h4_init_irq(void)
138{ 138{
139 omap2_init_common_hw();
139 omap_init_irq(); 140 omap_init_irq();
140 omap_gpio_init(); 141 omap_gpio_init();
141 h4_init_smc91x(); 142 h4_init_smc91x();
@@ -181,7 +182,7 @@ static void __init omap_h4_init(void)
181 182
182static void __init omap_h4_map_io(void) 183static void __init omap_h4_map_io(void)
183{ 184{
184 omap_map_common_io(); 185 omap2_map_common_io();
185} 186}
186 187
187MACHINE_START(OMAP_H4, "OMAP2420 H4 board") 188MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c
index 4a222f59f2cf..4303d988c4bf 100644
--- a/arch/arm/mach-realview/core.c
+++ b/arch/arm/mach-realview/core.c
@@ -182,7 +182,7 @@ static const struct icst307_params realview_oscvco_params = {
182static void realview_oscvco_set(struct clk *clk, struct icst307_vco vco) 182static void realview_oscvco_set(struct clk *clk, struct icst307_vco vco)
183{ 183{
184 void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET; 184 void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET;
185 void __iomem *sys_osc = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC1_OFFSET; 185 void __iomem *sys_osc = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET;
186 u32 val; 186 u32 val;
187 187
188 val = readl(sys_osc) & ~0x7ffff; 188 val = readl(sys_osc) & ~0x7ffff;
diff --git a/arch/arm/mach-s3c2410/clock.c b/arch/arm/mach-s3c2410/clock.c
index af2f3d52b61b..08489efdaf06 100644
--- a/arch/arm/mach-s3c2410/clock.c
+++ b/arch/arm/mach-s3c2410/clock.c
@@ -40,7 +40,6 @@
40#include <linux/mutex.h> 40#include <linux/mutex.h>
41 41
42#include <asm/hardware.h> 42#include <asm/hardware.h>
43#include <asm/atomic.h>
44#include <asm/irq.h> 43#include <asm/irq.h>
45#include <asm/io.h> 44#include <asm/io.h>
46 45
@@ -59,22 +58,18 @@ static DEFINE_MUTEX(clocks_mutex);
59void inline s3c24xx_clk_enable(unsigned int clocks, unsigned int enable) 58void inline s3c24xx_clk_enable(unsigned int clocks, unsigned int enable)
60{ 59{
61 unsigned long clkcon; 60 unsigned long clkcon;
62 unsigned long flags;
63
64 local_irq_save(flags);
65 61
66 clkcon = __raw_readl(S3C2410_CLKCON); 62 clkcon = __raw_readl(S3C2410_CLKCON);
67 clkcon &= ~clocks;
68 63
69 if (enable) 64 if (enable)
70 clkcon |= clocks; 65 clkcon |= clocks;
66 else
67 clkcon &= ~clocks;
71 68
72 /* ensure none of the special function bits set */ 69 /* ensure none of the special function bits set */
73 clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER); 70 clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER);
74 71
75 __raw_writel(clkcon, S3C2410_CLKCON); 72 __raw_writel(clkcon, S3C2410_CLKCON);
76
77 local_irq_restore(flags);
78} 73}
79 74
80/* enable and disable calls for use with the clk struct */ 75/* enable and disable calls for use with the clk struct */
@@ -138,16 +133,32 @@ void clk_put(struct clk *clk)
138 133
139int clk_enable(struct clk *clk) 134int clk_enable(struct clk *clk)
140{ 135{
141 if (IS_ERR(clk)) 136 if (IS_ERR(clk) || clk == NULL)
142 return -EINVAL; 137 return -EINVAL;
143 138
144 return (clk->enable)(clk, 1); 139 clk_enable(clk->parent);
140
141 mutex_lock(&clocks_mutex);
142
143 if ((clk->usage++) == 0)
144 (clk->enable)(clk, 1);
145
146 mutex_unlock(&clocks_mutex);
147 return 0;
145} 148}
146 149
147void clk_disable(struct clk *clk) 150void clk_disable(struct clk *clk)
148{ 151{
149 if (!IS_ERR(clk)) 152 if (IS_ERR(clk) || clk == NULL)
153 return;
154
155 mutex_lock(&clocks_mutex);
156
157 if ((--clk->usage) == 0)
150 (clk->enable)(clk, 0); 158 (clk->enable)(clk, 0);
159
160 mutex_unlock(&clocks_mutex);
161 clk_disable(clk->parent);
151} 162}
152 163
153 164
@@ -361,6 +372,14 @@ int s3c24xx_register_clock(struct clk *clk)
361 if (clk->enable == NULL) 372 if (clk->enable == NULL)
362 clk->enable = clk_null_enable; 373 clk->enable = clk_null_enable;
363 374
375 /* if this is a standard clock, set the usage state */
376
377 if (clk->ctrlbit) {
378 unsigned long clkcon = __raw_readl(S3C2410_CLKCON);
379
380 clk->usage = (clkcon & clk->ctrlbit) ? 1 : 0;
381 }
382
364 /* add to the list of available clocks */ 383 /* add to the list of available clocks */
365 384
366 mutex_lock(&clocks_mutex); 385 mutex_lock(&clocks_mutex);
@@ -402,6 +421,8 @@ int __init s3c24xx_setup_clocks(unsigned long xtal,
402 * the LCD clock if it is not needed. 421 * the LCD clock if it is not needed.
403 */ 422 */
404 423
424 mutex_lock(&clocks_mutex);
425
405 s3c24xx_clk_enable(S3C2410_CLKCON_NAND, 0); 426 s3c24xx_clk_enable(S3C2410_CLKCON_NAND, 0);
406 s3c24xx_clk_enable(S3C2410_CLKCON_USBH, 0); 427 s3c24xx_clk_enable(S3C2410_CLKCON_USBH, 0);
407 s3c24xx_clk_enable(S3C2410_CLKCON_USBD, 0); 428 s3c24xx_clk_enable(S3C2410_CLKCON_USBD, 0);
@@ -409,6 +430,8 @@ int __init s3c24xx_setup_clocks(unsigned long xtal,
409 s3c24xx_clk_enable(S3C2410_CLKCON_IIC, 0); 430 s3c24xx_clk_enable(S3C2410_CLKCON_IIC, 0);
410 s3c24xx_clk_enable(S3C2410_CLKCON_SPI, 0); 431 s3c24xx_clk_enable(S3C2410_CLKCON_SPI, 0);
411 432
433 mutex_unlock(&clocks_mutex);
434
412 /* assume uart clocks are correctly setup */ 435 /* assume uart clocks are correctly setup */
413 436
414 /* register our clocks */ 437 /* register our clocks */
diff --git a/arch/arm/mach-s3c2410/clock.h b/arch/arm/mach-s3c2410/clock.h
index 177d5c8decf7..eb5c95d1e7f2 100644
--- a/arch/arm/mach-s3c2410/clock.h
+++ b/arch/arm/mach-s3c2410/clock.h
@@ -16,6 +16,7 @@ struct clk {
16 struct clk *parent; 16 struct clk *parent;
17 const char *name; 17 const char *name;
18 int id; 18 int id;
19 int usage;
19 unsigned long rate; 20 unsigned long rate;
20 unsigned long ctrlbit; 21 unsigned long ctrlbit;
21 int (*enable)(struct clk *, int enable); 22 int (*enable)(struct clk *, int enable);
diff --git a/arch/arm/mach-s3c2410/devs.c b/arch/arm/mach-s3c2410/devs.c
index b8d994a24d1c..0a47d38789a5 100644
--- a/arch/arm/mach-s3c2410/devs.c
+++ b/arch/arm/mach-s3c2410/devs.c
@@ -275,6 +275,11 @@ static struct resource s3c_adc_resource[] = {
275 }, 275 },
276 [1] = { 276 [1] = {
277 .start = IRQ_TC, 277 .start = IRQ_TC,
278 .end = IRQ_TC,
279 .flags = IORESOURCE_IRQ,
280 },
281 [2] = {
282 .start = IRQ_ADC,
278 .end = IRQ_ADC, 283 .end = IRQ_ADC,
279 .flags = IORESOURCE_IRQ, 284 .flags = IORESOURCE_IRQ,
280 } 285 }
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
index 792f66375830..ee82763b02b8 100644
--- a/arch/arm/plat-omap/sram.c
+++ b/arch/arm/plat-omap/sram.c
@@ -17,6 +17,7 @@
17#include <linux/init.h> 17#include <linux/init.h>
18 18
19#include <asm/mach/map.h> 19#include <asm/mach/map.h>
20#include <asm/tlb.h>
20#include <asm/io.h> 21#include <asm/io.h>
21#include <asm/cacheflush.h> 22#include <asm/cacheflush.h>
22 23
@@ -96,6 +97,14 @@ void __init omap_map_sram(void)
96 omap_sram_io_desc[0].length); 97 omap_sram_io_desc[0].length);
97 98
98 /* 99 /*
100 * Normally devicemaps_init() would flush caches and tlb after
101 * mdesc->map_io(), but since we're called from map_io(), we
102 * must do it here.
103 */
104 local_flush_tlb_all();
105 flush_cache_all();
106
107 /*
99 * Looks like we need to preserve some bootloader code at the 108 * Looks like we need to preserve some bootloader code at the
100 * beginning of SRAM for jumping to flash for reboot to work... 109 * beginning of SRAM for jumping to flash for reboot to work...
101 */ 110 */
diff --git a/arch/cris/Makefile b/arch/cris/Makefile
index ea65d585cf5e..ee114699ef8e 100644
--- a/arch/cris/Makefile
+++ b/arch/cris/Makefile
@@ -119,7 +119,7 @@ $(SRC_ARCH)/.links:
119 @ln -sfn $(SRC_ARCH)/$(SARCH)/lib $(SRC_ARCH)/lib 119 @ln -sfn $(SRC_ARCH)/$(SARCH)/lib $(SRC_ARCH)/lib
120 @ln -sfn $(SRC_ARCH)/$(SARCH) $(SRC_ARCH)/arch 120 @ln -sfn $(SRC_ARCH)/$(SARCH) $(SRC_ARCH)/arch
121 @ln -sfn $(SRC_ARCH)/$(SARCH)/vmlinux.lds.S $(SRC_ARCH)/kernel/vmlinux.lds.S 121 @ln -sfn $(SRC_ARCH)/$(SARCH)/vmlinux.lds.S $(SRC_ARCH)/kernel/vmlinux.lds.S
122 @ln -sfn $(SRC_ARCH)/$(SARCH)/asm-offsets.c $(SRC_ARCH)/kernel/asm-offsets.c 122 @ln -sfn $(SRC_ARCH)/$(SARCH)/kernel/asm-offsets.c $(SRC_ARCH)/kernel/asm-offsets.c
123 @touch $@ 123 @touch $@
124 124
125# Create link to sub arch includes 125# Create link to sub arch includes
diff --git a/arch/cris/arch-v10/kernel/ptrace.c b/arch/cris/arch-v10/kernel/ptrace.c
index f214f74f264e..961c0d58ded4 100644
--- a/arch/cris/arch-v10/kernel/ptrace.c
+++ b/arch/cris/arch-v10/kernel/ptrace.c
@@ -202,18 +202,18 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
202 int i; 202 int i;
203 unsigned long tmp; 203 unsigned long tmp;
204 204
205 ret = 0;
205 for (i = 0; i <= PT_MAX; i++) { 206 for (i = 0; i <= PT_MAX; i++) {
206 tmp = get_reg(child, i); 207 tmp = get_reg(child, i);
207 208
208 if (put_user(tmp, datap)) { 209 if (put_user(tmp, datap)) {
209 ret = -EFAULT; 210 ret = -EFAULT;
210 goto out_tsk; 211 break;
211 } 212 }
212 213
213 data += sizeof(long); 214 data += sizeof(long);
214 } 215 }
215 216
216 ret = 0;
217 break; 217 break;
218 } 218 }
219 219
@@ -222,10 +222,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
222 int i; 222 int i;
223 unsigned long tmp; 223 unsigned long tmp;
224 224
225 ret = 0;
225 for (i = 0; i <= PT_MAX; i++) { 226 for (i = 0; i <= PT_MAX; i++) {
226 if (get_user(tmp, datap)) { 227 if (get_user(tmp, datap)) {
227 ret = -EFAULT; 228 ret = -EFAULT;
228 goto out_tsk; 229 break;
229 } 230 }
230 231
231 if (i == PT_DCCR) { 232 if (i == PT_DCCR) {
@@ -237,7 +238,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
237 data += sizeof(long); 238 data += sizeof(long);
238 } 239 }
239 240
240 ret = 0;
241 break; 241 break;
242 } 242 }
243 243
diff --git a/arch/cris/kernel/setup.c b/arch/cris/kernel/setup.c
index d11206e467ab..1ba57efff60d 100644
--- a/arch/cris/kernel/setup.c
+++ b/arch/cris/kernel/setup.c
@@ -24,7 +24,6 @@
24/* 24/*
25 * Setup options 25 * Setup options
26 */ 26 */
27struct drive_info_struct { char dummy[32]; } drive_info;
28struct screen_info screen_info; 27struct screen_info screen_info;
29 28
30extern int root_mountflags; 29extern int root_mountflags;
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
index 98a5c23cf3df..f39e09ef64ec 100644
--- a/arch/i386/kernel/apic.c
+++ b/arch/i386/kernel/apic.c
@@ -77,7 +77,7 @@ void ack_bad_irq(unsigned int irq)
77 * completely. 77 * completely.
78 * But only ack when the APIC is enabled -AK 78 * But only ack when the APIC is enabled -AK
79 */ 79 */
80 if (!cpu_has_apic) 80 if (cpu_has_apic)
81 ack_APIC_irq(); 81 ack_APIC_irq();
82} 82}
83 83
diff --git a/arch/i386/kernel/syscall_table.S b/arch/i386/kernel/syscall_table.S
index 1b665928336b..5a8b3fb6d27b 100644
--- a/arch/i386/kernel/syscall_table.S
+++ b/arch/i386/kernel/syscall_table.S
@@ -309,3 +309,4 @@ ENTRY(sys_call_table)
309 .long sys_faccessat 309 .long sys_faccessat
310 .long sys_pselect6 310 .long sys_pselect6
311 .long sys_ppoll 311 .long sys_ppoll
312 .long sys_unshare /* 310 */
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 199eeaf0f4e3..845cd0902a50 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -194,7 +194,6 @@ config IA64_L1_CACHE_SHIFT
194 default "7" if MCKINLEY 194 default "7" if MCKINLEY
195 default "6" if ITANIUM 195 default "6" if ITANIUM
196 196
197# align cache-sensitive data to 64 bytes
198config IA64_CYCLONE 197config IA64_CYCLONE
199 bool "Cyclone (EXA) Time Source support" 198 bool "Cyclone (EXA) Time Source support"
200 help 199 help
@@ -374,6 +373,9 @@ config IA64_PALINFO
374 To use this option, you have to ensure that the "/proc file system 373 To use this option, you have to ensure that the "/proc file system
375 support" (CONFIG_PROC_FS) is enabled, too. 374 support" (CONFIG_PROC_FS) is enabled, too.
376 375
376config SGI_SN
377 def_bool y if (IA64_SGI_SN2 || IA64_GENERIC)
378
377source "drivers/firmware/Kconfig" 379source "drivers/firmware/Kconfig"
378 380
379source "fs/Kconfig.binfmt" 381source "fs/Kconfig.binfmt"
diff --git a/arch/ia64/dig/setup.c b/arch/ia64/dig/setup.c
index d58003f1ad02..c9104bfff667 100644
--- a/arch/ia64/dig/setup.c
+++ b/arch/ia64/dig/setup.c
@@ -25,16 +25,6 @@
25#include <asm/machvec.h> 25#include <asm/machvec.h>
26#include <asm/system.h> 26#include <asm/system.h>
27 27
28/*
29 * This is here so we can use the CMOS detection in ide-probe.c to
30 * determine what drives are present. In theory, we don't need this
31 * as the auto-detection could be done via ide-probe.c:do_probe() but
32 * in practice that would be much slower, which is painful when
33 * running in the simulator. Note that passing zeroes in DRIVE_INFO
34 * is sufficient (the IDE driver will autodetect the drive geometry).
35 */
36char drive_info[4*16];
37
38void __init 28void __init
39dig_setup (char **cmdline_p) 29dig_setup (char **cmdline_p)
40{ 30{
diff --git a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c
index 5856510210fa..b3355a9ca2c3 100644
--- a/arch/ia64/ia32/ia32_signal.c
+++ b/arch/ia64/ia32/ia32_signal.c
@@ -515,6 +515,7 @@ sys32_signal (int sig, unsigned int handler)
515 515
516 sigact_set_handler(&new_sa, handler, 0); 516 sigact_set_handler(&new_sa, handler, 0);
517 new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK; 517 new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;
518 sigemptyset(&new_sa.sa.sa_mask);
518 519
519 ret = do_sigaction(sig, &new_sa, &old_sa); 520 ret = do_sigaction(sig, &new_sa, &old_sa);
520 521
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
index c485a3b32ba8..9990320b6f9a 100644
--- a/arch/ia64/kernel/efi.c
+++ b/arch/ia64/kernel/efi.c
@@ -410,24 +410,16 @@ efi_init (void)
410 efi_config_table_t *config_tables; 410 efi_config_table_t *config_tables;
411 efi_char16_t *c16; 411 efi_char16_t *c16;
412 u64 efi_desc_size; 412 u64 efi_desc_size;
413 char *cp, *end, vendor[100] = "unknown"; 413 char *cp, vendor[100] = "unknown";
414 extern char saved_command_line[]; 414 extern char saved_command_line[];
415 int i; 415 int i;
416 416
417 /* it's too early to be able to use the standard kernel command line support... */ 417 /* it's too early to be able to use the standard kernel command line support... */
418 for (cp = saved_command_line; *cp; ) { 418 for (cp = saved_command_line; *cp; ) {
419 if (memcmp(cp, "mem=", 4) == 0) { 419 if (memcmp(cp, "mem=", 4) == 0) {
420 cp += 4; 420 mem_limit = memparse(cp + 4, &cp);
421 mem_limit = memparse(cp, &end);
422 if (end != cp)
423 break;
424 cp = end;
425 } else if (memcmp(cp, "max_addr=", 9) == 0) { 421 } else if (memcmp(cp, "max_addr=", 9) == 0) {
426 cp += 9; 422 max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
427 max_addr = GRANULEROUNDDOWN(memparse(cp, &end));
428 if (end != cp)
429 break;
430 cp = end;
431 } else { 423 } else {
432 while (*cp != ' ' && *cp) 424 while (*cp != ' ' && *cp)
433 ++cp; 425 ++cp;
@@ -458,7 +450,7 @@ efi_init (void)
458 /* Show what we know for posterity */ 450 /* Show what we know for posterity */
459 c16 = __va(efi.systab->fw_vendor); 451 c16 = __va(efi.systab->fw_vendor);
460 if (c16) { 452 if (c16) {
461 for (i = 0;i < (int) sizeof(vendor) && *c16; ++i) 453 for (i = 0;i < (int) sizeof(vendor) - 1 && *c16; ++i)
462 vendor[i] = *c16++; 454 vendor[i] = *c16++;
463 vendor[i] = '\0'; 455 vendor[i] = '\0';
464 } 456 }
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index 7a6ffd613789..27b222c277e4 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -1601,5 +1601,21 @@ sys_call_table:
1601 data8 sys_inotify_add_watch 1601 data8 sys_inotify_add_watch
1602 data8 sys_inotify_rm_watch 1602 data8 sys_inotify_rm_watch
1603 data8 sys_migrate_pages // 1280 1603 data8 sys_migrate_pages // 1280
1604 data8 sys_openat
1605 data8 sys_mkdirat
1606 data8 sys_mknodat
1607 data8 sys_fchownat
1608 data8 sys_futimesat // 1285
1609 data8 sys_newfstatat
1610 data8 sys_unlinkat
1611 data8 sys_renameat
1612 data8 sys_linkat
1613 data8 sys_symlinkat // 1290
1614 data8 sys_readlinkat
1615 data8 sys_fchmodat
1616 data8 sys_faccessat
1617 data8 sys_ni_syscall // reserved for pselect
1618 data8 sys_ni_syscall // 1295 reserved for ppoll
1619 data8 sys_unshare
1604 1620
1605 .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls 1621 .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S
index ce423910ca97..ac6055c83115 100644
--- a/arch/ia64/kernel/fsys.S
+++ b/arch/ia64/kernel/fsys.S
@@ -878,31 +878,8 @@ fsyscall_table:
878 data8 0 // timer_delete 878 data8 0 // timer_delete
879 data8 0 // clock_settime 879 data8 0 // clock_settime
880 data8 fsys_clock_gettime // clock_gettime 880 data8 fsys_clock_gettime // clock_gettime
881 data8 0 // clock_getres // 1255 881 #define __NR_syscall_last 1255
882 data8 0 // clock_nanosleep 882
883 data8 0 // fstatfs64 883 .space 8*(NR_syscalls + 1024 - __NR_syscall_last), 0
884 data8 0 // statfs64
885 data8 0
886 data8 0 // 1260
887 data8 0
888 data8 0 // mq_open
889 data8 0 // mq_unlink
890 data8 0 // mq_timedsend
891 data8 0 // mq_timedreceive // 1265
892 data8 0 // mq_notify
893 data8 0 // mq_getsetattr
894 data8 0 // kexec_load
895 data8 0
896 data8 0 // 1270
897 data8 0
898 data8 0
899 data8 0
900 data8 0
901 data8 0 // 1275
902 data8 0
903 data8 0
904 data8 0
905 data8 0
906 data8 0 // 1280
907 884
908 .org fsyscall_table + 8*NR_syscalls // guard against failures to increase NR_syscalls 885 .org fsyscall_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
index fbc7ea35dd57..f1778a84ea61 100644
--- a/arch/ia64/kernel/head.S
+++ b/arch/ia64/kernel/head.S
@@ -352,6 +352,7 @@ start_ap:
352 mov ar.rsc=0 // place RSE in enforced lazy mode 352 mov ar.rsc=0 // place RSE in enforced lazy mode
353 ;; 353 ;;
354 loadrs // clear the dirty partition 354 loadrs // clear the dirty partition
355 mov IA64_KR(PER_CPU_DATA)=r0 // clear physical per-CPU base
355 ;; 356 ;;
356 mov ar.bspstore=r2 // establish the new RSE stack 357 mov ar.bspstore=r2 // establish the new RSE stack
357 ;; 358 ;;
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
index 3492e3211a44..8fd93afa75a7 100644
--- a/arch/ia64/kernel/mca_drv.c
+++ b/arch/ia64/kernel/mca_drv.c
@@ -437,6 +437,9 @@ recover_from_read_error(slidx_table_t *slidx,
437 * the process not have any locks of kernel. 437 * the process not have any locks of kernel.
438 */ 438 */
439 439
440 /* Is minstate valid? */
441 if (!peidx_bottom(peidx) || !(peidx_bottom(peidx)->valid.minstate))
442 return 0;
440 psr1 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_ipsr); 443 psr1 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_ipsr);
441 444
442 /* 445 /*
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c
index acc0f132f86c..056f7a6eedc7 100644
--- a/arch/ia64/kernel/sal.c
+++ b/arch/ia64/kernel/sal.c
@@ -14,6 +14,7 @@
14#include <linux/spinlock.h> 14#include <linux/spinlock.h>
15#include <linux/string.h> 15#include <linux/string.h>
16 16
17#include <asm/delay.h>
17#include <asm/page.h> 18#include <asm/page.h>
18#include <asm/sal.h> 19#include <asm/sal.h>
19#include <asm/pal.h> 20#include <asm/pal.h>
@@ -214,6 +215,78 @@ chk_nointroute_opt(void)
214static void __init sal_desc_ap_wakeup(void *p) { } 215static void __init sal_desc_ap_wakeup(void *p) { }
215#endif 216#endif
216 217
218/*
219 * HP rx5670 firmware polls for interrupts during SAL_CACHE_FLUSH by reading
220 * cr.ivr, but it never writes cr.eoi. This leaves any interrupt marked as
221 * "in-service" and masks other interrupts of equal or lower priority.
222 *
223 * HP internal defect reports: F1859, F2775, F3031.
224 */
225static int sal_cache_flush_drops_interrupts;
226
227static void __init
228check_sal_cache_flush (void)
229{
230 unsigned long flags, itv;
231 int cpu;
232 u64 vector;
233
234 cpu = get_cpu();
235 local_irq_save(flags);
236
237 /*
238 * Schedule a timer interrupt, wait until it's reported, and see if
239 * SAL_CACHE_FLUSH drops it.
240 */
241 itv = ia64_get_itv();
242 BUG_ON((itv & (1 << 16)) == 0);
243
244 ia64_set_itv(IA64_TIMER_VECTOR);
245 ia64_set_itm(ia64_get_itc() + 1000);
246
247 while (!ia64_get_irr(IA64_TIMER_VECTOR))
248 cpu_relax();
249
250 ia64_sal_cache_flush(3);
251
252 if (ia64_get_irr(IA64_TIMER_VECTOR)) {
253 vector = ia64_get_ivr();
254 ia64_eoi();
255 WARN_ON(vector != IA64_TIMER_VECTOR);
256 } else {
257 sal_cache_flush_drops_interrupts = 1;
258 printk(KERN_ERR "SAL: SAL_CACHE_FLUSH drops interrupts; "
259 "PAL_CACHE_FLUSH will be used instead\n");
260 ia64_eoi();
261 }
262
263 ia64_set_itv(itv);
264 local_irq_restore(flags);
265 put_cpu();
266}
267
268s64
269ia64_sal_cache_flush (u64 cache_type)
270{
271 struct ia64_sal_retval isrv;
272
273 if (sal_cache_flush_drops_interrupts) {
274 unsigned long flags;
275 u64 progress;
276 s64 rc;
277
278 progress = 0;
279 local_irq_save(flags);
280 rc = ia64_pal_cache_flush(cache_type,
281 PAL_CACHE_FLUSH_INVALIDATE, &progress, NULL);
282 local_irq_restore(flags);
283 return rc;
284 }
285
286 SAL_CALL(isrv, SAL_CACHE_FLUSH, cache_type, 0, 0, 0, 0, 0, 0);
287 return isrv.status;
288}
289
217void __init 290void __init
218ia64_sal_init (struct ia64_sal_systab *systab) 291ia64_sal_init (struct ia64_sal_systab *systab)
219{ 292{
@@ -262,6 +335,8 @@ ia64_sal_init (struct ia64_sal_systab *systab)
262 } 335 }
263 p += SAL_DESC_SIZE(*p); 336 p += SAL_DESC_SIZE(*p);
264 } 337 }
338
339 check_sal_cache_flush();
265} 340}
266 341
267int 342int
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
index c0766575a3a2..35f7835294a3 100644
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -71,6 +71,8 @@ unsigned long __per_cpu_offset[NR_CPUS];
71EXPORT_SYMBOL(__per_cpu_offset); 71EXPORT_SYMBOL(__per_cpu_offset);
72#endif 72#endif
73 73
74extern void ia64_setup_printk_clock(void);
75
74DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info); 76DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
75DEFINE_PER_CPU(unsigned long, local_per_cpu_offset); 77DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
76DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8); 78DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
@@ -445,6 +447,8 @@ setup_arch (char **cmdline_p)
445 /* process SAL system table: */ 447 /* process SAL system table: */
446 ia64_sal_init(efi.sal_systab); 448 ia64_sal_init(efi.sal_systab);
447 449
450 ia64_setup_printk_clock();
451
448#ifdef CONFIG_SMP 452#ifdef CONFIG_SMP
449 cpu_physical_id(0) = hard_smp_processor_id(); 453 cpu_physical_id(0) = hard_smp_processor_id();
450 454
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
index 028a2b95936c..a094ec49ccfa 100644
--- a/arch/ia64/kernel/time.c
+++ b/arch/ia64/kernel/time.c
@@ -278,3 +278,30 @@ udelay (unsigned long usecs)
278 } 278 }
279} 279}
280EXPORT_SYMBOL(udelay); 280EXPORT_SYMBOL(udelay);
281
282static unsigned long long ia64_itc_printk_clock(void)
283{
284 if (ia64_get_kr(IA64_KR_PER_CPU_DATA))
285 return sched_clock();
286 return 0;
287}
288
289static unsigned long long ia64_default_printk_clock(void)
290{
291 return (unsigned long long)(jiffies_64 - INITIAL_JIFFIES) *
292 (1000000000/HZ);
293}
294
295unsigned long long (*ia64_printk_clock)(void) = &ia64_default_printk_clock;
296
297unsigned long long printk_clock(void)
298{
299 return ia64_printk_clock();
300}
301
302void __init
303ia64_setup_printk_clock(void)
304{
305 if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT))
306 ia64_printk_clock = ia64_itc_printk_clock;
307}
diff --git a/arch/ia64/sn/Makefile b/arch/ia64/sn/Makefile
index a269f6d84c29..79a7df02e812 100644
--- a/arch/ia64/sn/Makefile
+++ b/arch/ia64/sn/Makefile
@@ -9,6 +9,4 @@
9# Makefile for the sn ia64 subplatform 9# Makefile for the sn ia64 subplatform
10# 10#
11 11
12CPPFLAGS += -I$(srctree)/arch/ia64/sn/include
13
14obj-y += kernel/ pci/ 12obj-y += kernel/ pci/
diff --git a/arch/ia64/sn/kernel/Makefile b/arch/ia64/sn/kernel/Makefile
index 4351c4ff9845..3e9b4eea7418 100644
--- a/arch/ia64/sn/kernel/Makefile
+++ b/arch/ia64/sn/kernel/Makefile
@@ -7,6 +7,8 @@
7# Copyright (C) 1999,2001-2005 Silicon Graphics, Inc. All Rights Reserved. 7# Copyright (C) 1999,2001-2005 Silicon Graphics, Inc. All Rights Reserved.
8# 8#
9 9
10CPPFLAGS += -I$(srctree)/arch/ia64/sn/include
11
10obj-y += setup.o bte.o bte_error.o irq.o mca.o idle.o \ 12obj-y += setup.o bte.o bte_error.o irq.o mca.o idle.o \
11 huberror.o io_init.o iomv.o klconflib.o sn2/ 13 huberror.o io_init.o iomv.o klconflib.o sn2/
12obj-$(CONFIG_IA64_GENERIC) += machvec.o 14obj-$(CONFIG_IA64_GENERIC) += machvec.o
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c
index dd73c0cb754b..1f11db470d90 100644
--- a/arch/ia64/sn/kernel/bte.c
+++ b/arch/ia64/sn/kernel/bte.c
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. 6 * Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
7 */ 7 */
8 8
9#include <linux/config.h> 9#include <linux/config.h>
@@ -186,18 +186,13 @@ retry_bteop:
186 186
187 /* Initialize the notification to a known value. */ 187 /* Initialize the notification to a known value. */
188 *bte->most_rcnt_na = BTE_WORD_BUSY; 188 *bte->most_rcnt_na = BTE_WORD_BUSY;
189 notif_phys_addr = TO_PHYS(ia64_tpa((unsigned long)bte->most_rcnt_na)); 189 notif_phys_addr = (u64)bte->most_rcnt_na;
190 190
191 if (is_shub2()) {
192 src = SH2_TIO_PHYS_TO_DMA(src);
193 dest = SH2_TIO_PHYS_TO_DMA(dest);
194 notif_phys_addr = SH2_TIO_PHYS_TO_DMA(notif_phys_addr);
195 }
196 /* Set the source and destination registers */ 191 /* Set the source and destination registers */
197 BTE_PRINTKV(("IBSA = 0x%lx)\n", (TO_PHYS(src)))); 192 BTE_PRINTKV(("IBSA = 0x%lx)\n", src));
198 BTE_SRC_STORE(bte, TO_PHYS(src)); 193 BTE_SRC_STORE(bte, src);
199 BTE_PRINTKV(("IBDA = 0x%lx)\n", (TO_PHYS(dest)))); 194 BTE_PRINTKV(("IBDA = 0x%lx)\n", dest));
200 BTE_DEST_STORE(bte, TO_PHYS(dest)); 195 BTE_DEST_STORE(bte, dest);
201 196
202 /* Set the notification register */ 197 /* Set the notification register */
203 BTE_PRINTKV(("IBNA = 0x%lx)\n", notif_phys_addr)); 198 BTE_PRINTKV(("IBNA = 0x%lx)\n", notif_phys_addr));
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index a4c78152b336..3437c2390429 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -208,7 +208,7 @@ static s64 sn_device_fixup_war(u64 nasid, u64 widget, int device,
208 * sn_fixup_ionodes() - This routine initializes the HUB data strcuture for 208 * sn_fixup_ionodes() - This routine initializes the HUB data strcuture for
209 * each node in the system. 209 * each node in the system.
210 */ 210 */
211static void sn_fixup_ionodes(void) 211static void __init sn_fixup_ionodes(void)
212{ 212{
213 struct sn_flush_device_kernel *sn_flush_device_kernel; 213 struct sn_flush_device_kernel *sn_flush_device_kernel;
214 struct sn_flush_device_kernel *dev_entry; 214 struct sn_flush_device_kernel *dev_entry;
@@ -467,6 +467,13 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
467 pcidev_info->pdi_sn_irq_info = NULL; 467 pcidev_info->pdi_sn_irq_info = NULL;
468 kfree(sn_irq_info); 468 kfree(sn_irq_info);
469 } 469 }
470
471 /*
472 * MSI currently not supported on altix. Remove this when
473 * the MSI abstraction patches are integrated into the kernel
474 * (sometime after 2.6.16 releases)
475 */
476 dev->no_msi = 1;
470} 477}
471 478
472/* 479/*
@@ -610,15 +617,15 @@ void sn_bus_store_sysdata(struct pci_dev *dev)
610void sn_bus_free_sysdata(void) 617void sn_bus_free_sysdata(void)
611{ 618{
612 struct sysdata_el *element; 619 struct sysdata_el *element;
613 struct list_head *list; 620 struct list_head *list, *safe;
614 621
615sn_sysdata_free_start: 622 list_for_each_safe(list, safe, &sn_sysdata_list) {
616 list_for_each(list, &sn_sysdata_list) {
617 element = list_entry(list, struct sysdata_el, entry); 623 element = list_entry(list, struct sysdata_el, entry);
618 list_del(&element->entry); 624 list_del(&element->entry);
625 list_del(&(((struct pcidev_info *)
626 (element->sysdata))->pdi_list));
619 kfree(element->sysdata); 627 kfree(element->sysdata);
620 kfree(element); 628 kfree(element);
621 goto sn_sysdata_free_start;
622 } 629 }
623 return; 630 return;
624} 631}
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c
index ec37084bdc17..c373113d073a 100644
--- a/arch/ia64/sn/kernel/irq.c
+++ b/arch/ia64/sn/kernel/irq.c
@@ -5,11 +5,12 @@
5 * License. See the file "COPYING" in the main directory of this archive 5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details. 6 * for more details.
7 * 7 *
8 * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. 8 * Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
9 */ 9 */
10 10
11#include <linux/irq.h> 11#include <linux/irq.h>
12#include <linux/spinlock.h> 12#include <linux/spinlock.h>
13#include <linux/init.h>
13#include <asm/sn/addrs.h> 14#include <asm/sn/addrs.h>
14#include <asm/sn/arch.h> 15#include <asm/sn/arch.h>
15#include <asm/sn/intr.h> 16#include <asm/sn/intr.h>
@@ -76,17 +77,15 @@ static void sn_enable_irq(unsigned int irq)
76 77
77static void sn_ack_irq(unsigned int irq) 78static void sn_ack_irq(unsigned int irq)
78{ 79{
79 u64 event_occurred, mask = 0; 80 u64 event_occurred, mask;
80 81
81 irq = irq & 0xff; 82 irq = irq & 0xff;
82 event_occurred = 83 event_occurred = HUB_L((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED));
83 HUB_L((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED));
84 mask = event_occurred & SH_ALL_INT_MASK; 84 mask = event_occurred & SH_ALL_INT_MASK;
85 HUB_S((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED_ALIAS), 85 HUB_S((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED_ALIAS), mask);
86 mask);
87 __set_bit(irq, (volatile void *)pda->sn_in_service_ivecs); 86 __set_bit(irq, (volatile void *)pda->sn_in_service_ivecs);
88 87
89 move_irq(irq); 88 move_native_irq(irq);
90} 89}
91 90
92static void sn_end_irq(unsigned int irq) 91static void sn_end_irq(unsigned int irq)
@@ -219,9 +218,8 @@ static void register_intr_pda(struct sn_irq_info *sn_irq_info)
219 pdacpu(cpu)->sn_last_irq = irq; 218 pdacpu(cpu)->sn_last_irq = irq;
220 } 219 }
221 220
222 if (pdacpu(cpu)->sn_first_irq == 0 || pdacpu(cpu)->sn_first_irq > irq) { 221 if (pdacpu(cpu)->sn_first_irq == 0 || pdacpu(cpu)->sn_first_irq > irq)
223 pdacpu(cpu)->sn_first_irq = irq; 222 pdacpu(cpu)->sn_first_irq = irq;
224 }
225} 223}
226 224
227static void unregister_intr_pda(struct sn_irq_info *sn_irq_info) 225static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)
@@ -289,7 +287,7 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)
289 list_add_rcu(&sn_irq_info->list, sn_irq_lh[sn_irq_info->irq_irq]); 287 list_add_rcu(&sn_irq_info->list, sn_irq_lh[sn_irq_info->irq_irq]);
290 spin_unlock(&sn_irq_info_lock); 288 spin_unlock(&sn_irq_info_lock);
291 289
292 (void)register_intr_pda(sn_irq_info); 290 register_intr_pda(sn_irq_info);
293} 291}
294 292
295void sn_irq_unfixup(struct pci_dev *pci_dev) 293void sn_irq_unfixup(struct pci_dev *pci_dev)
@@ -301,7 +299,9 @@ void sn_irq_unfixup(struct pci_dev *pci_dev)
301 return; 299 return;
302 300
303 sn_irq_info = SN_PCIDEV_INFO(pci_dev)->pdi_sn_irq_info; 301 sn_irq_info = SN_PCIDEV_INFO(pci_dev)->pdi_sn_irq_info;
304 if (!sn_irq_info || !sn_irq_info->irq_irq) { 302 if (!sn_irq_info)
303 return;
304 if (!sn_irq_info->irq_irq) {
305 kfree(sn_irq_info); 305 kfree(sn_irq_info);
306 return; 306 return;
307 } 307 }
@@ -419,7 +419,7 @@ void sn_lb_int_war_check(void)
419 rcu_read_unlock(); 419 rcu_read_unlock();
420} 420}
421 421
422void sn_irq_lh_init(void) 422void __init sn_irq_lh_init(void)
423{ 423{
424 int i; 424 int i;
425 425
@@ -434,5 +434,4 @@ void sn_irq_lh_init(void)
434 434
435 INIT_LIST_HEAD(sn_irq_lh[i]); 435 INIT_LIST_HEAD(sn_irq_lh[i]);
436 } 436 }
437
438} 437}
diff --git a/arch/ia64/sn/kernel/klconflib.c b/arch/ia64/sn/kernel/klconflib.c
index 0f11a3299cd2..87682b48ef83 100644
--- a/arch/ia64/sn/kernel/klconflib.c
+++ b/arch/ia64/sn/kernel/klconflib.c
@@ -78,31 +78,30 @@ format_module_id(char *buffer, moduleid_t m, int fmt)
78 position = MODULE_GET_BPOS(m); 78 position = MODULE_GET_BPOS(m);
79 79
80 if ((fmt == MODULE_FORMAT_BRIEF) || (fmt == MODULE_FORMAT_LCD)) { 80 if ((fmt == MODULE_FORMAT_BRIEF) || (fmt == MODULE_FORMAT_LCD)) {
81 /* Brief module number format, eg. 002c15 */ 81 /* Brief module number format, eg. 002c15 */
82 82
83 /* Decompress the rack number */ 83 /* Decompress the rack number */
84 *buffer++ = '0' + RACK_GET_CLASS(rack); 84 *buffer++ = '0' + RACK_GET_CLASS(rack);
85 *buffer++ = '0' + RACK_GET_GROUP(rack); 85 *buffer++ = '0' + RACK_GET_GROUP(rack);
86 *buffer++ = '0' + RACK_GET_NUM(rack); 86 *buffer++ = '0' + RACK_GET_NUM(rack);
87 87
88 /* Add the brick type */ 88 /* Add the brick type */
89 *buffer++ = brickchar; 89 *buffer++ = brickchar;
90 } 90 }
91 else if (fmt == MODULE_FORMAT_LONG) { 91 else if (fmt == MODULE_FORMAT_LONG) {
92 /* Fuller hwgraph format, eg. rack/002/bay/15 */ 92 /* Fuller hwgraph format, eg. rack/002/bay/15 */
93 93
94 strcpy(buffer, "rack" "/"); buffer += strlen(buffer); 94 strcpy(buffer, "rack" "/"); buffer += strlen(buffer);
95 95
96 *buffer++ = '0' + RACK_GET_CLASS(rack); 96 *buffer++ = '0' + RACK_GET_CLASS(rack);
97 *buffer++ = '0' + RACK_GET_GROUP(rack); 97 *buffer++ = '0' + RACK_GET_GROUP(rack);
98 *buffer++ = '0' + RACK_GET_NUM(rack); 98 *buffer++ = '0' + RACK_GET_NUM(rack);
99 99
100 strcpy(buffer, "/" "bay" "/"); buffer += strlen(buffer); 100 strcpy(buffer, "/" "bay" "/"); buffer += strlen(buffer);
101 } 101 }
102 102
103 /* Add the bay position, using at least two digits */ 103 /* Add the bay position, using at least two digits */
104 if (position < 10) 104 if (position < 10)
105 *buffer++ = '0'; 105 *buffer++ = '0';
106 sprintf(buffer, "%d", position); 106 sprintf(buffer, "%d", position);
107
108} 107}
diff --git a/arch/ia64/sn/kernel/mca.c b/arch/ia64/sn/kernel/mca.c
index 9ab684d1bb55..3db62f24596c 100644
--- a/arch/ia64/sn/kernel/mca.c
+++ b/arch/ia64/sn/kernel/mca.c
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. 6 * Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
7 */ 7 */
8 8
9#include <linux/types.h> 9#include <linux/types.h>
@@ -137,7 +137,8 @@ int sn_salinfo_platform_oemdata(const u8 *sect_header, u8 **oemdata, u64 *oemdat
137 137
138static int __init sn_salinfo_init(void) 138static int __init sn_salinfo_init(void)
139{ 139{
140 salinfo_platform_oemdata = &sn_salinfo_platform_oemdata; 140 if (ia64_platform_is("sn2"))
141 salinfo_platform_oemdata = &sn_salinfo_platform_oemdata;
141 return 0; 142 return 0;
142} 143}
143 144
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index e510dce9971f..48645ac120fc 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -67,6 +67,7 @@ extern unsigned long last_time_offset;
67extern void (*ia64_mark_idle) (int); 67extern void (*ia64_mark_idle) (int);
68extern void snidle(int); 68extern void snidle(int);
69extern unsigned char acpi_kbd_controller_present; 69extern unsigned char acpi_kbd_controller_present;
70extern unsigned long long (*ia64_printk_clock)(void);
70 71
71unsigned long sn_rtc_cycles_per_second; 72unsigned long sn_rtc_cycles_per_second;
72EXPORT_SYMBOL(sn_rtc_cycles_per_second); 73EXPORT_SYMBOL(sn_rtc_cycles_per_second);
@@ -125,20 +126,6 @@ struct screen_info sn_screen_info = {
125}; 126};
126 127
127/* 128/*
128 * This is here so we can use the CMOS detection in ide-probe.c to
129 * determine what drives are present. In theory, we don't need this
130 * as the auto-detection could be done via ide-probe.c:do_probe() but
131 * in practice that would be much slower, which is painful when
132 * running in the simulator. Note that passing zeroes in DRIVE_INFO
133 * is sufficient (the IDE driver will autodetect the drive geometry).
134 */
135#ifdef CONFIG_IA64_GENERIC
136extern char drive_info[4 * 16];
137#else
138char drive_info[4 * 16];
139#endif
140
141/*
142 * This routine can only be used during init, since 129 * This routine can only be used during init, since
143 * smp_boot_data is an init data structure. 130 * smp_boot_data is an init data structure.
144 * We have to use smp_boot_data.cpu_phys_id to find 131 * We have to use smp_boot_data.cpu_phys_id to find
@@ -209,7 +196,7 @@ void __init early_sn_setup(void)
209} 196}
210 197
211extern int platform_intr_list[]; 198extern int platform_intr_list[];
212static int __initdata shub_1_1_found = 0; 199static int __initdata shub_1_1_found;
213 200
214/* 201/*
215 * sn_check_for_wars 202 * sn_check_for_wars
@@ -372,6 +359,16 @@ sn_scan_pcdp(void)
372 } 359 }
373} 360}
374 361
362static unsigned long sn2_rtc_initial;
363
364static unsigned long long ia64_sn2_printk_clock(void)
365{
366 unsigned long rtc_now = rtc_time();
367
368 return (rtc_now - sn2_rtc_initial) *
369 (1000000000 / sn_rtc_cycles_per_second);
370}
371
375/** 372/**
376 * sn_setup - SN platform setup routine 373 * sn_setup - SN platform setup routine
377 * @cmdline_p: kernel command line 374 * @cmdline_p: kernel command line
@@ -386,6 +383,7 @@ void __init sn_setup(char **cmdline_p)
386 u32 version = sn_sal_rev(); 383 u32 version = sn_sal_rev();
387 extern void sn_cpu_init(void); 384 extern void sn_cpu_init(void);
388 385
386 sn2_rtc_initial = rtc_time();
389 ia64_sn_plat_set_error_handling_features(); // obsolete 387 ia64_sn_plat_set_error_handling_features(); // obsolete
390 ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV); 388 ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV);
391 ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES); 389 ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES);
@@ -437,19 +435,6 @@ void __init sn_setup(char **cmdline_p)
437 */ 435 */
438 build_cnode_tables(); 436 build_cnode_tables();
439 437
440 /*
441 * Old PROMs do not provide an ACPI FADT. Disable legacy keyboard
442 * support here so we don't have to listen to failed keyboard probe
443 * messages.
444 */
445 if (version <= 0x0209 && acpi_kbd_controller_present) {
446 printk(KERN_INFO "Disabling legacy keyboard support as prom "
447 "is too old and doesn't provide FADT\n");
448 acpi_kbd_controller_present = 0;
449 }
450
451 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
452
453 status = 438 status =
454 ia64_sal_freq_base(SAL_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec, 439 ia64_sal_freq_base(SAL_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec,
455 &drift); 440 &drift);
@@ -463,6 +448,21 @@ void __init sn_setup(char **cmdline_p)
463 448
464 platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR; 449 platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR;
465 450
451 ia64_printk_clock = ia64_sn2_printk_clock;
452
453 /*
454 * Old PROMs do not provide an ACPI FADT. Disable legacy keyboard
455 * support here so we don't have to listen to failed keyboard probe
456 * messages.
457 */
458 if (version <= 0x0209 && acpi_kbd_controller_present) {
459 printk(KERN_INFO "Disabling legacy keyboard support as prom "
460 "is too old and doesn't provide FADT\n");
461 acpi_kbd_controller_present = 0;
462 }
463
464 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
465
466 /* 466 /*
467 * we set the default root device to /dev/hda 467 * we set the default root device to /dev/hda
468 * to make simulation easy 468 * to make simulation easy
@@ -578,13 +578,17 @@ void __init sn_cpu_init(void)
578 sn_prom_type = 2; 578 sn_prom_type = 2;
579 else 579 else
580 sn_prom_type = 1; 580 sn_prom_type = 1;
581 printk("Running on medusa with %s PROM\n", (sn_prom_type == 1) ? "real" : "fake"); 581 printk(KERN_INFO "Running on medusa with %s PROM\n",
582 (sn_prom_type == 1) ? "real" : "fake");
582 } 583 }
583 584
584 memset(pda, 0, sizeof(pda)); 585 memset(pda, 0, sizeof(pda));
585 if (ia64_sn_get_sn_info(0, &sn_hub_info->shub2, &sn_hub_info->nasid_bitmask, &sn_hub_info->nasid_shift, 586 if (ia64_sn_get_sn_info(0, &sn_hub_info->shub2,
586 &sn_system_size, &sn_sharing_domain_size, &sn_partition_id, 587 &sn_hub_info->nasid_bitmask,
587 &sn_coherency_id, &sn_region_size)) 588 &sn_hub_info->nasid_shift,
589 &sn_system_size, &sn_sharing_domain_size,
590 &sn_partition_id, &sn_coherency_id,
591 &sn_region_size))
588 BUG(); 592 BUG();
589 sn_hub_info->as_shift = sn_hub_info->nasid_shift - 2; 593 sn_hub_info->as_shift = sn_hub_info->nasid_shift - 2;
590 594
@@ -716,7 +720,8 @@ void __init build_cnode_tables(void)
716 for_each_online_node(node) { 720 for_each_online_node(node) {
717 kl_config_hdr_t *klgraph_header; 721 kl_config_hdr_t *klgraph_header;
718 nasid = cnodeid_to_nasid(node); 722 nasid = cnodeid_to_nasid(node);
719 if ((klgraph_header = ia64_sn_get_klconfig_addr(nasid)) == NULL) 723 klgraph_header = ia64_sn_get_klconfig_addr(nasid);
724 if (klgraph_header == NULL)
720 BUG(); 725 BUG();
721 brd = NODE_OFFSET_TO_LBOARD(nasid, klgraph_header->ch_board_info); 726 brd = NODE_OFFSET_TO_LBOARD(nasid, klgraph_header->ch_board_info);
722 while (brd) { 727 while (brd) {
@@ -734,7 +739,7 @@ nasid_slice_to_cpuid(int nasid, int slice)
734{ 739{
735 long cpu; 740 long cpu;
736 741
737 for (cpu=0; cpu < NR_CPUS; cpu++) 742 for (cpu = 0; cpu < NR_CPUS; cpu++)
738 if (cpuid_to_nasid(cpu) == nasid && 743 if (cpuid_to_nasid(cpu) == nasid &&
739 cpuid_to_slice(cpu) == slice) 744 cpuid_to_slice(cpu) == slice)
740 return cpu; 745 return cpu;
diff --git a/arch/ia64/sn/kernel/sn2/Makefile b/arch/ia64/sn/kernel/sn2/Makefile
index 170bde4549da..99e177693234 100644
--- a/arch/ia64/sn/kernel/sn2/Makefile
+++ b/arch/ia64/sn/kernel/sn2/Makefile
@@ -9,5 +9,7 @@
9# sn2 specific kernel files 9# sn2 specific kernel files
10# 10#
11 11
12CPPFLAGS += -I$(srctree)/arch/ia64/sn/include
13
12obj-y += cache.o io.o ptc_deadlock.o sn2_smp.o sn_proc_fs.o \ 14obj-y += cache.o io.o ptc_deadlock.o sn2_smp.o sn_proc_fs.o \
13 prominfo_proc.o timer.o timer_interrupt.o sn_hwperf.o 15 prominfo_proc.o timer.o timer_interrupt.o sn_hwperf.o
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c
index 471bbaa65d1b..f153a4c35c70 100644
--- a/arch/ia64/sn/kernel/sn2/sn2_smp.c
+++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c
@@ -5,7 +5,7 @@
5 * License. See the file "COPYING" in the main directory of this archive 5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details. 6 * for more details.
7 * 7 *
8 * Copyright (C) 2000-2005 Silicon Graphics, Inc. All rights reserved. 8 * Copyright (C) 2000-2006 Silicon Graphics, Inc. All rights reserved.
9 */ 9 */
10 10
11#include <linux/init.h> 11#include <linux/init.h>
@@ -46,104 +46,28 @@ DECLARE_PER_CPU(struct ptc_stats, ptcstats);
46 46
47static __cacheline_aligned DEFINE_SPINLOCK(sn2_global_ptc_lock); 47static __cacheline_aligned DEFINE_SPINLOCK(sn2_global_ptc_lock);
48 48
49void sn2_ptc_deadlock_recovery(short *, short, int, volatile unsigned long *, unsigned long data0, 49void sn2_ptc_deadlock_recovery(short *, short, short, int, volatile unsigned long *, unsigned long,
50 volatile unsigned long *, unsigned long data1); 50 volatile unsigned long *, unsigned long);
51 51
52#ifdef DEBUG_PTC
53/* 52/*
54 * ptctest: 53 * Note: some is the following is captured here to make degugging easier
55 * 54 * (the macros make more sense if you see the debug patch - not posted)
56 * xyz - 3 digit hex number:
57 * x - Force PTC purges to use shub:
58 * 0 - no force
59 * 1 - force
60 * y - interupt enable
61 * 0 - disable interrupts
62 * 1 - leave interuupts enabled
63 * z - type of lock:
64 * 0 - global lock
65 * 1 - node local lock
66 * 2 - no lock
67 *
68 * Note: on shub1, only ptctest == 0 is supported. Don't try other values!
69 */ 55 */
70
71static unsigned int sn2_ptctest = 0;
72
73static int __init ptc_test(char *str)
74{
75 get_option(&str, &sn2_ptctest);
76 return 1;
77}
78__setup("ptctest=", ptc_test);
79
80static inline int ptc_lock(unsigned long *flagp)
81{
82 unsigned long opt = sn2_ptctest & 255;
83
84 switch (opt) {
85 case 0x00:
86 spin_lock_irqsave(&sn2_global_ptc_lock, *flagp);
87 break;
88 case 0x01:
89 spin_lock_irqsave(&sn_nodepda->ptc_lock, *flagp);
90 break;
91 case 0x02:
92 local_irq_save(*flagp);
93 break;
94 case 0x10:
95 spin_lock(&sn2_global_ptc_lock);
96 break;
97 case 0x11:
98 spin_lock(&sn_nodepda->ptc_lock);
99 break;
100 case 0x12:
101 break;
102 default:
103 BUG();
104 }
105 return opt;
106}
107
108static inline void ptc_unlock(unsigned long flags, int opt)
109{
110 switch (opt) {
111 case 0x00:
112 spin_unlock_irqrestore(&sn2_global_ptc_lock, flags);
113 break;
114 case 0x01:
115 spin_unlock_irqrestore(&sn_nodepda->ptc_lock, flags);
116 break;
117 case 0x02:
118 local_irq_restore(flags);
119 break;
120 case 0x10:
121 spin_unlock(&sn2_global_ptc_lock);
122 break;
123 case 0x11:
124 spin_unlock(&sn_nodepda->ptc_lock);
125 break;
126 case 0x12:
127 break;
128 default:
129 BUG();
130 }
131}
132#else
133
134#define sn2_ptctest 0 56#define sn2_ptctest 0
57#define local_node_uses_ptc_ga(sh1) ((sh1) ? 1 : 0)
58#define max_active_pio(sh1) ((sh1) ? 32 : 7)
59#define reset_max_active_on_deadlock() 1
60#define PTC_LOCK(sh1) ((sh1) ? &sn2_global_ptc_lock : &sn_nodepda->ptc_lock)
135 61
136static inline int ptc_lock(unsigned long *flagp) 62static inline void ptc_lock(int sh1, unsigned long *flagp)
137{ 63{
138 spin_lock_irqsave(&sn2_global_ptc_lock, *flagp); 64 spin_lock_irqsave(PTC_LOCK(sh1), *flagp);
139 return 0;
140} 65}
141 66
142static inline void ptc_unlock(unsigned long flags, int opt) 67static inline void ptc_unlock(int sh1, unsigned long flags)
143{ 68{
144 spin_unlock_irqrestore(&sn2_global_ptc_lock, flags); 69 spin_unlock_irqrestore(PTC_LOCK(sh1), flags);
145} 70}
146#endif
147 71
148struct ptc_stats { 72struct ptc_stats {
149 unsigned long ptc_l; 73 unsigned long ptc_l;
@@ -151,27 +75,30 @@ struct ptc_stats {
151 unsigned long shub_ptc_flushes; 75 unsigned long shub_ptc_flushes;
152 unsigned long nodes_flushed; 76 unsigned long nodes_flushed;
153 unsigned long deadlocks; 77 unsigned long deadlocks;
78 unsigned long deadlocks2;
154 unsigned long lock_itc_clocks; 79 unsigned long lock_itc_clocks;
155 unsigned long shub_itc_clocks; 80 unsigned long shub_itc_clocks;
156 unsigned long shub_itc_clocks_max; 81 unsigned long shub_itc_clocks_max;
82 unsigned long shub_ptc_flushes_not_my_mm;
157}; 83};
158 84
159static inline unsigned long wait_piowc(void) 85static inline unsigned long wait_piowc(void)
160{ 86{
161 volatile unsigned long *piows, zeroval; 87 volatile unsigned long *piows;
162 unsigned long ws; 88 unsigned long zeroval, ws;
163 89
164 piows = pda->pio_write_status_addr; 90 piows = pda->pio_write_status_addr;
165 zeroval = pda->pio_write_status_val; 91 zeroval = pda->pio_write_status_val;
166 do { 92 do {
167 cpu_relax(); 93 cpu_relax();
168 } while (((ws = *piows) & SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK) != zeroval); 94 } while (((ws = *piows) & SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK) != zeroval);
169 return ws; 95 return (ws & SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK) != 0;
170} 96}
171 97
172void sn_tlb_migrate_finish(struct mm_struct *mm) 98void sn_tlb_migrate_finish(struct mm_struct *mm)
173{ 99{
174 if (mm == current->mm) 100 /* flush_tlb_mm is inefficient if more than 1 users of mm */
101 if (mm == current->mm && mm && atomic_read(&mm->mm_users) == 1)
175 flush_tlb_mm(mm); 102 flush_tlb_mm(mm);
176} 103}
177 104
@@ -201,12 +128,14 @@ void
201sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start, 128sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
202 unsigned long end, unsigned long nbits) 129 unsigned long end, unsigned long nbits)
203{ 130{
204 int i, opt, shub1, cnode, mynasid, cpu, lcpu = 0, nasid, flushed = 0; 131 int i, ibegin, shub1, cnode, mynasid, cpu, lcpu = 0, nasid;
205 int mymm = (mm == current->active_mm && current->mm); 132 int mymm = (mm == current->active_mm && mm == current->mm);
133 int use_cpu_ptcga;
206 volatile unsigned long *ptc0, *ptc1; 134 volatile unsigned long *ptc0, *ptc1;
207 unsigned long itc, itc2, flags, data0 = 0, data1 = 0, rr_value; 135 unsigned long itc, itc2, flags, data0 = 0, data1 = 0, rr_value, old_rr = 0;
208 short nasids[MAX_NUMNODES], nix; 136 short nasids[MAX_NUMNODES], nix;
209 nodemask_t nodes_flushed; 137 nodemask_t nodes_flushed;
138 int active, max_active, deadlock;
210 139
211 nodes_clear(nodes_flushed); 140 nodes_clear(nodes_flushed);
212 i = 0; 141 i = 0;
@@ -267,41 +196,56 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
267 196
268 197
269 mynasid = get_nasid(); 198 mynasid = get_nasid();
199 use_cpu_ptcga = local_node_uses_ptc_ga(shub1);
200 max_active = max_active_pio(shub1);
270 201
271 itc = ia64_get_itc(); 202 itc = ia64_get_itc();
272 opt = ptc_lock(&flags); 203 ptc_lock(shub1, &flags);
273 itc2 = ia64_get_itc(); 204 itc2 = ia64_get_itc();
205
274 __get_cpu_var(ptcstats).lock_itc_clocks += itc2 - itc; 206 __get_cpu_var(ptcstats).lock_itc_clocks += itc2 - itc;
275 __get_cpu_var(ptcstats).shub_ptc_flushes++; 207 __get_cpu_var(ptcstats).shub_ptc_flushes++;
276 __get_cpu_var(ptcstats).nodes_flushed += nix; 208 __get_cpu_var(ptcstats).nodes_flushed += nix;
209 if (!mymm)
210 __get_cpu_var(ptcstats).shub_ptc_flushes_not_my_mm++;
277 211
212 if (use_cpu_ptcga && !mymm) {
213 old_rr = ia64_get_rr(start);
214 ia64_set_rr(start, (old_rr & 0xff) | (rr_value << 8));
215 ia64_srlz_d();
216 }
217
218 wait_piowc();
278 do { 219 do {
279 if (shub1) 220 if (shub1)
280 data1 = start | (1UL << SH1_PTC_1_START_SHFT); 221 data1 = start | (1UL << SH1_PTC_1_START_SHFT);
281 else 222 else
282 data0 = (data0 & ~SH2_PTC_ADDR_MASK) | (start & SH2_PTC_ADDR_MASK); 223 data0 = (data0 & ~SH2_PTC_ADDR_MASK) | (start & SH2_PTC_ADDR_MASK);
283 for (i = 0; i < nix; i++) { 224 deadlock = 0;
225 active = 0;
226 for (ibegin = 0, i = 0; i < nix; i++) {
284 nasid = nasids[i]; 227 nasid = nasids[i];
285 if ((!(sn2_ptctest & 3)) && unlikely(nasid == mynasid && mymm)) { 228 if (use_cpu_ptcga && unlikely(nasid == mynasid)) {
286 ia64_ptcga(start, nbits << 2); 229 ia64_ptcga(start, nbits << 2);
287 ia64_srlz_i(); 230 ia64_srlz_i();
288 } else { 231 } else {
289 ptc0 = CHANGE_NASID(nasid, ptc0); 232 ptc0 = CHANGE_NASID(nasid, ptc0);
290 if (ptc1) 233 if (ptc1)
291 ptc1 = CHANGE_NASID(nasid, ptc1); 234 ptc1 = CHANGE_NASID(nasid, ptc1);
292 pio_atomic_phys_write_mmrs(ptc0, data0, ptc1, 235 pio_atomic_phys_write_mmrs(ptc0, data0, ptc1, data1);
293 data1); 236 active++;
294 flushed = 1; 237 }
238 if (active >= max_active || i == (nix - 1)) {
239 if ((deadlock = wait_piowc())) {
240 sn2_ptc_deadlock_recovery(nasids, ibegin, i, mynasid, ptc0, data0, ptc1, data1);
241 if (reset_max_active_on_deadlock())
242 max_active = 1;
243 }
244 active = 0;
245 ibegin = i + 1;
295 } 246 }
296 } 247 }
297 if (flushed
298 && (wait_piowc() &
299 (SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK))) {
300 sn2_ptc_deadlock_recovery(nasids, nix, mynasid, ptc0, data0, ptc1, data1);
301 }
302
303 start += (1UL << nbits); 248 start += (1UL << nbits);
304
305 } while (start < end); 249 } while (start < end);
306 250
307 itc2 = ia64_get_itc() - itc2; 251 itc2 = ia64_get_itc() - itc2;
@@ -309,7 +253,12 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
309 if (itc2 > __get_cpu_var(ptcstats).shub_itc_clocks_max) 253 if (itc2 > __get_cpu_var(ptcstats).shub_itc_clocks_max)
310 __get_cpu_var(ptcstats).shub_itc_clocks_max = itc2; 254 __get_cpu_var(ptcstats).shub_itc_clocks_max = itc2;
311 255
312 ptc_unlock(flags, opt); 256 if (old_rr) {
257 ia64_set_rr(start, old_rr);
258 ia64_srlz_d();
259 }
260
261 ptc_unlock(shub1, flags);
313 262
314 preempt_enable(); 263 preempt_enable();
315} 264}
@@ -321,27 +270,30 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
321 * TLB flush transaction. The recovery sequence is somewhat tricky & is 270 * TLB flush transaction. The recovery sequence is somewhat tricky & is
322 * coded in assembly language. 271 * coded in assembly language.
323 */ 272 */
324void sn2_ptc_deadlock_recovery(short *nasids, short nix, int mynasid, volatile unsigned long *ptc0, unsigned long data0, 273void sn2_ptc_deadlock_recovery(short *nasids, short ib, short ie, int mynasid, volatile unsigned long *ptc0, unsigned long data0,
325 volatile unsigned long *ptc1, unsigned long data1) 274 volatile unsigned long *ptc1, unsigned long data1)
326{ 275{
327 extern void sn2_ptc_deadlock_recovery_core(volatile unsigned long *, unsigned long, 276 extern unsigned long sn2_ptc_deadlock_recovery_core(volatile unsigned long *, unsigned long,
328 volatile unsigned long *, unsigned long, volatile unsigned long *, unsigned long); 277 volatile unsigned long *, unsigned long, volatile unsigned long *, unsigned long);
329 short nasid, i; 278 short nasid, i;
330 unsigned long *piows, zeroval; 279 unsigned long *piows, zeroval, n;
331 280
332 __get_cpu_var(ptcstats).deadlocks++; 281 __get_cpu_var(ptcstats).deadlocks++;
333 282
334 piows = (unsigned long *) pda->pio_write_status_addr; 283 piows = (unsigned long *) pda->pio_write_status_addr;
335 zeroval = pda->pio_write_status_val; 284 zeroval = pda->pio_write_status_val;
336 285
337 for (i=0; i < nix; i++) { 286
287 for (i=ib; i <= ie; i++) {
338 nasid = nasids[i]; 288 nasid = nasids[i];
339 if (!(sn2_ptctest & 3) && nasid == mynasid) 289 if (local_node_uses_ptc_ga(is_shub1()) && nasid == mynasid)
340 continue; 290 continue;
341 ptc0 = CHANGE_NASID(nasid, ptc0); 291 ptc0 = CHANGE_NASID(nasid, ptc0);
342 if (ptc1) 292 if (ptc1)
343 ptc1 = CHANGE_NASID(nasid, ptc1); 293 ptc1 = CHANGE_NASID(nasid, ptc1);
344 sn2_ptc_deadlock_recovery_core(ptc0, data0, ptc1, data1, piows, zeroval); 294
295 n = sn2_ptc_deadlock_recovery_core(ptc0, data0, ptc1, data1, piows, zeroval);
296 __get_cpu_var(ptcstats).deadlocks2 += n;
345 } 297 }
346 298
347} 299}
@@ -452,20 +404,22 @@ static int sn2_ptc_seq_show(struct seq_file *file, void *data)
452 cpu = *(loff_t *) data; 404 cpu = *(loff_t *) data;
453 405
454 if (!cpu) { 406 if (!cpu) {
455 seq_printf(file, "# ptc_l change_rid shub_ptc_flushes shub_nodes_flushed deadlocks lock_nsec shub_nsec shub_nsec_max\n"); 407 seq_printf(file,
408 "# cpu ptc_l newrid ptc_flushes nodes_flushed deadlocks lock_nsec shub_nsec shub_nsec_max not_my_mm deadlock2\n");
456 seq_printf(file, "# ptctest %d\n", sn2_ptctest); 409 seq_printf(file, "# ptctest %d\n", sn2_ptctest);
457 } 410 }
458 411
459 if (cpu < NR_CPUS && cpu_online(cpu)) { 412 if (cpu < NR_CPUS && cpu_online(cpu)) {
460 stat = &per_cpu(ptcstats, cpu); 413 stat = &per_cpu(ptcstats, cpu);
461 seq_printf(file, "cpu %d %ld %ld %ld %ld %ld %ld %ld %ld\n", cpu, stat->ptc_l, 414 seq_printf(file, "cpu %d %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n", cpu, stat->ptc_l,
462 stat->change_rid, stat->shub_ptc_flushes, stat->nodes_flushed, 415 stat->change_rid, stat->shub_ptc_flushes, stat->nodes_flushed,
463 stat->deadlocks, 416 stat->deadlocks,
464 1000 * stat->lock_itc_clocks / per_cpu(cpu_info, cpu).cyc_per_usec, 417 1000 * stat->lock_itc_clocks / per_cpu(cpu_info, cpu).cyc_per_usec,
465 1000 * stat->shub_itc_clocks / per_cpu(cpu_info, cpu).cyc_per_usec, 418 1000 * stat->shub_itc_clocks / per_cpu(cpu_info, cpu).cyc_per_usec,
466 1000 * stat->shub_itc_clocks_max / per_cpu(cpu_info, cpu).cyc_per_usec); 419 1000 * stat->shub_itc_clocks_max / per_cpu(cpu_info, cpu).cyc_per_usec,
420 stat->shub_ptc_flushes_not_my_mm,
421 stat->deadlocks2);
467 } 422 }
468
469 return 0; 423 return 0;
470} 424}
471 425
@@ -476,7 +430,7 @@ static struct seq_operations sn2_ptc_seq_ops = {
476 .show = sn2_ptc_seq_show 430 .show = sn2_ptc_seq_show
477}; 431};
478 432
479int sn2_ptc_proc_open(struct inode *inode, struct file *file) 433static int sn2_ptc_proc_open(struct inode *inode, struct file *file)
480{ 434{
481 return seq_open(file, &sn2_ptc_seq_ops); 435 return seq_open(file, &sn2_ptc_seq_ops);
482} 436}
diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
index 19b54fbcd7ea..70db21f3df21 100644
--- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c
+++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 2004-2005 Silicon Graphics, Inc. All rights reserved. 6 * Copyright (C) 2004-2006 Silicon Graphics, Inc. All rights reserved.
7 * 7 *
8 * SGI Altix topology and hardware performance monitoring API. 8 * SGI Altix topology and hardware performance monitoring API.
9 * Mark Goodwin <markgw@sgi.com>. 9 * Mark Goodwin <markgw@sgi.com>.
@@ -973,6 +973,9 @@ static int __devinit sn_hwperf_misc_register_init(void)
973{ 973{
974 int e; 974 int e;
975 975
976 if (!ia64_platform_is("sn2"))
977 return 0;
978
976 sn_hwperf_init(); 979 sn_hwperf_init();
977 980
978 /* 981 /*
diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c
index c75f8aeefc2b..9cd460dfe27e 100644
--- a/arch/ia64/sn/kernel/xpc_main.c
+++ b/arch/ia64/sn/kernel/xpc_main.c
@@ -575,18 +575,21 @@ xpc_activate_partition(struct xpc_partition *part)
575 575
576 spin_lock_irqsave(&part->act_lock, irq_flags); 576 spin_lock_irqsave(&part->act_lock, irq_flags);
577 577
578 pid = kernel_thread(xpc_activating, (void *) ((u64) partid), 0);
579
580 DBUG_ON(part->act_state != XPC_P_INACTIVE); 578 DBUG_ON(part->act_state != XPC_P_INACTIVE);
581 579
582 if (pid > 0) { 580 part->act_state = XPC_P_ACTIVATION_REQ;
583 part->act_state = XPC_P_ACTIVATION_REQ; 581 XPC_SET_REASON(part, xpcCloneKThread, __LINE__);
584 XPC_SET_REASON(part, xpcCloneKThread, __LINE__);
585 } else {
586 XPC_SET_REASON(part, xpcCloneKThreadFailed, __LINE__);
587 }
588 582
589 spin_unlock_irqrestore(&part->act_lock, irq_flags); 583 spin_unlock_irqrestore(&part->act_lock, irq_flags);
584
585 pid = kernel_thread(xpc_activating, (void *) ((u64) partid), 0);
586
587 if (unlikely(pid <= 0)) {
588 spin_lock_irqsave(&part->act_lock, irq_flags);
589 part->act_state = XPC_P_INACTIVE;
590 XPC_SET_REASON(part, xpcCloneKThreadFailed, __LINE__);
591 spin_unlock_irqrestore(&part->act_lock, irq_flags);
592 }
590} 593}
591 594
592 595
diff --git a/arch/ia64/sn/pci/Makefile b/arch/ia64/sn/pci/Makefile
index 321576b1b425..c6946784a6a8 100644
--- a/arch/ia64/sn/pci/Makefile
+++ b/arch/ia64/sn/pci/Makefile
@@ -7,4 +7,6 @@
7# 7#
8# Makefile for the sn pci general routines. 8# Makefile for the sn pci general routines.
9 9
10CPPFLAGS += -I$(srctree)/arch/ia64/sn/include
11
10obj-y := pci_dma.o tioca_provider.o tioce_provider.o pcibr/ 12obj-y := pci_dma.o tioca_provider.o tioce_provider.o pcibr/
diff --git a/arch/ia64/sn/pci/pcibr/Makefile b/arch/ia64/sn/pci/pcibr/Makefile
index 1850c4a94c41..3b403ea456f9 100644
--- a/arch/ia64/sn/pci/pcibr/Makefile
+++ b/arch/ia64/sn/pci/pcibr/Makefile
@@ -7,5 +7,7 @@
7# 7#
8# Makefile for the sn2 io routines. 8# Makefile for the sn2 io routines.
9 9
10CPPFLAGS += -I$(srctree)/arch/ia64/sn/include
11
10obj-y += pcibr_dma.o pcibr_reg.o \ 12obj-y += pcibr_dma.o pcibr_reg.o \
11 pcibr_ate.o pcibr_provider.o 13 pcibr_ate.o pcibr_provider.o
diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c
index dbc8a392105f..be8b711367ec 100644
--- a/arch/m32r/kernel/m32r_ksyms.c
+++ b/arch/m32r/kernel/m32r_ksyms.c
@@ -18,11 +18,6 @@
18#include <asm/irq.h> 18#include <asm/irq.h>
19#include <asm/tlbflush.h> 19#include <asm/tlbflush.h>
20 20
21#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
22extern struct drive_info_struct drive_info;
23EXPORT_SYMBOL(drive_info);
24#endif
25
26/* platform dependent support */ 21/* platform dependent support */
27EXPORT_SYMBOL(boot_cpu_data); 22EXPORT_SYMBOL(boot_cpu_data);
28EXPORT_SYMBOL(dump_fpu); 23EXPORT_SYMBOL(dump_fpu);
diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c
index c2e4dccf0112..d742037a7ccb 100644
--- a/arch/m32r/kernel/setup.c
+++ b/arch/m32r/kernel/setup.c
@@ -37,12 +37,6 @@
37extern void init_mmu(void); 37extern void init_mmu(void);
38#endif 38#endif
39 39
40#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) \
41 || defined(CONFIG_BLK_DEV_IDE_MODULE) \
42 || defined(CONFIG_BLK_DEV_HD_MODULE)
43struct drive_info_struct { char dummy[32]; } drive_info;
44#endif
45
46extern char _end[]; 40extern char _end[];
47 41
48/* 42/*
diff --git a/arch/m68knommu/kernel/process.c b/arch/m68knommu/kernel/process.c
index 99bf43824795..63c117dae0c3 100644
--- a/arch/m68knommu/kernel/process.c
+++ b/arch/m68knommu/kernel/process.c
@@ -39,6 +39,14 @@
39 39
40asmlinkage void ret_from_fork(void); 40asmlinkage void ret_from_fork(void);
41 41
42/*
43 * The following aren't currently used.
44 */
45void (*pm_idle)(void);
46EXPORT_SYMBOL(pm_idle);
47
48void (*pm_power_off)(void);
49EXPORT_SYMBOL(pm_power_off);
42 50
43/* 51/*
44 * The idle loop on an m68knommu.. 52 * The idle loop on an m68knommu..
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index c3e852e9953e..767de847b4ab 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -595,6 +595,7 @@ config SGI_IP32
595 select SYS_HAS_CPU_R5000 595 select SYS_HAS_CPU_R5000
596 select SYS_HAS_CPU_R10000 if BROKEN 596 select SYS_HAS_CPU_R10000 if BROKEN
597 select SYS_HAS_CPU_RM7000 597 select SYS_HAS_CPU_RM7000
598 select SYS_HAS_CPU_NEVADA
598 select SYS_SUPPORTS_64BIT_KERNEL 599 select SYS_SUPPORTS_64BIT_KERNEL
599 select SYS_SUPPORTS_BIG_ENDIAN 600 select SYS_SUPPORTS_BIG_ENDIAN
600 help 601 help
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 2a9f2ef27b29..6a57407df1bc 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -53,14 +53,17 @@ CROSS_COMPILE := $(tool-prefix)
53endif 53endif
54 54
55CHECKFLAGS-y += -D__linux__ -D__mips__ \ 55CHECKFLAGS-y += -D__linux__ -D__mips__ \
56 -D_MIPS_SZINT=32 \
56 -D_ABIO32=1 \ 57 -D_ABIO32=1 \
57 -D_ABIN32=2 \ 58 -D_ABIN32=2 \
58 -D_ABI64=3 59 -D_ABI64=3
59CHECKFLAGS-$(CONFIG_32BIT) += -D_MIPS_SIM=_ABIO32 \ 60CHECKFLAGS-$(CONFIG_32BIT) += -D_MIPS_SIM=_ABIO32 \
60 -D_MIPS_SZLONG=32 \ 61 -D_MIPS_SZLONG=32 \
62 -D_MIPS_SZPTR=32 \
61 -D__PTRDIFF_TYPE__=int 63 -D__PTRDIFF_TYPE__=int
62CHECKFLAGS-$(CONFIG_64BIT) += -m64 -D_MIPS_SIM=_ABI64 \ 64CHECKFLAGS-$(CONFIG_64BIT) += -m64 -D_MIPS_SIM=_ABI64 \
63 -D_MIPS_SZLONG=64 \ 65 -D_MIPS_SZLONG=64 \
66 -D_MIPS_SZPTR=64 \
64 -D__PTRDIFF_TYPE__="long int" 67 -D__PTRDIFF_TYPE__="long int"
65CHECKFLAGS-$(CONFIG_CPU_BIG_ENDIAN) += -D__MIPSEB__ 68CHECKFLAGS-$(CONFIG_CPU_BIG_ENDIAN) += -D__MIPSEB__
66CHECKFLAGS-$(CONFIG_CPU_LITTLE_ENDIAN) += -D__MIPSEL__ 69CHECKFLAGS-$(CONFIG_CPU_LITTLE_ENDIAN) += -D__MIPSEL__
@@ -166,79 +169,97 @@ echo $$gcc_abi $$gcc_opt$$gcc_cpu $$gcc_isa $$gas_abi $$gas_opt$$gas_cpu $$gas_i
166# 169#
167cflags-$(CONFIG_CPU_R3000) += \ 170cflags-$(CONFIG_CPU_R3000) += \
168 $(call set_gccflags,r3000,mips1,r3000,mips1,mips1) 171 $(call set_gccflags,r3000,mips1,r3000,mips1,mips1)
172CHECKFLAGS-$(CONFIG_CPU_R3000) += -D_MIPS_ISA=_MIPS_ISA_MIPS1
169 173
170cflags-$(CONFIG_CPU_TX39XX) += \ 174cflags-$(CONFIG_CPU_TX39XX) += \
171 $(call set_gccflags,r3900,mips1,r3000,mips1,mips1) 175 $(call set_gccflags,r3900,mips1,r3000,mips1,mips1)
176CHECKFLAGS-$(CONFIG_CPU_TX39XX) += -D_MIPS_ISA=_MIPS_ISA_MIPS1
172 177
173cflags-$(CONFIG_CPU_R6000) += \ 178cflags-$(CONFIG_CPU_R6000) += \
174 $(call set_gccflags,r6000,mips2,r6000,mips2,mips2) \ 179 $(call set_gccflags,r6000,mips2,r6000,mips2,mips2) \
175 -Wa,--trap 180 -Wa,--trap
181CHECKFLAGS-$(CONFIG_CPU_R6000) += -D_MIPS_ISA=_MIPS_ISA_MIPS2
176 182
177cflags-$(CONFIG_CPU_R4300) += \ 183cflags-$(CONFIG_CPU_R4300) += \
178 $(call set_gccflags,r4300,mips3,r4300,mips3,mips2) \ 184 $(call set_gccflags,r4300,mips3,r4300,mips3,mips2) \
179 -Wa,--trap 185 -Wa,--trap
186CHECKFLAGS-$(CONFIG_CPU_R4300) += -D_MIPS_ISA=_MIPS_ISA_MIPS3
180 187
181cflags-$(CONFIG_CPU_VR41XX) += \ 188cflags-$(CONFIG_CPU_VR41XX) += \
182 $(call set_gccflags,r4100,mips3,r4600,mips3,mips2) \ 189 $(call set_gccflags,r4100,mips3,r4600,mips3,mips2) \
183 -Wa,--trap 190 -Wa,--trap
191CHECKFLAGS-$(CONFIG_CPU_VR41XX) += -D_MIPS_ISA=_MIPS_ISA_MIPS3
184 192
185cflags-$(CONFIG_CPU_R4X00) += \ 193cflags-$(CONFIG_CPU_R4X00) += \
186 $(call set_gccflags,r4600,mips3,r4600,mips3,mips2) \ 194 $(call set_gccflags,r4600,mips3,r4600,mips3,mips2) \
187 -Wa,--trap 195 -Wa,--trap
196CHECKFLAGS-$(CONFIG_CPU_R4X00) += -D_MIPS_ISA=_MIPS_ISA_MIPS3
188 197
189cflags-$(CONFIG_CPU_TX49XX) += \ 198cflags-$(CONFIG_CPU_TX49XX) += \
190 $(call set_gccflags,r4600,mips3,r4600,mips3,mips2) \ 199 $(call set_gccflags,r4600,mips3,r4600,mips3,mips2) \
191 -Wa,--trap 200 -Wa,--trap
201CHECKFLAGS-$(CONFIG_CPU_TX49XX) += -D_MIPS_ISA=_MIPS_ISA_MIPS3
192 202
193cflags-$(CONFIG_CPU_MIPS32_R1) += \ 203cflags-$(CONFIG_CPU_MIPS32_R1) += \
194 $(call set_gccflags,mips32,mips32,r4600,mips3,mips2) \ 204 $(call set_gccflags,mips32,mips32,r4600,mips3,mips2) \
195 -Wa,--trap 205 -Wa,--trap
206CHECKFLAGS-$(CONFIG_CPU_MIPS32_R1) += -D_MIPS_ISA=_MIPS_ISA_MIPS32
196 207
197cflags-$(CONFIG_CPU_MIPS32_R2) += \ 208cflags-$(CONFIG_CPU_MIPS32_R2) += \
198 $(call set_gccflags,mips32r2,mips32r2,r4600,mips3,mips2) \ 209 $(call set_gccflags,mips32r2,mips32r2,r4600,mips3,mips2) \
199 -Wa,--trap 210 -Wa,--trap
211CHECKFLAGS-$(CONFIG_CPU_MIPS32_R2) += -D_MIPS_ISA=_MIPS_ISA_MIPS32
200 212
201cflags-$(CONFIG_CPU_MIPS64_R1) += \ 213cflags-$(CONFIG_CPU_MIPS64_R1) += \
202 $(call set_gccflags,mips64,mips64,r4600,mips3,mips2) \ 214 $(call set_gccflags,mips64,mips64,r4600,mips3,mips2) \
203 -Wa,--trap 215 -Wa,--trap
216CHECKFLAGS-$(CONFIG_CPU_MIPS64_R1) += -D_MIPS_ISA=_MIPS_ISA_MIPS64
204 217
205cflags-$(CONFIG_CPU_MIPS64_R2) += \ 218cflags-$(CONFIG_CPU_MIPS64_R2) += \
206 $(call set_gccflags,mips64r2,mips64r2,r4600,mips3,mips2) \ 219 $(call set_gccflags,mips64r2,mips64r2,r4600,mips3,mips2) \
207 -Wa,--trap 220 -Wa,--trap
221CHECKFLAGS-$(CONFIG_CPU_MIPS64_R2) += -D_MIPS_ISA=_MIPS_ISA_MIPS64
208 222
209cflags-$(CONFIG_CPU_R5000) += \ 223cflags-$(CONFIG_CPU_R5000) += \
210 $(call set_gccflags,r5000,mips4,r5000,mips4,mips2) \ 224 $(call set_gccflags,r5000,mips4,r5000,mips4,mips2) \
211 -Wa,--trap 225 -Wa,--trap
226CHECKFLAGS-$(CONFIG_CPU_R5000) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
212 227
213cflags-$(CONFIG_CPU_R5432) += \ 228cflags-$(CONFIG_CPU_R5432) += \
214 $(call set_gccflags,r5400,mips4,r5000,mips4,mips2) \ 229 $(call set_gccflags,r5400,mips4,r5000,mips4,mips2) \
215 -Wa,--trap 230 -Wa,--trap
231CHECKFLAGS-$(CONFIG_CPU_R5432) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
216 232
217cflags-$(CONFIG_CPU_NEVADA) += \ 233cflags-$(CONFIG_CPU_NEVADA) += \
218 $(call set_gccflags,rm5200,mips4,r5000,mips4,mips2) \ 234 $(call set_gccflags,rm5200,mips4,r5000,mips4,mips2) \
219 -Wa,--trap 235 -Wa,--trap
220# $(call cc-option,-mmad) 236CHECKFLAGS-$(CONFIG_CPU_NEVADA) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
221 237
222cflags-$(CONFIG_CPU_RM7000) += \ 238cflags-$(CONFIG_CPU_RM7000) += \
223 $(call set_gccflags,rm7000,mips4,r5000,mips4,mips2) \ 239 $(call set_gccflags,rm7000,mips4,r5000,mips4,mips2) \
224 -Wa,--trap 240 -Wa,--trap
241CHECKFLAGS-$(CONFIG_CPU_RM7000) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
225 242
226cflags-$(CONFIG_CPU_RM9000) += \ 243cflags-$(CONFIG_CPU_RM9000) += \
227 $(call set_gccflags,rm9000,mips4,r5000,mips4,mips2) \ 244 $(call set_gccflags,rm9000,mips4,r5000,mips4,mips2) \
228 -Wa,--trap 245 -Wa,--trap
246CHECKFLAGS-$(CONFIG_CPU_RM9000) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
229 247
230 248
231cflags-$(CONFIG_CPU_SB1) += \ 249cflags-$(CONFIG_CPU_SB1) += \
232 $(call set_gccflags,sb1,mips64,r5000,mips4,mips2) \ 250 $(call set_gccflags,sb1,mips64,r5000,mips4,mips2) \
233 -Wa,--trap 251 -Wa,--trap
252CHECKFLAGS-$(CONFIG_CPU_SB1) += -D_MIPS_ISA=_MIPS_ISA_MIPS64
234 253
235cflags-$(CONFIG_CPU_R8000) += \ 254cflags-$(CONFIG_CPU_R8000) += \
236 $(call set_gccflags,r8000,mips4,r8000,mips4,mips2) \ 255 $(call set_gccflags,r8000,mips4,r8000,mips4,mips2) \
237 -Wa,--trap 256 -Wa,--trap
257CHECKFLAGS-$(CONFIG_CPU_R8000) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
238 258
239cflags-$(CONFIG_CPU_R10000) += \ 259cflags-$(CONFIG_CPU_R10000) += \
240 $(call set_gccflags,r10000,mips4,r8000,mips4,mips2) \ 260 $(call set_gccflags,r10000,mips4,r8000,mips4,mips2) \
241 -Wa,--trap 261 -Wa,--trap
262CHECKFLAGS-$(CONFIG_CPU_R10000) += -D_MIPS_ISA=_MIPS_ISA_MIPS4
242 263
243ifdef CONFIG_CPU_SB1 264ifdef CONFIG_CPU_SB1
244ifdef CONFIG_SB1_PASS_1_WORKAROUNDS 265ifdef CONFIG_SB1_PASS_1_WORKAROUNDS
@@ -369,7 +390,7 @@ load-$(CONFIG_MIPS_XXS1500) += 0xffffffff80100000
369# Cobalt Server 390# Cobalt Server
370# 391#
371core-$(CONFIG_MIPS_COBALT) += arch/mips/cobalt/ 392core-$(CONFIG_MIPS_COBALT) += arch/mips/cobalt/
372cflags-$(CONFIG_MIPS_COBALT) += -Iinclude/asm-mips/cobalt 393cflags-$(CONFIG_MIPS_COBALT) += -Iinclude/asm-mips/mach-cobalt
373load-$(CONFIG_MIPS_COBALT) += 0xffffffff80080000 394load-$(CONFIG_MIPS_COBALT) += 0xffffffff80080000
374 395
375# 396#
diff --git a/arch/mips/au1000/common/reset.c b/arch/mips/au1000/common/reset.c
index 65b84db800e4..4ffccedf5967 100644
--- a/arch/mips/au1000/common/reset.c
+++ b/arch/mips/au1000/common/reset.c
@@ -151,7 +151,7 @@ void au1000_restart(char *command)
151 } 151 }
152 152
153 set_c0_status(ST0_BEV | ST0_ERL); 153 set_c0_status(ST0_BEV | ST0_ERL);
154 set_c0_config(CONF_CM_UNCACHED); 154 change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
155 flush_cache_all(); 155 flush_cache_all();
156 write_c0_wired(0); 156 write_c0_wired(0);
157 157
diff --git a/arch/mips/au1000/common/setup.c b/arch/mips/au1000/common/setup.c
index 08c8c855cc9c..eb155c071aa6 100644
--- a/arch/mips/au1000/common/setup.c
+++ b/arch/mips/au1000/common/setup.c
@@ -33,6 +33,7 @@
33#include <linux/delay.h> 33#include <linux/delay.h>
34#include <linux/interrupt.h> 34#include <linux/interrupt.h>
35#include <linux/module.h> 35#include <linux/module.h>
36#include <linux/pm.h>
36 37
37#include <asm/cpu.h> 38#include <asm/cpu.h>
38#include <asm/bootinfo.h> 39#include <asm/bootinfo.h>
@@ -125,7 +126,7 @@ void __init plat_setup(void)
125#endif 126#endif
126 _machine_restart = au1000_restart; 127 _machine_restart = au1000_restart;
127 _machine_halt = au1000_halt; 128 _machine_halt = au1000_halt;
128 _machine_power_off = au1000_power_off; 129 pm_power_off = au1000_power_off;
129 board_time_init = au1xxx_time_init; 130 board_time_init = au1xxx_time_init;
130 board_timer_setup = au1xxx_timer_setup; 131 board_timer_setup = au1xxx_timer_setup;
131 132
diff --git a/arch/mips/cobalt/int-handler.S b/arch/mips/cobalt/int-handler.S
index f92608e8d84f..e75d5e3ca868 100644
--- a/arch/mips/cobalt/int-handler.S
+++ b/arch/mips/cobalt/int-handler.S
@@ -8,7 +8,7 @@
8 */ 8 */
9#include <asm/asm.h> 9#include <asm/asm.h>
10#include <asm/mipsregs.h> 10#include <asm/mipsregs.h>
11#include <asm/cobalt/cobalt.h> 11#include <asm/mach-cobalt/cobalt.h>
12#include <asm/regdef.h> 12#include <asm/regdef.h>
13#include <asm/stackframe.h> 13#include <asm/stackframe.h>
14 14
diff --git a/arch/mips/cobalt/irq.c b/arch/mips/cobalt/irq.c
index 0d90851f925e..f9a108820d6e 100644
--- a/arch/mips/cobalt/irq.c
+++ b/arch/mips/cobalt/irq.c
@@ -18,7 +18,7 @@
18#include <asm/gt64120.h> 18#include <asm/gt64120.h>
19#include <asm/ptrace.h> 19#include <asm/ptrace.h>
20 20
21#include <asm/cobalt/cobalt.h> 21#include <asm/mach-cobalt/cobalt.h>
22 22
23extern void cobalt_handle_int(void); 23extern void cobalt_handle_int(void);
24 24
diff --git a/arch/mips/cobalt/reset.c b/arch/mips/cobalt/reset.c
index 805a0e88507b..753dfccae6fa 100644
--- a/arch/mips/cobalt/reset.c
+++ b/arch/mips/cobalt/reset.c
@@ -16,7 +16,7 @@
16#include <asm/reboot.h> 16#include <asm/reboot.h>
17#include <asm/system.h> 17#include <asm/system.h>
18#include <asm/mipsregs.h> 18#include <asm/mipsregs.h>
19#include <asm/cobalt/cobalt.h> 19#include <asm/mach-cobalt/cobalt.h>
20 20
21void cobalt_machine_halt(void) 21void cobalt_machine_halt(void)
22{ 22{
diff --git a/arch/mips/cobalt/setup.c b/arch/mips/cobalt/setup.c
index d358a118fa31..b9713a723053 100644
--- a/arch/mips/cobalt/setup.c
+++ b/arch/mips/cobalt/setup.c
@@ -5,7 +5,7 @@
5 * License. See the file "COPYING" in the main directory of this archive 5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details. 6 * for more details.
7 * 7 *
8 * Copyright (C) 1996, 1997, 2004 by Ralf Baechle (ralf@linux-mips.org) 8 * Copyright (C) 1996, 1997, 2004, 05 by Ralf Baechle (ralf@linux-mips.org)
9 * Copyright (C) 2001, 2002, 2003 by Liam Davies (ldavies@agile.tv) 9 * Copyright (C) 2001, 2002, 2003 by Liam Davies (ldavies@agile.tv)
10 * 10 *
11 */ 11 */
@@ -13,6 +13,7 @@
13#include <linux/interrupt.h> 13#include <linux/interrupt.h>
14#include <linux/pci.h> 14#include <linux/pci.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/pm.h>
16#include <linux/serial.h> 17#include <linux/serial.h>
17#include <linux/serial_core.h> 18#include <linux/serial_core.h>
18 19
@@ -25,7 +26,7 @@
25#include <asm/gt64120.h> 26#include <asm/gt64120.h>
26#include <asm/serial.h> 27#include <asm/serial.h>
27 28
28#include <asm/cobalt/cobalt.h> 29#include <asm/mach-cobalt/cobalt.h>
29 30
30extern void cobalt_machine_restart(char *command); 31extern void cobalt_machine_restart(char *command);
31extern void cobalt_machine_halt(void); 32extern void cobalt_machine_halt(void);
@@ -99,7 +100,7 @@ void __init plat_setup(void)
99 100
100 _machine_restart = cobalt_machine_restart; 101 _machine_restart = cobalt_machine_restart;
101 _machine_halt = cobalt_machine_halt; 102 _machine_halt = cobalt_machine_halt;
102 _machine_power_off = cobalt_machine_power_off; 103 pm_power_off = cobalt_machine_power_off;
103 104
104 board_timer_setup = cobalt_timer_setup; 105 board_timer_setup = cobalt_timer_setup;
105 106
@@ -139,7 +140,7 @@ void __init plat_setup(void)
139 uart.type = PORT_UNKNOWN; 140 uart.type = PORT_UNKNOWN;
140 uart.uartclk = 18432000; 141 uart.uartclk = 18432000;
141 uart.irq = COBALT_SERIAL_IRQ; 142 uart.irq = COBALT_SERIAL_IRQ;
142 uart.flags = STD_COM_FLAGS; 143 uart.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
143 uart.iobase = 0xc800000; 144 uart.iobase = 0xc800000;
144 uart.iotype = UPIO_PORT; 145 uart.iotype = UPIO_PORT;
145 146
diff --git a/arch/mips/configs/ip32_defconfig b/arch/mips/configs/ip32_defconfig
index 967e7acd8e1f..a34db6e82b27 100644
--- a/arch/mips/configs/ip32_defconfig
+++ b/arch/mips/configs/ip32_defconfig
@@ -102,6 +102,7 @@ CONFIG_CPU_R5000=y
102# CONFIG_CPU_RM9000 is not set 102# CONFIG_CPU_RM9000 is not set
103# CONFIG_CPU_SB1 is not set 103# CONFIG_CPU_SB1 is not set
104CONFIG_SYS_HAS_CPU_R5000=y 104CONFIG_SYS_HAS_CPU_R5000=y
105CONFIG_SYS_HAS_CPU_NEVADA=y
105CONFIG_SYS_HAS_CPU_RM7000=y 106CONFIG_SYS_HAS_CPU_RM7000=y
106CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y 107CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
107CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y 108CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
diff --git a/arch/mips/configs/qemu_defconfig b/arch/mips/configs/qemu_defconfig
index dee44606164c..c02becab850b 100644
--- a/arch/mips/configs/qemu_defconfig
+++ b/arch/mips/configs/qemu_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.15-rc2 3# Linux kernel version: 2.6.16-rc2
4# Thu Nov 24 01:07:00 2005 4# Fri Feb 3 17:14:27 2006
5# 5#
6CONFIG_MIPS=y 6CONFIG_MIPS=y
7 7
@@ -147,26 +147,27 @@ CONFIG_LOCALVERSION_AUTO=y
147# CONFIG_BSD_PROCESS_ACCT is not set 147# CONFIG_BSD_PROCESS_ACCT is not set
148# CONFIG_SYSCTL is not set 148# CONFIG_SYSCTL is not set
149# CONFIG_AUDIT is not set 149# CONFIG_AUDIT is not set
150# CONFIG_HOTPLUG is not set
151CONFIG_KOBJECT_UEVENT=y
152# CONFIG_IKCONFIG is not set 150# CONFIG_IKCONFIG is not set
153CONFIG_INITRAMFS_SOURCE="" 151CONFIG_INITRAMFS_SOURCE=""
154CONFIG_EMBEDDED=y 152CONFIG_EMBEDDED=y
155CONFIG_KALLSYMS=y 153CONFIG_KALLSYMS=y
156# CONFIG_KALLSYMS_EXTRA_PASS is not set 154# CONFIG_KALLSYMS_EXTRA_PASS is not set
155# CONFIG_HOTPLUG is not set
157CONFIG_PRINTK=y 156CONFIG_PRINTK=y
158# CONFIG_BUG is not set 157# CONFIG_BUG is not set
158CONFIG_ELF_CORE=y
159# CONFIG_BASE_FULL is not set 159# CONFIG_BASE_FULL is not set
160# CONFIG_FUTEX is not set 160# CONFIG_FUTEX is not set
161# CONFIG_EPOLL is not set 161# CONFIG_EPOLL is not set
162# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
163# CONFIG_SHMEM is not set 162# CONFIG_SHMEM is not set
164CONFIG_CC_ALIGN_FUNCTIONS=0 163CONFIG_CC_ALIGN_FUNCTIONS=0
165CONFIG_CC_ALIGN_LABELS=0 164CONFIG_CC_ALIGN_LABELS=0
166CONFIG_CC_ALIGN_LOOPS=0 165CONFIG_CC_ALIGN_LOOPS=0
167CONFIG_CC_ALIGN_JUMPS=0 166CONFIG_CC_ALIGN_JUMPS=0
167CONFIG_SLAB=y
168CONFIG_TINY_SHMEM=y 168CONFIG_TINY_SHMEM=y
169CONFIG_BASE_SMALL=1 169CONFIG_BASE_SMALL=1
170# CONFIG_SLOB is not set
170 171
171# 172#
172# Loadable module support 173# Loadable module support
@@ -266,11 +267,7 @@ CONFIG_TCP_CONG_BIC=y
266# CONFIG_HAMRADIO is not set 267# CONFIG_HAMRADIO is not set
267# CONFIG_IRDA is not set 268# CONFIG_IRDA is not set
268# CONFIG_BT is not set 269# CONFIG_BT is not set
269CONFIG_IEEE80211=y 270# CONFIG_IEEE80211 is not set
270# CONFIG_IEEE80211_DEBUG is not set
271CONFIG_IEEE80211_CRYPT_WEP=y
272CONFIG_IEEE80211_CRYPT_CCMP=y
273CONFIG_IEEE80211_CRYPT_TKIP=y
274 271
275# 272#
276# Device Drivers 273# Device Drivers
@@ -323,7 +320,7 @@ CONFIG_BLK_DEV_RAM_COUNT=16
323# 320#
324# SCSI device support 321# SCSI device support
325# 322#
326CONFIG_RAID_ATTRS=y 323# CONFIG_RAID_ATTRS is not set
327# CONFIG_SCSI is not set 324# CONFIG_SCSI is not set
328 325
329# 326#
@@ -366,24 +363,16 @@ CONFIG_NETDEVICES=y
366# 363#
367# PHY device support 364# PHY device support
368# 365#
369CONFIG_PHYLIB=y 366# CONFIG_PHYLIB is not set
370
371#
372# MII PHY device drivers
373#
374CONFIG_MARVELL_PHY=y
375CONFIG_DAVICOM_PHY=y
376CONFIG_QSEMI_PHY=y
377CONFIG_LXT_PHY=y
378CONFIG_CICADA_PHY=y
379 367
380# 368#
381# Ethernet (10 or 100Mbit) 369# Ethernet (10 or 100Mbit)
382# 370#
383CONFIG_NET_ETHERNET=y 371CONFIG_NET_ETHERNET=y
384CONFIG_MII=y 372# CONFIG_MII is not set
385# CONFIG_NET_VENDOR_3COM is not set 373# CONFIG_NET_VENDOR_3COM is not set
386# CONFIG_NET_VENDOR_SMC is not set 374# CONFIG_NET_VENDOR_SMC is not set
375# CONFIG_DM9000 is not set
387# CONFIG_NET_VENDOR_RACAL is not set 376# CONFIG_NET_VENDOR_RACAL is not set
388# CONFIG_DEPCA is not set 377# CONFIG_DEPCA is not set
389# CONFIG_HP100 is not set 378# CONFIG_HP100 is not set
@@ -479,6 +468,7 @@ CONFIG_HW_CONSOLE=y
479CONFIG_SERIAL_8250=y 468CONFIG_SERIAL_8250=y
480CONFIG_SERIAL_8250_CONSOLE=y 469CONFIG_SERIAL_8250_CONSOLE=y
481CONFIG_SERIAL_8250_NR_UARTS=4 470CONFIG_SERIAL_8250_NR_UARTS=4
471CONFIG_SERIAL_8250_RUNTIME_UARTS=4
482# CONFIG_SERIAL_8250_EXTENDED is not set 472# CONFIG_SERIAL_8250_EXTENDED is not set
483 473
484# 474#
@@ -518,6 +508,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y
518# CONFIG_I2C is not set 508# CONFIG_I2C is not set
519 509
520# 510#
511# SPI support
512#
513# CONFIG_SPI is not set
514# CONFIG_SPI_MASTER is not set
515
516#
521# Dallas's 1-wire bus 517# Dallas's 1-wire bus
522# 518#
523# CONFIG_W1 is not set 519# CONFIG_W1 is not set
@@ -592,11 +588,14 @@ CONFIG_DUMMY_CONSOLE=y
592# 588#
593 589
594# 590#
591# EDAC - error detection and reporting (RAS)
592#
593
594#
595# File systems 595# File systems
596# 596#
597# CONFIG_EXT2_FS is not set 597# CONFIG_EXT2_FS is not set
598# CONFIG_EXT3_FS is not set 598# CONFIG_EXT3_FS is not set
599# CONFIG_JBD is not set
600# CONFIG_REISERFS_FS is not set 599# CONFIG_REISERFS_FS is not set
601# CONFIG_JFS_FS is not set 600# CONFIG_JFS_FS is not set
602# CONFIG_FS_POSIX_ACL is not set 601# CONFIG_FS_POSIX_ACL is not set
@@ -677,6 +676,7 @@ CONFIG_MSDOS_PARTITION=y
677# Kernel hacking 676# Kernel hacking
678# 677#
679# CONFIG_PRINTK_TIME is not set 678# CONFIG_PRINTK_TIME is not set
679# CONFIG_MAGIC_SYSRQ is not set
680# CONFIG_DEBUG_KERNEL is not set 680# CONFIG_DEBUG_KERNEL is not set
681CONFIG_LOG_BUF_SHIFT=14 681CONFIG_LOG_BUF_SHIFT=14
682CONFIG_CROSSCOMPILE=y 682CONFIG_CROSSCOMPILE=y
@@ -690,31 +690,7 @@ CONFIG_CMDLINE="console=ttyS0 debug ip=172.20.0.2:172.20.0.1::255.255.0.0"
690# 690#
691# Cryptographic options 691# Cryptographic options
692# 692#
693CONFIG_CRYPTO=y 693# CONFIG_CRYPTO is not set
694CONFIG_CRYPTO_HMAC=y
695CONFIG_CRYPTO_NULL=y
696CONFIG_CRYPTO_MD4=y
697CONFIG_CRYPTO_MD5=y
698CONFIG_CRYPTO_SHA1=y
699CONFIG_CRYPTO_SHA256=y
700CONFIG_CRYPTO_SHA512=y
701CONFIG_CRYPTO_WP512=y
702CONFIG_CRYPTO_TGR192=y
703CONFIG_CRYPTO_DES=y
704CONFIG_CRYPTO_BLOWFISH=y
705CONFIG_CRYPTO_TWOFISH=y
706CONFIG_CRYPTO_SERPENT=y
707CONFIG_CRYPTO_AES=y
708CONFIG_CRYPTO_CAST5=y
709CONFIG_CRYPTO_CAST6=y
710CONFIG_CRYPTO_TEA=y
711CONFIG_CRYPTO_ARC4=y
712CONFIG_CRYPTO_KHAZAD=y
713CONFIG_CRYPTO_ANUBIS=y
714CONFIG_CRYPTO_DEFLATE=y
715CONFIG_CRYPTO_MICHAEL_MIC=y
716CONFIG_CRYPTO_CRC32C=y
717# CONFIG_CRYPTO_TEST is not set
718 694
719# 695#
720# Hardware crypto devices 696# Hardware crypto devices
@@ -724,8 +700,6 @@ CONFIG_CRYPTO_CRC32C=y
724# Library routines 700# Library routines
725# 701#
726# CONFIG_CRC_CCITT is not set 702# CONFIG_CRC_CCITT is not set
727CONFIG_CRC16=y 703# CONFIG_CRC16 is not set
728CONFIG_CRC32=y 704CONFIG_CRC32=y
729CONFIG_LIBCRC32C=y 705# CONFIG_LIBCRC32C is not set
730CONFIG_ZLIB_INFLATE=y
731CONFIG_ZLIB_DEFLATE=y
diff --git a/arch/mips/ddb5xxx/ddb5074/setup.c b/arch/mips/ddb5xxx/ddb5074/setup.c
index 11535be265b9..91456b068c2e 100644
--- a/arch/mips/ddb5xxx/ddb5074/setup.c
+++ b/arch/mips/ddb5xxx/ddb5074/setup.c
@@ -14,6 +14,7 @@
14#include <linux/ide.h> 14#include <linux/ide.h>
15#include <linux/ioport.h> 15#include <linux/ioport.h>
16#include <linux/irq.h> 16#include <linux/irq.h>
17#include <linux/pm.h>
17 18
18#include <asm/addrspace.h> 19#include <asm/addrspace.h>
19#include <asm/bcache.h> 20#include <asm/bcache.h>
@@ -95,7 +96,7 @@ void __init plat_setup(void)
95 96
96 _machine_restart = ddb_machine_restart; 97 _machine_restart = ddb_machine_restart;
97 _machine_halt = ddb_machine_halt; 98 _machine_halt = ddb_machine_halt;
98 _machine_power_off = ddb_machine_power_off; 99 pm_power_off = ddb_machine_power_off;
99 100
100 ddb_out32(DDB_BAR0, 0); 101 ddb_out32(DDB_BAR0, 0);
101 102
diff --git a/arch/mips/ddb5xxx/ddb5476/setup.c b/arch/mips/ddb5xxx/ddb5476/setup.c
index f4e480a74edf..c902adef5942 100644
--- a/arch/mips/ddb5xxx/ddb5476/setup.c
+++ b/arch/mips/ddb5xxx/ddb5476/setup.c
@@ -11,6 +11,7 @@
11#include <linux/types.h> 11#include <linux/types.h>
12#include <linux/sched.h> 12#include <linux/sched.h>
13#include <linux/pci.h> 13#include <linux/pci.h>
14#include <linux/pm.h>
14 15
15#include <asm/addrspace.h> 16#include <asm/addrspace.h>
16#include <asm/bcache.h> 17#include <asm/bcache.h>
@@ -133,7 +134,7 @@ void __init plat_setup(void)
133 134
134 _machine_restart = ddb_machine_restart; 135 _machine_restart = ddb_machine_restart;
135 _machine_halt = ddb_machine_halt; 136 _machine_halt = ddb_machine_halt;
136 _machine_power_off = ddb_machine_power_off; 137 pm_power_off = ddb_machine_power_off;
137 138
138 /* request io port/mem resources */ 139 /* request io port/mem resources */
139 if (request_resource(&ioport_resource, &ddb5476_ioport.dma1) || 140 if (request_resource(&ioport_resource, &ddb5476_ioport.dma1) ||
diff --git a/arch/mips/ddb5xxx/ddb5477/setup.c b/arch/mips/ddb5xxx/ddb5477/setup.c
index 81163353c4a8..2f566034cc44 100644
--- a/arch/mips/ddb5xxx/ddb5477/setup.c
+++ b/arch/mips/ddb5xxx/ddb5477/setup.c
@@ -26,6 +26,7 @@
26#include <linux/major.h> 26#include <linux/major.h>
27#include <linux/kdev_t.h> 27#include <linux/kdev_t.h>
28#include <linux/root_dev.h> 28#include <linux/root_dev.h>
29#include <linux/pm.h>
29 30
30#include <asm/cpu.h> 31#include <asm/cpu.h>
31#include <asm/bootinfo.h> 32#include <asm/bootinfo.h>
@@ -182,7 +183,7 @@ void __init plat_setup(void)
182 183
183 _machine_restart = ddb_machine_restart; 184 _machine_restart = ddb_machine_restart;
184 _machine_halt = ddb_machine_halt; 185 _machine_halt = ddb_machine_halt;
185 _machine_power_off = ddb_machine_power_off; 186 pm_power_off = ddb_machine_power_off;
186 187
187 /* setup resource limits */ 188 /* setup resource limits */
188 ioport_resource.end = DDB_PCI0_IO_SIZE + DDB_PCI1_IO_SIZE - 1; 189 ioport_resource.end = DDB_PCI0_IO_SIZE + DDB_PCI1_IO_SIZE - 1;
diff --git a/arch/mips/dec/setup.c b/arch/mips/dec/setup.c
index 9ef54fe1feaa..7c1ca8f6330e 100644
--- a/arch/mips/dec/setup.c
+++ b/arch/mips/dec/setup.c
@@ -17,6 +17,7 @@
17#include <linux/sched.h> 17#include <linux/sched.h>
18#include <linux/spinlock.h> 18#include <linux/spinlock.h>
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/pm.h>
20 21
21#include <asm/bootinfo.h> 22#include <asm/bootinfo.h>
22#include <asm/cpu.h> 23#include <asm/cpu.h>
@@ -158,7 +159,7 @@ void __init plat_setup(void)
158 159
159 _machine_restart = dec_machine_restart; 160 _machine_restart = dec_machine_restart;
160 _machine_halt = dec_machine_halt; 161 _machine_halt = dec_machine_halt;
161 _machine_power_off = dec_machine_power_off; 162 pm_power_off = dec_machine_power_off;
162 163
163 ioport_resource.start = ~0UL; 164 ioport_resource.start = ~0UL;
164 ioport_resource.end = 0UL; 165 ioport_resource.end = 0UL;
diff --git a/arch/mips/gt64120/ev64120/setup.c b/arch/mips/gt64120/ev64120/setup.c
index 98b5a96cc039..6d859d1e7a2d 100644
--- a/arch/mips/gt64120/ev64120/setup.c
+++ b/arch/mips/gt64120/ev64120/setup.c
@@ -34,6 +34,8 @@
34#include <linux/interrupt.h> 34#include <linux/interrupt.h>
35#include <linux/pci.h> 35#include <linux/pci.h>
36#include <linux/timex.h> 36#include <linux/timex.h>
37#include <linux/pm.h>
38
37#include <asm/bootinfo.h> 39#include <asm/bootinfo.h>
38#include <asm/page.h> 40#include <asm/page.h>
39#include <asm/io.h> 41#include <asm/io.h>
@@ -73,7 +75,7 @@ void __init plat_setup(void)
73{ 75{
74 _machine_restart = galileo_machine_restart; 76 _machine_restart = galileo_machine_restart;
75 _machine_halt = galileo_machine_halt; 77 _machine_halt = galileo_machine_halt;
76 _machine_power_off = galileo_machine_power_off; 78 pm_power_off = galileo_machine_power_off;
77 79
78 board_time_init = gt64120_time_init; 80 board_time_init = gt64120_time_init;
79 set_io_port_base(KSEG1); 81 set_io_port_base(KSEG1);
diff --git a/arch/mips/gt64120/momenco_ocelot/setup.c b/arch/mips/gt64120/momenco_ocelot/setup.c
index 0d07c33112d0..20b65d3d2151 100644
--- a/arch/mips/gt64120/momenco_ocelot/setup.c
+++ b/arch/mips/gt64120/momenco_ocelot/setup.c
@@ -4,7 +4,7 @@
4 * BRIEF MODULE DESCRIPTION 4 * BRIEF MODULE DESCRIPTION
5 * Momentum Computer Ocelot (CP7000) - board dependent boot routines 5 * Momentum Computer Ocelot (CP7000) - board dependent boot routines
6 * 6 *
7 * Copyright (C) 1996, 1997, 2001 Ralf Baechle 7 * Copyright (C) 1996, 1997, 2001, 06 Ralf Baechle (ralf@linux-mips.org)
8 * Copyright (C) 2000 RidgeRun, Inc. 8 * Copyright (C) 2000 RidgeRun, Inc.
9 * Copyright (C) 2001 Red Hat, Inc. 9 * Copyright (C) 2001 Red Hat, Inc.
10 * Copyright (C) 2002 Momentum Computer 10 * Copyright (C) 2002 Momentum Computer
@@ -47,6 +47,8 @@
47#include <linux/pci.h> 47#include <linux/pci.h>
48#include <linux/timex.h> 48#include <linux/timex.h>
49#include <linux/vmalloc.h> 49#include <linux/vmalloc.h>
50#include <linux/pm.h>
51
50#include <asm/time.h> 52#include <asm/time.h>
51#include <asm/bootinfo.h> 53#include <asm/bootinfo.h>
52#include <asm/page.h> 54#include <asm/page.h>
@@ -159,7 +161,7 @@ void __init plat_setup(void)
159 161
160 _machine_restart = momenco_ocelot_restart; 162 _machine_restart = momenco_ocelot_restart;
161 _machine_halt = momenco_ocelot_halt; 163 _machine_halt = momenco_ocelot_halt;
162 _machine_power_off = momenco_ocelot_power_off; 164 pm_power_off = momenco_ocelot_power_off;
163 165
164 /* 166 /*
165 * initrd_start = (ulong)ocelot_initrd_start; 167 * initrd_start = (ulong)ocelot_initrd_start;
diff --git a/arch/mips/ite-boards/generic/it8172_setup.c b/arch/mips/ite-boards/generic/it8172_setup.c
index 062429dd7ca0..fc73c8d69df7 100644
--- a/arch/mips/ite-boards/generic/it8172_setup.c
+++ b/arch/mips/ite-boards/generic/it8172_setup.c
@@ -34,6 +34,7 @@
34#include <linux/major.h> 34#include <linux/major.h>
35#include <linux/kdev_t.h> 35#include <linux/kdev_t.h>
36#include <linux/root_dev.h> 36#include <linux/root_dev.h>
37#include <linux/pm.h>
37 38
38#include <asm/cpu.h> 39#include <asm/cpu.h>
39#include <asm/time.h> 40#include <asm/time.h>
@@ -125,7 +126,7 @@ void __init plat_setup(void)
125 126
126 _machine_restart = it8172_restart; 127 _machine_restart = it8172_restart;
127 _machine_halt = it8172_halt; 128 _machine_halt = it8172_halt;
128 _machine_power_off = it8172_power_off; 129 pm_power_off = it8172_power_off;
129 130
130 /* 131 /*
131 * IO/MEM resources. 132 * IO/MEM resources.
diff --git a/arch/mips/jazz/setup.c b/arch/mips/jazz/setup.c
index 044df9d4ab7c..4036dc434551 100644
--- a/arch/mips/jazz/setup.c
+++ b/arch/mips/jazz/setup.c
@@ -19,6 +19,8 @@
19#include <linux/console.h> 19#include <linux/console.h>
20#include <linux/fb.h> 20#include <linux/fb.h>
21#include <linux/ide.h> 21#include <linux/ide.h>
22#include <linux/pm.h>
23
22#include <asm/bootinfo.h> 24#include <asm/bootinfo.h>
23#include <asm/irq.h> 25#include <asm/irq.h>
24#include <asm/jazz.h> 26#include <asm/jazz.h>
@@ -79,7 +81,7 @@ void __init plat_setup(void)
79 81
80 _machine_restart = jazz_machine_restart; 82 _machine_restart = jazz_machine_restart;
81 _machine_halt = jazz_machine_halt; 83 _machine_halt = jazz_machine_halt;
82 _machine_power_off = jazz_machine_power_off; 84 pm_power_off = jazz_machine_power_off;
83 85
84#warning "Somebody should check if screen_info is ok for Jazz." 86#warning "Somebody should check if screen_info is ok for Jazz."
85 87
diff --git a/arch/mips/jmr3927/rbhma3100/setup.c b/arch/mips/jmr3927/rbhma3100/setup.c
index 4763957df8fc..9359cc413494 100644
--- a/arch/mips/jmr3927/rbhma3100/setup.c
+++ b/arch/mips/jmr3927/rbhma3100/setup.c
@@ -44,6 +44,7 @@
44#include <linux/ioport.h> 44#include <linux/ioport.h>
45#include <linux/param.h> /* for HZ */ 45#include <linux/param.h> /* for HZ */
46#include <linux/delay.h> 46#include <linux/delay.h>
47#include <linux/pm.h>
47#ifdef CONFIG_SERIAL_TXX9 48#ifdef CONFIG_SERIAL_TXX9
48#include <linux/tty.h> 49#include <linux/tty.h>
49#include <linux/serial.h> 50#include <linux/serial.h>
@@ -211,7 +212,7 @@ void __init plat_setup(void)
211 212
212 _machine_restart = jmr3927_machine_restart; 213 _machine_restart = jmr3927_machine_restart;
213 _machine_halt = jmr3927_machine_halt; 214 _machine_halt = jmr3927_machine_halt;
214 _machine_power_off = jmr3927_machine_power_off; 215 pm_power_off = jmr3927_machine_power_off;
215 216
216 /* 217 /*
217 * IO/MEM resources. 218 * IO/MEM resources.
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index fac48ad27b34..292f8b243a5e 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -2,8 +2,8 @@
2 * Processor capabilities determination functions. 2 * Processor capabilities determination functions.
3 * 3 *
4 * Copyright (C) xxxx the Anonymous 4 * Copyright (C) xxxx the Anonymous
5 * Copyright (C) 1994 - 2006 Ralf Baechle
5 * Copyright (C) 2003, 2004 Maciej W. Rozycki 6 * Copyright (C) 2003, 2004 Maciej W. Rozycki
6 * Copyright (C) 1994 - 2003 Ralf Baechle
7 * Copyright (C) 2001, 2004 MIPS Inc. 7 * Copyright (C) 2001, 2004 MIPS Inc.
8 * 8 *
9 * This program is free software; you can redistribute it and/or 9 * This program is free software; you can redistribute it and/or
@@ -641,10 +641,9 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c)
641 switch (c->processor_id & 0xff00) { 641 switch (c->processor_id & 0xff00) {
642 case PRID_IMP_SB1: 642 case PRID_IMP_SB1:
643 c->cputype = CPU_SB1; 643 c->cputype = CPU_SB1;
644#ifdef CONFIG_SB1_PASS_1_WORKAROUNDS
645 /* FPU in pass1 is known to have issues. */ 644 /* FPU in pass1 is known to have issues. */
646 c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); 645 if ((c->processor_id & 0xff) < 0x20)
647#endif 646 c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);
648 break; 647 break;
649 case PRID_IMP_SB1A: 648 case PRID_IMP_SB1A:
650 c->cputype = CPU_SB1A; 649 c->cputype = CPU_SB1A;
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
index aa18a8b7b380..13f22d1d0e8b 100644
--- a/arch/mips/kernel/genex.S
+++ b/arch/mips/kernel/genex.S
@@ -233,11 +233,11 @@ NESTED(except_vec_nmi, 0, sp)
233NESTED(nmi_handler, PT_SIZE, sp) 233NESTED(nmi_handler, PT_SIZE, sp)
234 .set push 234 .set push
235 .set noat 235 .set noat
236 .set mips3
237 SAVE_ALL 236 SAVE_ALL
238 move a0, sp 237 move a0, sp
239 jal nmi_exception_handler 238 jal nmi_exception_handler
240 RESTORE_ALL 239 RESTORE_ALL
240 .set mips3
241 eret 241 eret
242 .set pop 242 .set pop
243 END(nmi_handler) 243 END(nmi_handler)
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index fa98f10d0132..5232fc752935 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -4,6 +4,7 @@
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others. 6 * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others.
7 * Copyright (C) 2005, 2006 by Ralf Baechle (ralf@linux-mips.org)
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2004 Thiemo Seufer 9 * Copyright (C) 2004 Thiemo Seufer
9 */ 10 */
@@ -58,8 +59,8 @@ ATTRIB_NORET void cpu_idle(void)
58 } 59 }
59} 60}
60 61
61extern int do_signal(sigset_t *oldset, struct pt_regs *regs); 62extern void do_signal(struct pt_regs *regs);
62extern int do_signal32(sigset_t *oldset, struct pt_regs *regs); 63extern void do_signal32(struct pt_regs *regs);
63 64
64/* 65/*
65 * Native o32 and N64 ABI without DSP ASE 66 * Native o32 and N64 ABI without DSP ASE
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c
index 0c82b25d8c6d..0d5cf97af727 100644
--- a/arch/mips/kernel/ptrace32.c
+++ b/arch/mips/kernel/ptrace32.c
@@ -88,7 +88,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
88 ret = -EIO; 88 ret = -EIO;
89 if (copied != sizeof(tmp)) 89 if (copied != sizeof(tmp))
90 break; 90 break;
91 ret = put_user(tmp, (unsigned int *) (unsigned long) data); 91 ret = put_user(tmp, (unsigned int __user *) (unsigned long) data);
92 break; 92 break;
93 } 93 }
94 94
@@ -174,8 +174,10 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
174 case FPC_EIR: { /* implementation / version register */ 174 case FPC_EIR: { /* implementation / version register */
175 unsigned int flags; 175 unsigned int flags;
176 176
177 if (!cpu_has_fpu) 177 if (!cpu_has_fpu) {
178 tmp = 0;
178 break; 179 break;
180 }
179 181
180 preempt_disable(); 182 preempt_disable();
181 if (cpu_has_mipsmt) { 183 if (cpu_has_mipsmt) {
@@ -194,15 +196,18 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
194 preempt_enable(); 196 preempt_enable();
195 break; 197 break;
196 } 198 }
197 case DSP_BASE ... DSP_BASE + 5: 199 case DSP_BASE ... DSP_BASE + 5: {
200 dspreg_t *dregs;
201
198 if (!cpu_has_dsp) { 202 if (!cpu_has_dsp) {
199 tmp = 0; 203 tmp = 0;
200 ret = -EIO; 204 ret = -EIO;
201 goto out_tsk; 205 goto out_tsk;
202 } 206 }
203 dspreg_t *dregs = __get_dsp_regs(child); 207 dregs = __get_dsp_regs(child);
204 tmp = (unsigned long) (dregs[addr - DSP_BASE]); 208 tmp = (unsigned long) (dregs[addr - DSP_BASE]);
205 break; 209 break;
210 }
206 case DSP_CONTROL: 211 case DSP_CONTROL:
207 if (!cpu_has_dsp) { 212 if (!cpu_has_dsp) {
208 tmp = 0; 213 tmp = 0;
@@ -216,7 +221,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
216 ret = -EIO; 221 ret = -EIO;
217 goto out_tsk; 222 goto out_tsk;
218 } 223 }
219 ret = put_user(tmp, (unsigned *) (unsigned long) data); 224 ret = put_user(tmp, (unsigned __user *) (unsigned long) data);
220 break; 225 break;
221 } 226 }
222 227
@@ -304,15 +309,18 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
304 else 309 else
305 child->thread.fpu.soft.fcr31 = data; 310 child->thread.fpu.soft.fcr31 = data;
306 break; 311 break;
307 case DSP_BASE ... DSP_BASE + 5: 312 case DSP_BASE ... DSP_BASE + 5: {
313 dspreg_t *dregs;
314
308 if (!cpu_has_dsp) { 315 if (!cpu_has_dsp) {
309 ret = -EIO; 316 ret = -EIO;
310 break; 317 break;
311 } 318 }
312 319
313 dspreg_t *dregs = __get_dsp_regs(child); 320 dregs = __get_dsp_regs(child);
314 dregs[addr - DSP_BASE] = data; 321 dregs[addr - DSP_BASE] = data;
315 break; 322 break;
323 }
316 case DSP_CONTROL: 324 case DSP_CONTROL:
317 if (!cpu_has_dsp) { 325 if (!cpu_has_dsp) {
318 ret = -EIO; 326 ret = -EIO;
diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
index 5e37df3111ad..621037db2290 100644
--- a/arch/mips/kernel/reset.c
+++ b/arch/mips/kernel/reset.c
@@ -3,17 +3,16 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 2001 by Ralf Baechle 6 * Copyright (C) 2001, 06 by Ralf Baechle (ralf@linux-mips.org)
7 * Copyright (C) 2001 MIPS Technologies, Inc. 7 * Copyright (C) 2001 MIPS Technologies, Inc.
8 */ 8 */
9#include <linux/kernel.h> 9#include <linux/kernel.h>
10#include <linux/module.h> 10#include <linux/module.h>
11#include <linux/pm.h>
11#include <linux/types.h> 12#include <linux/types.h>
12#include <linux/reboot.h> 13#include <linux/reboot.h>
13#include <asm/reboot.h>
14 14
15void (*pm_power_off)(void); 15#include <asm/reboot.h>
16EXPORT_SYMBOL(pm_power_off);
17 16
18/* 17/*
19 * Urgs ... Too many MIPS machines to handle this in a generic way. 18 * Urgs ... Too many MIPS machines to handle this in a generic way.
@@ -22,23 +21,22 @@ EXPORT_SYMBOL(pm_power_off);
22 */ 21 */
23void (*_machine_restart)(char *command); 22void (*_machine_restart)(char *command);
24void (*_machine_halt)(void); 23void (*_machine_halt)(void);
25void (*_machine_power_off)(void); 24void (*pm_power_off)(void);
26 25
27void machine_restart(char *command) 26void machine_restart(char *command)
28{ 27{
29 _machine_restart(command); 28 if (_machine_restart)
29 _machine_restart(command);
30} 30}
31 31
32void machine_halt(void) 32void machine_halt(void)
33{ 33{
34 _machine_halt(); 34 if (_machine_halt)
35 _machine_halt();
35} 36}
36 37
37void machine_power_off(void) 38void machine_power_off(void)
38{ 39{
39 if (pm_power_off) 40 if (pm_power_off)
40 pm_power_off(); 41 pm_power_off();
41
42 _machine_power_off();
43} 42}
44
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c
index 1d855112bac2..986a9cf23067 100644
--- a/arch/mips/kernel/rtlx.c
+++ b/arch/mips/kernel/rtlx.c
@@ -1,5 +1,6 @@
1/* 1/*
2 * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. 2 * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved.
3 * Copyright (C) 2005, 06 Ralf Baechle (ralf@linux-mips.org)
3 * 4 *
4 * This program is free software; you can distribute it and/or modify it 5 * This program is free software; you can distribute it and/or modify it
5 * under the terms of the GNU General Public License (Version 2) as 6 * under the terms of the GNU General Public License (Version 2) as
@@ -20,9 +21,12 @@
20#include <linux/module.h> 21#include <linux/module.h>
21#include <linux/fs.h> 22#include <linux/fs.h>
22#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/interrupt.h>
25#include <linux/irq.h>
23#include <linux/poll.h> 26#include <linux/poll.h>
24#include <linux/sched.h> 27#include <linux/sched.h>
25#include <linux/wait.h> 28#include <linux/wait.h>
29
26#include <asm/mipsmtregs.h> 30#include <asm/mipsmtregs.h>
27#include <asm/bitops.h> 31#include <asm/bitops.h>
28#include <asm/cpu.h> 32#include <asm/cpu.h>
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
index a42e0e8caa7b..d7c4a38ed5ae 100644
--- a/arch/mips/kernel/scall32-o32.S
+++ b/arch/mips/kernel/scall32-o32.S
@@ -617,6 +617,23 @@ einval: li v0, -EINVAL
617 sys sys_inotify_init 0 617 sys sys_inotify_init 0
618 sys sys_inotify_add_watch 3 /* 4285 */ 618 sys sys_inotify_add_watch 3 /* 4285 */
619 sys sys_inotify_rm_watch 2 619 sys sys_inotify_rm_watch 2
620 sys sys_migrate_pages 4
621 sys sys_openat 4
622 sys sys_mkdirat 3
623 sys sys_mknodat 4 /* 4290 */
624 sys sys_fchownat 5
625 sys sys_futimesat 3
626 sys sys_newfstatat 4
627 sys sys_unlinkat 3
628 sys sys_renameat 4 /* 4295 */
629 sys sys_linkat 4
630 sys sys_symlinkat 3
631 sys sys_readlinkat 4
632 sys sys_fchmodat 3
633 sys sys_faccessat 3 /* 4300 */
634 sys sys_pselect6 6
635 sys sys_ppoll 5
636 sys sys_unshare 1
620 .endm 637 .endm
621 638
622 /* We pre-compute the number of _instruction_ bytes needed to 639 /* We pre-compute the number of _instruction_ bytes needed to
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
index 47bfbd416709..98bf25df56f3 100644
--- a/arch/mips/kernel/scall64-64.S
+++ b/arch/mips/kernel/scall64-64.S
@@ -443,3 +443,20 @@ sys_call_table:
443 PTR sys_inotify_init 443 PTR sys_inotify_init
444 PTR sys_inotify_add_watch 444 PTR sys_inotify_add_watch
445 PTR sys_inotify_rm_watch /* 5245 */ 445 PTR sys_inotify_rm_watch /* 5245 */
446 PTR sys_migrate_pages
447 PTR sys_openat
448 PTR sys_mkdirat
449 PTR sys_mknodat
450 PTR sys_fchownat /* 5250 */
451 PTR sys_futimesat
452 PTR sys_newfstatat
453 PTR sys_unlinkat
454 PTR sys_renameat
455 PTR sys_linkat /* 5255 */
456 PTR sys_symlinkat
457 PTR sys_readlinkat
458 PTR sys_fchmodat
459 PTR sys_faccessat
460 PTR sys_pselect6 /* 5260 */
461 PTR sys_ppoll
462 PTR sys_unshare
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
index b465ced1758f..bc4980cefc8b 100644
--- a/arch/mips/kernel/scall64-n32.S
+++ b/arch/mips/kernel/scall64-n32.S
@@ -369,3 +369,20 @@ EXPORT(sysn32_call_table)
369 PTR sys_inotify_init 369 PTR sys_inotify_init
370 PTR sys_inotify_add_watch 370 PTR sys_inotify_add_watch
371 PTR sys_inotify_rm_watch 371 PTR sys_inotify_rm_watch
372 PTR sys_migrate_pages /* 6250 */
373 PTR sys_openat
374 PTR sys_mkdirat
375 PTR sys_mknodat
376 PTR sys_fchownat
377 PTR sys_futimesat /* 6255 */
378 PTR sys_newfstatat
379 PTR sys_unlinkat
380 PTR sys_renameat
381 PTR sys_linkat
382 PTR sys_symlinkat /* 6260 */
383 PTR sys_readlinkat
384 PTR sys_fchmodat
385 PTR sys_faccessat
386 PTR sys_pselect6
387 PTR sys_ppoll /* 6265 */
388 PTR sys_unshare
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
index 3d338ca7eeeb..5b0414018c9a 100644
--- a/arch/mips/kernel/scall64-o32.S
+++ b/arch/mips/kernel/scall64-o32.S
@@ -491,4 +491,21 @@ sys_call_table:
491 PTR sys_inotify_init 491 PTR sys_inotify_init
492 PTR sys_inotify_add_watch /* 4285 */ 492 PTR sys_inotify_add_watch /* 4285 */
493 PTR sys_inotify_rm_watch 493 PTR sys_inotify_rm_watch
494 PTR sys_migrate_pages
495 PTR compat_sys_openat
496 PTR sys_mkdirat
497 PTR sys_mknodat /* 4290 */
498 PTR sys_fchownat
499 PTR compat_sys_futimesat
500 PTR compat_sys_newfstatat
501 PTR sys_unlinkat
502 PTR sys_renameat /* 4295 */
503 PTR sys_linkat
504 PTR sys_symlinkat
505 PTR sys_readlinkat
506 PTR sys_fchmodat
507 PTR sys_faccessat /* 4300 */
508 PTR sys_pselect6
509 PTR sys_ppoll
510 PTR sys_unshare
494 .size sys_call_table,.-sys_call_table 511 .size sys_call_table,.-sys_call_table
diff --git a/arch/mips/kernel/signal-common.h b/arch/mips/kernel/signal-common.h
index 0f66ae5838b9..0fbc492d24b4 100644
--- a/arch/mips/kernel/signal-common.h
+++ b/arch/mips/kernel/signal-common.h
@@ -11,7 +11,7 @@
11#include <linux/config.h> 11#include <linux/config.h>
12 12
13static inline int 13static inline int
14setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc) 14setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
15{ 15{
16 int err = 0; 16 int err = 0;
17 17
@@ -82,7 +82,7 @@ out:
82} 82}
83 83
84static inline int 84static inline int
85restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) 85restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
86{ 86{
87 unsigned int used_math; 87 unsigned int used_math;
88 unsigned long treg; 88 unsigned long treg;
@@ -157,7 +157,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
157/* 157/*
158 * Determine which stack to use.. 158 * Determine which stack to use..
159 */ 159 */
160static inline void * 160static inline void __user *
161get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) 161get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
162{ 162{
163 unsigned long sp; 163 unsigned long sp;
@@ -176,7 +176,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
176 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) 176 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
177 sp = current->sas_ss_sp + current->sas_ss_size; 177 sp = current->sas_ss_sp + current->sas_ss_size;
178 178
179 return (void *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK)); 179 return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK));
180} 180}
181 181
182static inline int install_sigtramp(unsigned int __user *tramp, 182static inline int install_sigtramp(unsigned int __user *tramp,
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
index 7d1800fe7038..c974cc9b30eb 100644
--- a/arch/mips/kernel/signal.c
+++ b/arch/mips/kernel/signal.c
@@ -39,8 +39,6 @@
39 39
40#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 40#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
41 41
42int do_signal(sigset_t *oldset, struct pt_regs *regs);
43
44/* 42/*
45 * Atomically swap in the new signal mask, and wait for a signal. 43 * Atomically swap in the new signal mask, and wait for a signal.
46 */ 44 */
@@ -50,7 +48,7 @@ save_static_function(sys_sigsuspend);
50__attribute_used__ noinline static int 48__attribute_used__ noinline static int
51_sys_sigsuspend(nabi_no_regargs struct pt_regs regs) 49_sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
52{ 50{
53 sigset_t saveset, newset; 51 sigset_t newset;
54 sigset_t __user *uset; 52 sigset_t __user *uset;
55 53
56 uset = (sigset_t __user *) regs.regs[4]; 54 uset = (sigset_t __user *) regs.regs[4];
@@ -59,19 +57,15 @@ _sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
59 sigdelsetmask(&newset, ~_BLOCKABLE); 57 sigdelsetmask(&newset, ~_BLOCKABLE);
60 58
61 spin_lock_irq(&current->sighand->siglock); 59 spin_lock_irq(&current->sighand->siglock);
62 saveset = current->blocked; 60 current->saved_sigmask = current->blocked;
63 current->blocked = newset; 61 current->blocked = newset;
64 recalc_sigpending(); 62 recalc_sigpending();
65 spin_unlock_irq(&current->sighand->siglock); 63 spin_unlock_irq(&current->sighand->siglock);
66 64
67 regs.regs[2] = EINTR; 65 current->state = TASK_INTERRUPTIBLE;
68 regs.regs[7] = 1; 66 schedule();
69 while (1) { 67 set_thread_flag(TIF_RESTORE_SIGMASK);
70 current->state = TASK_INTERRUPTIBLE; 68 return -ERESTARTNOHAND;
71 schedule();
72 if (do_signal(&saveset, &regs))
73 return -EINTR;
74 }
75} 69}
76#endif 70#endif
77 71
@@ -79,7 +73,7 @@ save_static_function(sys_rt_sigsuspend);
79__attribute_used__ noinline static int 73__attribute_used__ noinline static int
80_sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) 74_sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
81{ 75{
82 sigset_t saveset, newset; 76 sigset_t newset;
83 sigset_t __user *unewset; 77 sigset_t __user *unewset;
84 size_t sigsetsize; 78 size_t sigsetsize;
85 79
@@ -94,19 +88,15 @@ _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
94 sigdelsetmask(&newset, ~_BLOCKABLE); 88 sigdelsetmask(&newset, ~_BLOCKABLE);
95 89
96 spin_lock_irq(&current->sighand->siglock); 90 spin_lock_irq(&current->sighand->siglock);
97 saveset = current->blocked; 91 current->saved_sigmask = current->blocked;
98 current->blocked = newset; 92 current->blocked = newset;
99 recalc_sigpending(); 93 recalc_sigpending();
100 spin_unlock_irq(&current->sighand->siglock); 94 spin_unlock_irq(&current->sighand->siglock);
101 95
102 regs.regs[2] = EINTR; 96 current->state = TASK_INTERRUPTIBLE;
103 regs.regs[7] = 1; 97 schedule();
104 while (1) { 98 set_thread_flag(TIF_RESTORE_SIGMASK);
105 current->state = TASK_INTERRUPTIBLE; 99 return -ERESTARTNOHAND;
106 schedule();
107 if (do_signal(&saveset, &regs))
108 return -EINTR;
109 }
110} 100}
111 101
112#ifdef CONFIG_TRAD_SIGNALS 102#ifdef CONFIG_TRAD_SIGNALS
@@ -199,10 +189,10 @@ save_static_function(sys_sigreturn);
199__attribute_used__ noinline static void 189__attribute_used__ noinline static void
200_sys_sigreturn(nabi_no_regargs struct pt_regs regs) 190_sys_sigreturn(nabi_no_regargs struct pt_regs regs)
201{ 191{
202 struct sigframe *frame; 192 struct sigframe __user *frame;
203 sigset_t blocked; 193 sigset_t blocked;
204 194
205 frame = (struct sigframe *) regs.regs[29]; 195 frame = (struct sigframe __user *) regs.regs[29];
206 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 196 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
207 goto badframe; 197 goto badframe;
208 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) 198 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
@@ -236,11 +226,11 @@ save_static_function(sys_rt_sigreturn);
236__attribute_used__ noinline static void 226__attribute_used__ noinline static void
237_sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) 227_sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
238{ 228{
239 struct rt_sigframe *frame; 229 struct rt_sigframe __user *frame;
240 sigset_t set; 230 sigset_t set;
241 stack_t st; 231 stack_t st;
242 232
243 frame = (struct rt_sigframe *) regs.regs[29]; 233 frame = (struct rt_sigframe __user *) regs.regs[29];
244 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 234 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
245 goto badframe; 235 goto badframe;
246 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) 236 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
@@ -259,7 +249,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
259 goto badframe; 249 goto badframe;
260 /* It is more difficult to avoid calling this function than to 250 /* It is more difficult to avoid calling this function than to
261 call it and ignore errors. */ 251 call it and ignore errors. */
262 do_sigaltstack(&st, NULL, regs.regs[29]); 252 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
263 253
264 /* 254 /*
265 * Don't let your children do this ... 255 * Don't let your children do this ...
@@ -279,7 +269,7 @@ badframe:
279int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, 269int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
280 int signr, sigset_t *set) 270 int signr, sigset_t *set)
281{ 271{
282 struct sigframe *frame; 272 struct sigframe __user *frame;
283 int err = 0; 273 int err = 0;
284 274
285 frame = get_sigframe(ka, regs, sizeof(*frame)); 275 frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -315,18 +305,18 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
315 current->comm, current->pid, 305 current->comm, current->pid,
316 frame, regs->cp0_epc, frame->regs[31]); 306 frame, regs->cp0_epc, frame->regs[31]);
317#endif 307#endif
318 return 1; 308 return 0;
319 309
320give_sigsegv: 310give_sigsegv:
321 force_sigsegv(signr, current); 311 force_sigsegv(signr, current);
322 return 0; 312 return -EFAULT;
323} 313}
324#endif 314#endif
325 315
326int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, 316int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
327 int signr, sigset_t *set, siginfo_t *info) 317 int signr, sigset_t *set, siginfo_t *info)
328{ 318{
329 struct rt_sigframe *frame; 319 struct rt_sigframe __user *frame;
330 int err = 0; 320 int err = 0;
331 321
332 frame = get_sigframe(ka, regs, sizeof(*frame)); 322 frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -340,7 +330,7 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
340 330
341 /* Create the ucontext. */ 331 /* Create the ucontext. */
342 err |= __put_user(0, &frame->rs_uc.uc_flags); 332 err |= __put_user(0, &frame->rs_uc.uc_flags);
343 err |= __put_user(0, &frame->rs_uc.uc_link); 333 err |= __put_user(NULL, &frame->rs_uc.uc_link);
344 err |= __put_user((void *)current->sas_ss_sp, 334 err |= __put_user((void *)current->sas_ss_sp,
345 &frame->rs_uc.uc_stack.ss_sp); 335 &frame->rs_uc.uc_stack.ss_sp);
346 err |= __put_user(sas_ss_flags(regs->regs[29]), 336 err |= __put_user(sas_ss_flags(regs->regs[29]),
@@ -375,11 +365,11 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
375 current->comm, current->pid, 365 current->comm, current->pid,
376 frame, regs->cp0_epc, regs->regs[31]); 366 frame, regs->cp0_epc, regs->regs[31]);
377#endif 367#endif
378 return 1; 368 return 0;
379 369
380give_sigsegv: 370give_sigsegv:
381 force_sigsegv(signr, current); 371 force_sigsegv(signr, current);
382 return 0; 372 return -EFAULT;
383} 373}
384 374
385static inline int handle_signal(unsigned long sig, siginfo_t *info, 375static inline int handle_signal(unsigned long sig, siginfo_t *info,
@@ -393,7 +383,7 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
393 regs->regs[2] = EINTR; 383 regs->regs[2] = EINTR;
394 break; 384 break;
395 case ERESTARTSYS: 385 case ERESTARTSYS:
396 if(!(ka->sa.sa_flags & SA_RESTART)) { 386 if (!(ka->sa.sa_flags & SA_RESTART)) {
397 regs->regs[2] = EINTR; 387 regs->regs[2] = EINTR;
398 break; 388 break;
399 } 389 }
@@ -420,9 +410,10 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
420 return ret; 410 return ret;
421} 411}
422 412
423int do_signal(sigset_t *oldset, struct pt_regs *regs) 413void do_signal(struct pt_regs *regs)
424{ 414{
425 struct k_sigaction ka; 415 struct k_sigaction ka;
416 sigset_t *oldset;
426 siginfo_t info; 417 siginfo_t info;
427 int signr; 418 int signr;
428 419
@@ -432,17 +423,31 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
432 * if so. 423 * if so.
433 */ 424 */
434 if (!user_mode(regs)) 425 if (!user_mode(regs))
435 return 1; 426 return;
436 427
437 if (try_to_freeze()) 428 if (try_to_freeze())
438 goto no_signal; 429 goto no_signal;
439 430
440 if (!oldset) 431 if (test_thread_flag(TIF_RESTORE_SIGMASK))
432 oldset = &current->saved_sigmask;
433 else
441 oldset = &current->blocked; 434 oldset = &current->blocked;
442 435
436
443 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 437 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
444 if (signr > 0) 438 if (signr > 0) {
445 return handle_signal(signr, &info, &ka, oldset, regs); 439 /* Whee! Actually deliver the signal. */
440 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
441 /*
442 * A signal was successfully delivered; the saved
443 * sigmask will have been stored in the signal frame,
444 * and will be restored by sigreturn, so we can simply
445 * clear the TIF_RESTORE_SIGMASK flag.
446 */
447 if (test_thread_flag(TIF_RESTORE_SIGMASK))
448 clear_thread_flag(TIF_RESTORE_SIGMASK);
449 }
450 }
446 451
447no_signal: 452no_signal:
448 /* 453 /*
@@ -463,18 +468,25 @@ no_signal:
463 regs->cp0_epc -= 4; 468 regs->cp0_epc -= 4;
464 } 469 }
465 } 470 }
466 return 0; 471
472 /*
473 * If there's no signal to deliver, we just put the saved sigmask
474 * back
475 */
476 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
477 clear_thread_flag(TIF_RESTORE_SIGMASK);
478 sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
479 }
467} 480}
468 481
469/* 482/*
470 * notification of userspace execution resumption 483 * notification of userspace execution resumption
471 * - triggered by current->work.notify_resume 484 * - triggered by the TIF_WORK_MASK flags
472 */ 485 */
473asmlinkage void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, 486asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
474 __u32 thread_info_flags) 487 __u32 thread_info_flags)
475{ 488{
476 /* deal with pending signal delivery */ 489 /* deal with pending signal delivery */
477 if (thread_info_flags & _TIF_SIGPENDING) { 490 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
478 current->thread.abi->do_signal(oldset, regs); 491 current->thread.abi->do_signal(regs);
479 }
480} 492}
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index 98b185bbc947..da3271e1fdac 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -144,7 +144,7 @@ struct ucontext32 {
144extern void __put_sigset_unknown_nsig(void); 144extern void __put_sigset_unknown_nsig(void);
145extern void __get_sigset_unknown_nsig(void); 145extern void __get_sigset_unknown_nsig(void);
146 146
147static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf) 147static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
148{ 148{
149 int err = 0; 149 int err = 0;
150 150
@@ -269,7 +269,7 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
269 if (!access_ok(VERIFY_READ, act, sizeof(*act))) 269 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
270 return -EFAULT; 270 return -EFAULT;
271 err |= __get_user(handler, &act->sa_handler); 271 err |= __get_user(handler, &act->sa_handler);
272 new_ka.sa.sa_handler = (void*)(s64)handler; 272 new_ka.sa.sa_handler = (void __user *)(s64)handler;
273 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); 273 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
274 err |= __get_user(mask, &act->sa_mask.sig[0]); 274 err |= __get_user(mask, &act->sa_mask.sig[0]);
275 if (err) 275 if (err)
@@ -299,8 +299,8 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
299 299
300asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) 300asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
301{ 301{
302 const stack32_t *uss = (const stack32_t *) regs.regs[4]; 302 const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
303 stack32_t *uoss = (stack32_t *) regs.regs[5]; 303 stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
304 unsigned long usp = regs.regs[29]; 304 unsigned long usp = regs.regs[29];
305 stack_t kss, koss; 305 stack_t kss, koss;
306 int ret, err = 0; 306 int ret, err = 0;
@@ -319,7 +319,8 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
319 } 319 }
320 320
321 set_fs (KERNEL_DS); 321 set_fs (KERNEL_DS);
322 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp); 322 ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
323 uoss ? (stack_t __user *)&koss : NULL, usp);
323 set_fs (old_fs); 324 set_fs (old_fs);
324 325
325 if (!ret && uoss) { 326 if (!ret && uoss) {
@@ -335,7 +336,7 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
335 return ret; 336 return ret;
336} 337}
337 338
338static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc) 339static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 __user *sc)
339{ 340{
340 u32 used_math; 341 u32 used_math;
341 int err = 0; 342 int err = 0;
@@ -420,7 +421,7 @@ struct rt_sigframe32 {
420#endif 421#endif
421}; 422};
422 423
423int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from) 424int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
424{ 425{
425 int err; 426 int err;
426 427
@@ -455,7 +456,7 @@ int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from)
455 err |= __put_user(from->si_uid, &to->si_uid); 456 err |= __put_user(from->si_uid, &to->si_uid);
456 break; 457 break;
457 case __SI_FAULT >> 16: 458 case __SI_FAULT >> 16:
458 err |= __put_user((long)from->si_addr, &to->si_addr); 459 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
459 break; 460 break;
460 case __SI_POLL >> 16: 461 case __SI_POLL >> 16:
461 err |= __put_user(from->si_band, &to->si_band); 462 err |= __put_user(from->si_band, &to->si_band);
@@ -476,10 +477,10 @@ save_static_function(sys32_sigreturn);
476__attribute_used__ noinline static void 477__attribute_used__ noinline static void
477_sys32_sigreturn(nabi_no_regargs struct pt_regs regs) 478_sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
478{ 479{
479 struct sigframe *frame; 480 struct sigframe __user *frame;
480 sigset_t blocked; 481 sigset_t blocked;
481 482
482 frame = (struct sigframe *) regs.regs[29]; 483 frame = (struct sigframe __user *) regs.regs[29];
483 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 484 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
484 goto badframe; 485 goto badframe;
485 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) 486 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
@@ -512,13 +513,13 @@ save_static_function(sys32_rt_sigreturn);
512__attribute_used__ noinline static void 513__attribute_used__ noinline static void
513_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) 514_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
514{ 515{
515 struct rt_sigframe32 *frame; 516 struct rt_sigframe32 __user *frame;
516 mm_segment_t old_fs; 517 mm_segment_t old_fs;
517 sigset_t set; 518 sigset_t set;
518 stack_t st; 519 stack_t st;
519 s32 sp; 520 s32 sp;
520 521
521 frame = (struct rt_sigframe32 *) regs.regs[29]; 522 frame = (struct rt_sigframe32 __user *) regs.regs[29];
522 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 523 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
523 goto badframe; 524 goto badframe;
524 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) 525 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
@@ -546,7 +547,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
546 call it and ignore errors. */ 547 call it and ignore errors. */
547 old_fs = get_fs(); 548 old_fs = get_fs();
548 set_fs (KERNEL_DS); 549 set_fs (KERNEL_DS);
549 do_sigaltstack(&st, NULL, regs.regs[29]); 550 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
550 set_fs (old_fs); 551 set_fs (old_fs);
551 552
552 /* 553 /*
@@ -564,7 +565,7 @@ badframe:
564} 565}
565 566
566static inline int setup_sigcontext32(struct pt_regs *regs, 567static inline int setup_sigcontext32(struct pt_regs *regs,
567 struct sigcontext32 *sc) 568 struct sigcontext32 __user *sc)
568{ 569{
569 int err = 0; 570 int err = 0;
570 571
@@ -623,8 +624,9 @@ out:
623/* 624/*
624 * Determine which stack to use.. 625 * Determine which stack to use..
625 */ 626 */
626static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, 627static inline void __user *get_sigframe(struct k_sigaction *ka,
627 size_t frame_size) 628 struct pt_regs *regs,
629 size_t frame_size)
628{ 630{
629 unsigned long sp; 631 unsigned long sp;
630 632
@@ -642,13 +644,13 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
642 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) 644 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
643 sp = current->sas_ss_sp + current->sas_ss_size; 645 sp = current->sas_ss_sp + current->sas_ss_size;
644 646
645 return (void *)((sp - frame_size) & ALMASK); 647 return (void __user *)((sp - frame_size) & ALMASK);
646} 648}
647 649
648int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, 650int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
649 int signr, sigset_t *set) 651 int signr, sigset_t *set)
650{ 652{
651 struct sigframe *frame; 653 struct sigframe __user *frame;
652 int err = 0; 654 int err = 0;
653 655
654 frame = get_sigframe(ka, regs, sizeof(*frame)); 656 frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -692,17 +694,17 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
692 current->comm, current->pid, 694 current->comm, current->pid,
693 frame, regs->cp0_epc, frame->sf_code); 695 frame, regs->cp0_epc, frame->sf_code);
694#endif 696#endif
695 return 1; 697 return 0;
696 698
697give_sigsegv: 699give_sigsegv:
698 force_sigsegv(signr, current); 700 force_sigsegv(signr, current);
699 return 0; 701 return -EFAULT;
700} 702}
701 703
702int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, 704int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
703 int signr, sigset_t *set, siginfo_t *info) 705 int signr, sigset_t *set, siginfo_t *info)
704{ 706{
705 struct rt_sigframe32 *frame; 707 struct rt_sigframe32 __user *frame;
706 int err = 0; 708 int err = 0;
707 s32 sp; 709 s32 sp;
708 710
@@ -763,11 +765,11 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
763 current->comm, current->pid, 765 current->comm, current->pid,
764 frame, regs->cp0_epc, frame->rs_code); 766 frame, regs->cp0_epc, frame->rs_code);
765#endif 767#endif
766 return 1; 768 return 0;
767 769
768give_sigsegv: 770give_sigsegv:
769 force_sigsegv(signr, current); 771 force_sigsegv(signr, current);
770 return 0; 772 return -EFAULT;
771} 773}
772 774
773static inline int handle_signal(unsigned long sig, siginfo_t *info, 775static inline int handle_signal(unsigned long sig, siginfo_t *info,
@@ -855,7 +857,7 @@ no_signal:
855} 857}
856 858
857asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, 859asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
858 struct sigaction32 *oact, 860 struct sigaction32 __user *oact,
859 unsigned int sigsetsize) 861 unsigned int sigsetsize)
860{ 862{
861 struct k_sigaction new_sa, old_sa; 863 struct k_sigaction new_sa, old_sa;
@@ -872,7 +874,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
872 if (!access_ok(VERIFY_READ, act, sizeof(*act))) 874 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
873 return -EFAULT; 875 return -EFAULT;
874 err |= __get_user(handler, &act->sa_handler); 876 err |= __get_user(handler, &act->sa_handler);
875 new_sa.sa.sa_handler = (void*)(s64)handler; 877 new_sa.sa.sa_handler = (void __user *)(s64)handler;
876 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); 878 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
877 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); 879 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
878 if (err) 880 if (err)
@@ -899,7 +901,7 @@ out:
899} 901}
900 902
901asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, 903asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
902 compat_sigset_t *oset, unsigned int sigsetsize) 904 compat_sigset_t __user *oset, unsigned int sigsetsize)
903{ 905{
904 sigset_t old_set, new_set; 906 sigset_t old_set, new_set;
905 int ret; 907 int ret;
@@ -909,8 +911,9 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
909 return -EFAULT; 911 return -EFAULT;
910 912
911 set_fs (KERNEL_DS); 913 set_fs (KERNEL_DS);
912 ret = sys_rt_sigprocmask(how, set ? &new_set : NULL, 914 ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
913 oset ? &old_set : NULL, sigsetsize); 915 oset ? (sigset_t __user *)&old_set : NULL,
916 sigsetsize);
914 set_fs (old_fs); 917 set_fs (old_fs);
915 918
916 if (!ret && oset && put_sigset(&old_set, oset)) 919 if (!ret && oset && put_sigset(&old_set, oset))
@@ -919,7 +922,7 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
919 return ret; 922 return ret;
920} 923}
921 924
922asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, 925asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
923 unsigned int sigsetsize) 926 unsigned int sigsetsize)
924{ 927{
925 int ret; 928 int ret;
@@ -927,7 +930,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
927 mm_segment_t old_fs = get_fs(); 930 mm_segment_t old_fs = get_fs();
928 931
929 set_fs (KERNEL_DS); 932 set_fs (KERNEL_DS);
930 ret = sys_rt_sigpending(&set, sigsetsize); 933 ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
931 set_fs (old_fs); 934 set_fs (old_fs);
932 935
933 if (!ret && put_sigset(&set, uset)) 936 if (!ret && put_sigset(&set, uset))
@@ -936,7 +939,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
936 return ret; 939 return ret;
937} 940}
938 941
939asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) 942asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
940{ 943{
941 siginfo_t info; 944 siginfo_t info;
942 int ret; 945 int ret;
@@ -946,7 +949,7 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
946 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE)) 949 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
947 return -EFAULT; 950 return -EFAULT;
948 set_fs (KERNEL_DS); 951 set_fs (KERNEL_DS);
949 ret = sys_rt_sigqueueinfo(pid, sig, &info); 952 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
950 set_fs (old_fs); 953 set_fs (old_fs);
951 return ret; 954 return ret;
952} 955}
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c
index ec61b2670ba6..384fc4a639a4 100644
--- a/arch/mips/kernel/signal_n32.c
+++ b/arch/mips/kernel/signal_n32.c
@@ -48,6 +48,8 @@
48#define __NR_N32_rt_sigreturn 6211 48#define __NR_N32_rt_sigreturn 6211
49#define __NR_N32_restart_syscall 6214 49#define __NR_N32_restart_syscall 6214
50 50
51#define DEBUG_SIG 0
52
51#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 53#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
52 54
53/* IRIX compatible stack_t */ 55/* IRIX compatible stack_t */
@@ -83,12 +85,12 @@ save_static_function(sysn32_rt_sigreturn);
83__attribute_used__ noinline static void 85__attribute_used__ noinline static void
84_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) 86_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
85{ 87{
86 struct rt_sigframe_n32 *frame; 88 struct rt_sigframe_n32 __user *frame;
87 sigset_t set; 89 sigset_t set;
88 stack_t st; 90 stack_t st;
89 s32 sp; 91 s32 sp;
90 92
91 frame = (struct rt_sigframe_n32 *) regs.regs[29]; 93 frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
92 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 94 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
93 goto badframe; 95 goto badframe;
94 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) 96 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
@@ -114,7 +116,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
114 116
115 /* It is more difficult to avoid calling this function than to 117 /* It is more difficult to avoid calling this function than to
116 call it and ignore errors. */ 118 call it and ignore errors. */
117 do_sigaltstack(&st, NULL, regs.regs[29]); 119 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
118 120
119 /* 121 /*
120 * Don't let your children do this ... 122 * Don't let your children do this ...
@@ -133,7 +135,7 @@ badframe:
133int setup_rt_frame_n32(struct k_sigaction * ka, 135int setup_rt_frame_n32(struct k_sigaction * ka,
134 struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) 136 struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info)
135{ 137{
136 struct rt_sigframe_n32 *frame; 138 struct rt_sigframe_n32 __user *frame;
137 int err = 0; 139 int err = 0;
138 s32 sp; 140 s32 sp;
139 141
@@ -184,9 +186,9 @@ int setup_rt_frame_n32(struct k_sigaction * ka,
184 current->comm, current->pid, 186 current->comm, current->pid,
185 frame, regs->cp0_epc, regs->regs[31]); 187 frame, regs->cp0_epc, regs->regs[31]);
186#endif 188#endif
187 return 1; 189 return 0;
188 190
189give_sigsegv: 191give_sigsegv:
190 force_sigsegv(signr, current); 192 force_sigsegv(signr, current);
191 return 0; 193 return -EFAULT;
192} 194}
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
index 332358430ff5..1da2eeb3ef9e 100644
--- a/arch/mips/kernel/syscall.c
+++ b/arch/mips/kernel/syscall.c
@@ -212,12 +212,12 @@ asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs)
212 int error; 212 int error;
213 char * filename; 213 char * filename;
214 214
215 filename = getname((char *) (long)regs.regs[4]); 215 filename = getname((char __user *) (long)regs.regs[4]);
216 error = PTR_ERR(filename); 216 error = PTR_ERR(filename);
217 if (IS_ERR(filename)) 217 if (IS_ERR(filename))
218 goto out; 218 goto out;
219 error = do_execve(filename, (char **) (long)regs.regs[5], 219 error = do_execve(filename, (char __user *__user *) (long)regs.regs[5],
220 (char **) (long)regs.regs[6], &regs); 220 (char __user *__user *) (long)regs.regs[6], &regs);
221 putname(filename); 221 putname(filename);
222 222
223out: 223out:
@@ -227,7 +227,7 @@ out:
227/* 227/*
228 * Compacrapability ... 228 * Compacrapability ...
229 */ 229 */
230asmlinkage int sys_uname(struct old_utsname * name) 230asmlinkage int sys_uname(struct old_utsname __user * name)
231{ 231{
232 if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) 232 if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
233 return 0; 233 return 0;
@@ -237,7 +237,7 @@ asmlinkage int sys_uname(struct old_utsname * name)
237/* 237/*
238 * Compacrapability ... 238 * Compacrapability ...
239 */ 239 */
240asmlinkage int sys_olduname(struct oldold_utsname * name) 240asmlinkage int sys_olduname(struct oldold_utsname __user * name)
241{ 241{
242 int error; 242 int error;
243 243
@@ -274,7 +274,7 @@ void sys_set_thread_area(unsigned long addr)
274asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) 274asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
275{ 275{
276 int tmp, len; 276 int tmp, len;
277 char *name; 277 char __user *name;
278 278
279 switch(cmd) { 279 switch(cmd) {
280 case SETNAME: { 280 case SETNAME: {
@@ -283,7 +283,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
283 if (!capable(CAP_SYS_ADMIN)) 283 if (!capable(CAP_SYS_ADMIN))
284 return -EPERM; 284 return -EPERM;
285 285
286 name = (char *) arg1; 286 name = (char __user *) arg1;
287 287
288 len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); 288 len = strncpy_from_user(nodename, name, __NEW_UTS_LEN);
289 if (len < 0) 289 if (len < 0)
@@ -324,7 +324,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
324 * This is really horribly ugly. 324 * This is really horribly ugly.
325 */ 325 */
326asmlinkage int sys_ipc (uint call, int first, int second, 326asmlinkage int sys_ipc (uint call, int first, int second,
327 unsigned long third, void *ptr, long fifth) 327 unsigned long third, void __user *ptr, long fifth)
328{ 328{
329 int version, ret; 329 int version, ret;
330 330
@@ -333,24 +333,25 @@ asmlinkage int sys_ipc (uint call, int first, int second,
333 333
334 switch (call) { 334 switch (call) {
335 case SEMOP: 335 case SEMOP:
336 return sys_semtimedop (first, (struct sembuf *)ptr, second, 336 return sys_semtimedop (first, (struct sembuf __user *)ptr,
337 NULL); 337 second, NULL);
338 case SEMTIMEDOP: 338 case SEMTIMEDOP:
339 return sys_semtimedop (first, (struct sembuf *)ptr, second, 339 return sys_semtimedop (first, (struct sembuf __user *)ptr,
340 (const struct timespec __user *)fifth); 340 second,
341 (const struct timespec __user *)fifth);
341 case SEMGET: 342 case SEMGET:
342 return sys_semget (first, second, third); 343 return sys_semget (first, second, third);
343 case SEMCTL: { 344 case SEMCTL: {
344 union semun fourth; 345 union semun fourth;
345 if (!ptr) 346 if (!ptr)
346 return -EINVAL; 347 return -EINVAL;
347 if (get_user(fourth.__pad, (void **) ptr)) 348 if (get_user(fourth.__pad, (void *__user *) ptr))
348 return -EFAULT; 349 return -EFAULT;
349 return sys_semctl (first, second, third, fourth); 350 return sys_semctl (first, second, third, fourth);
350 } 351 }
351 352
352 case MSGSND: 353 case MSGSND:
353 return sys_msgsnd (first, (struct msgbuf *) ptr, 354 return sys_msgsnd (first, (struct msgbuf __user *) ptr,
354 second, third); 355 second, third);
355 case MSGRCV: 356 case MSGRCV:
356 switch (version) { 357 switch (version) {
@@ -360,7 +361,7 @@ asmlinkage int sys_ipc (uint call, int first, int second,
360 return -EINVAL; 361 return -EINVAL;
361 362
362 if (copy_from_user(&tmp, 363 if (copy_from_user(&tmp,
363 (struct ipc_kludge *) ptr, 364 (struct ipc_kludge __user *) ptr,
364 sizeof (tmp))) 365 sizeof (tmp)))
365 return -EFAULT; 366 return -EFAULT;
366 return sys_msgrcv (first, tmp.msgp, second, 367 return sys_msgrcv (first, tmp.msgp, second,
@@ -368,35 +369,38 @@ asmlinkage int sys_ipc (uint call, int first, int second,
368 } 369 }
369 default: 370 default:
370 return sys_msgrcv (first, 371 return sys_msgrcv (first,
371 (struct msgbuf *) ptr, 372 (struct msgbuf __user *) ptr,
372 second, fifth, third); 373 second, fifth, third);
373 } 374 }
374 case MSGGET: 375 case MSGGET:
375 return sys_msgget ((key_t) first, second); 376 return sys_msgget ((key_t) first, second);
376 case MSGCTL: 377 case MSGCTL:
377 return sys_msgctl (first, second, (struct msqid_ds *) ptr); 378 return sys_msgctl (first, second,
379 (struct msqid_ds __user *) ptr);
378 380
379 case SHMAT: 381 case SHMAT:
380 switch (version) { 382 switch (version) {
381 default: { 383 default: {
382 ulong raddr; 384 ulong raddr;
383 ret = do_shmat (first, (char *) ptr, second, &raddr); 385 ret = do_shmat (first, (char __user *) ptr, second,
386 &raddr);
384 if (ret) 387 if (ret)
385 return ret; 388 return ret;
386 return put_user (raddr, (ulong *) third); 389 return put_user (raddr, (ulong __user *) third);
387 } 390 }
388 case 1: /* iBCS2 emulator entry point */ 391 case 1: /* iBCS2 emulator entry point */
389 if (!segment_eq(get_fs(), get_ds())) 392 if (!segment_eq(get_fs(), get_ds()))
390 return -EINVAL; 393 return -EINVAL;
391 return do_shmat (first, (char *) ptr, second, (ulong *) third); 394 return do_shmat (first, (char __user *) ptr, second,
395 (ulong *) third);
392 } 396 }
393 case SHMDT: 397 case SHMDT:
394 return sys_shmdt ((char *)ptr); 398 return sys_shmdt ((char __user *)ptr);
395 case SHMGET: 399 case SHMGET:
396 return sys_shmget (first, second, third); 400 return sys_shmget (first, second, third);
397 case SHMCTL: 401 case SHMCTL:
398 return sys_shmctl (first, second, 402 return sys_shmctl (first, second,
399 (struct shmid_ds *) ptr); 403 (struct shmid_ds __user *) ptr);
400 default: 404 default:
401 return -ENOSYS; 405 return -ENOSYS;
402 } 406 }
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 59a187956de0..c9d2b5147ca3 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -1168,7 +1168,7 @@ void __init per_cpu_trap_init(void)
1168#endif 1168#endif
1169 if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV) 1169 if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV)
1170 status_set |= ST0_XX; 1170 status_set |= ST0_XX;
1171 change_c0_status(ST0_CU|ST0_MX|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX, 1171 change_c0_status(ST0_CU|ST0_MX|ST0_RE|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX,
1172 status_set); 1172 status_set);
1173 1173
1174 if (cpu_has_dsp) 1174 if (cpu_has_dsp)
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
index 25cc856d8e7e..ff699dbb99f7 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -1,4 +1,5 @@
1#include <linux/config.h> 1#include <linux/config.h>
2#include <asm/asm-offsets.h>
2#include <asm-generic/vmlinux.lds.h> 3#include <asm-generic/vmlinux.lds.h>
3 4
4#undef mips /* CPP really sucks for this job */ 5#undef mips /* CPP really sucks for this job */
@@ -64,10 +65,10 @@ SECTIONS
64 we can shorten the on-disk segment size. */ 65 we can shorten the on-disk segment size. */
65 .sdata : { *(.sdata) } 66 .sdata : { *(.sdata) }
66 67
67 . = ALIGN(4096); 68 . = ALIGN(_PAGE_SIZE);
68 __nosave_begin = .; 69 __nosave_begin = .;
69 .data_nosave : { *(.data.nosave) } 70 .data_nosave : { *(.data.nosave) }
70 . = ALIGN(4096); 71 . = ALIGN(_PAGE_SIZE);
71 __nosave_end = .; 72 __nosave_end = .;
72 73
73 . = ALIGN(32); 74 . = ALIGN(32);
@@ -76,7 +77,7 @@ SECTIONS
76 _edata = .; /* End of data section */ 77 _edata = .; /* End of data section */
77 78
78 /* will be freed after init */ 79 /* will be freed after init */
79 . = ALIGN(4096); /* Init code and data */ 80 . = ALIGN(_PAGE_SIZE); /* Init code and data */
80 __init_begin = .; 81 __init_begin = .;
81 .init.text : { 82 .init.text : {
82 _sinittext = .; 83 _sinittext = .;
@@ -105,7 +106,7 @@ SECTIONS
105 .con_initcall.init : { *(.con_initcall.init) } 106 .con_initcall.init : { *(.con_initcall.init) }
106 __con_initcall_end = .; 107 __con_initcall_end = .;
107 SECURITY_INIT 108 SECURITY_INIT
108 . = ALIGN(4096); 109 . = ALIGN(_PAGE_SIZE);
109 __initramfs_start = .; 110 __initramfs_start = .;
110 .init.ramfs : { *(.init.ramfs) } 111 .init.ramfs : { *(.init.ramfs) }
111 __initramfs_end = .; 112 __initramfs_end = .;
@@ -113,7 +114,7 @@ SECTIONS
113 __per_cpu_start = .; 114 __per_cpu_start = .;
114 .data.percpu : { *(.data.percpu) } 115 .data.percpu : { *(.data.percpu) }
115 __per_cpu_end = .; 116 __per_cpu_end = .;
116 . = ALIGN(4096); 117 . = ALIGN(_PAGE_SIZE);
117 __init_end = .; 118 __init_end = .;
118 /* freed after init ends here */ 119 /* freed after init ends here */
119 120
diff --git a/arch/mips/lasat/reset.c b/arch/mips/lasat/reset.c
index 8d7d7a454f9a..181bf68175fc 100644
--- a/arch/mips/lasat/reset.c
+++ b/arch/mips/lasat/reset.c
@@ -19,9 +19,12 @@
19 */ 19 */
20#include <linux/config.h> 20#include <linux/config.h>
21#include <linux/kernel.h> 21#include <linux/kernel.h>
22#include <linux/pm.h>
23
22#include <asm/reboot.h> 24#include <asm/reboot.h>
23#include <asm/system.h> 25#include <asm/system.h>
24#include <asm/lasat/lasat.h> 26#include <asm/lasat/lasat.h>
27
25#include "picvue.h" 28#include "picvue.h"
26#include "prom.h" 29#include "prom.h"
27 30
@@ -63,5 +66,5 @@ void lasat_reboot_setup(void)
63{ 66{
64 _machine_restart = lasat_machine_restart; 67 _machine_restart = lasat_machine_restart;
65 _machine_halt = lasat_machine_halt; 68 _machine_halt = lasat_machine_halt;
66 _machine_power_off = lasat_machine_halt; 69 pm_power_off = lasat_machine_halt;
67} 70}
diff --git a/arch/mips/lasat/setup.c b/arch/mips/lasat/setup.c
index dcd819d57dae..83eb08b7a072 100644
--- a/arch/mips/lasat/setup.c
+++ b/arch/mips/lasat/setup.c
@@ -134,8 +134,8 @@ void __init serial_init(void)
134 134
135 memset(&s, 0, sizeof(s)); 135 memset(&s, 0, sizeof(s));
136 136
137 s.flags = STD_COM_FLAGS; 137 s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
138 s.iotype = SERIAL_IO_MEM; 138 s.iotype = UPIO_MEM;
139 139
140 if (mips_machtype == MACH_LASAT_100) { 140 if (mips_machtype == MACH_LASAT_100) {
141 s.uartclk = LASAT_BASE_BAUD_100 * 16; 141 s.uartclk = LASAT_BASE_BAUD_100 * 16;
diff --git a/arch/mips/lib-32/dump_tlb.c b/arch/mips/lib-32/dump_tlb.c
index 46519f4331eb..c49a925d0169 100644
--- a/arch/mips/lib-32/dump_tlb.c
+++ b/arch/mips/lib-32/dump_tlb.c
@@ -158,29 +158,26 @@ void dump_list_process(struct task_struct *t, void *address)
158 printk("task->mm == %8p\n", t->mm); 158 printk("task->mm == %8p\n", t->mm);
159 //printk("tasks->mm.pgd == %08x\n", (unsigned int) t->mm->pgd); 159 //printk("tasks->mm.pgd == %08x\n", (unsigned int) t->mm->pgd);
160 160
161 if (addr > KSEG0) 161 if (addr > KSEG0) {
162 page_dir = pgd_offset_k(0); 162 page_dir = pgd_offset_k(0);
163 else if (t->mm) {
164 page_dir = pgd_offset(t->mm, 0);
165 printk("page_dir == %08x\n", (unsigned int) page_dir);
166 } else
167 printk("Current thread has no mm\n");
168
169 if (addr > KSEG0)
170 pgd = pgd_offset_k(addr); 163 pgd = pgd_offset_k(addr);
171 else if (t->mm) { 164 } else if (t->mm) {
165 page_dir = pgd_offset(t->mm, 0);
172 pgd = pgd_offset(t->mm, addr); 166 pgd = pgd_offset(t->mm, addr);
173 printk("pgd == %08x, ", (unsigned int) pgd); 167 } else {
174 pud = pud_offset(pgd, addr); 168 printk("Current thread has no mm\n");
175 printk("pud == %08x, ", (unsigned int) pud); 169 return;
170 }
171 printk("page_dir == %08x\n", (unsigned int) page_dir);
172 printk("pgd == %08x, ", (unsigned int) pgd);
173 pud = pud_offset(pgd, addr);
174 printk("pud == %08x, ", (unsigned int) pud);
176 175
177 pmd = pmd_offset(pud, addr); 176 pmd = pmd_offset(pud, addr);
178 printk("pmd == %08x, ", (unsigned int) pmd); 177 printk("pmd == %08x, ", (unsigned int) pmd);
179 178
180 pte = pte_offset(pmd, addr); 179 pte = pte_offset(pmd, addr);
181 printk("pte == %08x, ", (unsigned int) pte); 180 printk("pte == %08x, ", (unsigned int) pte);
182 } else
183 printk("Current thread has no mm\n");
184 181
185 page = *pte; 182 page = *pte;
186#ifdef CONFIG_64BIT_PHYS_ADDR 183#ifdef CONFIG_64BIT_PHYS_ADDR
diff --git a/arch/mips/math-emu/dp_simple.c b/arch/mips/math-emu/dp_simple.c
index 495c1ac94298..1c555e6c6a9f 100644
--- a/arch/mips/math-emu/dp_simple.c
+++ b/arch/mips/math-emu/dp_simple.c
@@ -48,16 +48,22 @@ ieee754dp ieee754dp_neg(ieee754dp x)
48 CLEARCX; 48 CLEARCX;
49 FLUSHXDP; 49 FLUSHXDP;
50 50
51 /*
52 * Invert the sign ALWAYS to prevent an endless recursion on
53 * pow() in libc.
54 */
55 /* quick fix up */
56 DPSIGN(x) ^= 1;
57
51 if (xc == IEEE754_CLASS_SNAN) { 58 if (xc == IEEE754_CLASS_SNAN) {
59 ieee754dp y = ieee754dp_indef();
52 SETCX(IEEE754_INVALID_OPERATION); 60 SETCX(IEEE754_INVALID_OPERATION);
53 return ieee754dp_nanxcpt(ieee754dp_indef(), "neg"); 61 DPSIGN(y) = DPSIGN(x);
62 return ieee754dp_nanxcpt(y, "neg");
54 } 63 }
55 64
56 if (ieee754dp_isnan(x)) /* but not infinity */ 65 if (ieee754dp_isnan(x)) /* but not infinity */
57 return ieee754dp_nanxcpt(x, "neg", x); 66 return ieee754dp_nanxcpt(x, "neg", x);
58
59 /* quick fix up */
60 DPSIGN(x) ^= 1;
61 return x; 67 return x;
62} 68}
63 69
diff --git a/arch/mips/math-emu/sp_simple.c b/arch/mips/math-emu/sp_simple.c
index c809830dffb4..770f0f4677cd 100644
--- a/arch/mips/math-emu/sp_simple.c
+++ b/arch/mips/math-emu/sp_simple.c
@@ -48,16 +48,22 @@ ieee754sp ieee754sp_neg(ieee754sp x)
48 CLEARCX; 48 CLEARCX;
49 FLUSHXSP; 49 FLUSHXSP;
50 50
51 /*
52 * Invert the sign ALWAYS to prevent an endless recursion on
53 * pow() in libc.
54 */
55 /* quick fix up */
56 SPSIGN(x) ^= 1;
57
51 if (xc == IEEE754_CLASS_SNAN) { 58 if (xc == IEEE754_CLASS_SNAN) {
59 ieee754sp y = ieee754sp_indef();
52 SETCX(IEEE754_INVALID_OPERATION); 60 SETCX(IEEE754_INVALID_OPERATION);
53 return ieee754sp_nanxcpt(ieee754sp_indef(), "neg"); 61 SPSIGN(y) = SPSIGN(x);
62 return ieee754sp_nanxcpt(y, "neg");
54 } 63 }
55 64
56 if (ieee754sp_isnan(x)) /* but not infinity */ 65 if (ieee754sp_isnan(x)) /* but not infinity */
57 return ieee754sp_nanxcpt(x, "neg", x); 66 return ieee754sp_nanxcpt(x, "neg", x);
58
59 /* quick fix up */
60 SPSIGN(x) ^= 1;
61 return x; 67 return x;
62} 68}
63 69
diff --git a/arch/mips/mips-boards/atlas/atlas_setup.c b/arch/mips/mips-boards/atlas/atlas_setup.c
index 625843b30bed..873cf3141a31 100644
--- a/arch/mips/mips-boards/atlas/atlas_setup.c
+++ b/arch/mips/mips-boards/atlas/atlas_setup.c
@@ -82,8 +82,8 @@ static void __init serial_init(void)
82#endif 82#endif
83 s.irq = ATLASINT_UART; 83 s.irq = ATLASINT_UART;
84 s.uartclk = ATLAS_BASE_BAUD * 16; 84 s.uartclk = ATLAS_BASE_BAUD * 16;
85 s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 85 s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_AUTO_IRQ;
86 s.iotype = SERIAL_IO_PORT; 86 s.iotype = UPIO_PORT;
87 s.regshift = 3; 87 s.regshift = 3;
88 88
89 if (early_serial_setup(&s) != 0) { 89 if (early_serial_setup(&s) != 0) {
diff --git a/arch/mips/mips-boards/generic/reset.c b/arch/mips/mips-boards/generic/reset.c
index 9fdec743bd95..7213c395fb6b 100644
--- a/arch/mips/mips-boards/generic/reset.c
+++ b/arch/mips/mips-boards/generic/reset.c
@@ -23,6 +23,7 @@
23 * 23 *
24 */ 24 */
25#include <linux/config.h> 25#include <linux/config.h>
26#include <linux/pm.h>
26 27
27#include <asm/io.h> 28#include <asm/io.h>
28#include <asm/reboot.h> 29#include <asm/reboot.h>
@@ -65,9 +66,9 @@ void mips_reboot_setup(void)
65 _machine_restart = mips_machine_restart; 66 _machine_restart = mips_machine_restart;
66 _machine_halt = mips_machine_halt; 67 _machine_halt = mips_machine_halt;
67#if defined(CONFIG_MIPS_ATLAS) 68#if defined(CONFIG_MIPS_ATLAS)
68 _machine_power_off = atlas_machine_power_off; 69 pm_power_off = atlas_machine_power_off;
69#endif 70#endif
70#if defined(CONFIG_MIPS_MALTA) || defined(CONFIG_MIPS_SEAD) 71#if defined(CONFIG_MIPS_MALTA) || defined(CONFIG_MIPS_SEAD)
71 _machine_power_off = mips_machine_halt; 72 pm_power_off = mips_machine_halt;
72#endif 73#endif
73} 74}
diff --git a/arch/mips/mips-boards/sead/sead_setup.c b/arch/mips/mips-boards/sead/sead_setup.c
index f966bc161dfa..4266ce445174 100644
--- a/arch/mips/mips-boards/sead/sead_setup.c
+++ b/arch/mips/mips-boards/sead/sead_setup.c
@@ -71,8 +71,8 @@ static void __init serial_init(void)
71#endif 71#endif
72 s.irq = MIPSCPU_INT_BASE + MIPSCPU_INT_UART0; 72 s.irq = MIPSCPU_INT_BASE + MIPSCPU_INT_UART0;
73 s.uartclk = SEAD_BASE_BAUD * 16; 73 s.uartclk = SEAD_BASE_BAUD * 16;
74 s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 74 s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_AUTO_IRQ;
75 s.iotype = 0; 75 s.iotype = UPIO_PORT;
76 s.regshift = 3; 76 s.regshift = 3;
77 77
78 if (early_serial_setup(&s) != 0) { 78 if (early_serial_setup(&s) != 0) {
diff --git a/arch/mips/mips-boards/sim/sim_setup.c b/arch/mips/mips-boards/sim/sim_setup.c
index 485d5a58d9cf..a2fd62997ca3 100644
--- a/arch/mips/mips-boards/sim/sim_setup.c
+++ b/arch/mips/mips-boards/sim/sim_setup.c
@@ -88,8 +88,8 @@ static void __init serial_init(void)
88 but poll for now */ 88 but poll for now */
89 s.irq = 0; 89 s.irq = 0;
90 s.uartclk = BASE_BAUD * 16; 90 s.uartclk = BASE_BAUD * 16;
91 s.flags = ASYNC_BOOT_AUTOCONF | UPF_SKIP_TEST; 91 s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
92 s.iotype = SERIAL_IO_PORT | ASYNC_SKIP_TEST; 92 s.iotype = UPIO_PORT;
93 s.regshift = 0; 93 s.regshift = 0;
94 s.timeout = 4; 94 s.timeout = 4;
95 95
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 422b55fab07a..e51c38cef88e 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -464,8 +464,8 @@ static void r4k_flush_data_cache_page(unsigned long addr)
464} 464}
465 465
466struct flush_icache_range_args { 466struct flush_icache_range_args {
467 unsigned long __user start; 467 unsigned long start;
468 unsigned long __user end; 468 unsigned long end;
469}; 469};
470 470
471static inline void local_r4k_flush_icache_range(void *args) 471static inline void local_r4k_flush_icache_range(void *args)
@@ -528,8 +528,7 @@ static inline void local_r4k_flush_icache_range(void *args)
528 } 528 }
529} 529}
530 530
531static void r4k_flush_icache_range(unsigned long __user start, 531static void r4k_flush_icache_range(unsigned long start, unsigned long end)
532 unsigned long __user end)
533{ 532{
534 struct flush_icache_range_args args; 533 struct flush_icache_range_args args;
535 534
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c
index 314701a66b13..591c22b080e4 100644
--- a/arch/mips/mm/cache.c
+++ b/arch/mips/mm/cache.c
@@ -25,8 +25,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
25 unsigned long end); 25 unsigned long end);
26void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, 26void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page,
27 unsigned long pfn); 27 unsigned long pfn);
28void (*flush_icache_range)(unsigned long __user start, 28void (*flush_icache_range)(unsigned long start, unsigned long end);
29 unsigned long __user end);
30void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page); 29void (*flush_icache_page)(struct vm_area_struct *vma, struct page *page);
31 30
32/* MIPS specific cache operations */ 31/* MIPS specific cache operations */
@@ -53,7 +52,7 @@ EXPORT_SYMBOL(_dma_cache_inv);
53 * We could optimize the case where the cache argument is not BCACHE but 52 * We could optimize the case where the cache argument is not BCACHE but
54 * that seems very atypical use ... 53 * that seems very atypical use ...
55 */ 54 */
56asmlinkage int sys_cacheflush(unsigned long __user addr, 55asmlinkage int sys_cacheflush(unsigned long addr,
57 unsigned long bytes, unsigned int cache) 56 unsigned long bytes, unsigned int cache)
58{ 57{
59 if (bytes == 0) 58 if (bytes == 0)
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 4ee91c9a556f..0ff9a348b843 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -24,6 +24,7 @@
24#include <linux/bootmem.h> 24#include <linux/bootmem.h>
25#include <linux/highmem.h> 25#include <linux/highmem.h>
26#include <linux/swap.h> 26#include <linux/swap.h>
27#include <linux/proc_fs.h>
27 28
28#include <asm/bootinfo.h> 29#include <asm/bootinfo.h>
29#include <asm/cachectl.h> 30#include <asm/cachectl.h>
@@ -200,6 +201,11 @@ static inline int page_is_ram(unsigned long pagenr)
200 return 0; 201 return 0;
201} 202}
202 203
204static struct kcore_list kcore_mem, kcore_vmalloc;
205#ifdef CONFIG_64BIT
206static struct kcore_list kcore_kseg0;
207#endif
208
203void __init mem_init(void) 209void __init mem_init(void)
204{ 210{
205 unsigned long codesize, reservedpages, datasize, initsize; 211 unsigned long codesize, reservedpages, datasize, initsize;
@@ -249,6 +255,16 @@ void __init mem_init(void)
249 datasize = (unsigned long) &_edata - (unsigned long) &_etext; 255 datasize = (unsigned long) &_edata - (unsigned long) &_etext;
250 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; 256 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
251 257
258#ifdef CONFIG_64BIT
259 if ((unsigned long) &_text > (unsigned long) CKSEG0)
260 /* The -4 is a hack so that user tools don't have to handle
261 the overflow. */
262 kclist_add(&kcore_kseg0, (void *) CKSEG0, 0x80000000 - 4);
263#endif
264 kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT);
265 kclist_add(&kcore_vmalloc, (void *)VMALLOC_START,
266 VMALLOC_END-VMALLOC_START);
267
252 printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, " 268 printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
253 "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n", 269 "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n",
254 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), 270 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
diff --git a/arch/mips/momentum/jaguar_atx/ja-console.c b/arch/mips/momentum/jaguar_atx/ja-console.c
index da6e1ed34db1..2292d0ec47fc 100644
--- a/arch/mips/momentum/jaguar_atx/ja-console.c
+++ b/arch/mips/momentum/jaguar_atx/ja-console.c
@@ -93,7 +93,7 @@ static void inline ja_console_probe(void)
93 up.uartclk = JAGUAR_ATX_UART_CLK; 93 up.uartclk = JAGUAR_ATX_UART_CLK;
94 up.regshift = 2; 94 up.regshift = 2;
95 up.iotype = UPIO_MEM; 95 up.iotype = UPIO_MEM;
96 up.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 96 up.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
97 up.line = 0; 97 up.line = 0;
98 98
99 if (early_serial_setup(&up)) 99 if (early_serial_setup(&up))
diff --git a/arch/mips/momentum/jaguar_atx/setup.c b/arch/mips/momentum/jaguar_atx/setup.c
index bab192ddc185..301d67226d72 100644
--- a/arch/mips/momentum/jaguar_atx/setup.c
+++ b/arch/mips/momentum/jaguar_atx/setup.c
@@ -50,6 +50,7 @@
50#include <linux/pci.h> 50#include <linux/pci.h>
51#include <linux/swap.h> 51#include <linux/swap.h>
52#include <linux/ioport.h> 52#include <linux/ioport.h>
53#include <linux/pm.h>
53#include <linux/sched.h> 54#include <linux/sched.h>
54#include <linux/interrupt.h> 55#include <linux/interrupt.h>
55#include <linux/timex.h> 56#include <linux/timex.h>
@@ -365,7 +366,7 @@ void __init plat_setup(void)
365 366
366 _machine_restart = momenco_jaguar_restart; 367 _machine_restart = momenco_jaguar_restart;
367 _machine_halt = momenco_jaguar_halt; 368 _machine_halt = momenco_jaguar_halt;
368 _machine_power_off = momenco_jaguar_power_off; 369 pm_power_off = momenco_jaguar_power_off;
369 370
370 /* 371 /*
371 * initrd_start = (ulong)jaguar_initrd_start; 372 * initrd_start = (ulong)jaguar_initrd_start;
diff --git a/arch/mips/momentum/ocelot_3/setup.c b/arch/mips/momentum/ocelot_3/setup.c
index c9b7ff8148ec..f95677f4f06f 100644
--- a/arch/mips/momentum/ocelot_3/setup.c
+++ b/arch/mips/momentum/ocelot_3/setup.c
@@ -57,6 +57,8 @@
57#include <linux/timex.h> 57#include <linux/timex.h>
58#include <linux/bootmem.h> 58#include <linux/bootmem.h>
59#include <linux/mv643xx.h> 59#include <linux/mv643xx.h>
60#include <linux/pm.h>
61
60#include <asm/time.h> 62#include <asm/time.h>
61#include <asm/page.h> 63#include <asm/page.h>
62#include <asm/bootinfo.h> 64#include <asm/bootinfo.h>
@@ -321,7 +323,7 @@ void __init plat_setup(void)
321 323
322 _machine_restart = momenco_ocelot_restart; 324 _machine_restart = momenco_ocelot_restart;
323 _machine_halt = momenco_ocelot_halt; 325 _machine_halt = momenco_ocelot_halt;
324 _machine_power_off = momenco_ocelot_power_off; 326 pm_power_off = momenco_ocelot_power_off;
325 327
326 /* Wired TLB entries */ 328 /* Wired TLB entries */
327 setup_wired_tlb_entries(); 329 setup_wired_tlb_entries();
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c
index 2755c1547473..15998d8a9341 100644
--- a/arch/mips/momentum/ocelot_c/setup.c
+++ b/arch/mips/momentum/ocelot_c/setup.c
@@ -51,8 +51,10 @@
51#include <linux/sched.h> 51#include <linux/sched.h>
52#include <linux/interrupt.h> 52#include <linux/interrupt.h>
53#include <linux/pci.h> 53#include <linux/pci.h>
54#include <linux/pm.h>
54#include <linux/timex.h> 55#include <linux/timex.h>
55#include <linux/vmalloc.h> 56#include <linux/vmalloc.h>
57
56#include <asm/time.h> 58#include <asm/time.h>
57#include <asm/bootinfo.h> 59#include <asm/bootinfo.h>
58#include <asm/page.h> 60#include <asm/page.h>
@@ -236,7 +238,7 @@ void __init plat_setup(void)
236 238
237 _machine_restart = momenco_ocelot_restart; 239 _machine_restart = momenco_ocelot_restart;
238 _machine_halt = momenco_ocelot_halt; 240 _machine_halt = momenco_ocelot_halt;
239 _machine_power_off = momenco_ocelot_power_off; 241 pm_power_off = momenco_ocelot_power_off;
240 242
241 /* 243 /*
242 * initrd_start = (ulong)ocelot_initrd_start; 244 * initrd_start = (ulong)ocelot_initrd_start;
diff --git a/arch/mips/momentum/ocelot_g/setup.c b/arch/mips/momentum/ocelot_g/setup.c
index 6336751391c3..fed4e8eee116 100644
--- a/arch/mips/momentum/ocelot_g/setup.c
+++ b/arch/mips/momentum/ocelot_g/setup.c
@@ -47,8 +47,10 @@
47#include <linux/sched.h> 47#include <linux/sched.h>
48#include <linux/interrupt.h> 48#include <linux/interrupt.h>
49#include <linux/pci.h> 49#include <linux/pci.h>
50#include <linux/pm.h>
50#include <linux/timex.h> 51#include <linux/timex.h>
51#include <linux/vmalloc.h> 52#include <linux/vmalloc.h>
53
52#include <asm/time.h> 54#include <asm/time.h>
53#include <asm/bootinfo.h> 55#include <asm/bootinfo.h>
54#include <asm/page.h> 56#include <asm/page.h>
@@ -169,7 +171,7 @@ void __init plat_setup(void)
169 171
170 _machine_restart = momenco_ocelot_restart; 172 _machine_restart = momenco_ocelot_restart;
171 _machine_halt = momenco_ocelot_halt; 173 _machine_halt = momenco_ocelot_halt;
172 _machine_power_off = momenco_ocelot_power_off; 174 pm_power_off = momenco_ocelot_power_off;
173 175
174 /* 176 /*
175 * initrd_start = (ulong)ocelot_initrd_start; 177 * initrd_start = (ulong)ocelot_initrd_start;
diff --git a/arch/mips/oprofile/Makefile b/arch/mips/oprofile/Makefile
index 354261d37d62..0a50aad5bbe4 100644
--- a/arch/mips/oprofile/Makefile
+++ b/arch/mips/oprofile/Makefile
@@ -12,4 +12,5 @@ oprofile-y := $(DRIVER_OBJS) common.o
12 12
13oprofile-$(CONFIG_CPU_MIPS32) += op_model_mipsxx.o 13oprofile-$(CONFIG_CPU_MIPS32) += op_model_mipsxx.o
14oprofile-$(CONFIG_CPU_MIPS64) += op_model_mipsxx.o 14oprofile-$(CONFIG_CPU_MIPS64) += op_model_mipsxx.o
15oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o
15oprofile-$(CONFIG_CPU_RM9000) += op_model_rm9000.o 16oprofile-$(CONFIG_CPU_RM9000) += op_model_rm9000.o
diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c
index 53f9889b30ed..935dd851f480 100644
--- a/arch/mips/oprofile/common.c
+++ b/arch/mips/oprofile/common.c
@@ -79,6 +79,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
79 case CPU_20KC: 79 case CPU_20KC:
80 case CPU_24K: 80 case CPU_24K:
81 case CPU_25KF: 81 case CPU_25KF:
82 case CPU_34K:
83 case CPU_SB1:
84 case CPU_SB1A:
82 lmodel = &op_model_mipsxx; 85 lmodel = &op_model_mipsxx;
83 break; 86 break;
84 87
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c
index 1d1eee407faf..95d488ca0754 100644
--- a/arch/mips/oprofile/op_model_mipsxx.c
+++ b/arch/mips/oprofile/op_model_mipsxx.c
@@ -201,10 +201,21 @@ static int __init mipsxx_init(void)
201 op_model_mipsxx.cpu_type = "mips/25K"; 201 op_model_mipsxx.cpu_type = "mips/25K";
202 break; 202 break;
203 203
204#ifndef CONFIG_SMP
205 case CPU_34K:
206 op_model_mipsxx.cpu_type = "mips/34K";
207 break;
208#endif
209
204 case CPU_5KC: 210 case CPU_5KC:
205 op_model_mipsxx.cpu_type = "mips/5K"; 211 op_model_mipsxx.cpu_type = "mips/5K";
206 break; 212 break;
207 213
214 case CPU_SB1:
215 case CPU_SB1A:
216 op_model_mipsxx.cpu_type = "mips/sb1";
217 break;
218
208 default: 219 default:
209 printk(KERN_ERR "Profiling unsupported for this CPU\n"); 220 printk(KERN_ERR "Profiling unsupported for this CPU\n");
210 221
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
index 741e67c9195a..16205b587338 100644
--- a/arch/mips/pci/Makefile
+++ b/arch/mips/pci/Makefile
@@ -46,6 +46,7 @@ obj-$(CONFIG_PMC_YOSEMITE) += fixup-yosemite.o ops-titan.o ops-titan-ht.o \
46obj-$(CONFIG_SGI_IP27) += pci-ip27.o 46obj-$(CONFIG_SGI_IP27) += pci-ip27.o
47obj-$(CONFIG_SGI_IP32) += fixup-ip32.o ops-mace.o pci-ip32.o 47obj-$(CONFIG_SGI_IP32) += fixup-ip32.o ops-mace.o pci-ip32.o
48obj-$(CONFIG_SIBYTE_SB1250) += fixup-sb1250.o pci-sb1250.o 48obj-$(CONFIG_SIBYTE_SB1250) += fixup-sb1250.o pci-sb1250.o
49obj-$(CONFIG_SIBYTE_BCM112X) += fixup-sb1250.o pci-sb1250.o
49obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o 50obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o
50obj-$(CONFIG_SNI_RM200_PCI) += fixup-sni.o ops-sni.o 51obj-$(CONFIG_SNI_RM200_PCI) += fixup-sni.o ops-sni.o
51obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o 52obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o
diff --git a/arch/mips/pci/fixup-cobalt.c b/arch/mips/pci/fixup-cobalt.c
index 909292f50d06..75a01e764898 100644
--- a/arch/mips/pci/fixup-cobalt.c
+++ b/arch/mips/pci/fixup-cobalt.c
@@ -17,7 +17,7 @@
17#include <asm/io.h> 17#include <asm/io.h>
18#include <asm/gt64120.h> 18#include <asm/gt64120.h>
19 19
20#include <asm/cobalt/cobalt.h> 20#include <asm/mach-cobalt/cobalt.h>
21 21
22extern int cobalt_board_id; 22extern int cobalt_board_id;
23 23
@@ -52,7 +52,7 @@ static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
52 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lt); 52 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lt);
53 if (lt < 64) 53 if (lt < 64)
54 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64); 54 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
55 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7); 55 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8);
56} 56}
57 57
58DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, 58DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1,
@@ -69,7 +69,7 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev)
69 * host bridge. 69 * host bridge.
70 */ 70 */
71 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64); 71 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
72 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7); 72 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8);
73 73
74 /* 74 /*
75 * The code described by the comment below has been removed 75 * The code described by the comment below has been removed
diff --git a/arch/mips/pci/ops-gt64111.c b/arch/mips/pci/ops-gt64111.c
index c1807934768d..13de45940b19 100644
--- a/arch/mips/pci/ops-gt64111.c
+++ b/arch/mips/pci/ops-gt64111.c
@@ -15,7 +15,7 @@
15#include <asm/io.h> 15#include <asm/io.h>
16#include <asm/gt64120.h> 16#include <asm/gt64120.h>
17 17
18#include <asm/cobalt/cobalt.h> 18#include <asm/mach-cobalt/cobalt.h>
19 19
20/* 20/*
21 * Device 31 on the GT64111 is used to generate PCI special 21 * Device 31 on the GT64111 is used to generate PCI special
diff --git a/arch/mips/pci/pci-bcm1480.c b/arch/mips/pci/pci-bcm1480.c
index f194b4e4f86a..ca975e7d32ff 100644
--- a/arch/mips/pci/pci-bcm1480.c
+++ b/arch/mips/pci/pci-bcm1480.c
@@ -234,11 +234,9 @@ static int __init bcm1480_pcibios_init(void)
234 234
235 /* turn on ExpMemEn */ 235 /* turn on ExpMemEn */
236 cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40)); 236 cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40));
237 printk("PCIFeatureCtrl = %x\n", cmdreg);
238 WRITECFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40), 237 WRITECFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40),
239 cmdreg | 0x10); 238 cmdreg | 0x10);
240 cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40)); 239 cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0), 0x40));
241 printk("PCIFeatureCtrl = %x\n", cmdreg);
242 240
243 /* 241 /*
244 * Establish mappings in KSEG2 (kernel virtual) to PCI I/O 242 * Establish mappings in KSEG2 (kernel virtual) to PCI I/O
diff --git a/arch/mips/philips/pnx8550/common/platform.c b/arch/mips/philips/pnx8550/common/platform.c
index 8aa9bd65b45e..a592260fd673 100644
--- a/arch/mips/philips/pnx8550/common/platform.c
+++ b/arch/mips/philips/pnx8550/common/platform.c
@@ -66,28 +66,28 @@ struct ip3106_port ip3106_ports[] = {
66 [0] = { 66 [0] = {
67 .port = { 67 .port = {
68 .type = PORT_IP3106, 68 .type = PORT_IP3106,
69 .iotype = SERIAL_IO_MEM, 69 .iotype = UPIO_MEM,
70 .membase = (void __iomem *)PNX8550_UART_PORT0, 70 .membase = (void __iomem *)PNX8550_UART_PORT0,
71 .mapbase = PNX8550_UART_PORT0, 71 .mapbase = PNX8550_UART_PORT0,
72 .irq = PNX8550_UART_INT(0), 72 .irq = PNX8550_UART_INT(0),
73 .uartclk = 3692300, 73 .uartclk = 3692300,
74 .fifosize = 16, 74 .fifosize = 16,
75 .ops = &ip3106_pops, 75 .ops = &ip3106_pops,
76 .flags = ASYNC_BOOT_AUTOCONF, 76 .flags = UPF_BOOT_AUTOCONF,
77 .line = 0, 77 .line = 0,
78 }, 78 },
79 }, 79 },
80 [1] = { 80 [1] = {
81 .port = { 81 .port = {
82 .type = PORT_IP3106, 82 .type = PORT_IP3106,
83 .iotype = SERIAL_IO_MEM, 83 .iotype = UPIO_MEM,
84 .membase = (void __iomem *)PNX8550_UART_PORT1, 84 .membase = (void __iomem *)PNX8550_UART_PORT1,
85 .mapbase = PNX8550_UART_PORT1, 85 .mapbase = PNX8550_UART_PORT1,
86 .irq = PNX8550_UART_INT(1), 86 .irq = PNX8550_UART_INT(1),
87 .uartclk = 3692300, 87 .uartclk = 3692300,
88 .fifosize = 16, 88 .fifosize = 16,
89 .ops = &ip3106_pops, 89 .ops = &ip3106_pops,
90 .flags = ASYNC_BOOT_AUTOCONF, 90 .flags = UPF_BOOT_AUTOCONF,
91 .line = 1, 91 .line = 1,
92 }, 92 },
93 }, 93 },
diff --git a/arch/mips/philips/pnx8550/common/setup.c b/arch/mips/philips/pnx8550/common/setup.c
index ee6bf72094f6..0d8a77619391 100644
--- a/arch/mips/philips/pnx8550/common/setup.c
+++ b/arch/mips/philips/pnx8550/common/setup.c
@@ -25,6 +25,7 @@
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/interrupt.h> 26#include <linux/interrupt.h>
27#include <linux/serial_ip3106.h> 27#include <linux/serial_ip3106.h>
28#include <linux/pm.h>
28 29
29#include <asm/cpu.h> 30#include <asm/cpu.h>
30#include <asm/bootinfo.h> 31#include <asm/bootinfo.h>
@@ -90,7 +91,7 @@ void __init plat_setup(void)
90 91
91 _machine_restart = pnx8550_machine_restart; 92 _machine_restart = pnx8550_machine_restart;
92 _machine_halt = pnx8550_machine_halt; 93 _machine_halt = pnx8550_machine_halt;
93 _machine_power_off = pnx8550_machine_power_off; 94 pm_power_off = pnx8550_machine_power_off;
94 95
95 board_time_init = pnx8550_time_init; 96 board_time_init = pnx8550_time_init;
96 board_timer_setup = pnx8550_timer_setup; 97 board_timer_setup = pnx8550_timer_setup;
diff --git a/arch/mips/pmc-sierra/yosemite/prom.c b/arch/mips/pmc-sierra/yosemite/prom.c
index 555bfacf7647..165275c00cbb 100644
--- a/arch/mips/pmc-sierra/yosemite/prom.c
+++ b/arch/mips/pmc-sierra/yosemite/prom.c
@@ -13,6 +13,7 @@
13#include <linux/sched.h> 13#include <linux/sched.h>
14#include <linux/mm.h> 14#include <linux/mm.h>
15#include <linux/delay.h> 15#include <linux/delay.h>
16#include <linux/pm.h>
16#include <linux/smp.h> 17#include <linux/smp.h>
17 18
18#include <asm/io.h> 19#include <asm/io.h>
@@ -92,7 +93,7 @@ void __init prom_init(void)
92 /* Callbacks for halt, restart */ 93 /* Callbacks for halt, restart */
93 _machine_restart = (void (*)(char *)) prom_exit; 94 _machine_restart = (void (*)(char *)) prom_exit;
94 _machine_halt = prom_halt; 95 _machine_halt = prom_halt;
95 _machine_power_off = prom_halt; 96 pm_power_off = prom_halt;
96 97
97 debug_vectors = cv; 98 debug_vectors = cv;
98 arcs_cmdline[0] = '\0'; 99 arcs_cmdline[0] = '\0';
diff --git a/arch/mips/pmc-sierra/yosemite/setup.c b/arch/mips/pmc-sierra/yosemite/setup.c
index 059755b5ed57..8bce711575de 100644
--- a/arch/mips/pmc-sierra/yosemite/setup.c
+++ b/arch/mips/pmc-sierra/yosemite/setup.c
@@ -185,7 +185,7 @@ static void __init py_uart_setup(void)
185 up.uartclk = TITAN_UART_CLK; 185 up.uartclk = TITAN_UART_CLK;
186 up.regshift = 0; 186 up.regshift = 0;
187 up.iotype = UPIO_MEM; 187 up.iotype = UPIO_MEM;
188 up.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 188 up.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
189 up.line = 0; 189 up.line = 0;
190 190
191 if (early_serial_setup(&up)) 191 if (early_serial_setup(&up))
diff --git a/arch/mips/sgi-ip22/ip22-reset.c b/arch/mips/sgi-ip22/ip22-reset.c
index 214ffd2e98a3..92a3b3c15ed3 100644
--- a/arch/mips/sgi-ip22/ip22-reset.c
+++ b/arch/mips/sgi-ip22/ip22-reset.c
@@ -3,8 +3,9 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 1997, 1998, 2001, 2003 by Ralf Baechle 6 * Copyright (C) 1997, 1998, 2001, 03, 05, 06 by Ralf Baechle
7 */ 7 */
8#include <linux/linkage.h>
8#include <linux/init.h> 9#include <linux/init.h>
9#include <linux/ds1286.h> 10#include <linux/ds1286.h>
10#include <linux/module.h> 11#include <linux/module.h>
@@ -12,6 +13,7 @@
12#include <linux/kernel.h> 13#include <linux/kernel.h>
13#include <linux/sched.h> 14#include <linux/sched.h>
14#include <linux/notifier.h> 15#include <linux/notifier.h>
16#include <linux/pm.h>
15#include <linux/timer.h> 17#include <linux/timer.h>
16 18
17#include <asm/io.h> 19#include <asm/io.h>
@@ -41,28 +43,10 @@ static struct timer_list power_timer, blink_timer, debounce_timer, volume_timer;
41 43
42#define MACHINE_PANICED 1 44#define MACHINE_PANICED 1
43#define MACHINE_SHUTTING_DOWN 2 45#define MACHINE_SHUTTING_DOWN 2
44static int machine_state = 0;
45 46
46static void sgi_machine_restart(char *command) __attribute__((noreturn)); 47static int machine_state;
47static void sgi_machine_halt(void) __attribute__((noreturn));
48static void sgi_machine_power_off(void) __attribute__((noreturn));
49 48
50static void sgi_machine_restart(char *command) 49static void ATTRIB_NORET sgi_machine_power_off(void)
51{
52 if (machine_state & MACHINE_SHUTTING_DOWN)
53 sgi_machine_power_off();
54 sgimc->cpuctrl0 |= SGIMC_CCTRL0_SYSINIT;
55 while (1);
56}
57
58static void sgi_machine_halt(void)
59{
60 if (machine_state & MACHINE_SHUTTING_DOWN)
61 sgi_machine_power_off();
62 ArcEnterInteractiveMode();
63}
64
65static void sgi_machine_power_off(void)
66{ 50{
67 unsigned int tmp; 51 unsigned int tmp;
68 52
@@ -84,6 +68,21 @@ static void sgi_machine_power_off(void)
84 } 68 }
85} 69}
86 70
71static void ATTRIB_NORET sgi_machine_restart(char *command)
72{
73 if (machine_state & MACHINE_SHUTTING_DOWN)
74 sgi_machine_power_off();
75 sgimc->cpuctrl0 |= SGIMC_CCTRL0_SYSINIT;
76 while (1);
77}
78
79static void ATTRIB_NORET sgi_machine_halt(void)
80{
81 if (machine_state & MACHINE_SHUTTING_DOWN)
82 sgi_machine_power_off();
83 ArcEnterInteractiveMode();
84}
85
87static void power_timeout(unsigned long data) 86static void power_timeout(unsigned long data)
88{ 87{
89 sgi_machine_power_off(); 88 sgi_machine_power_off();
@@ -95,7 +94,7 @@ static void blink_timeout(unsigned long data)
95 sgi_ioc_reset ^= (SGIOC_RESET_LC0OFF|SGIOC_RESET_LC1OFF); 94 sgi_ioc_reset ^= (SGIOC_RESET_LC0OFF|SGIOC_RESET_LC1OFF);
96 sgioc->reset = sgi_ioc_reset; 95 sgioc->reset = sgi_ioc_reset;
97 96
98 mod_timer(&blink_timer, jiffies+data); 97 mod_timer(&blink_timer, jiffies + data);
99} 98}
100 99
101static void debounce(unsigned long data) 100static void debounce(unsigned long data)
@@ -103,7 +102,7 @@ static void debounce(unsigned long data)
103 del_timer(&debounce_timer); 102 del_timer(&debounce_timer);
104 if (sgint->istat1 & SGINT_ISTAT1_PWR) { 103 if (sgint->istat1 & SGINT_ISTAT1_PWR) {
105 /* Interrupt still being sent. */ 104 /* Interrupt still being sent. */
106 debounce_timer.expires = jiffies + 5; /* 0.05s */ 105 debounce_timer.expires = jiffies + (HZ / 20); /* 0.05s */
107 add_timer(&debounce_timer); 106 add_timer(&debounce_timer);
108 107
109 sgioc->panel = SGIOC_PANEL_POWERON | SGIOC_PANEL_POWERINTR | 108 sgioc->panel = SGIOC_PANEL_POWERON | SGIOC_PANEL_POWERINTR |
@@ -151,7 +150,7 @@ static inline void volume_up_button(unsigned long data)
151 indy_volume_button(1); 150 indy_volume_button(1);
152 151
153 if (sgint->istat1 & SGINT_ISTAT1_PWR) { 152 if (sgint->istat1 & SGINT_ISTAT1_PWR) {
154 volume_timer.expires = jiffies + 1; 153 volume_timer.expires = jiffies + (HZ / 100);
155 add_timer(&volume_timer); 154 add_timer(&volume_timer);
156 } 155 }
157} 156}
@@ -164,7 +163,7 @@ static inline void volume_down_button(unsigned long data)
164 indy_volume_button(-1); 163 indy_volume_button(-1);
165 164
166 if (sgint->istat1 & SGINT_ISTAT1_PWR) { 165 if (sgint->istat1 & SGINT_ISTAT1_PWR) {
167 volume_timer.expires = jiffies + 1; 166 volume_timer.expires = jiffies + (HZ / 100);
168 add_timer(&volume_timer); 167 add_timer(&volume_timer);
169 } 168 }
170} 169}
@@ -199,14 +198,14 @@ static irqreturn_t panel_int(int irq, void *dev_id, struct pt_regs *regs)
199 if (!(buttons & SGIOC_PANEL_VOLUPINTR)) { 198 if (!(buttons & SGIOC_PANEL_VOLUPINTR)) {
200 init_timer(&volume_timer); 199 init_timer(&volume_timer);
201 volume_timer.function = volume_up_button; 200 volume_timer.function = volume_up_button;
202 volume_timer.expires = jiffies + 1; 201 volume_timer.expires = jiffies + (HZ / 100);
203 add_timer(&volume_timer); 202 add_timer(&volume_timer);
204 } 203 }
205 /* Volume down button was pressed */ 204 /* Volume down button was pressed */
206 if (!(buttons & SGIOC_PANEL_VOLDNINTR)) { 205 if (!(buttons & SGIOC_PANEL_VOLDNINTR)) {
207 init_timer(&volume_timer); 206 init_timer(&volume_timer);
208 volume_timer.function = volume_down_button; 207 volume_timer.function = volume_down_button;
209 volume_timer.expires = jiffies + 1; 208 volume_timer.expires = jiffies + (HZ / 100);
210 add_timer(&volume_timer); 209 add_timer(&volume_timer);
211 } 210 }
212 211
@@ -234,7 +233,7 @@ static int __init reboot_setup(void)
234{ 233{
235 _machine_restart = sgi_machine_restart; 234 _machine_restart = sgi_machine_restart;
236 _machine_halt = sgi_machine_halt; 235 _machine_halt = sgi_machine_halt;
237 _machine_power_off = sgi_machine_power_off; 236 pm_power_off = sgi_machine_power_off;
238 237
239 request_irq(SGI_PANEL_IRQ, panel_int, 0, "Front Panel", NULL); 238 request_irq(SGI_PANEL_IRQ, panel_int, 0, "Front Panel", NULL);
240 init_timer(&blink_timer); 239 init_timer(&blink_timer);
diff --git a/arch/mips/sgi-ip22/ip22-setup.c b/arch/mips/sgi-ip22/ip22-setup.c
index 5e59b4c8876b..7018e1833e85 100644
--- a/arch/mips/sgi-ip22/ip22-setup.c
+++ b/arch/mips/sgi-ip22/ip22-setup.c
@@ -56,6 +56,7 @@ extern void ip22_time_init(void) __init;
56void __init plat_setup(void) 56void __init plat_setup(void)
57{ 57{
58 char *ctype; 58 char *ctype;
59 char *cserial;
59 60
60 board_be_init = ip22_be_init; 61 board_be_init = ip22_be_init;
61 ip22_time_init(); 62 ip22_time_init();
@@ -81,9 +82,14 @@ void __init plat_setup(void)
81 /* ARCS console environment variable is set to "g?" for 82 /* ARCS console environment variable is set to "g?" for
82 * graphics console, it is set to "d" for the first serial 83 * graphics console, it is set to "d" for the first serial
83 * line and "d2" for the second serial line. 84 * line and "d2" for the second serial line.
85 *
86 * Need to check if the case is 'g' but no keyboard:
87 * (ConsoleIn/Out = serial)
84 */ 88 */
85 ctype = ArcGetEnvironmentVariable("console"); 89 ctype = ArcGetEnvironmentVariable("console");
86 if (ctype && *ctype == 'd') { 90 cserial = ArcGetEnvironmentVariable("ConsoleOut");
91
92 if ((ctype && *ctype == 'd') || (cserial && *cserial == 's')) {
87 static char options[8]; 93 static char options[8];
88 char *baud = ArcGetEnvironmentVariable("dbaud"); 94 char *baud = ArcGetEnvironmentVariable("dbaud");
89 if (baud) 95 if (baud)
@@ -91,7 +97,7 @@ void __init plat_setup(void)
91 add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0, 97 add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0,
92 baud ? options : NULL); 98 baud ? options : NULL);
93 } else if (!ctype || *ctype != 'g') { 99 } else if (!ctype || *ctype != 'g') {
94 /* Use ARC if we don't want serial ('d') or Newport ('g'). */ 100 /* Use ARC if we don't want serial ('d') or graphics ('g'). */
95 prom_flags |= PROM_FLAG_USE_AS_CONSOLE; 101 prom_flags |= PROM_FLAG_USE_AS_CONSOLE;
96 add_preferred_console("arc", 0, NULL); 102 add_preferred_console("arc", 0, NULL);
97 } 103 }
diff --git a/arch/mips/sgi-ip27/ip27-reset.c b/arch/mips/sgi-ip27/ip27-reset.c
index 2e16be94c78b..4322db57d3c1 100644
--- a/arch/mips/sgi-ip27/ip27-reset.c
+++ b/arch/mips/sgi-ip27/ip27-reset.c
@@ -5,7 +5,7 @@
5 * 5 *
6 * Reset an IP27. 6 * Reset an IP27.
7 * 7 *
8 * Copyright (C) 1997, 1998, 1999, 2000 by Ralf Baechle 8 * Copyright (C) 1997, 1998, 1999, 2000, 06 by Ralf Baechle
9 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 9 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
10 */ 10 */
11#include <linux/config.h> 11#include <linux/config.h>
@@ -15,6 +15,7 @@
15#include <linux/smp.h> 15#include <linux/smp.h>
16#include <linux/mmzone.h> 16#include <linux/mmzone.h>
17#include <linux/nodemask.h> 17#include <linux/nodemask.h>
18#include <linux/pm.h>
18 19
19#include <asm/io.h> 20#include <asm/io.h>
20#include <asm/irq.h> 21#include <asm/irq.h>
@@ -77,5 +78,5 @@ void ip27_reboot_setup(void)
77{ 78{
78 _machine_restart = ip27_machine_restart; 79 _machine_restart = ip27_machine_restart;
79 _machine_halt = ip27_machine_halt; 80 _machine_halt = ip27_machine_halt;
80 _machine_power_off = ip27_machine_power_off; 81 pm_power_off = ip27_machine_power_off;
81} 82}
diff --git a/arch/mips/sgi-ip32/ip32-reset.c b/arch/mips/sgi-ip32/ip32-reset.c
index 88e1f52059ff..0c948008b023 100644
--- a/arch/mips/sgi-ip32/ip32-reset.c
+++ b/arch/mips/sgi-ip32/ip32-reset.c
@@ -15,6 +15,7 @@
15#include <linux/delay.h> 15#include <linux/delay.h>
16#include <linux/ds17287rtc.h> 16#include <linux/ds17287rtc.h>
17#include <linux/interrupt.h> 17#include <linux/interrupt.h>
18#include <linux/pm.h>
18 19
19#include <asm/addrspace.h> 20#include <asm/addrspace.h>
20#include <asm/irq.h> 21#include <asm/irq.h>
@@ -188,7 +189,7 @@ static __init int ip32_reboot_setup(void)
188 189
189 _machine_restart = ip32_machine_restart; 190 _machine_restart = ip32_machine_restart;
190 _machine_halt = ip32_machine_halt; 191 _machine_halt = ip32_machine_halt;
191 _machine_power_off = ip32_machine_power_off; 192 pm_power_off = ip32_machine_power_off;
192 193
193 init_timer(&blink_timer); 194 init_timer(&blink_timer);
194 blink_timer.function = blink_timeout; 195 blink_timer.function = blink_timeout;
diff --git a/arch/mips/sgi-ip32/ip32-setup.c b/arch/mips/sgi-ip32/ip32-setup.c
index d10a269aeae1..2c38770b1e1b 100644
--- a/arch/mips/sgi-ip32/ip32-setup.c
+++ b/arch/mips/sgi-ip32/ip32-setup.c
@@ -66,11 +66,6 @@ static inline void str2eaddr(unsigned char *ea, unsigned char *str)
66#include <linux/tty.h> 66#include <linux/tty.h>
67#include <linux/serial.h> 67#include <linux/serial.h>
68#include <linux/serial_core.h> 68#include <linux/serial_core.h>
69extern int early_serial_setup(struct uart_port *port);
70
71#define STD_COM_FLAGS (ASYNC_SKIP_TEST)
72#define BASE_BAUD (1843200 / 16)
73
74#endif /* CONFIG_SERIAL_8250 */ 69#endif /* CONFIG_SERIAL_8250 */
75 70
76/* An arbitrary time; this can be decreased if reliability looks good */ 71/* An arbitrary time; this can be decreased if reliability looks good */
@@ -110,8 +105,8 @@ void __init plat_setup(void)
110 o2_serial[0].type = PORT_16550A; 105 o2_serial[0].type = PORT_16550A;
111 o2_serial[0].line = 0; 106 o2_serial[0].line = 0;
112 o2_serial[0].irq = MACEISA_SERIAL1_IRQ; 107 o2_serial[0].irq = MACEISA_SERIAL1_IRQ;
113 o2_serial[0].flags = STD_COM_FLAGS; 108 o2_serial[0].flags = UPF_SKIP_TEST;
114 o2_serial[0].uartclk = BASE_BAUD * 16; 109 o2_serial[0].uartclk = 1843200;
115 o2_serial[0].iotype = UPIO_MEM; 110 o2_serial[0].iotype = UPIO_MEM;
116 o2_serial[0].membase = (char *)&mace->isa.serial1; 111 o2_serial[0].membase = (char *)&mace->isa.serial1;
117 o2_serial[0].fifosize = 14; 112 o2_serial[0].fifosize = 14;
@@ -121,8 +116,8 @@ void __init plat_setup(void)
121 o2_serial[1].type = PORT_16550A; 116 o2_serial[1].type = PORT_16550A;
122 o2_serial[1].line = 1; 117 o2_serial[1].line = 1;
123 o2_serial[1].irq = MACEISA_SERIAL2_IRQ; 118 o2_serial[1].irq = MACEISA_SERIAL2_IRQ;
124 o2_serial[1].flags = STD_COM_FLAGS; 119 o2_serial[1].flags = UPF_SKIP_TEST;
125 o2_serial[1].uartclk = BASE_BAUD * 16; 120 o2_serial[1].uartclk = 1843200;
126 o2_serial[1].iotype = UPIO_MEM; 121 o2_serial[1].iotype = UPIO_MEM;
127 o2_serial[1].membase = (char *)&mace->isa.serial2; 122 o2_serial[1].membase = (char *)&mace->isa.serial2;
128 o2_serial[1].fifosize = 14; 123 o2_serial[1].fifosize = 14;
diff --git a/arch/mips/sibyte/cfe/setup.c b/arch/mips/sibyte/cfe/setup.c
index 7a2c7a8510d4..ea308029450e 100644
--- a/arch/mips/sibyte/cfe/setup.c
+++ b/arch/mips/sibyte/cfe/setup.c
@@ -23,6 +23,7 @@
23#include <linux/mm.h> 23#include <linux/mm.h>
24#include <linux/blkdev.h> 24#include <linux/blkdev.h>
25#include <linux/bootmem.h> 25#include <linux/bootmem.h>
26#include <linux/pm.h>
26#include <linux/smp.h> 27#include <linux/smp.h>
27 28
28#include <asm/bootinfo.h> 29#include <asm/bootinfo.h>
@@ -248,7 +249,7 @@ void __init prom_init(void)
248 249
249 _machine_restart = cfe_linux_restart; 250 _machine_restart = cfe_linux_restart;
250 _machine_halt = cfe_linux_halt; 251 _machine_halt = cfe_linux_halt;
251 _machine_power_off = cfe_linux_halt; 252 pm_power_off = cfe_linux_halt;
252 253
253 /* 254 /*
254 * Check if a loader was used; if NOT, the 4 arguments are 255 * Check if a loader was used; if NOT, the 4 arguments are
diff --git a/arch/mips/sibyte/sb1250/prom.c b/arch/mips/sibyte/sb1250/prom.c
index de62ab0f55a2..742043f8d755 100644
--- a/arch/mips/sibyte/sb1250/prom.c
+++ b/arch/mips/sibyte/sb1250/prom.c
@@ -24,6 +24,7 @@
24#include <linux/bootmem.h> 24#include <linux/bootmem.h>
25#include <linux/smp.h> 25#include <linux/smp.h>
26#include <linux/initrd.h> 26#include <linux/initrd.h>
27#include <linux/pm.h>
27 28
28#include <asm/bootinfo.h> 29#include <asm/bootinfo.h>
29#include <asm/reboot.h> 30#include <asm/reboot.h>
@@ -79,7 +80,7 @@ void __init prom_init(void)
79{ 80{
80 _machine_restart = (void (*)(char *))prom_linux_exit; 81 _machine_restart = (void (*)(char *))prom_linux_exit;
81 _machine_halt = prom_linux_exit; 82 _machine_halt = prom_linux_exit;
82 _machine_power_off = prom_linux_exit; 83 pm_power_off = prom_linux_exit;
83 84
84 strcpy(arcs_cmdline, "root=/dev/ram0 "); 85 strcpy(arcs_cmdline, "root=/dev/ram0 ");
85 86
diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c
index df2e266c700c..fde4751c84fe 100644
--- a/arch/mips/sibyte/sb1250/setup.c
+++ b/arch/mips/sibyte/sb1250/setup.c
@@ -16,6 +16,7 @@
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */ 17 */
18#include <linux/config.h> 18#include <linux/config.h>
19#include <linux/init.h>
19#include <linux/kernel.h> 20#include <linux/kernel.h>
20#include <linux/reboot.h> 21#include <linux/reboot.h>
21#include <linux/string.h> 22#include <linux/string.h>
@@ -42,7 +43,7 @@ static inline int setup_bcm112x(void);
42 43
43/* Setup code likely to be common to all SiByte platforms */ 44/* Setup code likely to be common to all SiByte platforms */
44 45
45static inline int sys_rev_decode(void) 46static int __init sys_rev_decode(void)
46{ 47{
47 int ret = 0; 48 int ret = 0;
48 49
@@ -74,7 +75,7 @@ static inline int sys_rev_decode(void)
74 return ret; 75 return ret;
75} 76}
76 77
77static inline int setup_bcm1250(void) 78static int __init setup_bcm1250(void)
78{ 79{
79 int ret = 0; 80 int ret = 0;
80 81
@@ -120,7 +121,7 @@ static inline int setup_bcm1250(void)
120 return ret; 121 return ret;
121} 122}
122 123
123static inline int setup_bcm112x(void) 124static int __init setup_bcm112x(void)
124{ 125{
125 int ret = 0; 126 int ret = 0;
126 127
@@ -146,7 +147,7 @@ static inline int setup_bcm112x(void)
146 return ret; 147 return ret;
147} 148}
148 149
149void sb1250_setup(void) 150void __init sb1250_setup(void)
150{ 151{
151 uint64_t sys_rev; 152 uint64_t sys_rev;
152 int plldiv; 153 int plldiv;
@@ -169,31 +170,42 @@ void sb1250_setup(void)
169 soc_str, pass_str, zbbus_mhz * 2, sb1_pass); 170 soc_str, pass_str, zbbus_mhz * 2, sb1_pass);
170 prom_printf("Board type: %s\n", get_system_type()); 171 prom_printf("Board type: %s\n", get_system_type());
171 172
172 switch(war_pass) { 173 switch (war_pass) {
173 case K_SYS_REVISION_BCM1250_PASS1: 174 case K_SYS_REVISION_BCM1250_PASS1:
174#ifndef CONFIG_SB1_PASS_1_WORKAROUNDS 175#ifndef CONFIG_SB1_PASS_1_WORKAROUNDS
175 prom_printf("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, and the kernel doesn't have the proper workarounds compiled in. @@@@\n"); 176 prom_printf("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, "
177 "and the kernel doesn't have the proper "
178 "workarounds compiled in. @@@@\n");
176 bad_config = 1; 179 bad_config = 1;
177#endif 180#endif
178 break; 181 break;
179 case K_SYS_REVISION_BCM1250_PASS2: 182 case K_SYS_REVISION_BCM1250_PASS2:
180 /* Pass 2 - easiest as default for now - so many numbers */ 183 /* Pass 2 - easiest as default for now - so many numbers */
181#if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || !defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) 184#if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || \
182 prom_printf("@@@@ This is a BCM1250 A3-A10 board, and the kernel doesn't have the proper workarounds compiled in. @@@@\n"); 185 !defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS)
186 prom_printf("@@@@ This is a BCM1250 A3-A10 board, and the "
187 "kernel doesn't have the proper workarounds "
188 "compiled in. @@@@\n");
183 bad_config = 1; 189 bad_config = 1;
184#endif 190#endif
185#ifdef CONFIG_CPU_HAS_PREFETCH 191#ifdef CONFIG_CPU_HAS_PREFETCH
186 prom_printf("@@@@ Prefetches may be enabled in this kernel, but are buggy on this board. @@@@\n"); 192 prom_printf("@@@@ Prefetches may be enabled in this kernel, "
193 "but are buggy on this board. @@@@\n");
187 bad_config = 1; 194 bad_config = 1;
188#endif 195#endif
189 break; 196 break;
190 case K_SYS_REVISION_BCM1250_PASS2_2: 197 case K_SYS_REVISION_BCM1250_PASS2_2:
191#ifndef CONFIG_SB1_PASS_2_WORKAROUNDS 198#ifndef CONFIG_SB1_PASS_2_WORKAROUNDS
192 prom_printf("@@@@ This is a BCM1250 B1/B2. board, and the kernel doesn't have the proper workarounds compiled in. @@@@\n"); 199 prom_printf("@@@@ This is a BCM1250 B1/B2. board, and the "
200 "kernel doesn't have the proper workarounds "
201 "compiled in. @@@@\n");
193 bad_config = 1; 202 bad_config = 1;
194#endif 203#endif
195#if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || !defined(CONFIG_CPU_HAS_PREFETCH) 204#if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || \
196 prom_printf("@@@@ This is a BCM1250 B1/B2, but the kernel is conservatively configured for an 'A' stepping. @@@@\n"); 205 !defined(CONFIG_CPU_HAS_PREFETCH)
206 prom_printf("@@@@ This is a BCM1250 B1/B2, but the kernel is "
207 "conservatively configured for an 'A' stepping. "
208 "@@@@\n");
197#endif 209#endif
198 break; 210 break;
199 default: 211 default:
diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c
index 262c85680709..1141fcd13a59 100644
--- a/arch/mips/sni/setup.c
+++ b/arch/mips/sni/setup.c
@@ -5,7 +5,7 @@
5 * License. See the file "COPYING" in the main directory of this archive 5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details. 6 * for more details.
7 * 7 *
8 * Copyright (C) 1996, 97, 98, 2000, 03, 04 Ralf Baechle (ralf@linux-mips.org) 8 * Copyright (C) 1996, 97, 98, 2000, 03, 04, 06 Ralf Baechle (ralf@linux-mips.org)
9 */ 9 */
10#include <linux/config.h> 10#include <linux/config.h>
11#include <linux/eisa.h> 11#include <linux/eisa.h>
@@ -15,6 +15,7 @@
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/mc146818rtc.h> 17#include <linux/mc146818rtc.h>
18#include <linux/pm.h>
18#include <linux/pci.h> 19#include <linux/pci.h>
19#include <linux/console.h> 20#include <linux/console.h>
20#include <linux/fb.h> 21#include <linux/fb.h>
@@ -189,7 +190,7 @@ void __init plat_setup(void)
189 190
190 _machine_restart = sni_machine_restart; 191 _machine_restart = sni_machine_restart;
191 _machine_halt = sni_machine_halt; 192 _machine_halt = sni_machine_halt;
192 _machine_power_off = sni_machine_power_off; 193 pm_power_off = sni_machine_power_off;
193 194
194 sni_display_setup(); 195 sni_display_setup();
195 196
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_prom.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_prom.c
index e4d095d3e192..e19e2be70f76 100644
--- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_prom.c
+++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_prom.c
@@ -60,7 +60,6 @@ void __init prom_init_cmdline(void)
60 60
61void __init prom_init(void) 61void __init prom_init(void)
62{ 62{
63 const char* toshiba_name_list[] = GROUP_TOSHIBA_NAMES;
64 extern int tx4927_get_mem_size(void); 63 extern int tx4927_get_mem_size(void);
65 extern char* toshiba_name; 64 extern char* toshiba_name;
66 int msize; 65 int msize;
@@ -69,12 +68,13 @@ void __init prom_init(void)
69 68
70 mips_machgroup = MACH_GROUP_TOSHIBA; 69 mips_machgroup = MACH_GROUP_TOSHIBA;
71 70
72 if ((read_c0_prid() & 0xff) == PRID_REV_TX4927) 71 if ((read_c0_prid() & 0xff) == PRID_REV_TX4927) {
73 mips_machtype = MACH_TOSHIBA_RBTX4927; 72 mips_machtype = MACH_TOSHIBA_RBTX4927;
74 else 73 toshiba_name = "TX4927";
74 } else {
75 mips_machtype = MACH_TOSHIBA_RBTX4937; 75 mips_machtype = MACH_TOSHIBA_RBTX4937;
76 76 toshiba_name = "TX4937";
77 toshiba_name = toshiba_name_list[mips_machtype]; 77 }
78 78
79 msize = tx4927_get_mem_size(); 79 msize = tx4927_get_mem_size();
80 add_memory_region(0, msize << 20, BOOT_MEM_RAM); 80 add_memory_region(0, msize << 20, BOOT_MEM_RAM);
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
index 990fcb294bab..2ad6401d2af4 100644
--- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
+++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
@@ -53,6 +53,8 @@
53#include <linux/interrupt.h> 53#include <linux/interrupt.h>
54#include <linux/pci.h> 54#include <linux/pci.h>
55#include <linux/timex.h> 55#include <linux/timex.h>
56#include <linux/pm.h>
57
56#include <asm/bootinfo.h> 58#include <asm/bootinfo.h>
57#include <asm/page.h> 59#include <asm/page.h>
58#include <asm/io.h> 60#include <asm/io.h>
@@ -537,19 +539,10 @@ void tx4927_pci_setup(void)
537 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI2, 539 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI2,
538 "0x%08lx=mips_io_port_base", 540 "0x%08lx=mips_io_port_base",
539 mips_io_port_base); 541 mips_io_port_base);
540
541 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI2,
542 "setup pci_io_resource to 0x%08lx 0x%08lx\n",
543 pci_io_resource.start,
544 pci_io_resource.end);
545 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI2,
546 "setup pci_mem_resource to 0x%08lx 0x%08lx\n",
547 pci_mem_resource.start,
548 pci_mem_resource.end);
549
550 if (!called) { 542 if (!called) {
551 printk 543 printk
552 ("TX4927 PCIC -- DID:%04x VID:%04x RID:%02x Arbiter:%s\n", 544 ("%s PCIC -- DID:%04x VID:%04x RID:%02x Arbiter:%s\n",
545 toshiba_name,
553 (unsigned short) (tx4927_pcicptr->pciid >> 16), 546 (unsigned short) (tx4927_pcicptr->pciid >> 16),
554 (unsigned short) (tx4927_pcicptr->pciid & 0xffff), 547 (unsigned short) (tx4927_pcicptr->pciid & 0xffff),
555 (unsigned short) (tx4927_pcicptr->pciccrev & 0xff), 548 (unsigned short) (tx4927_pcicptr->pciccrev & 0xff),
@@ -562,21 +555,52 @@ void tx4927_pci_setup(void)
562 (tx4927_ccfgptr->ccfg & TX4927_CCFG_PCI66) ? " PCI66" : ""); 555 (tx4927_ccfgptr->ccfg & TX4927_CCFG_PCI66) ? " PCI66" : "");
563 if (tx4927_ccfgptr->pcfg & TX4927_PCFG_PCICLKEN_ALL) { 556 if (tx4927_ccfgptr->pcfg & TX4927_PCFG_PCICLKEN_ALL) {
564 int pciclk = 0; 557 int pciclk = 0;
565 switch ((unsigned long) tx4927_ccfgptr-> 558 if (mips_machtype == MACH_TOSHIBA_RBTX4937)
566 ccfg & TX4927_CCFG_PCIDIVMODE_MASK) { 559 switch ((unsigned long) tx4927_ccfgptr->
567 case TX4927_CCFG_PCIDIVMODE_2_5: 560 ccfg & TX4937_CCFG_PCIDIVMODE_MASK) {
568 pciclk = tx4927_cpu_clock * 2 / 5; 561 case TX4937_CCFG_PCIDIVMODE_4:
569 break; 562 pciclk = tx4927_cpu_clock / 4;
570 case TX4927_CCFG_PCIDIVMODE_3: 563 break;
571 pciclk = tx4927_cpu_clock / 3; 564 case TX4937_CCFG_PCIDIVMODE_4_5:
572 break; 565 pciclk = tx4927_cpu_clock * 2 / 9;
573 case TX4927_CCFG_PCIDIVMODE_5: 566 break;
574 pciclk = tx4927_cpu_clock / 5; 567 case TX4937_CCFG_PCIDIVMODE_5:
575 break; 568 pciclk = tx4927_cpu_clock / 5;
576 case TX4927_CCFG_PCIDIVMODE_6: 569 break;
577 pciclk = tx4927_cpu_clock / 6; 570 case TX4937_CCFG_PCIDIVMODE_5_5:
578 break; 571 pciclk = tx4927_cpu_clock * 2 / 11;
579 } 572 break;
573 case TX4937_CCFG_PCIDIVMODE_8:
574 pciclk = tx4927_cpu_clock / 8;
575 break;
576 case TX4937_CCFG_PCIDIVMODE_9:
577 pciclk = tx4927_cpu_clock / 9;
578 break;
579 case TX4937_CCFG_PCIDIVMODE_10:
580 pciclk = tx4927_cpu_clock / 10;
581 break;
582 case TX4937_CCFG_PCIDIVMODE_11:
583 pciclk = tx4927_cpu_clock / 11;
584 break;
585 }
586
587 else
588 switch ((unsigned long) tx4927_ccfgptr->
589 ccfg & TX4927_CCFG_PCIDIVMODE_MASK) {
590 case TX4927_CCFG_PCIDIVMODE_2_5:
591 pciclk = tx4927_cpu_clock * 2 / 5;
592 break;
593 case TX4927_CCFG_PCIDIVMODE_3:
594 pciclk = tx4927_cpu_clock / 3;
595 break;
596 case TX4927_CCFG_PCIDIVMODE_5:
597 pciclk = tx4927_cpu_clock / 5;
598 break;
599 case TX4927_CCFG_PCIDIVMODE_6:
600 pciclk = tx4927_cpu_clock / 6;
601 break;
602 }
603
580 printk("Internal(%dMHz)", pciclk / 1000000); 604 printk("Internal(%dMHz)", pciclk / 1000000);
581 } else { 605 } else {
582 int pciclk = 0; 606 int pciclk = 0;
@@ -814,24 +838,40 @@ void __init toshiba_rbtx4927_setup(void)
814 ":ResetRoutines\n"); 838 ":ResetRoutines\n");
815 _machine_restart = toshiba_rbtx4927_restart; 839 _machine_restart = toshiba_rbtx4927_restart;
816 _machine_halt = toshiba_rbtx4927_halt; 840 _machine_halt = toshiba_rbtx4927_halt;
817 _machine_power_off = toshiba_rbtx4927_power_off; 841 pm_power_off = toshiba_rbtx4927_power_off;
818 842
819#ifdef CONFIG_PCI 843#ifdef CONFIG_PCI
820 844
821 /* PCIC */ 845 /* PCIC */
822 /* 846 /*
823 * ASSUMPTION: PCIDIVMODE is configured for PCI 33MHz or 66MHz. 847 * ASSUMPTION: PCIDIVMODE is configured for PCI 33MHz or 66MHz.
824 * PCIDIVMODE[12:11]'s initial value are given by S9[4:3] (ON:0, OFF:1). 848 *
849 * For TX4927:
850 * PCIDIVMODE[12:11]'s initial value is given by S9[4:3] (ON:0, OFF:1).
825 * CPU 166MHz: PCI 66MHz : PCIDIVMODE: 00 (1/2.5) 851 * CPU 166MHz: PCI 66MHz : PCIDIVMODE: 00 (1/2.5)
826 * CPU 200MHz: PCI 66MHz : PCIDIVMODE: 01 (1/3) 852 * CPU 200MHz: PCI 66MHz : PCIDIVMODE: 01 (1/3)
827 * CPU 166MHz: PCI 33MHz : PCIDIVMODE: 10 (1/5) 853 * CPU 166MHz: PCI 33MHz : PCIDIVMODE: 10 (1/5)
828 * CPU 200MHz: PCI 33MHz : PCIDIVMODE: 11 (1/6) 854 * CPU 200MHz: PCI 33MHz : PCIDIVMODE: 11 (1/6)
829 * i.e. S9[3]: ON (83MHz), OFF (100MHz) 855 * i.e. S9[3]: ON (83MHz), OFF (100MHz)
856 *
857 * For TX4937:
858 * PCIDIVMODE[12:11]'s initial value is given by S1[5:4] (ON:0, OFF:1)
859 * PCIDIVMODE[10] is 0.
860 * CPU 266MHz: PCI 33MHz : PCIDIVMODE: 000 (1/8)
861 * CPU 266MHz: PCI 66MHz : PCIDIVMODE: 001 (1/4)
862 * CPU 300MHz: PCI 33MHz : PCIDIVMODE: 010 (1/9)
863 * CPU 300MHz: PCI 66MHz : PCIDIVMODE: 011 (1/4.5)
864 * CPU 333MHz: PCI 33MHz : PCIDIVMODE: 100 (1/10)
865 * CPU 333MHz: PCI 66MHz : PCIDIVMODE: 101 (1/5)
866 *
830 */ 867 */
831 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI1, 868 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI1,
832 "ccfg is %lx, DIV is %x\n", 869 "ccfg is %lx, PCIDIVMODE is %x\n",
833 (unsigned long) tx4927_ccfgptr-> 870 (unsigned long) tx4927_ccfgptr->ccfg,
834 ccfg, TX4927_CCFG_PCIDIVMODE_MASK); 871 (unsigned long) tx4927_ccfgptr->ccfg &
872 (mips_machtype == MACH_TOSHIBA_RBTX4937 ?
873 TX4937_CCFG_PCIDIVMODE_MASK :
874 TX4927_CCFG_PCIDIVMODE_MASK));
835 875
836 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI1, 876 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI1,
837 "PCI66 mode is %lx, PCI mode is %lx, pci arb is %lx\n", 877 "PCI66 mode is %lx, PCI mode is %lx, pci arb is %lx\n",
@@ -842,20 +882,30 @@ void __init toshiba_rbtx4927_setup(void)
842 (unsigned long) tx4927_ccfgptr-> 882 (unsigned long) tx4927_ccfgptr->
843 ccfg & TX4927_CCFG_PCIXARB); 883 ccfg & TX4927_CCFG_PCIXARB);
844 884
845 TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_PCI1, 885 if (mips_machtype == MACH_TOSHIBA_RBTX4937)
846 "PCIDIVMODE is %lx\n", 886 switch ((unsigned long)tx4927_ccfgptr->
847 (unsigned long) tx4927_ccfgptr-> 887 ccfg & TX4937_CCFG_PCIDIVMODE_MASK) {
848 ccfg & TX4927_CCFG_PCIDIVMODE_MASK); 888 case TX4937_CCFG_PCIDIVMODE_8:
849 889 case TX4937_CCFG_PCIDIVMODE_4:
850 switch ((unsigned long) tx4927_ccfgptr-> 890 tx4927_cpu_clock = 266666666; /* 266MHz */
851 ccfg & TX4927_CCFG_PCIDIVMODE_MASK) { 891 break;
852 case TX4927_CCFG_PCIDIVMODE_2_5: 892 case TX4937_CCFG_PCIDIVMODE_9:
853 case TX4927_CCFG_PCIDIVMODE_5: 893 case TX4937_CCFG_PCIDIVMODE_4_5:
854 tx4927_cpu_clock = 166000000; /* 166MHz */ 894 tx4927_cpu_clock = 300000000; /* 300MHz */
855 break; 895 break;
856 default: 896 default:
857 tx4927_cpu_clock = 200000000; /* 200MHz */ 897 tx4927_cpu_clock = 333333333; /* 333MHz */
858 } 898 }
899 else
900 switch ((unsigned long)tx4927_ccfgptr->
901 ccfg & TX4927_CCFG_PCIDIVMODE_MASK) {
902 case TX4927_CCFG_PCIDIVMODE_2_5:
903 case TX4927_CCFG_PCIDIVMODE_5:
904 tx4927_cpu_clock = 166666666; /* 166MHz */
905 break;
906 default:
907 tx4927_cpu_clock = 200000000; /* 200MHz */
908 }
859 909
860 /* CCFG */ 910 /* CCFG */
861 /* enable Timeout BusError */ 911 /* enable Timeout BusError */
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/setup.c b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
index 9f1dcc8ca5a3..5c7ace982a49 100644
--- a/arch/mips/tx4938/toshiba_rbtx4938/setup.c
+++ b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
@@ -20,6 +20,8 @@
20#include <linux/interrupt.h> 20#include <linux/interrupt.h>
21#include <linux/console.h> 21#include <linux/console.h>
22#include <linux/pci.h> 22#include <linux/pci.h>
23#include <linux/pm.h>
24
23#include <asm/wbflush.h> 25#include <asm/wbflush.h>
24#include <asm/reboot.h> 26#include <asm/reboot.h>
25#include <asm/irq.h> 27#include <asm/irq.h>
@@ -1003,7 +1005,7 @@ void __init toshiba_rbtx4938_setup(void)
1003 1005
1004 _machine_restart = rbtx4938_machine_restart; 1006 _machine_restart = rbtx4938_machine_restart;
1005 _machine_halt = rbtx4938_machine_halt; 1007 _machine_halt = rbtx4938_machine_halt;
1006 _machine_power_off = rbtx4938_machine_power_off; 1008 pm_power_off = rbtx4938_machine_power_off;
1007 1009
1008 *rbtx4938_led_ptr = 0xff; 1010 *rbtx4938_led_ptr = 0xff;
1009 printk("RBTX4938 --- FPGA(Rev %02x)", *rbtx4938_fpga_rev_ptr); 1011 printk("RBTX4938 --- FPGA(Rev %02x)", *rbtx4938_fpga_rev_ptr);
diff --git a/arch/mips/vr41xx/common/pmu.c b/arch/mips/vr41xx/common/pmu.c
index 02bf4f7d06ba..5e469796413f 100644
--- a/arch/mips/vr41xx/common/pmu.c
+++ b/arch/mips/vr41xx/common/pmu.c
@@ -21,6 +21,7 @@
21#include <linux/init.h> 21#include <linux/init.h>
22#include <linux/ioport.h> 22#include <linux/ioport.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/pm.h>
24#include <linux/smp.h> 25#include <linux/smp.h>
25#include <linux/types.h> 26#include <linux/types.h>
26 27
@@ -114,7 +115,7 @@ static int __init vr41xx_pmu_init(void)
114 115
115 _machine_restart = vr41xx_restart; 116 _machine_restart = vr41xx_restart;
116 _machine_halt = vr41xx_halt; 117 _machine_halt = vr41xx_halt;
117 _machine_power_off = vr41xx_power_off; 118 pm_power_off = vr41xx_power_off;
118 119
119 return 0; 120 return 0;
120} 121}
diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c
index 29b4d61898f2..05273ccced0e 100644
--- a/arch/parisc/hpux/sys_hpux.c
+++ b/arch/parisc/hpux/sys_hpux.c
@@ -468,19 +468,23 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2)
468 if ( opcode == 1 ) { /* GETFSIND */ 468 if ( opcode == 1 ) { /* GETFSIND */
469 len = strlen_user((char *)arg1); 469 len = strlen_user((char *)arg1);
470 printk(KERN_DEBUG "len of arg1 = %d\n", len); 470 printk(KERN_DEBUG "len of arg1 = %d\n", len);
471 471 if (len == 0)
472 fsname = (char *) kmalloc(len+1, GFP_KERNEL); 472 return 0;
473 fsname = (char *) kmalloc(len, GFP_KERNEL);
473 if ( !fsname ) { 474 if ( !fsname ) {
474 printk(KERN_DEBUG "failed to kmalloc fsname\n"); 475 printk(KERN_DEBUG "failed to kmalloc fsname\n");
475 return 0; 476 return 0;
476 } 477 }
477 478
478 if ( copy_from_user(fsname, (char *)arg1, len+1) ) { 479 if ( copy_from_user(fsname, (char *)arg1, len) ) {
479 printk(KERN_DEBUG "failed to copy_from_user fsname\n"); 480 printk(KERN_DEBUG "failed to copy_from_user fsname\n");
480 kfree(fsname); 481 kfree(fsname);
481 return 0; 482 return 0;
482 } 483 }
483 484
485 /* String could be altered by userspace after strlen_user() */
486 fsname[len] = '\0';
487
484 printk(KERN_DEBUG "that is '%s' as (char *)\n", fsname); 488 printk(KERN_DEBUG "that is '%s' as (char *)\n", fsname);
485 if ( !strcmp(fsname, "hfs") ) { 489 if ( !strcmp(fsname, "hfs") ) {
486 fstype = 0; 490 fstype = 0;
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index c287980b7e65..80e9fe2632b8 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -12,10 +12,10 @@ endif
12 12
13obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ 13obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
14 irq.o align.o signal_32.o pmc.o vdso.o \ 14 irq.o align.o signal_32.o pmc.o vdso.o \
15 init_task.o process.o 15 init_task.o process.o systbl.o
16obj-y += vdso32/ 16obj-y += vdso32/
17obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ 17obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
18 signal_64.o ptrace32.o systbl.o \ 18 signal_64.o ptrace32.o \
19 paca.o cpu_setup_power4.o \ 19 paca.o cpu_setup_power4.o \
20 firmware.o sysfs.o idle_64.o 20 firmware.o sysfs.o idle_64.o
21obj-$(CONFIG_PPC64) += vdso64/ 21obj-$(CONFIG_PPC64) += vdso64/
@@ -46,7 +46,7 @@ extra-$(CONFIG_8xx) := head_8xx.o
46extra-y += vmlinux.lds 46extra-y += vmlinux.lds
47 47
48obj-y += time.o prom.o traps.o setup-common.o udbg.o 48obj-y += time.o prom.o traps.o setup-common.o udbg.o
49obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o systbl.o 49obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o
50obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o 50obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o
51obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o 51obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
52obj-$(CONFIG_MODULES) += ppc_ksyms.o 52obj-$(CONFIG_MODULES) += ppc_ksyms.o
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index c6d0595da6b5..bd837b5dbf06 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -142,11 +142,7 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
142 return 0; 142 return 0;
143} 143}
144 144
145static inline compat_uptr_t to_user_ptr(void *kp) 145#define to_user_ptr(p) ptr_to_compat(p)
146{
147 return (compat_uptr_t)(u64)kp;
148}
149
150#define from_user_ptr(p) compat_ptr(p) 146#define from_user_ptr(p) compat_ptr(p)
151 147
152static inline int save_general_regs(struct pt_regs *regs, 148static inline int save_general_regs(struct pt_regs *regs,
@@ -213,8 +209,8 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
213 return 0; 209 return 0;
214} 210}
215 211
216#define to_user_ptr(p) (p) 212#define to_user_ptr(p) ((unsigned long)(p))
217#define from_user_ptr(p) (p) 213#define from_user_ptr(p) ((void __user *)(p))
218 214
219static inline int save_general_regs(struct pt_regs *regs, 215static inline int save_general_regs(struct pt_regs *regs,
220 struct mcontext __user *frame) 216 struct mcontext __user *frame)
@@ -526,7 +522,7 @@ long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act,
526 522
527 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); 523 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
528 if (!ret && oact) { 524 if (!ret && oact) {
529 ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler); 525 ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler);
530 ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask); 526 ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
531 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); 527 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
532 } 528 }
@@ -675,8 +671,8 @@ long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t __user *uinfo
675int compat_sys_sigaltstack(u32 __new, u32 __old, int r5, 671int compat_sys_sigaltstack(u32 __new, u32 __old, int r5,
676 int r6, int r7, int r8, struct pt_regs *regs) 672 int r6, int r7, int r8, struct pt_regs *regs)
677{ 673{
678 stack_32_t __user * newstack = (stack_32_t __user *)(long) __new; 674 stack_32_t __user * newstack = compat_ptr(__new);
679 stack_32_t __user * oldstack = (stack_32_t __user *)(long) __old; 675 stack_32_t __user * oldstack = compat_ptr(__old);
680 stack_t uss, uoss; 676 stack_t uss, uoss;
681 int ret; 677 int ret;
682 mm_segment_t old_fs; 678 mm_segment_t old_fs;
@@ -708,7 +704,7 @@ int compat_sys_sigaltstack(u32 __new, u32 __old, int r5,
708 set_fs(old_fs); 704 set_fs(old_fs);
709 /* Copy the stack information to the user output buffer */ 705 /* Copy the stack information to the user output buffer */
710 if (!ret && oldstack && 706 if (!ret && oldstack &&
711 (put_user((long)uoss.ss_sp, &oldstack->ss_sp) || 707 (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) ||
712 __put_user(uoss.ss_flags, &oldstack->ss_flags) || 708 __put_user(uoss.ss_flags, &oldstack->ss_flags) ||
713 __put_user(uoss.ss_size, &oldstack->ss_size))) 709 __put_user(uoss.ss_size, &oldstack->ss_size)))
714 return -EFAULT; 710 return -EFAULT;
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
index b3193116e686..497a5d3df359 100644
--- a/arch/powerpc/kernel/signal_64.c
+++ b/arch/powerpc/kernel/signal_64.c
@@ -60,8 +60,8 @@ struct rt_sigframe {
60 struct ucontext uc; 60 struct ucontext uc;
61 unsigned long _unused[2]; 61 unsigned long _unused[2];
62 unsigned int tramp[TRAMP_SIZE]; 62 unsigned int tramp[TRAMP_SIZE];
63 struct siginfo *pinfo; 63 struct siginfo __user *pinfo;
64 void *puc; 64 void __user *puc;
65 struct siginfo info; 65 struct siginfo info;
66 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */ 66 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
67 char abigap[288]; 67 char abigap[288];
diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S
index 007b15ee36d2..8a9f994ed917 100644
--- a/arch/powerpc/kernel/systbl.S
+++ b/arch/powerpc/kernel/systbl.S
@@ -36,8 +36,6 @@
36#ifdef CONFIG_PPC64 36#ifdef CONFIG_PPC64
37#define sys_sigpending sys_ni_syscall 37#define sys_sigpending sys_ni_syscall
38#define sys_old_getrlimit sys_ni_syscall 38#define sys_old_getrlimit sys_ni_syscall
39#else
40#define ppc_rtas sys_ni_syscall
41#endif 39#endif
42 40
43_GLOBAL(sys_call_table) 41_GLOBAL(sys_call_table)
@@ -323,3 +321,4 @@ SYSCALL(spu_run)
323SYSCALL(spu_create) 321SYSCALL(spu_create)
324COMPAT_SYS(pselect6) 322COMPAT_SYS(pselect6)
325COMPAT_SYS(ppoll) 323COMPAT_SYS(ppoll)
324SYSCALL(unshare)
diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c
index 535c802b369f..87eb6bb7f0e7 100644
--- a/arch/powerpc/platforms/powermac/low_i2c.c
+++ b/arch/powerpc/platforms/powermac/low_i2c.c
@@ -1052,8 +1052,7 @@ struct pmac_i2c_bus *pmac_i2c_adapter_to_bus(struct i2c_adapter *adapter)
1052} 1052}
1053EXPORT_SYMBOL_GPL(pmac_i2c_adapter_to_bus); 1053EXPORT_SYMBOL_GPL(pmac_i2c_adapter_to_bus);
1054 1054
1055extern int pmac_i2c_match_adapter(struct device_node *dev, 1055int pmac_i2c_match_adapter(struct device_node *dev, struct i2c_adapter *adapter)
1056 struct i2c_adapter *adapter)
1057{ 1056{
1058 struct pmac_i2c_bus *bus = pmac_i2c_find_bus(dev); 1057 struct pmac_i2c_bus *bus = pmac_i2c_find_bus(dev);
1059 1058
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c
index f671ed253901..de3f30e6b333 100644
--- a/arch/powerpc/platforms/powermac/pci.c
+++ b/arch/powerpc/platforms/powermac/pci.c
@@ -136,14 +136,14 @@ static void __init fixup_bus_range(struct device_node *bridge)
136 |(((unsigned int)(off)) & 0xFCUL) \ 136 |(((unsigned int)(off)) & 0xFCUL) \
137 |1UL) 137 |1UL)
138 138
139static unsigned long macrisc_cfg_access(struct pci_controller* hose, 139static volatile void __iomem *macrisc_cfg_access(struct pci_controller* hose,
140 u8 bus, u8 dev_fn, u8 offset) 140 u8 bus, u8 dev_fn, u8 offset)
141{ 141{
142 unsigned int caddr; 142 unsigned int caddr;
143 143
144 if (bus == hose->first_busno) { 144 if (bus == hose->first_busno) {
145 if (dev_fn < (11 << 3)) 145 if (dev_fn < (11 << 3))
146 return 0; 146 return NULL;
147 caddr = MACRISC_CFA0(dev_fn, offset); 147 caddr = MACRISC_CFA0(dev_fn, offset);
148 } else 148 } else
149 caddr = MACRISC_CFA1(bus, dev_fn, offset); 149 caddr = MACRISC_CFA1(bus, dev_fn, offset);
@@ -154,14 +154,14 @@ static unsigned long macrisc_cfg_access(struct pci_controller* hose,
154 } while (in_le32(hose->cfg_addr) != caddr); 154 } while (in_le32(hose->cfg_addr) != caddr);
155 155
156 offset &= has_uninorth ? 0x07 : 0x03; 156 offset &= has_uninorth ? 0x07 : 0x03;
157 return ((unsigned long)hose->cfg_data) + offset; 157 return hose->cfg_data + offset;
158} 158}
159 159
160static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn, 160static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn,
161 int offset, int len, u32 *val) 161 int offset, int len, u32 *val)
162{ 162{
163 struct pci_controller *hose; 163 struct pci_controller *hose;
164 unsigned long addr; 164 volatile void __iomem *addr;
165 165
166 hose = pci_bus_to_host(bus); 166 hose = pci_bus_to_host(bus);
167 if (hose == NULL) 167 if (hose == NULL)
@@ -177,13 +177,13 @@ static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn,
177 */ 177 */
178 switch (len) { 178 switch (len) {
179 case 1: 179 case 1:
180 *val = in_8((u8 *)addr); 180 *val = in_8(addr);
181 break; 181 break;
182 case 2: 182 case 2:
183 *val = in_le16((u16 *)addr); 183 *val = in_le16(addr);
184 break; 184 break;
185 default: 185 default:
186 *val = in_le32((u32 *)addr); 186 *val = in_le32(addr);
187 break; 187 break;
188 } 188 }
189 return PCIBIOS_SUCCESSFUL; 189 return PCIBIOS_SUCCESSFUL;
@@ -193,7 +193,7 @@ static int macrisc_write_config(struct pci_bus *bus, unsigned int devfn,
193 int offset, int len, u32 val) 193 int offset, int len, u32 val)
194{ 194{
195 struct pci_controller *hose; 195 struct pci_controller *hose;
196 unsigned long addr; 196 volatile void __iomem *addr;
197 197
198 hose = pci_bus_to_host(bus); 198 hose = pci_bus_to_host(bus);
199 if (hose == NULL) 199 if (hose == NULL)
@@ -209,16 +209,16 @@ static int macrisc_write_config(struct pci_bus *bus, unsigned int devfn,
209 */ 209 */
210 switch (len) { 210 switch (len) {
211 case 1: 211 case 1:
212 out_8((u8 *)addr, val); 212 out_8(addr, val);
213 (void) in_8((u8 *)addr); 213 (void) in_8(addr);
214 break; 214 break;
215 case 2: 215 case 2:
216 out_le16((u16 *)addr, val); 216 out_le16(addr, val);
217 (void) in_le16((u16 *)addr); 217 (void) in_le16(addr);
218 break; 218 break;
219 default: 219 default:
220 out_le32((u32 *)addr, val); 220 out_le32(addr, val);
221 (void) in_le32((u32 *)addr); 221 (void) in_le32(addr);
222 break; 222 break;
223 } 223 }
224 return PCIBIOS_SUCCESSFUL; 224 return PCIBIOS_SUCCESSFUL;
@@ -348,25 +348,23 @@ static int u3_ht_skip_device(struct pci_controller *hose,
348 + (((unsigned int)bus) << 16) \ 348 + (((unsigned int)bus) << 16) \
349 + 0x01000000UL) 349 + 0x01000000UL)
350 350
351static unsigned long u3_ht_cfg_access(struct pci_controller* hose, 351static volatile void __iomem *u3_ht_cfg_access(struct pci_controller* hose,
352 u8 bus, u8 devfn, u8 offset) 352 u8 bus, u8 devfn, u8 offset)
353{ 353{
354 if (bus == hose->first_busno) { 354 if (bus == hose->first_busno) {
355 /* For now, we don't self probe U3 HT bridge */ 355 /* For now, we don't self probe U3 HT bridge */
356 if (PCI_SLOT(devfn) == 0) 356 if (PCI_SLOT(devfn) == 0)
357 return 0; 357 return NULL;
358 return ((unsigned long)hose->cfg_data) + 358 return hose->cfg_data + U3_HT_CFA0(devfn, offset);
359 U3_HT_CFA0(devfn, offset);
360 } else 359 } else
361 return ((unsigned long)hose->cfg_data) + 360 return hose->cfg_data + U3_HT_CFA1(bus, devfn, offset);
362 U3_HT_CFA1(bus, devfn, offset);
363} 361}
364 362
365static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, 363static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
366 int offset, int len, u32 *val) 364 int offset, int len, u32 *val)
367{ 365{
368 struct pci_controller *hose; 366 struct pci_controller *hose;
369 unsigned long addr; 367 volatile void __iomem *addr;
370 368
371 hose = pci_bus_to_host(bus); 369 hose = pci_bus_to_host(bus);
372 if (hose == NULL) 370 if (hose == NULL)
@@ -400,13 +398,13 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
400 */ 398 */
401 switch (len) { 399 switch (len) {
402 case 1: 400 case 1:
403 *val = in_8((u8 *)addr); 401 *val = in_8(addr);
404 break; 402 break;
405 case 2: 403 case 2:
406 *val = in_le16((u16 *)addr); 404 *val = in_le16(addr);
407 break; 405 break;
408 default: 406 default:
409 *val = in_le32((u32 *)addr); 407 *val = in_le32(addr);
410 break; 408 break;
411 } 409 }
412 return PCIBIOS_SUCCESSFUL; 410 return PCIBIOS_SUCCESSFUL;
@@ -416,7 +414,7 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
416 int offset, int len, u32 val) 414 int offset, int len, u32 val)
417{ 415{
418 struct pci_controller *hose; 416 struct pci_controller *hose;
419 unsigned long addr; 417 volatile void __iomem *addr;
420 418
421 hose = pci_bus_to_host(bus); 419 hose = pci_bus_to_host(bus);
422 if (hose == NULL) 420 if (hose == NULL)
@@ -442,16 +440,16 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
442 */ 440 */
443 switch (len) { 441 switch (len) {
444 case 1: 442 case 1:
445 out_8((u8 *)addr, val); 443 out_8(addr, val);
446 (void) in_8((u8 *)addr); 444 (void) in_8(addr);
447 break; 445 break;
448 case 2: 446 case 2:
449 out_le16((u16 *)addr, val); 447 out_le16(addr, val);
450 (void) in_le16((u16 *)addr); 448 (void) in_le16(addr);
451 break; 449 break;
452 default: 450 default:
453 out_le32((u32 *)addr, val); 451 out_le32((u32 __iomem *)addr, val);
454 (void) in_le32((u32 *)addr); 452 (void) in_le32(addr);
455 break; 453 break;
456 } 454 }
457 return PCIBIOS_SUCCESSFUL; 455 return PCIBIOS_SUCCESSFUL;
@@ -476,7 +474,7 @@ static struct pci_ops u3_ht_pci_ops =
476 |(((unsigned int)(off)) & 0xfcU) \ 474 |(((unsigned int)(off)) & 0xfcU) \
477 |1UL) 475 |1UL)
478 476
479static unsigned long u4_pcie_cfg_access(struct pci_controller* hose, 477static volatile void __iomem *u4_pcie_cfg_access(struct pci_controller* hose,
480 u8 bus, u8 dev_fn, int offset) 478 u8 bus, u8 dev_fn, int offset)
481{ 479{
482 unsigned int caddr; 480 unsigned int caddr;
@@ -492,14 +490,14 @@ static unsigned long u4_pcie_cfg_access(struct pci_controller* hose,
492 } while (in_le32(hose->cfg_addr) != caddr); 490 } while (in_le32(hose->cfg_addr) != caddr);
493 491
494 offset &= 0x03; 492 offset &= 0x03;
495 return ((unsigned long)hose->cfg_data) + offset; 493 return hose->cfg_data + offset;
496} 494}
497 495
498static int u4_pcie_read_config(struct pci_bus *bus, unsigned int devfn, 496static int u4_pcie_read_config(struct pci_bus *bus, unsigned int devfn,
499 int offset, int len, u32 *val) 497 int offset, int len, u32 *val)
500{ 498{
501 struct pci_controller *hose; 499 struct pci_controller *hose;
502 unsigned long addr; 500 volatile void __iomem *addr;
503 501
504 hose = pci_bus_to_host(bus); 502 hose = pci_bus_to_host(bus);
505 if (hose == NULL) 503 if (hose == NULL)
@@ -515,13 +513,13 @@ static int u4_pcie_read_config(struct pci_bus *bus, unsigned int devfn,
515 */ 513 */
516 switch (len) { 514 switch (len) {
517 case 1: 515 case 1:
518 *val = in_8((u8 *)addr); 516 *val = in_8(addr);
519 break; 517 break;
520 case 2: 518 case 2:
521 *val = in_le16((u16 *)addr); 519 *val = in_le16(addr);
522 break; 520 break;
523 default: 521 default:
524 *val = in_le32((u32 *)addr); 522 *val = in_le32(addr);
525 break; 523 break;
526 } 524 }
527 return PCIBIOS_SUCCESSFUL; 525 return PCIBIOS_SUCCESSFUL;
@@ -531,7 +529,7 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
531 int offset, int len, u32 val) 529 int offset, int len, u32 val)
532{ 530{
533 struct pci_controller *hose; 531 struct pci_controller *hose;
534 unsigned long addr; 532 volatile void __iomem *addr;
535 533
536 hose = pci_bus_to_host(bus); 534 hose = pci_bus_to_host(bus);
537 if (hose == NULL) 535 if (hose == NULL)
@@ -547,16 +545,16 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
547 */ 545 */
548 switch (len) { 546 switch (len) {
549 case 1: 547 case 1:
550 out_8((u8 *)addr, val); 548 out_8(addr, val);
551 (void) in_8((u8 *)addr); 549 (void) in_8(addr);
552 break; 550 break;
553 case 2: 551 case 2:
554 out_le16((u16 *)addr, val); 552 out_le16(addr, val);
555 (void) in_le16((u16 *)addr); 553 (void) in_le16(addr);
556 break; 554 break;
557 default: 555 default:
558 out_le32((u32 *)addr, val); 556 out_le32(addr, val);
559 (void) in_le32((u32 *)addr); 557 (void) in_le32(addr);
560 break; 558 break;
561 } 559 }
562 return PCIBIOS_SUCCESSFUL; 560 return PCIBIOS_SUCCESSFUL;
@@ -773,8 +771,7 @@ static void __init setup_u3_ht(struct pci_controller* hose)
773 * the reg address cell, we shall fix that by killing struct 771 * the reg address cell, we shall fix that by killing struct
774 * reg_property and using some accessor functions instead 772 * reg_property and using some accessor functions instead
775 */ 773 */
776 hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000, 774 hose->cfg_data = ioremap(0xf2000000, 0x02000000);
777 0x02000000);
778 775
779 /* 776 /*
780 * /ht node doesn't expose a "ranges" property, so we "remove" 777 * /ht node doesn't expose a "ranges" property, so we "remove"
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c
index 616b1e3ebe04..97c54e19c1b5 100644
--- a/arch/powerpc/platforms/powermac/setup.c
+++ b/arch/powerpc/platforms/powermac/setup.c
@@ -82,8 +82,6 @@
82 82
83#undef SHOW_GATWICK_IRQS 83#undef SHOW_GATWICK_IRQS
84 84
85unsigned char drive_info;
86
87int ppc_override_l2cr = 0; 85int ppc_override_l2cr = 0;
88int ppc_override_l2cr_value; 86int ppc_override_l2cr_value;
89int has_l2cache = 0; 87int has_l2cache = 0;
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c
index 6373372932ba..e3cbba49fd6e 100644
--- a/arch/powerpc/platforms/pseries/eeh_driver.c
+++ b/arch/powerpc/platforms/pseries/eeh_driver.c
@@ -333,7 +333,7 @@ void handle_eeh_events (struct eeh_event *event)
333 rc = eeh_reset_device(frozen_pdn, NULL); 333 rc = eeh_reset_device(frozen_pdn, NULL);
334 if (rc) 334 if (rc)
335 goto hard_fail; 335 goto hard_fail;
336 pci_walk_bus(frozen_bus, eeh_report_reset, 0); 336 pci_walk_bus(frozen_bus, eeh_report_reset, NULL);
337 } 337 }
338 338
339 /* If all devices reported they can proceed, the re-enable PIO */ 339 /* If all devices reported they can proceed, the re-enable PIO */
@@ -342,11 +342,11 @@ void handle_eeh_events (struct eeh_event *event)
342 rc = eeh_reset_device(frozen_pdn, NULL); 342 rc = eeh_reset_device(frozen_pdn, NULL);
343 if (rc) 343 if (rc)
344 goto hard_fail; 344 goto hard_fail;
345 pci_walk_bus(frozen_bus, eeh_report_reset, 0); 345 pci_walk_bus(frozen_bus, eeh_report_reset, NULL);
346 } 346 }
347 347
348 /* Tell all device drivers that they can resume operations */ 348 /* Tell all device drivers that they can resume operations */
349 pci_walk_bus(frozen_bus, eeh_report_resume, 0); 349 pci_walk_bus(frozen_bus, eeh_report_resume, NULL);
350 350
351 return; 351 return;
352 352
@@ -367,7 +367,7 @@ hard_fail:
367 eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); 367 eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */);
368 368
369 /* Notify all devices that they're about to go down. */ 369 /* Notify all devices that they're about to go down. */
370 pci_walk_bus(frozen_bus, eeh_report_failure, 0); 370 pci_walk_bus(frozen_bus, eeh_report_failure, NULL);
371 371
372 /* Shut down the device drivers for good. */ 372 /* Shut down the device drivers for good. */
373 pcibios_remove_pci_devices(frozen_bus); 373 pcibios_remove_pci_devices(frozen_bus);
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c
index 929ad2333aab..61d317428610 100644
--- a/arch/powerpc/sysdev/dart_iommu.c
+++ b/arch/powerpc/sysdev/dart_iommu.c
@@ -59,7 +59,7 @@ static unsigned long dart_tablesize;
59static u32 *dart_vbase; 59static u32 *dart_vbase;
60 60
61/* Mapped base address for the dart */ 61/* Mapped base address for the dart */
62static unsigned int *__iomem dart; 62static unsigned int __iomem *dart;
63 63
64/* Dummy val that entries are set to when unused */ 64/* Dummy val that entries are set to when unused */
65static unsigned int dart_emptyval; 65static unsigned int dart_emptyval;
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S
index c3427eed8345..5a936566fd61 100644
--- a/arch/ppc/kernel/misc.S
+++ b/arch/ppc/kernel/misc.S
@@ -1048,286 +1048,3 @@ _GLOBAL(name) \
1048 blr 1048 blr
1049 1049
1050SYSCALL(execve) 1050SYSCALL(execve)
1051
1052/* Why isn't this a) automatic, b) written in 'C'? */
1053 .data
1054 .align 4
1055_GLOBAL(sys_call_table)
1056 .long sys_restart_syscall /* 0 */
1057 .long sys_exit
1058 .long ppc_fork
1059 .long sys_read
1060 .long sys_write
1061 .long sys_open /* 5 */
1062 .long sys_close
1063 .long sys_waitpid
1064 .long sys_creat
1065 .long sys_link
1066 .long sys_unlink /* 10 */
1067 .long sys_execve
1068 .long sys_chdir
1069 .long sys_time
1070 .long sys_mknod
1071 .long sys_chmod /* 15 */
1072 .long sys_lchown
1073 .long sys_ni_syscall /* old break syscall holder */
1074 .long sys_stat
1075 .long sys_lseek
1076 .long sys_getpid /* 20 */
1077 .long sys_mount
1078 .long sys_oldumount
1079 .long sys_setuid
1080 .long sys_getuid
1081 .long sys_stime /* 25 */
1082 .long sys_ptrace
1083 .long sys_alarm
1084 .long sys_fstat
1085 .long sys_pause
1086 .long sys_utime /* 30 */
1087 .long sys_ni_syscall /* old stty syscall holder */
1088 .long sys_ni_syscall /* old gtty syscall holder */
1089 .long sys_access
1090 .long sys_nice
1091 .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */
1092 .long sys_sync
1093 .long sys_kill
1094 .long sys_rename
1095 .long sys_mkdir
1096 .long sys_rmdir /* 40 */
1097 .long sys_dup
1098 .long sys_pipe
1099 .long sys_times
1100 .long sys_ni_syscall /* old prof syscall holder */
1101 .long sys_brk /* 45 */
1102 .long sys_setgid
1103 .long sys_getgid
1104 .long sys_signal
1105 .long sys_geteuid
1106 .long sys_getegid /* 50 */
1107 .long sys_acct
1108 .long sys_umount /* recycled never used phys() */
1109 .long sys_ni_syscall /* old lock syscall holder */
1110 .long sys_ioctl
1111 .long sys_fcntl /* 55 */
1112 .long sys_ni_syscall /* old mpx syscall holder */
1113 .long sys_setpgid
1114 .long sys_ni_syscall /* old ulimit syscall holder */
1115 .long sys_olduname
1116 .long sys_umask /* 60 */
1117 .long sys_chroot
1118 .long sys_ustat
1119 .long sys_dup2
1120 .long sys_getppid
1121 .long sys_getpgrp /* 65 */
1122 .long sys_setsid
1123 .long sys_sigaction
1124 .long sys_sgetmask
1125 .long sys_ssetmask
1126 .long sys_setreuid /* 70 */
1127 .long sys_setregid
1128 .long sys_sigsuspend
1129 .long sys_sigpending
1130 .long sys_sethostname
1131 .long sys_setrlimit /* 75 */
1132 .long sys_old_getrlimit
1133 .long sys_getrusage
1134 .long sys_gettimeofday
1135 .long sys_settimeofday
1136 .long sys_getgroups /* 80 */
1137 .long sys_setgroups
1138 .long ppc_select
1139 .long sys_symlink
1140 .long sys_lstat
1141 .long sys_readlink /* 85 */
1142 .long sys_uselib
1143 .long sys_swapon
1144 .long sys_reboot
1145 .long old_readdir
1146 .long sys_mmap /* 90 */
1147 .long sys_munmap
1148 .long sys_truncate
1149 .long sys_ftruncate
1150 .long sys_fchmod
1151 .long sys_fchown /* 95 */
1152 .long sys_getpriority
1153 .long sys_setpriority
1154 .long sys_ni_syscall /* old profil syscall holder */
1155 .long sys_statfs
1156 .long sys_fstatfs /* 100 */
1157 .long sys_ni_syscall
1158 .long sys_socketcall
1159 .long sys_syslog
1160 .long sys_setitimer
1161 .long sys_getitimer /* 105 */
1162 .long sys_newstat
1163 .long sys_newlstat
1164 .long sys_newfstat
1165 .long sys_uname
1166 .long sys_ni_syscall /* 110 */
1167 .long sys_vhangup
1168 .long sys_ni_syscall /* old 'idle' syscall */
1169 .long sys_ni_syscall
1170 .long sys_wait4
1171 .long sys_swapoff /* 115 */
1172 .long sys_sysinfo
1173 .long sys_ipc
1174 .long sys_fsync
1175 .long sys_sigreturn
1176 .long ppc_clone /* 120 */
1177 .long sys_setdomainname
1178 .long sys_newuname
1179 .long sys_ni_syscall
1180 .long sys_adjtimex
1181 .long sys_mprotect /* 125 */
1182 .long sys_sigprocmask
1183 .long sys_ni_syscall /* old sys_create_module */
1184 .long sys_init_module
1185 .long sys_delete_module
1186 .long sys_ni_syscall /* old sys_get_kernel_syms */ /* 130 */
1187 .long sys_quotactl
1188 .long sys_getpgid
1189 .long sys_fchdir
1190 .long sys_bdflush
1191 .long sys_sysfs /* 135 */
1192 .long sys_personality
1193 .long sys_ni_syscall /* for afs_syscall */
1194 .long sys_setfsuid
1195 .long sys_setfsgid
1196 .long sys_llseek /* 140 */
1197 .long sys_getdents
1198 .long ppc_select
1199 .long sys_flock
1200 .long sys_msync
1201 .long sys_readv /* 145 */
1202 .long sys_writev
1203 .long sys_getsid
1204 .long sys_fdatasync
1205 .long sys_sysctl
1206 .long sys_mlock /* 150 */
1207 .long sys_munlock
1208 .long sys_mlockall
1209 .long sys_munlockall
1210 .long sys_sched_setparam
1211 .long sys_sched_getparam /* 155 */
1212 .long sys_sched_setscheduler
1213 .long sys_sched_getscheduler
1214 .long sys_sched_yield
1215 .long sys_sched_get_priority_max
1216 .long sys_sched_get_priority_min /* 160 */
1217 .long sys_sched_rr_get_interval
1218 .long sys_nanosleep
1219 .long sys_mremap
1220 .long sys_setresuid
1221 .long sys_getresuid /* 165 */
1222 .long sys_ni_syscall /* old sys_query_module */
1223 .long sys_poll
1224 .long sys_nfsservctl
1225 .long sys_setresgid
1226 .long sys_getresgid /* 170 */
1227 .long sys_prctl
1228 .long sys_rt_sigreturn
1229 .long sys_rt_sigaction
1230 .long sys_rt_sigprocmask
1231 .long sys_rt_sigpending /* 175 */
1232 .long sys_rt_sigtimedwait
1233 .long sys_rt_sigqueueinfo
1234 .long sys_rt_sigsuspend
1235 .long sys_pread64
1236 .long sys_pwrite64 /* 180 */
1237 .long sys_chown
1238 .long sys_getcwd
1239 .long sys_capget
1240 .long sys_capset
1241 .long sys_sigaltstack /* 185 */
1242 .long sys_sendfile
1243 .long sys_ni_syscall /* streams1 */
1244 .long sys_ni_syscall /* streams2 */
1245 .long ppc_vfork
1246 .long sys_getrlimit /* 190 */
1247 .long sys_readahead
1248 .long sys_mmap2
1249 .long sys_truncate64
1250 .long sys_ftruncate64
1251 .long sys_stat64 /* 195 */
1252 .long sys_lstat64
1253 .long sys_fstat64
1254 .long sys_pciconfig_read
1255 .long sys_pciconfig_write
1256 .long sys_pciconfig_iobase /* 200 */
1257 .long sys_ni_syscall /* 201 - reserved - MacOnLinux - new */
1258 .long sys_getdents64
1259 .long sys_pivot_root
1260 .long sys_fcntl64
1261 .long sys_madvise /* 205 */
1262 .long sys_mincore
1263 .long sys_gettid
1264 .long sys_tkill
1265 .long sys_setxattr
1266 .long sys_lsetxattr /* 210 */
1267 .long sys_fsetxattr
1268 .long sys_getxattr
1269 .long sys_lgetxattr
1270 .long sys_fgetxattr
1271 .long sys_listxattr /* 215 */
1272 .long sys_llistxattr
1273 .long sys_flistxattr
1274 .long sys_removexattr
1275 .long sys_lremovexattr
1276 .long sys_fremovexattr /* 220 */
1277 .long sys_futex
1278 .long sys_sched_setaffinity
1279 .long sys_sched_getaffinity
1280 .long sys_ni_syscall
1281 .long sys_ni_syscall /* 225 - reserved for Tux */
1282 .long sys_sendfile64
1283 .long sys_io_setup
1284 .long sys_io_destroy
1285 .long sys_io_getevents
1286 .long sys_io_submit /* 230 */
1287 .long sys_io_cancel
1288 .long sys_set_tid_address
1289 .long sys_fadvise64
1290 .long sys_exit_group
1291 .long sys_lookup_dcookie /* 235 */
1292 .long sys_epoll_create
1293 .long sys_epoll_ctl
1294 .long sys_epoll_wait
1295 .long sys_remap_file_pages
1296 .long sys_timer_create /* 240 */
1297 .long sys_timer_settime
1298 .long sys_timer_gettime
1299 .long sys_timer_getoverrun
1300 .long sys_timer_delete
1301 .long sys_clock_settime /* 245 */
1302 .long sys_clock_gettime
1303 .long sys_clock_getres
1304 .long sys_clock_nanosleep
1305 .long sys_swapcontext
1306 .long sys_tgkill /* 250 */
1307 .long sys_utimes
1308 .long sys_statfs64
1309 .long sys_fstatfs64
1310 .long ppc_fadvise64_64
1311 .long sys_ni_syscall /* 255 - rtas (used on ppc64) */
1312 .long sys_debug_setcontext
1313 .long sys_ni_syscall /* 257 reserved for vserver */
1314 .long sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */
1315 .long sys_ni_syscall /* 259 reserved for new sys_mbind */
1316 .long sys_ni_syscall /* 260 reserved for new sys_get_mempolicy */
1317 .long sys_ni_syscall /* 261 reserved for new sys_set_mempolicy */
1318 .long sys_mq_open
1319 .long sys_mq_unlink
1320 .long sys_mq_timedsend
1321 .long sys_mq_timedreceive /* 265 */
1322 .long sys_mq_notify
1323 .long sys_mq_getsetattr
1324 .long sys_kexec_load
1325 .long sys_add_key
1326 .long sys_request_key /* 270 */
1327 .long sys_keyctl
1328 .long sys_waitid
1329 .long sys_ioprio_set
1330 .long sys_ioprio_get
1331 .long sys_inotify_init /* 275 */
1332 .long sys_inotify_add_watch
1333 .long sys_inotify_rm_watch
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c
index 3a6e4bcb3c53..15bd9b448a48 100644
--- a/arch/ppc/kernel/ppc_ksyms.c
+++ b/arch/ppc/kernel/ppc_ksyms.c
@@ -186,11 +186,15 @@ EXPORT_SYMBOL(flush_tlb_kernel_range);
186EXPORT_SYMBOL(flush_tlb_page); 186EXPORT_SYMBOL(flush_tlb_page);
187EXPORT_SYMBOL(_tlbie); 187EXPORT_SYMBOL(_tlbie);
188#ifdef CONFIG_ALTIVEC 188#ifdef CONFIG_ALTIVEC
189#ifndef CONFIG_SMP
189EXPORT_SYMBOL(last_task_used_altivec); 190EXPORT_SYMBOL(last_task_used_altivec);
191#endif
190EXPORT_SYMBOL(giveup_altivec); 192EXPORT_SYMBOL(giveup_altivec);
191#endif /* CONFIG_ALTIVEC */ 193#endif /* CONFIG_ALTIVEC */
192#ifdef CONFIG_SPE 194#ifdef CONFIG_SPE
195#ifndef CONFIG_SMP
193EXPORT_SYMBOL(last_task_used_spe); 196EXPORT_SYMBOL(last_task_used_spe);
197#endif
194EXPORT_SYMBOL(giveup_spe); 198EXPORT_SYMBOL(giveup_spe);
195#endif /* CONFIG_SPE */ 199#endif /* CONFIG_SPE */
196#ifdef CONFIG_SMP 200#ifdef CONFIG_SMP
diff --git a/arch/ppc/platforms/4xx/bamboo.c b/arch/ppc/platforms/4xx/bamboo.c
index 159b228eca1e..0ec53f049338 100644
--- a/arch/ppc/platforms/4xx/bamboo.c
+++ b/arch/ppc/platforms/4xx/bamboo.c
@@ -332,8 +332,8 @@ bamboo_early_serial_map(void)
332 port.irq = 0; 332 port.irq = 0;
333 port.uartclk = clocks.uart0; 333 port.uartclk = clocks.uart0;
334 port.regshift = 0; 334 port.regshift = 0;
335 port.iotype = SERIAL_IO_MEM; 335 port.iotype = UPIO_MEM;
336 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 336 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
337 port.line = 0; 337 port.line = 0;
338 338
339 if (early_serial_setup(&port) != 0) { 339 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/4xx/bubinga.c b/arch/ppc/platforms/4xx/bubinga.c
index 8110f55668c5..ce48a4f08cbb 100644
--- a/arch/ppc/platforms/4xx/bubinga.c
+++ b/arch/ppc/platforms/4xx/bubinga.c
@@ -97,8 +97,8 @@ bubinga_early_serial_map(void)
97 port.irq = ACTING_UART0_INT; 97 port.irq = ACTING_UART0_INT;
98 port.uartclk = uart_clock; 98 port.uartclk = uart_clock;
99 port.regshift = 0; 99 port.regshift = 0;
100 port.iotype = SERIAL_IO_MEM; 100 port.iotype = UPIO_MEM;
101 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 101 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
102 port.line = 0; 102 port.line = 0;
103 103
104 if (early_serial_setup(&port) != 0) { 104 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/4xx/ebony.c b/arch/ppc/platforms/4xx/ebony.c
index 64ebae19cdbb..9a828b623417 100644
--- a/arch/ppc/platforms/4xx/ebony.c
+++ b/arch/ppc/platforms/4xx/ebony.c
@@ -225,8 +225,8 @@ ebony_early_serial_map(void)
225 port.irq = 0; 225 port.irq = 0;
226 port.uartclk = clocks.uart0; 226 port.uartclk = clocks.uart0;
227 port.regshift = 0; 227 port.regshift = 0;
228 port.iotype = SERIAL_IO_MEM; 228 port.iotype = UPIO_MEM;
229 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 229 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
230 port.line = 0; 230 port.line = 0;
231 231
232 if (early_serial_setup(&port) != 0) { 232 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/4xx/luan.c b/arch/ppc/platforms/4xx/luan.c
index d810b736d9bf..21d29132aebd 100644
--- a/arch/ppc/platforms/4xx/luan.c
+++ b/arch/ppc/platforms/4xx/luan.c
@@ -279,8 +279,8 @@ luan_early_serial_map(void)
279 port.irq = UART0_INT; 279 port.irq = UART0_INT;
280 port.uartclk = clocks.uart0; 280 port.uartclk = clocks.uart0;
281 port.regshift = 0; 281 port.regshift = 0;
282 port.iotype = SERIAL_IO_MEM; 282 port.iotype = UPIO_MEM;
283 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 283 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
284 port.line = 0; 284 port.line = 0;
285 285
286 if (early_serial_setup(&port) != 0) { 286 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/4xx/ocotea.c b/arch/ppc/platforms/4xx/ocotea.c
index 73b2c98158f6..4f355b6acab2 100644
--- a/arch/ppc/platforms/4xx/ocotea.c
+++ b/arch/ppc/platforms/4xx/ocotea.c
@@ -248,8 +248,8 @@ ocotea_early_serial_map(void)
248 port.irq = UART0_INT; 248 port.irq = UART0_INT;
249 port.uartclk = clocks.uart0; 249 port.uartclk = clocks.uart0;
250 port.regshift = 0; 250 port.regshift = 0;
251 port.iotype = SERIAL_IO_MEM; 251 port.iotype = UPIO_MEM;
252 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 252 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
253 port.line = 0; 253 port.line = 0;
254 254
255 if (early_serial_setup(&port) != 0) { 255 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/4xx/yucca.c b/arch/ppc/platforms/4xx/yucca.c
index e60f4bd437ec..b065b8babcd3 100644
--- a/arch/ppc/platforms/4xx/yucca.c
+++ b/arch/ppc/platforms/4xx/yucca.c
@@ -305,8 +305,8 @@ yucca_early_serial_map(void)
305 port.irq = UART0_INT; 305 port.irq = UART0_INT;
306 port.uartclk = clocks.uart0; 306 port.uartclk = clocks.uart0;
307 port.regshift = 0; 307 port.regshift = 0;
308 port.iotype = SERIAL_IO_MEM; 308 port.iotype = UPIO_MEM;
309 port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; 309 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
310 port.line = 0; 310 port.line = 0;
311 311
312 if (early_serial_setup(&port) != 0) { 312 if (early_serial_setup(&port) != 0) {
diff --git a/arch/ppc/platforms/83xx/mpc834x_sys.c b/arch/ppc/platforms/83xx/mpc834x_sys.c
index 012e1e652c03..1a659bbc1860 100644
--- a/arch/ppc/platforms/83xx/mpc834x_sys.c
+++ b/arch/ppc/platforms/83xx/mpc834x_sys.c
@@ -301,14 +301,14 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
301 struct uart_port p; 301 struct uart_port p;
302 302
303 memset(&p, 0, sizeof (p)); 303 memset(&p, 0, sizeof (p));
304 p.iotype = SERIAL_IO_MEM; 304 p.iotype = UPIO_MEM;
305 p.membase = (unsigned char __iomem *)(VIRT_IMMRBAR + 0x4500); 305 p.membase = (unsigned char __iomem *)(VIRT_IMMRBAR + 0x4500);
306 p.uartclk = binfo->bi_busfreq; 306 p.uartclk = binfo->bi_busfreq;
307 307
308 gen550_init(0, &p); 308 gen550_init(0, &p);
309 309
310 memset(&p, 0, sizeof (p)); 310 memset(&p, 0, sizeof (p));
311 p.iotype = SERIAL_IO_MEM; 311 p.iotype = UPIO_MEM;
312 p.membase = (unsigned char __iomem *)(VIRT_IMMRBAR + 0x4600); 312 p.membase = (unsigned char __iomem *)(VIRT_IMMRBAR + 0x4600);
313 p.uartclk = binfo->bi_busfreq; 313 p.uartclk = binfo->bi_busfreq;
314 314
diff --git a/arch/ppc/platforms/85xx/mpc8540_ads.c b/arch/ppc/platforms/85xx/mpc8540_ads.c
index 2eceb1e6f4eb..408d64f18e1a 100644
--- a/arch/ppc/platforms/85xx/mpc8540_ads.c
+++ b/arch/ppc/platforms/85xx/mpc8540_ads.c
@@ -162,14 +162,14 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
162 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0); 162 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0);
163 163
164 memset(&p, 0, sizeof (p)); 164 memset(&p, 0, sizeof (p));
165 p.iotype = SERIAL_IO_MEM; 165 p.iotype = UPIO_MEM;
166 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET; 166 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET;
167 p.uartclk = binfo->bi_busfreq; 167 p.uartclk = binfo->bi_busfreq;
168 168
169 gen550_init(0, &p); 169 gen550_init(0, &p);
170 170
171 memset(&p, 0, sizeof (p)); 171 memset(&p, 0, sizeof (p));
172 p.iotype = SERIAL_IO_MEM; 172 p.iotype = UPIO_MEM;
173 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET; 173 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET;
174 p.uartclk = binfo->bi_busfreq; 174 p.uartclk = binfo->bi_busfreq;
175 175
diff --git a/arch/ppc/platforms/85xx/mpc85xx_cds_common.c b/arch/ppc/platforms/85xx/mpc85xx_cds_common.c
index b332ebae6bd3..1801ab392e22 100644
--- a/arch/ppc/platforms/85xx/mpc85xx_cds_common.c
+++ b/arch/ppc/platforms/85xx/mpc85xx_cds_common.c
@@ -534,14 +534,14 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
534 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0); 534 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0);
535 535
536 memset(&p, 0, sizeof (p)); 536 memset(&p, 0, sizeof (p));
537 p.iotype = SERIAL_IO_MEM; 537 p.iotype = UPIO_MEM;
538 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET; 538 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET;
539 p.uartclk = binfo->bi_busfreq; 539 p.uartclk = binfo->bi_busfreq;
540 540
541 gen550_init(0, &p); 541 gen550_init(0, &p);
542 542
543 memset(&p, 0, sizeof (p)); 543 memset(&p, 0, sizeof (p));
544 p.iotype = SERIAL_IO_MEM; 544 p.iotype = UPIO_MEM;
545 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET; 545 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET;
546 p.uartclk = binfo->bi_busfreq; 546 p.uartclk = binfo->bi_busfreq;
547 547
diff --git a/arch/ppc/platforms/85xx/sbc8560.c b/arch/ppc/platforms/85xx/sbc8560.c
index e777ba824aa9..8a72221f816c 100644
--- a/arch/ppc/platforms/85xx/sbc8560.c
+++ b/arch/ppc/platforms/85xx/sbc8560.c
@@ -64,7 +64,7 @@ sbc8560_early_serial_map(void)
64 uart_req.irq = MPC85xx_IRQ_EXT9; 64 uart_req.irq = MPC85xx_IRQ_EXT9;
65 uart_req.flags = STD_COM_FLAGS; 65 uart_req.flags = STD_COM_FLAGS;
66 uart_req.uartclk = BASE_BAUD * 16; 66 uart_req.uartclk = BASE_BAUD * 16;
67 uart_req.iotype = SERIAL_IO_MEM; 67 uart_req.iotype = UPIO_MEM;
68 uart_req.mapbase = UARTA_ADDR; 68 uart_req.mapbase = UARTA_ADDR;
69 uart_req.membase = ioremap(uart_req.mapbase, MPC85xx_UART0_SIZE); 69 uart_req.membase = ioremap(uart_req.mapbase, MPC85xx_UART0_SIZE);
70 uart_req.type = PORT_16650; 70 uart_req.type = PORT_16650;
diff --git a/arch/ppc/platforms/85xx/tqm85xx.c b/arch/ppc/platforms/85xx/tqm85xx.c
index b436f4d0a3fa..a5e38ba62732 100644
--- a/arch/ppc/platforms/85xx/tqm85xx.c
+++ b/arch/ppc/platforms/85xx/tqm85xx.c
@@ -346,14 +346,14 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
346 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0); 346 binfo->bi_immr_base, MPC85xx_CCSRBAR_SIZE, _PAGE_IO, 0);
347 347
348 memset(&p, 0, sizeof (p)); 348 memset(&p, 0, sizeof (p));
349 p.iotype = SERIAL_IO_MEM; 349 p.iotype = UPIO_MEM;
350 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET; 350 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART0_OFFSET;
351 p.uartclk = binfo->bi_busfreq; 351 p.uartclk = binfo->bi_busfreq;
352 352
353 gen550_init(0, &p); 353 gen550_init(0, &p);
354 354
355 memset(&p, 0, sizeof (p)); 355 memset(&p, 0, sizeof (p));
356 p.iotype = SERIAL_IO_MEM; 356 p.iotype = UPIO_MEM;
357 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET; 357 p.membase = (void *) binfo->bi_immr_base + MPC85xx_UART1_OFFSET;
358 p.uartclk = binfo->bi_busfreq; 358 p.uartclk = binfo->bi_busfreq;
359 359
diff --git a/arch/ppc/platforms/chestnut.c b/arch/ppc/platforms/chestnut.c
index 48a4a510d598..aefcc0e7be57 100644
--- a/arch/ppc/platforms/chestnut.c
+++ b/arch/ppc/platforms/chestnut.c
@@ -116,7 +116,7 @@ chestnut_early_serial_map(void)
116 port.uartclk = BASE_BAUD * 16; 116 port.uartclk = BASE_BAUD * 16;
117 port.irq = UART0_INT; 117 port.irq = UART0_INT;
118 port.flags = STD_COM_FLAGS | UPF_IOREMAP; 118 port.flags = STD_COM_FLAGS | UPF_IOREMAP;
119 port.iotype = SERIAL_IO_MEM; 119 port.iotype = UPIO_MEM;
120 port.mapbase = CHESTNUT_UART0_IO_BASE; 120 port.mapbase = CHESTNUT_UART0_IO_BASE;
121 port.regshift = 0; 121 port.regshift = 0;
122 122
diff --git a/arch/ppc/platforms/ev64260.c b/arch/ppc/platforms/ev64260.c
index 32358b3fb236..ffde8f6f6302 100644
--- a/arch/ppc/platforms/ev64260.c
+++ b/arch/ppc/platforms/ev64260.c
@@ -330,7 +330,7 @@ ev64260_early_serial_map(void)
330 port.irq = EV64260_UART_0_IRQ; 330 port.irq = EV64260_UART_0_IRQ;
331 port.uartclk = BASE_BAUD * 16; 331 port.uartclk = BASE_BAUD * 16;
332 port.regshift = 2; 332 port.regshift = 2;
333 port.iotype = SERIAL_IO_MEM; 333 port.iotype = UPIO_MEM;
334 port.flags = STD_COM_FLAGS; 334 port.flags = STD_COM_FLAGS;
335 335
336#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) 336#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
diff --git a/arch/ppc/platforms/radstone_ppc7d.c b/arch/ppc/platforms/radstone_ppc7d.c
index 708b8739ecdd..872c0a3ba3c7 100644
--- a/arch/ppc/platforms/radstone_ppc7d.c
+++ b/arch/ppc/platforms/radstone_ppc7d.c
@@ -100,7 +100,7 @@ static void __init ppc7d_early_serial_map(void)
100 serial_req.uartclk = UART_CLK; 100 serial_req.uartclk = UART_CLK;
101 serial_req.irq = 4; 101 serial_req.irq = 4;
102 serial_req.flags = STD_COM_FLAGS; 102 serial_req.flags = STD_COM_FLAGS;
103 serial_req.iotype = SERIAL_IO_MEM; 103 serial_req.iotype = UPIO_MEM;
104 serial_req.membase = (u_char *) PPC7D_SERIAL_0; 104 serial_req.membase = (u_char *) PPC7D_SERIAL_0;
105 105
106 gen550_init(0, &serial_req); 106 gen550_init(0, &serial_req);
diff --git a/arch/ppc/platforms/spruce.c b/arch/ppc/platforms/spruce.c
index 5ad70d357cb9..69e1de7971f2 100644
--- a/arch/ppc/platforms/spruce.c
+++ b/arch/ppc/platforms/spruce.c
@@ -176,8 +176,8 @@ spruce_early_serial_map(void)
176 memset(&serial_req, 0, sizeof(serial_req)); 176 memset(&serial_req, 0, sizeof(serial_req));
177 serial_req.uartclk = uart_clk; 177 serial_req.uartclk = uart_clk;
178 serial_req.irq = UART0_INT; 178 serial_req.irq = UART0_INT;
179 serial_req.flags = ASYNC_BOOT_AUTOCONF; 179 serial_req.flags = UPF_BOOT_AUTOCONF;
180 serial_req.iotype = SERIAL_IO_MEM; 180 serial_req.iotype = UPIO_MEM;
181 serial_req.membase = (u_char *)UART0_IO_BASE; 181 serial_req.membase = (u_char *)UART0_IO_BASE;
182 serial_req.regshift = 0; 182 serial_req.regshift = 0;
183 183
diff --git a/arch/ppc/syslib/ocp.c b/arch/ppc/syslib/ocp.c
index ab34b1d6072f..2fe28ded2c60 100644
--- a/arch/ppc/syslib/ocp.c
+++ b/arch/ppc/syslib/ocp.c
@@ -189,8 +189,8 @@ ocp_device_resume(struct device *dev)
189struct bus_type ocp_bus_type = { 189struct bus_type ocp_bus_type = {
190 .name = "ocp", 190 .name = "ocp",
191 .match = ocp_device_match, 191 .match = ocp_device_match,
192 .probe = ocp_driver_probe, 192 .probe = ocp_device_probe,
193 .remove = ocp_driver_remove, 193 .remove = ocp_device_remove,
194 .suspend = ocp_device_suspend, 194 .suspend = ocp_device_suspend,
195 .resume = ocp_device_resume, 195 .resume = ocp_device_resume,
196}; 196};
diff --git a/arch/ppc/syslib/ppc83xx_setup.c b/arch/ppc/syslib/ppc83xx_setup.c
index 1b5fe9e398d4..7bada82527a8 100644
--- a/arch/ppc/syslib/ppc83xx_setup.c
+++ b/arch/ppc/syslib/ppc83xx_setup.c
@@ -108,7 +108,7 @@ mpc83xx_early_serial_map(void)
108 108
109#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) 109#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
110 memset(&serial_req, 0, sizeof (serial_req)); 110 memset(&serial_req, 0, sizeof (serial_req));
111 serial_req.iotype = SERIAL_IO_MEM; 111 serial_req.iotype = UPIO_MEM;
112 serial_req.mapbase = pdata[0].mapbase; 112 serial_req.mapbase = pdata[0].mapbase;
113 serial_req.membase = pdata[0].membase; 113 serial_req.membase = pdata[0].membase;
114 serial_req.regshift = 0; 114 serial_req.regshift = 0;
diff --git a/arch/ppc/syslib/ppc85xx_setup.c b/arch/ppc/syslib/ppc85xx_setup.c
index 1a47ff4b831d..e4dda43fdaa7 100644
--- a/arch/ppc/syslib/ppc85xx_setup.c
+++ b/arch/ppc/syslib/ppc85xx_setup.c
@@ -90,7 +90,7 @@ mpc85xx_early_serial_map(void)
90 90
91#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) 91#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
92 memset(&serial_req, 0, sizeof (serial_req)); 92 memset(&serial_req, 0, sizeof (serial_req));
93 serial_req.iotype = SERIAL_IO_MEM; 93 serial_req.iotype = UPIO_MEM;
94 serial_req.mapbase = pdata[0].mapbase; 94 serial_req.mapbase = pdata[0].mapbase;
95 serial_req.membase = pdata[0].membase; 95 serial_req.membase = pdata[0].membase;
96 serial_req.regshift = 0; 96 serial_req.regshift = 0;
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
index bf9a7a361b34..cc20f0e3a7d3 100644
--- a/arch/s390/kernel/compat_linux.c
+++ b/arch/s390/kernel/compat_linux.c
@@ -100,12 +100,12 @@
100#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) 100#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid)
101#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) 101#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid)
102 102
103asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group) 103asmlinkage long sys32_chown16(const char __user * filename, u16 user, u16 group)
104{ 104{
105 return sys_chown(filename, low2highuid(user), low2highgid(group)); 105 return sys_chown(filename, low2highuid(user), low2highgid(group));
106} 106}
107 107
108asmlinkage long sys32_lchown16(const char * filename, u16 user, u16 group) 108asmlinkage long sys32_lchown16(const char __user * filename, u16 user, u16 group)
109{ 109{
110 return sys_lchown(filename, low2highuid(user), low2highgid(group)); 110 return sys_lchown(filename, low2highuid(user), low2highgid(group));
111} 111}
@@ -141,7 +141,7 @@ asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
141 low2highuid(suid)); 141 low2highuid(suid));
142} 142}
143 143
144asmlinkage long sys32_getresuid16(u16 *ruid, u16 *euid, u16 *suid) 144asmlinkage long sys32_getresuid16(u16 __user *ruid, u16 __user *euid, u16 __user *suid)
145{ 145{
146 int retval; 146 int retval;
147 147
@@ -158,7 +158,7 @@ asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
158 low2highgid(sgid)); 158 low2highgid(sgid));
159} 159}
160 160
161asmlinkage long sys32_getresgid16(u16 *rgid, u16 *egid, u16 *sgid) 161asmlinkage long sys32_getresgid16(u16 __user *rgid, u16 __user *egid, u16 __user *sgid)
162{ 162{
163 int retval; 163 int retval;
164 164
@@ -179,7 +179,7 @@ asmlinkage long sys32_setfsgid16(u16 gid)
179 return sys_setfsgid((gid_t)gid); 179 return sys_setfsgid((gid_t)gid);
180} 180}
181 181
182static int groups16_to_user(u16 *grouplist, struct group_info *group_info) 182static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info)
183{ 183{
184 int i; 184 int i;
185 u16 group; 185 u16 group;
@@ -193,7 +193,7 @@ static int groups16_to_user(u16 *grouplist, struct group_info *group_info)
193 return 0; 193 return 0;
194} 194}
195 195
196static int groups16_from_user(struct group_info *group_info, u16 *grouplist) 196static int groups16_from_user(struct group_info *group_info, u16 __user *grouplist)
197{ 197{
198 int i; 198 int i;
199 u16 group; 199 u16 group;
@@ -207,7 +207,7 @@ static int groups16_from_user(struct group_info *group_info, u16 *grouplist)
207 return 0; 207 return 0;
208} 208}
209 209
210asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist) 210asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist)
211{ 211{
212 int i; 212 int i;
213 213
@@ -231,7 +231,7 @@ out:
231 return i; 231 return i;
232} 232}
233 233
234asmlinkage long sys32_setgroups16(int gidsetsize, u16 *grouplist) 234asmlinkage long sys32_setgroups16(int gidsetsize, u16 __user *grouplist)
235{ 235{
236 struct group_info *group_info; 236 struct group_info *group_info;
237 int retval; 237 int retval;
@@ -278,14 +278,14 @@ asmlinkage long sys32_getegid16(void)
278 278
279/* 32-bit timeval and related flotsam. */ 279/* 32-bit timeval and related flotsam. */
280 280
281static inline long get_tv32(struct timeval *o, struct compat_timeval *i) 281static inline long get_tv32(struct timeval *o, struct compat_timeval __user *i)
282{ 282{
283 return (!access_ok(VERIFY_READ, o, sizeof(*o)) || 283 return (!access_ok(VERIFY_READ, o, sizeof(*o)) ||
284 (__get_user(o->tv_sec, &i->tv_sec) || 284 (__get_user(o->tv_sec, &i->tv_sec) ||
285 __get_user(o->tv_usec, &i->tv_usec))); 285 __get_user(o->tv_usec, &i->tv_usec)));
286} 286}
287 287
288static inline long put_tv32(struct compat_timeval *o, struct timeval *i) 288static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
289{ 289{
290 return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || 290 return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
291 (__put_user(i->tv_sec, &o->tv_sec) || 291 (__put_user(i->tv_sec, &o->tv_sec) ||
@@ -341,7 +341,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
341 return -ENOSYS; 341 return -ENOSYS;
342} 342}
343 343
344asmlinkage long sys32_truncate64(const char * path, unsigned long high, unsigned long low) 344asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
345{ 345{
346 if ((int)high < 0) 346 if ((int)high < 0)
347 return -EINVAL; 347 return -EINVAL;
@@ -357,7 +357,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned
357 return sys_ftruncate(fd, (high << 32) | low); 357 return sys_ftruncate(fd, (high << 32) | low);
358} 358}
359 359
360int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf) 360int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
361{ 361{
362 int err; 362 int err;
363 363
@@ -591,7 +591,7 @@ sys32_delete_module(const char __user *name_user, unsigned int flags)
591 591
592extern struct timezone sys_tz; 592extern struct timezone sys_tz;
593 593
594asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz) 594asmlinkage long sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
595{ 595{
596 if (tv) { 596 if (tv) {
597 struct timeval ktv; 597 struct timeval ktv;
@@ -606,7 +606,7 @@ asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *t
606 return 0; 606 return 0;
607} 607}
608 608
609static inline long get_ts32(struct timespec *o, struct compat_timeval *i) 609static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i)
610{ 610{
611 long usec; 611 long usec;
612 612
@@ -620,7 +620,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
620 return 0; 620 return 0;
621} 621}
622 622
623asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz) 623asmlinkage long sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
624{ 624{
625 struct timespec kts; 625 struct timespec kts;
626 struct timezone ktz; 626 struct timezone ktz;
@@ -645,7 +645,7 @@ asmlinkage long sys32_pause(void)
645 return -ERESTARTNOHAND; 645 return -ERESTARTNOHAND;
646} 646}
647 647
648asmlinkage long sys32_pread64(unsigned int fd, char *ubuf, 648asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
649 size_t count, u32 poshi, u32 poslo) 649 size_t count, u32 poshi, u32 poslo)
650{ 650{
651 if ((compat_ssize_t) count < 0) 651 if ((compat_ssize_t) count < 0)
@@ -653,7 +653,7 @@ asmlinkage long sys32_pread64(unsigned int fd, char *ubuf,
653 return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo)); 653 return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
654} 654}
655 655
656asmlinkage long sys32_pwrite64(unsigned int fd, const char *ubuf, 656asmlinkage long sys32_pwrite64(unsigned int fd, const char __user *ubuf,
657 size_t count, u32 poshi, u32 poslo) 657 size_t count, u32 poshi, u32 poslo)
658{ 658{
659 if ((compat_ssize_t) count < 0) 659 if ((compat_ssize_t) count < 0)
@@ -666,7 +666,7 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun
666 return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count); 666 return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);
667} 667}
668 668
669asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size_t count) 669asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, size_t count)
670{ 670{
671 mm_segment_t old_fs = get_fs(); 671 mm_segment_t old_fs = get_fs();
672 int ret; 672 int ret;
@@ -686,7 +686,7 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size
686} 686}
687 687
688asmlinkage long sys32_sendfile64(int out_fd, int in_fd, 688asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
689 compat_loff_t *offset, s32 count) 689 compat_loff_t __user *offset, s32 count)
690{ 690{
691 mm_segment_t old_fs = get_fs(); 691 mm_segment_t old_fs = get_fs();
692 int ret; 692 int ret;
@@ -722,7 +722,7 @@ struct timex32 {
722 722
723extern int do_adjtimex(struct timex *); 723extern int do_adjtimex(struct timex *);
724 724
725asmlinkage long sys32_adjtimex(struct timex32 *utp) 725asmlinkage long sys32_adjtimex(struct timex32 __user *utp)
726{ 726{
727 struct timex txc; 727 struct timex txc;
728 int ret; 728 int ret;
@@ -789,12 +789,13 @@ struct __sysctl_args32 {
789 u32 __unused[4]; 789 u32 __unused[4];
790}; 790};
791 791
792asmlinkage long sys32_sysctl(struct __sysctl_args32 *args) 792asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
793{ 793{
794 struct __sysctl_args32 tmp; 794 struct __sysctl_args32 tmp;
795 int error; 795 int error;
796 size_t oldlen, *oldlenp = NULL; 796 size_t oldlen;
797 unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7; 797 size_t __user *oldlenp = NULL;
798 unsigned long addr = (((unsigned long)&args->__unused[0]) + 7) & ~7;
798 799
799 if (copy_from_user(&tmp, args, sizeof(tmp))) 800 if (copy_from_user(&tmp, args, sizeof(tmp)))
800 return -EFAULT; 801 return -EFAULT;
@@ -806,20 +807,20 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
806 basically copy the whole sysctl.c here, and 807 basically copy the whole sysctl.c here, and
807 glibc's __sysctl uses rw memory for the structure 808 glibc's __sysctl uses rw memory for the structure
808 anyway. */ 809 anyway. */
809 if (get_user(oldlen, (u32 *)A(tmp.oldlenp)) || 810 if (get_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp)) ||
810 put_user(oldlen, (size_t *)addr)) 811 put_user(oldlen, (size_t __user *)addr))
811 return -EFAULT; 812 return -EFAULT;
812 oldlenp = (size_t *)addr; 813 oldlenp = (size_t __user *)addr;
813 } 814 }
814 815
815 lock_kernel(); 816 lock_kernel();
816 error = do_sysctl((int *)A(tmp.name), tmp.nlen, (void *)A(tmp.oldval), 817 error = do_sysctl(compat_ptr(tmp.name), tmp.nlen, compat_ptr(tmp.oldval),
817 oldlenp, (void *)A(tmp.newval), tmp.newlen); 818 oldlenp, compat_ptr(tmp.newval), tmp.newlen);
818 unlock_kernel(); 819 unlock_kernel();
819 if (oldlenp) { 820 if (oldlenp) {
820 if (!error) { 821 if (!error) {
821 if (get_user(oldlen, (size_t *)addr) || 822 if (get_user(oldlen, (size_t __user *)addr) ||
822 put_user(oldlen, (u32 *)A(tmp.oldlenp))) 823 put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp)))
823 error = -EFAULT; 824 error = -EFAULT;
824 } 825 }
825 copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); 826 copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused));
@@ -853,7 +854,7 @@ struct stat64_emu31 {
853 unsigned long st_ino; 854 unsigned long st_ino;
854}; 855};
855 856
856static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat) 857static int cp_stat64(struct stat64_emu31 __user *ubuf, struct kstat *stat)
857{ 858{
858 struct stat64_emu31 tmp; 859 struct stat64_emu31 tmp;
859 860
@@ -877,7 +878,7 @@ static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat)
877 return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 878 return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
878} 879}
879 880
880asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf) 881asmlinkage long sys32_stat64(char __user * filename, struct stat64_emu31 __user * statbuf)
881{ 882{
882 struct kstat stat; 883 struct kstat stat;
883 int ret = vfs_stat(filename, &stat); 884 int ret = vfs_stat(filename, &stat);
@@ -886,7 +887,7 @@ asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf)
886 return ret; 887 return ret;
887} 888}
888 889
889asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf) 890asmlinkage long sys32_lstat64(char __user * filename, struct stat64_emu31 __user * statbuf)
890{ 891{
891 struct kstat stat; 892 struct kstat stat;
892 int ret = vfs_lstat(filename, &stat); 893 int ret = vfs_lstat(filename, &stat);
@@ -895,7 +896,7 @@ asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf)
895 return ret; 896 return ret;
896} 897}
897 898
898asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf) 899asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 __user * statbuf)
899{ 900{
900 struct kstat stat; 901 struct kstat stat;
901 int ret = vfs_fstat(fd, &stat); 902 int ret = vfs_fstat(fd, &stat);
@@ -952,7 +953,7 @@ out:
952 953
953 954
954asmlinkage unsigned long 955asmlinkage unsigned long
955old32_mmap(struct mmap_arg_struct_emu31 *arg) 956old32_mmap(struct mmap_arg_struct_emu31 __user *arg)
956{ 957{
957 struct mmap_arg_struct_emu31 a; 958 struct mmap_arg_struct_emu31 a;
958 int error = -EFAULT; 959 int error = -EFAULT;
@@ -970,7 +971,7 @@ out:
970} 971}
971 972
972asmlinkage long 973asmlinkage long
973sys32_mmap2(struct mmap_arg_struct_emu31 *arg) 974sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg)
974{ 975{
975 struct mmap_arg_struct_emu31 a; 976 struct mmap_arg_struct_emu31 a;
976 int error = -EFAULT; 977 int error = -EFAULT;
@@ -982,7 +983,7 @@ out:
982 return error; 983 return error;
983} 984}
984 985
985asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count) 986asmlinkage long sys32_read(unsigned int fd, char __user * buf, size_t count)
986{ 987{
987 if ((compat_ssize_t) count < 0) 988 if ((compat_ssize_t) count < 0)
988 return -EINVAL; 989 return -EINVAL;
@@ -990,7 +991,7 @@ asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count)
990 return sys_read(fd, buf, count); 991 return sys_read(fd, buf, count);
991} 992}
992 993
993asmlinkage long sys32_write(unsigned int fd, char * buf, size_t count) 994asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count)
994{ 995{
995 if ((compat_ssize_t) count < 0) 996 if ((compat_ssize_t) count < 0)
996 return -EINVAL; 997 return -EINVAL;
@@ -1002,12 +1003,12 @@ asmlinkage long sys32_clone(struct pt_regs regs)
1002{ 1003{
1003 unsigned long clone_flags; 1004 unsigned long clone_flags;
1004 unsigned long newsp; 1005 unsigned long newsp;
1005 int *parent_tidptr, *child_tidptr; 1006 int __user *parent_tidptr, *child_tidptr;
1006 1007
1007 clone_flags = regs.gprs[3] & 0xffffffffUL; 1008 clone_flags = regs.gprs[3] & 0xffffffffUL;
1008 newsp = regs.orig_gpr2 & 0x7fffffffUL; 1009 newsp = regs.orig_gpr2 & 0x7fffffffUL;
1009 parent_tidptr = (int *) (regs.gprs[4] & 0x7fffffffUL); 1010 parent_tidptr = compat_ptr(regs.gprs[4]);
1010 child_tidptr = (int *) (regs.gprs[5] & 0x7fffffffUL); 1011 child_tidptr = compat_ptr(regs.gprs[5]);
1011 if (!newsp) 1012 if (!newsp)
1012 newsp = regs.gprs[15]; 1013 newsp = regs.gprs[15];
1013 return do_fork(clone_flags, newsp, &regs, 0, 1014 return do_fork(clone_flags, newsp, &regs, 0,
diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c
index 6a63553493c5..e351780bb660 100644
--- a/arch/s390/kernel/sys_s390.c
+++ b/arch/s390/kernel/sys_s390.c
@@ -122,8 +122,8 @@ out:
122#ifndef CONFIG_64BIT 122#ifndef CONFIG_64BIT
123struct sel_arg_struct { 123struct sel_arg_struct {
124 unsigned long n; 124 unsigned long n;
125 fd_set *inp, *outp, *exp; 125 fd_set __user *inp, *outp, *exp;
126 struct timeval *tvp; 126 struct timeval __user *tvp;
127}; 127};
128 128
129asmlinkage long old_select(struct sel_arg_struct __user *arg) 129asmlinkage long old_select(struct sel_arg_struct __user *arg)
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
index 5d21e9e6e7b4..a46793beeddd 100644
--- a/arch/s390/kernel/traps.c
+++ b/arch/s390/kernel/traps.c
@@ -486,7 +486,7 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code)
486 info.si_signo = signal; 486 info.si_signo = signal;
487 info.si_errno = 0; 487 info.si_errno = 0;
488 info.si_code = ILL_ILLOPC; 488 info.si_code = ILL_ILLOPC;
489 info.si_addr = (void *) location; 489 info.si_addr = (void __user *) location;
490 do_trap(interruption_code, signal, 490 do_trap(interruption_code, signal,
491 "illegal operation", regs, &info); 491 "illegal operation", regs, &info);
492 } 492 }
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c
index 2d5cb1385753..b075ab499d05 100644
--- a/arch/s390/mm/cmm.c
+++ b/arch/s390/mm/cmm.c
@@ -42,8 +42,8 @@ static volatile long cmm_timed_pages_target = 0;
42static long cmm_timeout_pages = 0; 42static long cmm_timeout_pages = 0;
43static long cmm_timeout_seconds = 0; 43static long cmm_timeout_seconds = 0;
44 44
45static struct cmm_page_array *cmm_page_list = 0; 45static struct cmm_page_array *cmm_page_list = NULL;
46static struct cmm_page_array *cmm_timed_page_list = 0; 46static struct cmm_page_array *cmm_timed_page_list = NULL;
47 47
48static unsigned long cmm_thread_active = 0; 48static unsigned long cmm_thread_active = 0;
49static struct work_struct cmm_thread_starter; 49static struct work_struct cmm_thread_starter;
@@ -259,7 +259,7 @@ static struct ctl_table cmm_table[];
259 259
260static int 260static int
261cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, 261cmm_pages_handler(ctl_table *ctl, int write, struct file *filp,
262 void *buffer, size_t *lenp, loff_t *ppos) 262 void __user *buffer, size_t *lenp, loff_t *ppos)
263{ 263{
264 char buf[16], *p; 264 char buf[16], *p;
265 long pages; 265 long pages;
@@ -300,7 +300,7 @@ cmm_pages_handler(ctl_table *ctl, int write, struct file *filp,
300 300
301static int 301static int
302cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp, 302cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp,
303 void *buffer, size_t *lenp, loff_t *ppos) 303 void __user *buffer, size_t *lenp, loff_t *ppos)
304{ 304{
305 char buf[64], *p; 305 char buf[64], *p;
306 long pages, seconds; 306 long pages, seconds;
@@ -419,7 +419,7 @@ cmm_init (void)
419#ifdef CONFIG_CMM_IUCV 419#ifdef CONFIG_CMM_IUCV
420 smsg_register_callback(SMSG_PREFIX, cmm_smsg_target); 420 smsg_register_callback(SMSG_PREFIX, cmm_smsg_target);
421#endif 421#endif
422 INIT_WORK(&cmm_thread_starter, (void *) cmm_start_thread, 0); 422 INIT_WORK(&cmm_thread_starter, (void *) cmm_start_thread, NULL);
423 init_waitqueue_head(&cmm_thread_wait); 423 init_waitqueue_head(&cmm_thread_wait);
424 init_timer(&cmm_timer); 424 init_timer(&cmm_timer);
425 return 0; 425 return 0;
diff --git a/arch/sh/boards/renesas/rts7751r2d/io.c b/arch/sh/boards/renesas/rts7751r2d/io.c
index c46f9154cfd5..123abbbc91e0 100644
--- a/arch/sh/boards/renesas/rts7751r2d/io.c
+++ b/arch/sh/boards/renesas/rts7751r2d/io.c
@@ -216,24 +216,26 @@ void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count)
216{ 216{
217 volatile __u8 *bp; 217 volatile __u8 *bp;
218 volatile __u16 *p; 218 volatile __u16 *p;
219 unsigned char *s = addr;
219 220
220 if (CHECK_AX88796L_PORT(port)) { 221 if (CHECK_AX88796L_PORT(port)) {
221 p = (volatile unsigned short *)port88796l(port, 0); 222 p = (volatile unsigned short *)port88796l(port, 0);
222 while (count--) *((unsigned char *) addr)++ = *p & 0xff; 223 while (count--) *s++ = *p & 0xff;
223 } else if (PXSEG(port)) 224 } else if (PXSEG(port))
224 while (count--) *((unsigned char *) addr)++ = *(volatile unsigned char *)port; 225 while (count--) *s++ = *(volatile unsigned char *)port;
225 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { 226 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
226 bp = (__u8 *)PCI_IOMAP(port); 227 bp = (__u8 *)PCI_IOMAP(port);
227 while (count--) *((volatile unsigned char *) addr)++ = *bp; 228 while (count--) *s++ = *bp;
228 } else { 229 } else {
229 p = (volatile unsigned short *)port2adr(port); 230 p = (volatile unsigned short *)port2adr(port);
230 while (count--) *((unsigned char *) addr)++ = *p & 0xff; 231 while (count--) *s++ = *p & 0xff;
231 } 232 }
232} 233}
233 234
234void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count) 235void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count)
235{ 236{
236 volatile __u16 *p; 237 volatile __u16 *p;
238 __u16 *s = addr;
237 239
238 if (CHECK_AX88796L_PORT(port)) 240 if (CHECK_AX88796L_PORT(port))
239 p = (volatile unsigned short *)port88796l(port, 1); 241 p = (volatile unsigned short *)port88796l(port, 1);
@@ -243,7 +245,7 @@ void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count)
243 p = (volatile unsigned short *)PCI_IOMAP(port); 245 p = (volatile unsigned short *)PCI_IOMAP(port);
244 else 246 else
245 p = (volatile unsigned short *)port2adr(port); 247 p = (volatile unsigned short *)port2adr(port);
246 while (count--) *((__u16 *) addr)++ = *p; 248 while (count--) *s++ = *p;
247} 249}
248 250
249void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count) 251void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count)
@@ -252,8 +254,9 @@ void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count)
252 maybebadio(insl, port); 254 maybebadio(insl, port);
253 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { 255 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
254 volatile __u32 *p = (__u32 *)PCI_IOMAP(port); 256 volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
257 __u32 *s = addr;
255 258
256 while (count--) *((__u32 *) addr)++ = *p; 259 while (count--) *s++ = *p;
257 } else 260 } else
258 maybebadio(insl, port); 261 maybebadio(insl, port);
259} 262}
@@ -262,24 +265,26 @@ void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count)
262{ 265{
263 volatile __u8 *bp; 266 volatile __u8 *bp;
264 volatile __u16 *p; 267 volatile __u16 *p;
268 const __u8 *s = addr;
265 269
266 if (CHECK_AX88796L_PORT(port)) { 270 if (CHECK_AX88796L_PORT(port)) {
267 p = (volatile unsigned short *)port88796l(port, 0); 271 p = (volatile unsigned short *)port88796l(port, 0);
268 while (count--) *p = *((unsigned char *) addr)++; 272 while (count--) *p = *s++;
269 } else if (PXSEG(port)) 273 } else if (PXSEG(port))
270 while (count--) *(volatile unsigned char *)port = *((unsigned char *) addr)++; 274 while (count--) *(volatile unsigned char *)port = *s++;
271 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { 275 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
272 bp = (__u8 *)PCI_IOMAP(port); 276 bp = (__u8 *)PCI_IOMAP(port);
273 while (count--) *bp = *((volatile unsigned char *) addr)++; 277 while (count--) *bp = *s++;
274 } else { 278 } else {
275 p = (volatile unsigned short *)port2adr(port); 279 p = (volatile unsigned short *)port2adr(port);
276 while (count--) *p = *((unsigned char *) addr)++; 280 while (count--) *p = *s++;
277 } 281 }
278} 282}
279 283
280void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count) 284void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count)
281{ 285{
282 volatile __u16 *p; 286 volatile __u16 *p;
287 const __u16 *s = addr;
283 288
284 if (CHECK_AX88796L_PORT(port)) 289 if (CHECK_AX88796L_PORT(port))
285 p = (volatile unsigned short *)port88796l(port, 1); 290 p = (volatile unsigned short *)port88796l(port, 1);
@@ -289,7 +294,7 @@ void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count)
289 p = (volatile unsigned short *)PCI_IOMAP(port); 294 p = (volatile unsigned short *)PCI_IOMAP(port);
290 else 295 else
291 p = (volatile unsigned short *)port2adr(port); 296 p = (volatile unsigned short *)port2adr(port);
292 while (count--) *p = *((__u16 *) addr)++; 297 while (count--) *p = *s++;
293} 298}
294 299
295void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count) 300void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count)
@@ -298,8 +303,9 @@ void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count)
298 maybebadio(outsl, port); 303 maybebadio(outsl, port);
299 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) { 304 else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
300 volatile __u32 *p = (__u32 *)PCI_IOMAP(port); 305 volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
306 const __u32 *s = addr;
301 307
302 while (count--) *p = *((__u32 *) addr)++; 308 while (count--) *p = *s++;
303 } else 309 } else
304 maybebadio(outsl, port); 310 maybebadio(outsl, port);
305} 311}
diff --git a/arch/sh64/kernel/sh_ksyms.c b/arch/sh64/kernel/sh_ksyms.c
index 472b450e61be..de29c45f23a7 100644
--- a/arch/sh64/kernel/sh_ksyms.c
+++ b/arch/sh64/kernel/sh_ksyms.c
@@ -31,14 +31,6 @@
31 31
32extern int dump_fpu(struct pt_regs *, elf_fpregset_t *); 32extern int dump_fpu(struct pt_regs *, elf_fpregset_t *);
33 33
34#if 0
35/* Not yet - there's no declaration of drive_info anywhere. */
36#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
37extern struct drive_info_struct drive_info;
38EXPORT_SYMBOL(drive_info);
39#endif
40#endif
41
42/* platform dependent support */ 34/* platform dependent support */
43EXPORT_SYMBOL(dump_fpu); 35EXPORT_SYMBOL(dump_fpu);
44EXPORT_SYMBOL(iounmap); 36EXPORT_SYMBOL(iounmap);
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 267ec8f6fb58..887f6a160c58 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -38,7 +38,7 @@
38 38
39#define curptr g6 39#define curptr g6
40 40
41#define NR_SYSCALLS 299 /* Each OS is different... */ 41#define NR_SYSCALLS 300 /* Each OS is different... */
42 42
43/* These are just handy. */ 43/* These are just handy. */
44#define _SV save %sp, -STACKFRAME_SZ, %sp 44#define _SV save %sp, -STACKFRAME_SZ, %sp
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
index fbb05a452e51..118cac84a0f5 100644
--- a/arch/sparc/kernel/process.c
+++ b/arch/sparc/kernel/process.c
@@ -54,7 +54,7 @@ void (*pm_idle)(void);
54 * This is done via auxio, but could be used as a fallback 54 * This is done via auxio, but could be used as a fallback
55 * handler when auxio is not present-- unused for now... 55 * handler when auxio is not present-- unused for now...
56 */ 56 */
57void (*pm_power_off)(void); 57void (*pm_power_off)(void) = machine_power_off;
58 58
59/* 59/*
60 * sysctl - toggle power-off restriction for serial console 60 * sysctl - toggle power-off restriction for serial console
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S
index 6877ae4cd1d9..c0314705d73a 100644
--- a/arch/sparc/kernel/systbls.S
+++ b/arch/sparc/kernel/systbls.S
@@ -78,7 +78,7 @@ sys_call_table:
78/*280*/ .long sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl, sys_openat 78/*280*/ .long sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl, sys_openat
79/*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_newfstatat 79/*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_newfstatat
80/*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat 80/*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
81/*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll 81/*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
82 82
83#ifdef CONFIG_SUNOS_EMUL 83#ifdef CONFIG_SUNOS_EMUL
84 /* Now the SunOS syscall table. */ 84 /* Now the SunOS syscall table. */
@@ -190,5 +190,6 @@ sunos_sys_table:
190/*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys 190/*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys
191 .long sunos_nosys, sunos_nosys, sunos_nosys 191 .long sunos_nosys, sunos_nosys, sunos_nosys
192 .long sunos_nosys, sunos_nosys, sunos_nosys 192 .long sunos_nosys, sunos_nosys, sunos_nosys
193 .long sunos_nosys
193 194
194#endif 195#endif
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig
index bc56a7d88308..069d49777b2a 100644
--- a/arch/sparc64/defconfig
+++ b/arch/sparc64/defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.16-rc2 3# Linux kernel version: 2.6.16-rc2
4# Sat Feb 4 02:31:38 2006 4# Tue Feb 7 17:47:18 2006
5# 5#
6CONFIG_SPARC=y 6CONFIG_SPARC=y
7CONFIG_SPARC64=y 7CONFIG_SPARC64=y
@@ -30,7 +30,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
30# General setup 30# General setup
31# 31#
32CONFIG_LOCALVERSION="" 32CONFIG_LOCALVERSION=""
33CONFIG_LOCALVERSION_AUTO=y 33# CONFIG_LOCALVERSION_AUTO is not set
34CONFIG_SWAP=y 34CONFIG_SWAP=y
35CONFIG_SYSVIPC=y 35CONFIG_SYSVIPC=y
36CONFIG_POSIX_MQUEUE=y 36CONFIG_POSIX_MQUEUE=y
@@ -766,6 +766,7 @@ CONFIG_HWMON=y
766# CONFIG_SENSORS_ASB100 is not set 766# CONFIG_SENSORS_ASB100 is not set
767# CONFIG_SENSORS_ATXP1 is not set 767# CONFIG_SENSORS_ATXP1 is not set
768# CONFIG_SENSORS_DS1621 is not set 768# CONFIG_SENSORS_DS1621 is not set
769# CONFIG_SENSORS_F71805F is not set
769# CONFIG_SENSORS_FSCHER is not set 770# CONFIG_SENSORS_FSCHER is not set
770# CONFIG_SENSORS_FSCPOS is not set 771# CONFIG_SENSORS_FSCPOS is not set
771# CONFIG_SENSORS_GL518SM is not set 772# CONFIG_SENSORS_GL518SM is not set
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S
index 12911e7463f2..a73553ae7e53 100644
--- a/arch/sparc64/kernel/entry.S
+++ b/arch/sparc64/kernel/entry.S
@@ -25,7 +25,7 @@
25 25
26#define curptr g6 26#define curptr g6
27 27
28#define NR_SYSCALLS 299 /* Each OS is different... */ 28#define NR_SYSCALLS 300 /* Each OS is different... */
29 29
30 .text 30 .text
31 .align 32 31 .align 32
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
index 2881faf36635..a19168510be2 100644
--- a/arch/sparc64/kernel/systbls.S
+++ b/arch/sparc64/kernel/systbls.S
@@ -79,7 +79,7 @@ sys_call_table32:
79/*280*/ .word sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat 79/*280*/ .word sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat
80 .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_newfstatat 80 .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_newfstatat
81/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat 81/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
82 .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll 82 .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
83 83
84#endif /* CONFIG_COMPAT */ 84#endif /* CONFIG_COMPAT */
85 85
@@ -146,9 +146,9 @@ sys_call_table:
146/*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink 146/*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink
147 .word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid 147 .word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid
148/*280*/ .word sys_nis_syscall, sys_add_key, sys_request_key, sys_keyctl, sys_openat 148/*280*/ .word sys_nis_syscall, sys_add_key, sys_request_key, sys_keyctl, sys_openat
149 .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, compat_sys_newfstatat 149 .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_newfstatat
150/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat 150/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
151 .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll 151 .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
152 152
153#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ 153#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
154 defined(CONFIG_SOLARIS_EMUL_MODULE) 154 defined(CONFIG_SOLARIS_EMUL_MODULE)
@@ -261,4 +261,5 @@ sunos_sys_table:
261/*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys 261/*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys
262 .word sunos_nosys, sunos_nosys, sunos_nosys 262 .word sunos_nosys, sunos_nosys, sunos_nosys
263 .word sunos_nosys, sunos_nosys, sunos_nosys 263 .word sunos_nosys, sunos_nosys, sunos_nosys
264 .word sunos_nosys
264#endif 265#endif
diff --git a/arch/sparc64/solaris/systbl.S b/arch/sparc64/solaris/systbl.S
index d25667eeae10..7043ca18caf9 100644
--- a/arch/sparc64/solaris/systbl.S
+++ b/arch/sparc64/solaris/systbl.S
@@ -283,32 +283,3 @@ solaris_sys_table:
283 .word solaris_unimplemented /* 253 */ 283 .word solaris_unimplemented /* 253 */
284 .word solaris_unimplemented /* 254 */ 284 .word solaris_unimplemented /* 254 */
285 .word solaris_unimplemented /* 255 */ 285 .word solaris_unimplemented /* 255 */
286 .word solaris_unimplemented /* 256 */
287 .word solaris_unimplemented /* 257 */
288 .word solaris_unimplemented /* 258 */
289 .word solaris_unimplemented /* 259 */
290 .word solaris_unimplemented /* 260 */
291 .word solaris_unimplemented /* 261 */
292 .word solaris_unimplemented /* 262 */
293 .word solaris_unimplemented /* 263 */
294 .word solaris_unimplemented /* 264 */
295 .word solaris_unimplemented /* 265 */
296 .word solaris_unimplemented /* 266 */
297 .word solaris_unimplemented /* 267 */
298 .word solaris_unimplemented /* 268 */
299 .word solaris_unimplemented /* 269 */
300 .word solaris_unimplemented /* 270 */
301 .word solaris_unimplemented /* 271 */
302 .word solaris_unimplemented /* 272 */
303 .word solaris_unimplemented /* 273 */
304 .word solaris_unimplemented /* 274 */
305 .word solaris_unimplemented /* 275 */
306 .word solaris_unimplemented /* 276 */
307 .word solaris_unimplemented /* 277 */
308 .word solaris_unimplemented /* 278 */
309 .word solaris_unimplemented /* 279 */
310 .word solaris_unimplemented /* 280 */
311 .word solaris_unimplemented /* 281 */
312 .word solaris_unimplemented /* 282 */
313 .word solaris_unimplemented /* 283 */
314
diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c
index 5d50d4a44abf..2f880cb167a5 100644
--- a/arch/um/drivers/chan_user.c
+++ b/arch/um/drivers/chan_user.c
@@ -9,6 +9,7 @@
9#include <termios.h> 9#include <termios.h>
10#include <string.h> 10#include <string.h>
11#include <signal.h> 11#include <signal.h>
12#include <sched.h>
12#include <sys/stat.h> 13#include <sys/stat.h>
13#include <sys/ioctl.h> 14#include <sys/ioctl.h>
14#include <sys/socket.h> 15#include <sys/socket.h>
@@ -73,7 +74,6 @@ static void winch_handler(int sig)
73struct winch_data { 74struct winch_data {
74 int pty_fd; 75 int pty_fd;
75 int pipe_fd; 76 int pipe_fd;
76 int close_me;
77}; 77};
78 78
79static int winch_thread(void *arg) 79static int winch_thread(void *arg)
@@ -84,7 +84,6 @@ static int winch_thread(void *arg)
84 int count, err; 84 int count, err;
85 char c = 1; 85 char c = 1;
86 86
87 os_close_file(data->close_me);
88 pty_fd = data->pty_fd; 87 pty_fd = data->pty_fd;
89 pipe_fd = data->pipe_fd; 88 pipe_fd = data->pipe_fd;
90 count = os_write_file(pipe_fd, &c, sizeof(c)); 89 count = os_write_file(pipe_fd, &c, sizeof(c));
@@ -153,15 +152,16 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
153 } 152 }
154 153
155 data = ((struct winch_data) { .pty_fd = fd, 154 data = ((struct winch_data) { .pty_fd = fd,
156 .pipe_fd = fds[1], 155 .pipe_fd = fds[1] } );
157 .close_me = fds[0] } ); 156 /* CLONE_FILES so this thread doesn't hold open files which are open
158 err = run_helper_thread(winch_thread, &data, 0, &stack, 0); 157 * now, but later closed. This is a problem with /dev/net/tun.
158 */
159 err = run_helper_thread(winch_thread, &data, CLONE_FILES, &stack, 0);
159 if(err < 0){ 160 if(err < 0){
160 printk("fork of winch_thread failed - errno = %d\n", errno); 161 printk("fork of winch_thread failed - errno = %d\n", errno);
161 goto out_close; 162 goto out_close;
162 } 163 }
163 164
164 os_close_file(fds[1]);
165 *fd_out = fds[0]; 165 *fd_out = fds[0];
166 n = os_read_file(fds[0], &c, sizeof(c)); 166 n = os_read_file(fds[0], &c, sizeof(c));
167 if(n != sizeof(c)){ 167 if(n != sizeof(c)){
@@ -169,13 +169,12 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
169 printk("read failed, err = %d\n", -n); 169 printk("read failed, err = %d\n", -n);
170 printk("fd %d will not support SIGWINCH\n", fd); 170 printk("fd %d will not support SIGWINCH\n", fd);
171 err = -EINVAL; 171 err = -EINVAL;
172 goto out_close1; 172 goto out_close;
173 } 173 }
174 return err ; 174 return err ;
175 175
176 out_close: 176 out_close:
177 os_close_file(fds[1]); 177 os_close_file(fds[1]);
178 out_close1:
179 os_close_file(fds[0]); 178 os_close_file(fds[0]);
180 out: 179 out:
181 return err; 180 return err;
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index 8ebb2241ad42..8c7279bb353b 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -131,9 +131,8 @@ static int uml_net_open(struct net_device *dev)
131 SA_INTERRUPT | SA_SHIRQ, dev->name, dev); 131 SA_INTERRUPT | SA_SHIRQ, dev->name, dev);
132 if(err != 0){ 132 if(err != 0){
133 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err); 133 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err);
134 if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user);
135 lp->fd = -1;
136 err = -ENETUNREACH; 134 err = -ENETUNREACH;
135 goto out_close;
137 } 136 }
138 137
139 lp->tl.data = (unsigned long) &lp->user; 138 lp->tl.data = (unsigned long) &lp->user;
@@ -145,9 +144,19 @@ static int uml_net_open(struct net_device *dev)
145 */ 144 */
146 while((err = uml_net_rx(dev)) > 0) ; 145 while((err = uml_net_rx(dev)) > 0) ;
147 146
148 out:
149 spin_unlock(&lp->lock); 147 spin_unlock(&lp->lock);
150 return(err); 148
149 spin_lock(&opened_lock);
150 list_add(&lp->list, &opened);
151 spin_unlock(&opened_lock);
152
153 return 0;
154out_close:
155 if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user);
156 lp->fd = -1;
157out:
158 spin_unlock(&lp->lock);
159 return err;
151} 160}
152 161
153static int uml_net_close(struct net_device *dev) 162static int uml_net_close(struct net_device *dev)
@@ -161,9 +170,13 @@ static int uml_net_close(struct net_device *dev)
161 if(lp->close != NULL) 170 if(lp->close != NULL)
162 (*lp->close)(lp->fd, &lp->user); 171 (*lp->close)(lp->fd, &lp->user);
163 lp->fd = -1; 172 lp->fd = -1;
164 list_del(&lp->list);
165 173
166 spin_unlock(&lp->lock); 174 spin_unlock(&lp->lock);
175
176 spin_lock(&opened_lock);
177 list_del(&lp->list);
178 spin_unlock(&opened_lock);
179
167 return 0; 180 return 0;
168} 181}
169 182
@@ -410,11 +423,7 @@ static int eth_configure(int n, void *init, char *mac,
410 if (device->have_mac) 423 if (device->have_mac)
411 set_ether_mac(dev, device->mac); 424 set_ether_mac(dev, device->mac);
412 425
413 spin_lock(&opened_lock); 426 return 0;
414 list_add(&lp->list, &opened);
415 spin_unlock(&opened_lock);
416
417 return(0);
418} 427}
419 428
420static struct uml_net *find_device(int n) 429static struct uml_net *find_device(int n)
diff --git a/arch/um/include/registers.h b/arch/um/include/registers.h
index 4892e5fcef07..83b688ca198f 100644
--- a/arch/um/include/registers.h
+++ b/arch/um/include/registers.h
@@ -14,7 +14,7 @@ extern int restore_fp_registers(int pid, unsigned long *fp_regs);
14extern void save_registers(int pid, union uml_pt_regs *regs); 14extern void save_registers(int pid, union uml_pt_regs *regs);
15extern void restore_registers(int pid, union uml_pt_regs *regs); 15extern void restore_registers(int pid, union uml_pt_regs *regs);
16extern void init_registers(int pid); 16extern void init_registers(int pid);
17extern void get_safe_registers(unsigned long * regs); 17extern void get_safe_registers(unsigned long * regs, unsigned long * fp_regs);
18extern void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer); 18extern void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer);
19 19
20#endif 20#endif
diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c
deleted file mode 100644
index eea1c9c4bb0f..000000000000
--- a/arch/um/kernel/skas/process.c
+++ /dev/null
@@ -1,569 +0,0 @@
1/*
2 * Copyright (C) 2002- 2004 Jeff Dike (jdike@addtoit.com)
3 * Licensed under the GPL
4 */
5
6#include <stdlib.h>
7#include <string.h>
8#include <unistd.h>
9#include <errno.h>
10#include <signal.h>
11#include <setjmp.h>
12#include <sched.h>
13#include <sys/wait.h>
14#include <sys/mman.h>
15#include <sys/user.h>
16#include <sys/time.h>
17#include <asm/unistd.h>
18#include <asm/types.h>
19#include "user.h"
20#include "ptrace_user.h"
21#include "sysdep/ptrace.h"
22#include "user_util.h"
23#include "kern_util.h"
24#include "skas.h"
25#include "stub-data.h"
26#include "mm_id.h"
27#include "sysdep/sigcontext.h"
28#include "sysdep/stub.h"
29#include "os.h"
30#include "proc_mm.h"
31#include "skas_ptrace.h"
32#include "chan_user.h"
33#include "registers.h"
34#include "mem.h"
35#include "uml-config.h"
36#include "process.h"
37
38int is_skas_winch(int pid, int fd, void *data)
39{
40 if(pid != os_getpgrp())
41 return(0);
42
43 register_winch_irq(-1, fd, -1, data);
44 return(1);
45}
46
47void wait_stub_done(int pid, int sig, char * fname)
48{
49 int n, status, err;
50
51 do {
52 if ( sig != -1 ) {
53 err = ptrace(PTRACE_CONT, pid, 0, sig);
54 if(err)
55 panic("%s : continue failed, errno = %d\n",
56 fname, errno);
57 }
58 sig = 0;
59
60 CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
61 } while((n >= 0) && WIFSTOPPED(status) &&
62 ((WSTOPSIG(status) == SIGVTALRM) ||
63 /* running UML inside a detached screen can cause
64 * SIGWINCHes
65 */
66 (WSTOPSIG(status) == SIGWINCH)));
67
68 if((n < 0) || !WIFSTOPPED(status) ||
69 (WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status) != SIGTRAP)){
70 unsigned long regs[HOST_FRAME_SIZE];
71 if(ptrace(PTRACE_GETREGS, pid, 0, regs) < 0)
72 printk("Failed to get registers from stub, "
73 "errno = %d\n", errno);
74 else {
75 int i;
76
77 printk("Stub registers -\n");
78 for(i = 0; i < HOST_FRAME_SIZE; i++)
79 printk("\t%d - %lx\n", i, regs[i]);
80 }
81 panic("%s : failed to wait for SIGUSR1/SIGTRAP, "
82 "pid = %d, n = %d, errno = %d, status = 0x%x\n",
83 fname, pid, n, errno, status);
84 }
85}
86
87void get_skas_faultinfo(int pid, struct faultinfo * fi)
88{
89 int err;
90
91 if(ptrace_faultinfo){
92 err = ptrace(PTRACE_FAULTINFO, pid, 0, fi);
93 if(err)
94 panic("get_skas_faultinfo - PTRACE_FAULTINFO failed, "
95 "errno = %d\n", errno);
96
97 /* Special handling for i386, which has different structs */
98 if (sizeof(struct ptrace_faultinfo) < sizeof(struct faultinfo))
99 memset((char *)fi + sizeof(struct ptrace_faultinfo), 0,
100 sizeof(struct faultinfo) -
101 sizeof(struct ptrace_faultinfo));
102 }
103 else {
104 wait_stub_done(pid, SIGSEGV, "get_skas_faultinfo");
105
106 /* faultinfo is prepared by the stub-segv-handler at start of
107 * the stub stack page. We just have to copy it.
108 */
109 memcpy(fi, (void *)current_stub_stack(), sizeof(*fi));
110 }
111}
112
113static void handle_segv(int pid, union uml_pt_regs * regs)
114{
115 get_skas_faultinfo(pid, &regs->skas.faultinfo);
116 segv(regs->skas.faultinfo, 0, 1, NULL);
117}
118
119/*To use the same value of using_sysemu as the caller, ask it that value (in local_using_sysemu)*/
120static void handle_trap(int pid, union uml_pt_regs *regs, int local_using_sysemu)
121{
122 int err, status;
123
124 /* Mark this as a syscall */
125 UPT_SYSCALL_NR(regs) = PT_SYSCALL_NR(regs->skas.regs);
126
127 if (!local_using_sysemu)
128 {
129 err = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid);
130 if(err < 0)
131 panic("handle_trap - nullifying syscall failed errno = %d\n",
132 errno);
133
134 err = ptrace(PTRACE_SYSCALL, pid, 0, 0);
135 if(err < 0)
136 panic("handle_trap - continuing to end of syscall failed, "
137 "errno = %d\n", errno);
138
139 CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED));
140 if((err < 0) || !WIFSTOPPED(status) ||
141 (WSTOPSIG(status) != SIGTRAP + 0x80))
142 panic("handle_trap - failed to wait at end of syscall, "
143 "errno = %d, status = %d\n", errno, status);
144 }
145
146 handle_syscall(regs);
147}
148
149extern int __syscall_stub_start;
150int stub_code_fd = -1;
151__u64 stub_code_offset;
152
153static int userspace_tramp(void *stack)
154{
155 void *addr;
156
157 ptrace(PTRACE_TRACEME, 0, 0, 0);
158
159 init_new_thread_signals(1);
160 enable_timer();
161
162 if(!proc_mm){
163 /* This has a pte, but it can't be mapped in with the usual
164 * tlb_flush mechanism because this is part of that mechanism
165 */
166 addr = mmap64((void *) UML_CONFIG_STUB_CODE, page_size(),
167 PROT_EXEC, MAP_FIXED | MAP_PRIVATE,
168 stub_code_fd, stub_code_offset);
169 if(addr == MAP_FAILED){
170 printk("mapping stub code failed, errno = %d\n",
171 errno);
172 exit(1);
173 }
174
175 if(stack != NULL){
176 int fd;
177 __u64 offset;
178
179 fd = phys_mapping(to_phys(stack), &offset);
180 addr = mmap((void *) UML_CONFIG_STUB_DATA, page_size(),
181 PROT_READ | PROT_WRITE,
182 MAP_FIXED | MAP_SHARED, fd, offset);
183 if(addr == MAP_FAILED){
184 printk("mapping stub stack failed, "
185 "errno = %d\n", errno);
186 exit(1);
187 }
188 }
189 }
190 if(!ptrace_faultinfo){
191 unsigned long v = UML_CONFIG_STUB_CODE +
192 (unsigned long) stub_segv_handler -
193 (unsigned long) &__syscall_stub_start;
194
195 set_sigstack((void *) UML_CONFIG_STUB_DATA, page_size());
196 set_handler(SIGSEGV, (void *) v, SA_ONSTACK,
197 SIGIO, SIGWINCH, SIGALRM, SIGVTALRM,
198 SIGUSR1, -1);
199 }
200
201 os_stop_process(os_getpid());
202 return(0);
203}
204
205/* Each element set once, and only accessed by a single processor anyway */
206#undef NR_CPUS
207#define NR_CPUS 1
208int userspace_pid[NR_CPUS];
209
210int start_userspace(unsigned long stub_stack)
211{
212 void *stack;
213 unsigned long sp;
214 int pid, status, n, flags;
215
216 if ( stub_code_fd == -1 )
217 stub_code_fd = phys_mapping(to_phys(&__syscall_stub_start),
218 &stub_code_offset);
219
220 stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
221 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
222 if(stack == MAP_FAILED)
223 panic("start_userspace : mmap failed, errno = %d", errno);
224 sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *);
225
226 flags = CLONE_FILES | SIGCHLD;
227 if(proc_mm) flags |= CLONE_VM;
228 pid = clone(userspace_tramp, (void *) sp, flags, (void *) stub_stack);
229 if(pid < 0)
230 panic("start_userspace : clone failed, errno = %d", errno);
231
232 do {
233 CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
234 if(n < 0)
235 panic("start_userspace : wait failed, errno = %d",
236 errno);
237 } while(WIFSTOPPED(status) && (WSTOPSIG(status) == SIGVTALRM));
238
239 if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP))
240 panic("start_userspace : expected SIGSTOP, got status = %d",
241 status);
242
243 if (ptrace(PTRACE_OLDSETOPTIONS, pid, NULL, (void *)PTRACE_O_TRACESYSGOOD) < 0)
244 panic("start_userspace : PTRACE_SETOPTIONS failed, errno=%d\n",
245 errno);
246
247 if(munmap(stack, PAGE_SIZE) < 0)
248 panic("start_userspace : munmap failed, errno = %d\n", errno);
249
250 return(pid);
251}
252
253void userspace(union uml_pt_regs *regs)
254{
255 int err, status, op, pid = userspace_pid[0];
256 int local_using_sysemu; /*To prevent races if using_sysemu changes under us.*/
257
258 while(1){
259 restore_registers(pid, regs);
260
261 /* Now we set local_using_sysemu to be used for one loop */
262 local_using_sysemu = get_using_sysemu();
263
264 op = SELECT_PTRACE_OPERATION(local_using_sysemu, singlestepping(NULL));
265
266 err = ptrace(op, pid, 0, 0);
267 if(err)
268 panic("userspace - could not resume userspace process, "
269 "pid=%d, ptrace operation = %d, errno = %d\n",
270 op, errno);
271
272 CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED));
273 if(err < 0)
274 panic("userspace - waitpid failed, errno = %d\n",
275 errno);
276
277 regs->skas.is_user = 1;
278 save_registers(pid, regs);
279 UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */
280
281 if(WIFSTOPPED(status)){
282 switch(WSTOPSIG(status)){
283 case SIGSEGV:
284 if(PTRACE_FULL_FAULTINFO || !ptrace_faultinfo)
285 user_signal(SIGSEGV, regs, pid);
286 else handle_segv(pid, regs);
287 break;
288 case SIGTRAP + 0x80:
289 handle_trap(pid, regs, local_using_sysemu);
290 break;
291 case SIGTRAP:
292 relay_signal(SIGTRAP, regs);
293 break;
294 case SIGIO:
295 case SIGVTALRM:
296 case SIGILL:
297 case SIGBUS:
298 case SIGFPE:
299 case SIGWINCH:
300 user_signal(WSTOPSIG(status), regs, pid);
301 break;
302 default:
303 printk("userspace - child stopped with signal "
304 "%d\n", WSTOPSIG(status));
305 }
306 pid = userspace_pid[0];
307 interrupt_end();
308
309 /* Avoid -ERESTARTSYS handling in host */
310 PT_SYSCALL_NR(regs->skas.regs) = -1;
311 }
312 }
313}
314#define INIT_JMP_NEW_THREAD 0
315#define INIT_JMP_REMOVE_SIGSTACK 1
316#define INIT_JMP_CALLBACK 2
317#define INIT_JMP_HALT 3
318#define INIT_JMP_REBOOT 4
319
320
321int copy_context_skas0(unsigned long new_stack, int pid)
322{
323 int err;
324 unsigned long regs[MAX_REG_NR];
325 unsigned long current_stack = current_stub_stack();
326 struct stub_data *data = (struct stub_data *) current_stack;
327 struct stub_data *child_data = (struct stub_data *) new_stack;
328 __u64 new_offset;
329 int new_fd = phys_mapping(to_phys((void *)new_stack), &new_offset);
330
331 /* prepare offset and fd of child's stack as argument for parent's
332 * and child's mmap2 calls
333 */
334 *data = ((struct stub_data) { .offset = MMAP_OFFSET(new_offset),
335 .fd = new_fd,
336 .timer = ((struct itimerval)
337 { { 0, 1000000 / hz() },
338 { 0, 1000000 / hz() }})});
339 get_safe_registers(regs);
340
341 /* Set parent's instruction pointer to start of clone-stub */
342 regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE +
343 (unsigned long) stub_clone_handler -
344 (unsigned long) &__syscall_stub_start;
345 regs[REGS_SP_INDEX] = UML_CONFIG_STUB_DATA + PAGE_SIZE -
346 sizeof(void *);
347 err = ptrace_setregs(pid, regs);
348 if(err < 0)
349 panic("copy_context_skas0 : PTRACE_SETREGS failed, "
350 "pid = %d, errno = %d\n", pid, errno);
351
352 /* set a well known return code for detection of child write failure */
353 child_data->err = 12345678;
354
355 /* Wait, until parent has finished its work: read child's pid from
356 * parent's stack, and check, if bad result.
357 */
358 wait_stub_done(pid, 0, "copy_context_skas0");
359
360 pid = data->err;
361 if(pid < 0)
362 panic("copy_context_skas0 - stub-parent reports error %d\n",
363 pid);
364
365 /* Wait, until child has finished too: read child's result from
366 * child's stack and check it.
367 */
368 wait_stub_done(pid, -1, "copy_context_skas0");
369 if (child_data->err != UML_CONFIG_STUB_DATA)
370 panic("copy_context_skas0 - stub-child reports error %d\n",
371 child_data->err);
372
373 if (ptrace(PTRACE_OLDSETOPTIONS, pid, NULL,
374 (void *)PTRACE_O_TRACESYSGOOD) < 0)
375 panic("copy_context_skas0 : PTRACE_SETOPTIONS failed, "
376 "errno = %d\n", errno);
377
378 return pid;
379}
380
381/*
382 * This is used only, if stub pages are needed, while proc_mm is
383 * availabl. Opening /proc/mm creates a new mm_context, which lacks
384 * the stub-pages. Thus, we map them using /proc/mm-fd
385 */
386void map_stub_pages(int fd, unsigned long code,
387 unsigned long data, unsigned long stack)
388{
389 struct proc_mm_op mmop;
390 int n;
391
392 mmop = ((struct proc_mm_op) { .op = MM_MMAP,
393 .u =
394 { .mmap =
395 { .addr = code,
396 .len = PAGE_SIZE,
397 .prot = PROT_EXEC,
398 .flags = MAP_FIXED | MAP_PRIVATE,
399 .fd = stub_code_fd,
400 .offset = stub_code_offset
401 } } });
402 n = os_write_file(fd, &mmop, sizeof(mmop));
403 if(n != sizeof(mmop))
404 panic("map_stub_pages : /proc/mm map for code failed, "
405 "err = %d\n", -n);
406
407 if ( stack ) {
408 __u64 map_offset;
409 int map_fd = phys_mapping(to_phys((void *)stack), &map_offset);
410 mmop = ((struct proc_mm_op)
411 { .op = MM_MMAP,
412 .u =
413 { .mmap =
414 { .addr = data,
415 .len = PAGE_SIZE,
416 .prot = PROT_READ | PROT_WRITE,
417 .flags = MAP_FIXED | MAP_SHARED,
418 .fd = map_fd,
419 .offset = map_offset
420 } } });
421 n = os_write_file(fd, &mmop, sizeof(mmop));
422 if(n != sizeof(mmop))
423 panic("map_stub_pages : /proc/mm map for data failed, "
424 "err = %d\n", -n);
425 }
426}
427
428void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
429 void (*handler)(int))
430{
431 unsigned long flags;
432 sigjmp_buf switch_buf, fork_buf;
433
434 *switch_buf_ptr = &switch_buf;
435 *fork_buf_ptr = &fork_buf;
436
437 /* Somewhat subtle - siglongjmp restores the signal mask before doing
438 * the longjmp. This means that when jumping from one stack to another
439 * when the target stack has interrupts enabled, an interrupt may occur
440 * on the source stack. This is bad when starting up a process because
441 * it's not supposed to get timer ticks until it has been scheduled.
442 * So, we disable interrupts around the sigsetjmp to ensure that
443 * they can't happen until we get back here where they are safe.
444 */
445 flags = get_signals();
446 block_signals();
447 if(sigsetjmp(fork_buf, 1) == 0)
448 new_thread_proc(stack, handler);
449
450 remove_sigstack();
451
452 set_signals(flags);
453}
454
455void thread_wait(void *sw, void *fb)
456{
457 sigjmp_buf buf, **switch_buf = sw, *fork_buf;
458
459 *switch_buf = &buf;
460 fork_buf = fb;
461 if(sigsetjmp(buf, 1) == 0)
462 siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK);
463}
464
465void switch_threads(void *me, void *next)
466{
467 sigjmp_buf my_buf, **me_ptr = me, *next_buf = next;
468
469 *me_ptr = &my_buf;
470 if(sigsetjmp(my_buf, 1) == 0)
471 siglongjmp(*next_buf, 1);
472}
473
474static sigjmp_buf initial_jmpbuf;
475
476/* XXX Make these percpu */
477static void (*cb_proc)(void *arg);
478static void *cb_arg;
479static sigjmp_buf *cb_back;
480
481int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr)
482{
483 sigjmp_buf **switch_buf = switch_buf_ptr;
484 int n;
485
486 set_handler(SIGWINCH, (__sighandler_t) sig_handler,
487 SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM,
488 SIGVTALRM, -1);
489
490 *fork_buf_ptr = &initial_jmpbuf;
491 n = sigsetjmp(initial_jmpbuf, 1);
492 switch(n){
493 case INIT_JMP_NEW_THREAD:
494 new_thread_proc((void *) stack, new_thread_handler);
495 break;
496 case INIT_JMP_REMOVE_SIGSTACK:
497 remove_sigstack();
498 break;
499 case INIT_JMP_CALLBACK:
500 (*cb_proc)(cb_arg);
501 siglongjmp(*cb_back, 1);
502 break;
503 case INIT_JMP_HALT:
504 kmalloc_ok = 0;
505 return(0);
506 case INIT_JMP_REBOOT:
507 kmalloc_ok = 0;
508 return(1);
509 default:
510 panic("Bad sigsetjmp return in start_idle_thread - %d\n", n);
511 }
512 siglongjmp(**switch_buf, 1);
513}
514
515void initial_thread_cb_skas(void (*proc)(void *), void *arg)
516{
517 sigjmp_buf here;
518
519 cb_proc = proc;
520 cb_arg = arg;
521 cb_back = &here;
522
523 block_signals();
524 if(sigsetjmp(here, 1) == 0)
525 siglongjmp(initial_jmpbuf, INIT_JMP_CALLBACK);
526 unblock_signals();
527
528 cb_proc = NULL;
529 cb_arg = NULL;
530 cb_back = NULL;
531}
532
533void halt_skas(void)
534{
535 block_signals();
536 siglongjmp(initial_jmpbuf, INIT_JMP_HALT);
537}
538
539void reboot_skas(void)
540{
541 block_signals();
542 siglongjmp(initial_jmpbuf, INIT_JMP_REBOOT);
543}
544
545void switch_mm_skas(struct mm_id *mm_idp)
546{
547 int err;
548
549#warning need cpu pid in switch_mm_skas
550 if(proc_mm){
551 err = ptrace(PTRACE_SWITCH_MM, userspace_pid[0], 0,
552 mm_idp->u.mm_fd);
553 if(err)
554 panic("switch_mm_skas - PTRACE_SWITCH_MM failed, "
555 "errno = %d\n", errno);
556 }
557 else userspace_pid[0] = mm_idp->u.pid;
558}
559
560/*
561 * Overrides for Emacs so that we follow Linus's tabbing style.
562 * Emacs will notice this stuff at the end of the file and automatically
563 * adjust the settings for this buffer only. This must remain at the end
564 * of the file.
565 * ---------------------------------------------------------------------------
566 * Local variables:
567 * c-file-style: "linux"
568 * End:
569 */
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
index e2d3ca445ef5..27cdf9164422 100644
--- a/arch/um/kernel/um_arch.c
+++ b/arch/um/kernel/um_arch.c
@@ -193,6 +193,24 @@ __uml_setup("root=", uml_root_setup,
193" root=/dev/ubd5\n\n" 193" root=/dev/ubd5\n\n"
194); 194);
195 195
196#ifndef CONFIG_MODE_TT
197
198static int __init no_skas_debug_setup(char *line, int *add)
199{
200 printf("'debug' is not necessary to gdb UML in skas mode - run \n");
201 printf("'gdb linux' and disable CONFIG_CMDLINE_ON_HOST if gdb \n");
202 printf("doesn't work as expected\n");
203
204 return 0;
205}
206
207__uml_setup("debug", no_skas_debug_setup,
208"debug\n"
209" this flag is not needed to run gdb on UML in skas mode\n\n"
210);
211
212#endif
213
196#ifdef CONFIG_SMP 214#ifdef CONFIG_SMP
197static int __init uml_ncpus_setup(char *line, int *add) 215static int __init uml_ncpus_setup(char *line, int *add)
198{ 216{
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c
index 52945338b64d..87c3aa0252db 100644
--- a/arch/um/os-Linux/drivers/tuntap_user.c
+++ b/arch/um/os-Linux/drivers/tuntap_user.c
@@ -122,6 +122,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
122 return(-EINVAL); 122 return(-EINVAL);
123 } 123 }
124 *fd_out = ((int *) CMSG_DATA(cmsg))[0]; 124 *fd_out = ((int *) CMSG_DATA(cmsg))[0];
125 os_set_exec_close(*fd_out, 1);
125 return(0); 126 return(0);
126} 127}
127 128
@@ -137,7 +138,8 @@ static int tuntap_open(void *data)
137 return(err); 138 return(err);
138 139
139 if(pri->fixed_config){ 140 if(pri->fixed_config){
140 pri->fd = os_open_file("/dev/net/tun", of_rdwr(OPENFLAGS()), 0); 141 pri->fd = os_open_file("/dev/net/tun",
142 of_cloexec(of_rdwr(OPENFLAGS())), 0);
141 if(pri->fd < 0){ 143 if(pri->fd < 0){
142 printk("Failed to open /dev/net/tun, err = %d\n", 144 printk("Failed to open /dev/net/tun, err = %d\n",
143 -pri->fd); 145 -pri->fd);
diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c
index 9890e9090f58..fbb080c2fc26 100644
--- a/arch/um/os-Linux/skas/mem.c
+++ b/arch/um/os-Linux/skas/mem.c
@@ -60,7 +60,7 @@ static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr)
60 60
61 multi_count++; 61 multi_count++;
62 62
63 get_safe_registers(regs); 63 get_safe_registers(regs, NULL);
64 regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + 64 regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE +
65 ((unsigned long) &batch_syscall_stub - 65 ((unsigned long) &batch_syscall_stub -
66 (unsigned long) &__syscall_stub_start); 66 (unsigned long) &__syscall_stub_start);
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 120a21c5883f..bbf34cb91ce1 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -310,16 +310,12 @@ void userspace(union uml_pt_regs *regs)
310 } 310 }
311 } 311 }
312} 312}
313#define INIT_JMP_NEW_THREAD 0
314#define INIT_JMP_REMOVE_SIGSTACK 1
315#define INIT_JMP_CALLBACK 2
316#define INIT_JMP_HALT 3
317#define INIT_JMP_REBOOT 4
318 313
319int copy_context_skas0(unsigned long new_stack, int pid) 314int copy_context_skas0(unsigned long new_stack, int pid)
320{ 315{
321 int err; 316 int err;
322 unsigned long regs[MAX_REG_NR]; 317 unsigned long regs[HOST_FRAME_SIZE];
318 unsigned long fp_regs[HOST_FP_SIZE];
323 unsigned long current_stack = current_stub_stack(); 319 unsigned long current_stack = current_stub_stack();
324 struct stub_data *data = (struct stub_data *) current_stack; 320 struct stub_data *data = (struct stub_data *) current_stack;
325 struct stub_data *child_data = (struct stub_data *) new_stack; 321 struct stub_data *child_data = (struct stub_data *) new_stack;
@@ -334,7 +330,7 @@ int copy_context_skas0(unsigned long new_stack, int pid)
334 .timer = ((struct itimerval) 330 .timer = ((struct itimerval)
335 { { 0, 1000000 / hz() }, 331 { { 0, 1000000 / hz() },
336 { 0, 1000000 / hz() }})}); 332 { 0, 1000000 / hz() }})});
337 get_safe_registers(regs); 333 get_safe_registers(regs, fp_regs);
338 334
339 /* Set parent's instruction pointer to start of clone-stub */ 335 /* Set parent's instruction pointer to start of clone-stub */
340 regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + 336 regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE +
@@ -350,6 +346,11 @@ int copy_context_skas0(unsigned long new_stack, int pid)
350 panic("copy_context_skas0 : PTRACE_SETREGS failed, " 346 panic("copy_context_skas0 : PTRACE_SETREGS failed, "
351 "pid = %d, errno = %d\n", pid, errno); 347 "pid = %d, errno = %d\n", pid, errno);
352 348
349 err = ptrace_setfpregs(pid, fp_regs);
350 if(err < 0)
351 panic("copy_context_skas0 : PTRACE_SETFPREGS failed, "
352 "pid = %d, errno = %d\n", pid, errno);
353
353 /* set a well known return code for detection of child write failure */ 354 /* set a well known return code for detection of child write failure */
354 child_data->err = 12345678; 355 child_data->err = 12345678;
355 356
@@ -457,6 +458,12 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
457 set_signals(flags); 458 set_signals(flags);
458} 459}
459 460
461#define INIT_JMP_NEW_THREAD 0
462#define INIT_JMP_REMOVE_SIGSTACK 1
463#define INIT_JMP_CALLBACK 2
464#define INIT_JMP_HALT 3
465#define INIT_JMP_REBOOT 4
466
460void thread_wait(void *sw, void *fb) 467void thread_wait(void *sw, void *fb)
461{ 468{
462 sigjmp_buf buf, **switch_buf = sw, *fork_buf; 469 sigjmp_buf buf, **switch_buf = sw, *fork_buf;
diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c
index 6c5b17ed59e1..829d6b0d8b02 100644
--- a/arch/um/os-Linux/start_up.c
+++ b/arch/um/os-Linux/start_up.c
@@ -49,6 +49,7 @@ static int ptrace_child(void *arg)
49 int pid = os_getpid(), ppid = getppid(); 49 int pid = os_getpid(), ppid = getppid();
50 int sc_result; 50 int sc_result;
51 51
52 change_sig(SIGWINCH, 0);
52 if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ 53 if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){
53 perror("ptrace"); 54 perror("ptrace");
54 os_kill_process(pid, 0); 55 os_kill_process(pid, 0);
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c
index aee4812333c6..7a6f6b99ceff 100644
--- a/arch/um/os-Linux/sys-i386/registers.c
+++ b/arch/um/os-Linux/sys-i386/registers.c
@@ -122,9 +122,12 @@ void init_registers(int pid)
122 err); 122 err);
123} 123}
124 124
125void get_safe_registers(unsigned long *regs) 125void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
126{ 126{
127 memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); 127 memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
128 if(fp_regs != NULL)
129 memcpy(fp_regs, exec_fp_regs,
130 HOST_FP_SIZE * sizeof(unsigned long));
128} 131}
129 132
130void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) 133void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c
index 4b638dfb52b0..001941fa1a1e 100644
--- a/arch/um/os-Linux/sys-x86_64/registers.c
+++ b/arch/um/os-Linux/sys-x86_64/registers.c
@@ -70,9 +70,12 @@ void init_registers(int pid)
70 err); 70 err);
71} 71}
72 72
73void get_safe_registers(unsigned long *regs) 73void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
74{ 74{
75 memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); 75 memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
76 if(fp_regs != NULL)
77 memcpy(fp_regs, exec_fp_regs,
78 HOST_FP_SIZE * sizeof(unsigned long));
76} 79}
77 80
78void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) 81void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
diff --git a/arch/um/sys-x86_64/ptrace_user.c b/arch/um/sys-x86_64/ptrace_user.c
index 12e404c6fa46..b5f9c33e311e 100644
--- a/arch/um/sys-x86_64/ptrace_user.c
+++ b/arch/um/sys-x86_64/ptrace_user.c
@@ -24,6 +24,13 @@ int ptrace_setregs(long pid, unsigned long *regs)
24 return(0); 24 return(0);
25} 25}
26 26
27int ptrace_setfpregs(long pid, unsigned long *regs)
28{
29 if (ptrace(PTRACE_SETFPREGS, pid, 0, regs) < 0)
30 return -errno;
31 return 0;
32}
33
27void ptrace_pokeuser(unsigned long addr, unsigned long data) 34void ptrace_pokeuser(unsigned long addr, unsigned long data)
28{ 35{
29 panic("ptrace_pokeuser"); 36 panic("ptrace_pokeuser");
diff --git a/arch/um/sys-x86_64/user-offsets.c b/arch/um/sys-x86_64/user-offsets.c
index 5a585bfbb8c2..7bd54a921cf7 100644
--- a/arch/um/sys-x86_64/user-offsets.c
+++ b/arch/um/sys-x86_64/user-offsets.c
@@ -57,7 +57,7 @@ void foo(void)
57#endif 57#endif
58 58
59 DEFINE_LONGS(HOST_FRAME_SIZE, FRAME_SIZE); 59 DEFINE_LONGS(HOST_FRAME_SIZE, FRAME_SIZE);
60 DEFINE(HOST_FP_SIZE, 0); 60 DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
61 DEFINE(HOST_XFP_SIZE, 0); 61 DEFINE(HOST_XFP_SIZE, 0);
62 DEFINE_LONGS(HOST_RBX, RBX); 62 DEFINE_LONGS(HOST_RBX, RBX);
63 DEFINE_LONGS(HOST_RCX, RCX); 63 DEFINE_LONGS(HOST_RCX, RCX);
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
index 067c0f47bd0d..ada4535d0161 100644
--- a/arch/x86_64/ia32/ia32entry.S
+++ b/arch/x86_64/ia32/ia32entry.S
@@ -685,6 +685,9 @@ ia32_sys_call_table:
685 .quad sys_readlinkat /* 305 */ 685 .quad sys_readlinkat /* 305 */
686 .quad sys_fchmodat 686 .quad sys_fchmodat
687 .quad sys_faccessat 687 .quad sys_faccessat
688 .quad sys_ni_syscall /* pselect6 for now */
689 .quad sys_ni_syscall /* ppoll for now */
690 .quad sys_unshare /* 310 */
688ia32_syscall_end: 691ia32_syscall_end:
689 .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8 692 .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
690 .quad ni_syscall 693 .quad ni_syscall
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index 363db5a003df..9435ab7d6fb8 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -94,7 +94,6 @@ unsigned long saved_video_mode;
94/* 94/*
95 * Setup options 95 * Setup options
96 */ 96 */
97struct drive_info_struct { char dummy[32]; } drive_info;
98struct screen_info screen_info; 97struct screen_info screen_info;
99struct sys_desc_table_struct { 98struct sys_desc_table_struct {
100 unsigned short length; 99 unsigned short length;
@@ -572,7 +571,6 @@ void __init setup_arch(char **cmdline_p)
572 unsigned long kernel_end; 571 unsigned long kernel_end;
573 572
574 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); 573 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
575 drive_info = DRIVE_INFO;
576 screen_info = SCREEN_INFO; 574 screen_info = SCREEN_INFO;
577 edid_info = EDID_INFO; 575 edid_info = EDID_INFO;
578 saved_video_mode = SAVED_VIDEO_MODE; 576 saved_video_mode = SAVED_VIDEO_MODE;
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c
index a28756ef7cef..67e4e28f4df8 100644
--- a/arch/x86_64/kernel/smpboot.c
+++ b/arch/x86_64/kernel/smpboot.c
@@ -59,6 +59,7 @@
59#include <asm/nmi.h> 59#include <asm/nmi.h>
60#include <asm/irq.h> 60#include <asm/irq.h>
61#include <asm/hw_irq.h> 61#include <asm/hw_irq.h>
62#include <asm/numa.h>
62 63
63/* Number of siblings per CPU package */ 64/* Number of siblings per CPU package */
64int smp_num_siblings = 1; 65int smp_num_siblings = 1;
@@ -890,6 +891,7 @@ do_rest:
890 if (boot_error) { 891 if (boot_error) {
891 cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */ 892 cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
892 clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */ 893 clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
894 clear_node_cpumask(cpu); /* was set by numa_add_cpu */
893 cpu_clear(cpu, cpu_present_map); 895 cpu_clear(cpu, cpu_present_map);
894 cpu_clear(cpu, cpu_possible_map); 896 cpu_clear(cpu, cpu_possible_map);
895 x86_cpu_to_apicid[cpu] = BAD_APICID; 897 x86_cpu_to_apicid[cpu] = BAD_APICID;
@@ -1187,6 +1189,7 @@ void remove_cpu_from_maps(void)
1187 cpu_clear(cpu, cpu_callout_map); 1189 cpu_clear(cpu, cpu_callout_map);
1188 cpu_clear(cpu, cpu_callin_map); 1190 cpu_clear(cpu, cpu_callin_map);
1189 clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */ 1191 clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
1192 clear_node_cpumask(cpu);
1190} 1193}
1191 1194
1192int __cpu_disable(void) 1195int __cpu_disable(void)
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c
index c0844bffbf84..dba7237be5c1 100644
--- a/arch/x86_64/kernel/time.c
+++ b/arch/x86_64/kernel/time.c
@@ -748,7 +748,7 @@ static __init int late_hpet_init(void)
748 * Timer0 and Timer1 is used by platform. 748 * Timer0 and Timer1 is used by platform.
749 */ 749 */
750 hd.hd_phys_address = vxtime.hpet_address; 750 hd.hd_phys_address = vxtime.hpet_address;
751 hd.hd_address = (void *)fix_to_virt(FIX_HPET_BASE); 751 hd.hd_address = (void __iomem *)fix_to_virt(FIX_HPET_BASE);
752 hd.hd_nirqs = ntimer; 752 hd.hd_nirqs = ntimer;
753 hd.hd_flags = HPET_DATA_PLATFORM; 753 hd.hd_flags = HPET_DATA_PLATFORM;
754 hpet_reserve_timer(&hd, 0); 754 hpet_reserve_timer(&hd, 0);
diff --git a/arch/x86_64/kernel/x8664_ksyms.c b/arch/x86_64/kernel/x8664_ksyms.c
index b614d54d2ae4..3496abc8d372 100644
--- a/arch/x86_64/kernel/x8664_ksyms.c
+++ b/arch/x86_64/kernel/x8664_ksyms.c
@@ -39,11 +39,6 @@ extern void __write_lock_failed(rwlock_t *rw);
39extern void __read_lock_failed(rwlock_t *rw); 39extern void __read_lock_failed(rwlock_t *rw);
40#endif 40#endif
41 41
42#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
43extern struct drive_info_struct drive_info;
44EXPORT_SYMBOL(drive_info);
45#endif
46
47/* platform dependent support */ 42/* platform dependent support */
48EXPORT_SYMBOL(boot_cpu_data); 43EXPORT_SYMBOL(boot_cpu_data);
49//EXPORT_SYMBOL(dump_fpu); 44//EXPORT_SYMBOL(dump_fpu);
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c
index b4a3fe4ec249..18f371fe37f8 100644
--- a/arch/x86_64/pci/mmconfig.c
+++ b/arch/x86_64/pci/mmconfig.c
@@ -49,7 +49,7 @@ static char __iomem *get_virt(unsigned int seg, unsigned bus)
49 return pci_mmcfg_virt[0].virt; 49 return pci_mmcfg_virt[0].virt;
50 50
51 /* Fall back to type 0 */ 51 /* Fall back to type 0 */
52 return 0; 52 return NULL;
53} 53}
54 54
55static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) 55static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn)