diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/boot/compressed/head-shark.S | 42 | ||||
-rw-r--r-- | arch/arm/configs/bast_defconfig | 1 | ||||
-rw-r--r-- | arch/arm/configs/s3c2410_defconfig | 1 | ||||
-rw-r--r-- | arch/arm/kernel/smp.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-integrator/platsmp.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/dma.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/mach-bast.c | 37 | ||||
-rw-r--r-- | arch/arm/nwfpe/fpa11.h | 4 | ||||
-rw-r--r-- | arch/arm/nwfpe/fpmodule.c | 2 | ||||
-rw-r--r-- | arch/arm/nwfpe/fpmodule.inl | 14 | ||||
-rw-r--r-- | arch/i386/kernel/i387.c | 11 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 20 | ||||
-rw-r--r-- | arch/i386/kernel/setup.c | 14 | ||||
-rw-r--r-- | arch/sparc64/kernel/entry.S | 17 | ||||
-rw-r--r-- | arch/sparc64/kernel/irq.c | 20 | ||||
-rw-r--r-- | arch/sparc64/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/sparc64/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/sparc64/kernel/traps.c | 2 |
18 files changed, 119 insertions, 86 deletions
diff --git a/arch/arm/boot/compressed/head-shark.S b/arch/arm/boot/compressed/head-shark.S index 848f60e542..089c560e07 100644 --- a/arch/arm/boot/compressed/head-shark.S +++ b/arch/arm/boot/compressed/head-shark.S | |||
@@ -63,8 +63,8 @@ __beginning: mov r4, r0 @ save the entry to the firmware | |||
63 | 63 | ||
64 | mov pc, r2 | 64 | mov pc, r2 |
65 | 65 | ||
66 | __copy_target: .long 0x08508000 | 66 | __copy_target: .long 0x08507FFC |
67 | __copy_end: .long 0x08608000 | 67 | __copy_end: .long 0x08607FFC |
68 | 68 | ||
69 | .word _start | 69 | .word _start |
70 | .word __bss_start | 70 | .word __bss_start |
@@ -73,9 +73,10 @@ __copy_end: .long 0x08608000 | |||
73 | __temp_stack: .space 128 | 73 | __temp_stack: .space 128 |
74 | 74 | ||
75 | __mmu_off: | 75 | __mmu_off: |
76 | adr r0, __ofw_data | 76 | adr r0, __ofw_data @ read the 1. entry of the memory map |
77 | ldr r0, [r0, #4] | 77 | ldr r0, [r0, #4] |
78 | orr r0, r0, #0x00600000 | 78 | orr r0, r0, #0x00600000 |
79 | sub r0, r0, #4 | ||
79 | 80 | ||
80 | ldr r1, __copy_end | 81 | ldr r1, __copy_end |
81 | ldr r3, __copy_target | 82 | ldr r3, __copy_target |
@@ -89,20 +90,43 @@ __mmu_off: | |||
89 | * from 0x08500000 to 0x08508000 if we have only 8MB | 90 | * from 0x08500000 to 0x08508000 if we have only 8MB |
90 | */ | 91 | */ |
91 | 92 | ||
93 | /* As we get more 2.6-kernels it gets more and more | ||
94 | * uncomfortable to be bound to kernel images of 1MB only. | ||
95 | * So we add a loop here, to be able to copy some more. | ||
96 | * Alexander Schulz 2005-07-17 | ||
97 | */ | ||
98 | |||
99 | mov r4, #3 @ How many megabytes to copy | ||
100 | |||
101 | |||
102 | __MoveCode: sub r4, r4, #1 | ||
92 | 103 | ||
93 | __Copy: ldr r2, [r0], #-4 | 104 | __Copy: ldr r2, [r0], #-4 |
94 | str r2, [r1], #-4 | 105 | str r2, [r1], #-4 |
95 | teq r1, r3 | 106 | teq r1, r3 |
96 | bne __Copy | 107 | bne __Copy |
108 | |||
109 | /* The firmware maps us in blocks of 1 MB, the next block is | ||
110 | _below_ the last one. So our decrementing source pointer | ||
111 | ist right here, but the destination pointer must be increased | ||
112 | by 2 MB */ | ||
113 | add r1, r1, #0x00200000 | ||
114 | add r3, r3, #0x00100000 | ||
115 | |||
116 | teq r4, #0 | ||
117 | bne __MoveCode | ||
118 | |||
119 | |||
97 | /* and jump to it */ | 120 | /* and jump to it */ |
98 | adr r2, __go_on | 121 | adr r2, __go_on @ where we want to jump |
99 | adr r0, __ofw_data | 122 | adr r0, __ofw_data @ read the 1. entry of the memory map |
100 | ldr r0, [r0, #4] | 123 | ldr r0, [r0, #4] |
101 | sub r2, r2, r0 | 124 | sub r2, r2, r0 @ we are mapped add 0e50 now, sub that (-0e00) |
102 | sub r2, r2, #0x00500000 | 125 | sub r2, r2, #0x00500000 @ -0050 |
103 | ldr r0, __copy_target | 126 | ldr r0, __copy_target @ and add 0850 8000 instead |
127 | add r0, r0, #4 | ||
104 | add r2, r2, r0 | 128 | add r2, r2, r0 |
105 | mov pc, r2 | 129 | mov pc, r2 @ and jump there |
106 | 130 | ||
107 | __go_on: | 131 | __go_on: |
108 | adr sp, __temp_stack | 132 | adr sp, __temp_stack |
diff --git a/arch/arm/configs/bast_defconfig b/arch/arm/configs/bast_defconfig index 2d985e9611..35e3a99bcb 100644 --- a/arch/arm/configs/bast_defconfig +++ b/arch/arm/configs/bast_defconfig | |||
@@ -561,7 +561,6 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y | |||
561 | # | 561 | # |
562 | CONFIG_SERIAL_S3C2410=y | 562 | CONFIG_SERIAL_S3C2410=y |
563 | CONFIG_SERIAL_S3C2410_CONSOLE=y | 563 | CONFIG_SERIAL_S3C2410_CONSOLE=y |
564 | CONFIG_SERIAL_BAST_SIO=y | ||
565 | CONFIG_SERIAL_CORE=y | 564 | CONFIG_SERIAL_CORE=y |
566 | CONFIG_SERIAL_CORE_CONSOLE=y | 565 | CONFIG_SERIAL_CORE_CONSOLE=y |
567 | CONFIG_UNIX98_PTYS=y | 566 | CONFIG_UNIX98_PTYS=y |
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index 98b72ff388..96a794d8de 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig | |||
@@ -570,7 +570,6 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y | |||
570 | # | 570 | # |
571 | CONFIG_SERIAL_S3C2410=y | 571 | CONFIG_SERIAL_S3C2410=y |
572 | CONFIG_SERIAL_S3C2410_CONSOLE=y | 572 | CONFIG_SERIAL_S3C2410_CONSOLE=y |
573 | CONFIG_SERIAL_BAST_SIO=y | ||
574 | CONFIG_SERIAL_CORE=y | 573 | CONFIG_SERIAL_CORE=y |
575 | CONFIG_SERIAL_CORE_CONSOLE=y | 574 | CONFIG_SERIAL_CORE_CONSOLE=y |
576 | CONFIG_UNIX98_PTYS=y | 575 | CONFIG_UNIX98_PTYS=y |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 7ae45c3fc8..295e0a8379 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -78,7 +78,7 @@ struct smp_call_struct { | |||
78 | static struct smp_call_struct * volatile smp_call_function_data; | 78 | static struct smp_call_struct * volatile smp_call_function_data; |
79 | static DEFINE_SPINLOCK(smp_call_function_lock); | 79 | static DEFINE_SPINLOCK(smp_call_function_lock); |
80 | 80 | ||
81 | int __init __cpu_up(unsigned int cpu) | 81 | int __cpuinit __cpu_up(unsigned int cpu) |
82 | { | 82 | { |
83 | struct task_struct *idle; | 83 | struct task_struct *idle; |
84 | pgd_t *pgd; | 84 | pgd_t *pgd; |
@@ -159,7 +159,7 @@ int __init __cpu_up(unsigned int cpu) | |||
159 | * This is the secondary CPU boot entry. We're using this CPUs | 159 | * This is the secondary CPU boot entry. We're using this CPUs |
160 | * idle thread stack, but a set of temporary page tables. | 160 | * idle thread stack, but a set of temporary page tables. |
161 | */ | 161 | */ |
162 | asmlinkage void __init secondary_start_kernel(void) | 162 | asmlinkage void __cpuinit secondary_start_kernel(void) |
163 | { | 163 | { |
164 | struct mm_struct *mm = &init_mm; | 164 | struct mm_struct *mm = &init_mm; |
165 | unsigned int cpu = smp_processor_id(); | 165 | unsigned int cpu = smp_processor_id(); |
@@ -209,7 +209,7 @@ asmlinkage void __init secondary_start_kernel(void) | |||
209 | * Called by both boot and secondaries to move global data into | 209 | * Called by both boot and secondaries to move global data into |
210 | * per-processor storage. | 210 | * per-processor storage. |
211 | */ | 211 | */ |
212 | void __init smp_store_cpu_info(unsigned int cpuid) | 212 | void __cpuinit smp_store_cpu_info(unsigned int cpuid) |
213 | { | 213 | { |
214 | struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid); | 214 | struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid); |
215 | 215 | ||
diff --git a/arch/arm/mach-integrator/platsmp.c b/arch/arm/mach-integrator/platsmp.c index 2ba0257770..aecf47ba03 100644 --- a/arch/arm/mach-integrator/platsmp.c +++ b/arch/arm/mach-integrator/platsmp.c | |||
@@ -27,12 +27,12 @@ extern void integrator_secondary_startup(void); | |||
27 | * control for which core is the next to come out of the secondary | 27 | * control for which core is the next to come out of the secondary |
28 | * boot "holding pen" | 28 | * boot "holding pen" |
29 | */ | 29 | */ |
30 | volatile int __initdata pen_release = -1; | 30 | volatile int __cpuinitdata pen_release = -1; |
31 | unsigned long __initdata phys_pen_release = 0; | 31 | unsigned long __cpuinitdata phys_pen_release = 0; |
32 | 32 | ||
33 | static DEFINE_SPINLOCK(boot_lock); | 33 | static DEFINE_SPINLOCK(boot_lock); |
34 | 34 | ||
35 | void __init platform_secondary_init(unsigned int cpu) | 35 | void __cpuinit platform_secondary_init(unsigned int cpu) |
36 | { | 36 | { |
37 | /* | 37 | /* |
38 | * the primary core may have used a "cross call" soft interrupt | 38 | * the primary core may have used a "cross call" soft interrupt |
@@ -61,7 +61,7 @@ void __init platform_secondary_init(unsigned int cpu) | |||
61 | spin_unlock(&boot_lock); | 61 | spin_unlock(&boot_lock); |
62 | } | 62 | } |
63 | 63 | ||
64 | int __init boot_secondary(unsigned int cpu, struct task_struct *idle) | 64 | int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) |
65 | { | 65 | { |
66 | unsigned long timeout; | 66 | unsigned long timeout; |
67 | 67 | ||
diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index c7c28890d4..65feaf20d2 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c | |||
@@ -436,7 +436,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, | |||
436 | 436 | ||
437 | buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); | 437 | buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); |
438 | if (buf == NULL) { | 438 | if (buf == NULL) { |
439 | pr_debug("%s: out of memory (%d alloc)\n", | 439 | pr_debug("%s: out of memory (%ld alloc)\n", |
440 | __FUNCTION__, sizeof(*buf)); | 440 | __FUNCTION__, sizeof(*buf)); |
441 | return -ENOMEM; | 441 | return -ENOMEM; |
442 | } | 442 | } |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index ccb6bcefa4..206778ebfc 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
@@ -28,6 +28,7 @@ | |||
28 | * 14-Mar-2006 BJD Updated for __iomem changes | 28 | * 14-Mar-2006 BJD Updated for __iomem changes |
29 | * 22-Jun-2006 BJD Added DM9000 platform information | 29 | * 22-Jun-2006 BJD Added DM9000 platform information |
30 | * 28-Jun-2006 BJD Moved pm functionality out to common code | 30 | * 28-Jun-2006 BJD Moved pm functionality out to common code |
31 | * 17-Jul-2006 BJD Changed to platform device for SuperIO 16550s | ||
31 | */ | 32 | */ |
32 | 33 | ||
33 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
@@ -64,6 +65,8 @@ | |||
64 | #include <linux/mtd/nand_ecc.h> | 65 | #include <linux/mtd/nand_ecc.h> |
65 | #include <linux/mtd/partitions.h> | 66 | #include <linux/mtd/partitions.h> |
66 | 67 | ||
68 | #include <linux/serial_8250.h> | ||
69 | |||
67 | #include "clock.h" | 70 | #include "clock.h" |
68 | #include "devs.h" | 71 | #include "devs.h" |
69 | #include "cpu.h" | 72 | #include "cpu.h" |
@@ -351,6 +354,39 @@ static struct platform_device bast_device_dm9k = { | |||
351 | } | 354 | } |
352 | }; | 355 | }; |
353 | 356 | ||
357 | /* serial devices */ | ||
358 | |||
359 | #define SERIAL_BASE (S3C2410_CS2 + BAST_PA_SUPERIO) | ||
360 | #define SERIAL_FLAGS (UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ) | ||
361 | #define SERIAL_CLK (1843200) | ||
362 | |||
363 | static struct plat_serial8250_port bast_sio_data[] = { | ||
364 | [0] = { | ||
365 | .mapbase = SERIAL_BASE + 0x2f8, | ||
366 | .irq = IRQ_PCSERIAL1, | ||
367 | .flags = SERIAL_FLAGS, | ||
368 | .iotype = UPIO_MEM, | ||
369 | .regshift = 0, | ||
370 | .uartclk = SERIAL_CLK, | ||
371 | }, | ||
372 | [1] = { | ||
373 | .mapbase = SERIAL_BASE + 0x3f8, | ||
374 | .irq = IRQ_PCSERIAL2, | ||
375 | .flags = SERIAL_FLAGS, | ||
376 | .iotype = UPIO_MEM, | ||
377 | .regshift = 0, | ||
378 | .uartclk = SERIAL_CLK, | ||
379 | }, | ||
380 | { } | ||
381 | }; | ||
382 | |||
383 | static struct platform_device bast_sio = { | ||
384 | .name = "serial8250", | ||
385 | .id = 0, | ||
386 | .dev = { | ||
387 | .platform_data = &bast_sio_data, | ||
388 | }, | ||
389 | }; | ||
354 | 390 | ||
355 | /* Standard BAST devices */ | 391 | /* Standard BAST devices */ |
356 | 392 | ||
@@ -364,6 +400,7 @@ static struct platform_device *bast_devices[] __initdata = { | |||
364 | &s3c_device_nand, | 400 | &s3c_device_nand, |
365 | &bast_device_nor, | 401 | &bast_device_nor, |
366 | &bast_device_dm9k, | 402 | &bast_device_dm9k, |
403 | &bast_sio, | ||
367 | }; | 404 | }; |
368 | 405 | ||
369 | static struct clk *bast_clocks[] = { | 406 | static struct clk *bast_clocks[] = { |
diff --git a/arch/arm/nwfpe/fpa11.h b/arch/arm/nwfpe/fpa11.h index 45cc65426a..e4a61aea53 100644 --- a/arch/arm/nwfpe/fpa11.h +++ b/arch/arm/nwfpe/fpa11.h | |||
@@ -29,9 +29,7 @@ | |||
29 | * stack+task struct. Use the same method as 'current' uses to | 29 | * stack+task struct. Use the same method as 'current' uses to |
30 | * reach them. | 30 | * reach them. |
31 | */ | 31 | */ |
32 | register unsigned long *user_registers asm("sl"); | 32 | #define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1) |
33 | |||
34 | #define GET_USERREG() (user_registers) | ||
35 | 33 | ||
36 | #include <linux/config.h> | 34 | #include <linux/config.h> |
37 | #include <linux/thread_info.h> | 35 | #include <linux/thread_info.h> |
diff --git a/arch/arm/nwfpe/fpmodule.c b/arch/arm/nwfpe/fpmodule.c index a8efcf3488..12885f31d3 100644 --- a/arch/arm/nwfpe/fpmodule.c +++ b/arch/arm/nwfpe/fpmodule.c | |||
@@ -132,7 +132,7 @@ void float_raise(signed char flags) | |||
132 | printk(KERN_DEBUG | 132 | printk(KERN_DEBUG |
133 | "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", | 133 | "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", |
134 | current->comm, current->pid, flags, | 134 | current->comm, current->pid, flags, |
135 | __builtin_return_address(0), GET_USERREG()[15]); | 135 | __builtin_return_address(0), GET_USERREG()->ARM_pc); |
136 | #endif | 136 | #endif |
137 | 137 | ||
138 | /* Keep SoftFloat exception flags up to date. */ | 138 | /* Keep SoftFloat exception flags up to date. */ |
diff --git a/arch/arm/nwfpe/fpmodule.inl b/arch/arm/nwfpe/fpmodule.inl index e5f59e9a30..2c39ad408f 100644 --- a/arch/arm/nwfpe/fpmodule.inl +++ b/arch/arm/nwfpe/fpmodule.inl | |||
@@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg) | |||
28 | for this in this routine. LDF/STF instructions with Rn = PC | 28 | for this in this routine. LDF/STF instructions with Rn = PC |
29 | depend on the PC being correct, as they use PC+8 in their | 29 | depend on the PC being correct, as they use PC+8 in their |
30 | address calculations. */ | 30 | address calculations. */ |
31 | unsigned long *userRegisters = GET_USERREG(); | 31 | struct pt_regs *regs = GET_USERREG(); |
32 | unsigned int val = userRegisters[nReg]; | 32 | unsigned int val = regs->uregs[nReg]; |
33 | if (REG_PC == nReg) | 33 | if (REG_PC == nReg) |
34 | val -= 4; | 34 | val -= 4; |
35 | return val; | 35 | return val; |
@@ -38,8 +38,8 @@ static inline unsigned long readRegister(const unsigned int nReg) | |||
38 | static inline void | 38 | static inline void |
39 | writeRegister(const unsigned int nReg, const unsigned long val) | 39 | writeRegister(const unsigned int nReg, const unsigned long val) |
40 | { | 40 | { |
41 | unsigned long *userRegisters = GET_USERREG(); | 41 | struct pt_regs *regs = GET_USERREG(); |
42 | userRegisters[nReg] = val; | 42 | regs->uregs[nReg] = val; |
43 | } | 43 | } |
44 | 44 | ||
45 | static inline unsigned long readCPSR(void) | 45 | static inline unsigned long readCPSR(void) |
@@ -63,12 +63,12 @@ static inline unsigned long readConditionCodes(void) | |||
63 | 63 | ||
64 | static inline void writeConditionCodes(const unsigned long val) | 64 | static inline void writeConditionCodes(const unsigned long val) |
65 | { | 65 | { |
66 | unsigned long *userRegisters = GET_USERREG(); | 66 | struct pt_regs *regs = GET_USERREG(); |
67 | unsigned long rval; | 67 | unsigned long rval; |
68 | /* | 68 | /* |
69 | * Operate directly on userRegisters since | 69 | * Operate directly on userRegisters since |
70 | * the CPSR may be the PC register itself. | 70 | * the CPSR may be the PC register itself. |
71 | */ | 71 | */ |
72 | rval = userRegisters[REG_CPSR] & ~CC_MASK; | 72 | rval = regs->ARM_cpsr & ~CC_MASK; |
73 | userRegisters[REG_CPSR] = rval | (val & CC_MASK); | 73 | regs->ARM_cpsr = rval | (val & CC_MASK); |
74 | } | 74 | } |
diff --git a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c index b817168d9c..d75524758d 100644 --- a/arch/i386/kernel/i387.c +++ b/arch/i386/kernel/i387.c | |||
@@ -82,17 +82,6 @@ void kernel_fpu_begin(void) | |||
82 | } | 82 | } |
83 | EXPORT_SYMBOL_GPL(kernel_fpu_begin); | 83 | EXPORT_SYMBOL_GPL(kernel_fpu_begin); |
84 | 84 | ||
85 | void restore_fpu( struct task_struct *tsk ) | ||
86 | { | ||
87 | if ( cpu_has_fxsr ) { | ||
88 | asm volatile( "fxrstor %0" | ||
89 | : : "m" (tsk->thread.i387.fxsave) ); | ||
90 | } else { | ||
91 | asm volatile( "frstor %0" | ||
92 | : : "m" (tsk->thread.i387.fsave) ); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | /* | 85 | /* |
97 | * FPU tag word conversions. | 86 | * FPU tag word conversions. |
98 | */ | 87 | */ |
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index ba243a4cc1..d9492058aa 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -700,23 +700,27 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
700 | 700 | ||
701 | /* | 701 | /* |
702 | * Restore %fs and %gs if needed. | 702 | * Restore %fs and %gs if needed. |
703 | * | ||
704 | * Glibc normally makes %fs be zero, and %gs is one of | ||
705 | * the TLS segments. | ||
703 | */ | 706 | */ |
704 | if (unlikely(prev->fs | prev->gs | next->fs | next->gs)) { | 707 | if (unlikely(prev->fs | next->fs)) |
705 | loadsegment(fs, next->fs); | 708 | loadsegment(fs, next->fs); |
709 | |||
710 | if (prev->gs | next->gs) | ||
706 | loadsegment(gs, next->gs); | 711 | loadsegment(gs, next->gs); |
707 | } | ||
708 | 712 | ||
709 | /* | 713 | /* |
710 | * Now maybe reload the debug registers | 714 | * Now maybe reload the debug registers |
711 | */ | 715 | */ |
712 | if (unlikely(next->debugreg[7])) { | 716 | if (unlikely(next->debugreg[7])) { |
713 | set_debugreg(current->thread.debugreg[0], 0); | 717 | set_debugreg(next->debugreg[0], 0); |
714 | set_debugreg(current->thread.debugreg[1], 1); | 718 | set_debugreg(next->debugreg[1], 1); |
715 | set_debugreg(current->thread.debugreg[2], 2); | 719 | set_debugreg(next->debugreg[2], 2); |
716 | set_debugreg(current->thread.debugreg[3], 3); | 720 | set_debugreg(next->debugreg[3], 3); |
717 | /* no 4 and 5 */ | 721 | /* no 4 and 5 */ |
718 | set_debugreg(current->thread.debugreg[6], 6); | 722 | set_debugreg(next->debugreg[6], 6); |
719 | set_debugreg(current->thread.debugreg[7], 7); | 723 | set_debugreg(next->debugreg[7], 7); |
720 | } | 724 | } |
721 | 725 | ||
722 | if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) | 726 | if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 7306353c52..af4de58cab 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -1414,7 +1414,7 @@ static struct nop { | |||
1414 | This runs before SMP is initialized to avoid SMP problems with | 1414 | This runs before SMP is initialized to avoid SMP problems with |
1415 | self modifying code. This implies that assymetric systems where | 1415 | self modifying code. This implies that assymetric systems where |
1416 | APs have less capabilities than the boot processor are not handled. | 1416 | APs have less capabilities than the boot processor are not handled. |
1417 | In this case boot with "noreplacement". */ | 1417 | Tough. Make sure you disable such features by hand. */ |
1418 | void apply_alternatives(void *start, void *end) | 1418 | void apply_alternatives(void *start, void *end) |
1419 | { | 1419 | { |
1420 | struct alt_instr *a; | 1420 | struct alt_instr *a; |
@@ -1442,24 +1442,12 @@ void apply_alternatives(void *start, void *end) | |||
1442 | } | 1442 | } |
1443 | } | 1443 | } |
1444 | 1444 | ||
1445 | static int no_replacement __initdata = 0; | ||
1446 | |||
1447 | void __init alternative_instructions(void) | 1445 | void __init alternative_instructions(void) |
1448 | { | 1446 | { |
1449 | extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; | 1447 | extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; |
1450 | if (no_replacement) | ||
1451 | return; | ||
1452 | apply_alternatives(__alt_instructions, __alt_instructions_end); | 1448 | apply_alternatives(__alt_instructions, __alt_instructions_end); |
1453 | } | 1449 | } |
1454 | 1450 | ||
1455 | static int __init noreplacement_setup(char *s) | ||
1456 | { | ||
1457 | no_replacement = 1; | ||
1458 | return 0; | ||
1459 | } | ||
1460 | |||
1461 | __setup("noreplacement", noreplacement_setup); | ||
1462 | |||
1463 | static char * __init machine_specific_memory_setup(void); | 1451 | static char * __init machine_specific_memory_setup(void); |
1464 | 1452 | ||
1465 | #ifdef CONFIG_MCA | 1453 | #ifdef CONFIG_MCA |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index d781f10adc..88332f0009 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -1600,11 +1600,11 @@ sys_clone: flushw | |||
1600 | ba,pt %xcc, sparc_do_fork | 1600 | ba,pt %xcc, sparc_do_fork |
1601 | add %sp, PTREGS_OFF, %o2 | 1601 | add %sp, PTREGS_OFF, %o2 |
1602 | ret_from_syscall: | 1602 | ret_from_syscall: |
1603 | /* Clear SPARC_FLAG_NEWCHILD, switch_to leaves thread.flags in | 1603 | /* Clear current_thread_info()->new_child, and |
1604 | * %o7 for us. Check performance counter stuff too. | 1604 | * check performance counter stuff too. |
1605 | */ | 1605 | */ |
1606 | andn %o7, _TIF_NEWCHILD, %l0 | 1606 | stb %g0, [%g6 + TI_NEW_CHILD] |
1607 | stx %l0, [%g6 + TI_FLAGS] | 1607 | ldx [%g6 + TI_FLAGS], %l0 |
1608 | call schedule_tail | 1608 | call schedule_tail |
1609 | mov %g7, %o0 | 1609 | mov %g7, %o0 |
1610 | andcc %l0, _TIF_PERFCTR, %g0 | 1610 | andcc %l0, _TIF_PERFCTR, %g0 |
@@ -1720,12 +1720,11 @@ ret_sys_call: | |||
1720 | /* Check if force_successful_syscall_return() | 1720 | /* Check if force_successful_syscall_return() |
1721 | * was invoked. | 1721 | * was invoked. |
1722 | */ | 1722 | */ |
1723 | ldx [%curptr + TI_FLAGS], %l0 | 1723 | ldub [%curptr + TI_SYS_NOERROR], %l0 |
1724 | andcc %l0, _TIF_SYSCALL_SUCCESS, %g0 | 1724 | brz,pt %l0, 1f |
1725 | be,pt %icc, 1f | 1725 | nop |
1726 | andn %l0, _TIF_SYSCALL_SUCCESS, %l0 | ||
1727 | ba,pt %xcc, 80f | 1726 | ba,pt %xcc, 80f |
1728 | stx %l0, [%curptr + TI_FLAGS] | 1727 | stb %g0, [%curptr + TI_SYS_NOERROR] |
1729 | 1728 | ||
1730 | 1: | 1729 | 1: |
1731 | cmp %o0, -ERESTART_RESTARTBLOCK | 1730 | cmp %o0, -ERESTART_RESTARTBLOCK |
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index daa2fb9305..c9b6916763 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
@@ -782,8 +782,14 @@ static void distribute_irqs(void) | |||
782 | } | 782 | } |
783 | #endif | 783 | #endif |
784 | 784 | ||
785 | struct sun5_timer { | ||
786 | u64 count0; | ||
787 | u64 limit0; | ||
788 | u64 count1; | ||
789 | u64 limit1; | ||
790 | }; | ||
785 | 791 | ||
786 | struct sun5_timer *prom_timers; | 792 | static struct sun5_timer *prom_timers; |
787 | static u64 prom_limit0, prom_limit1; | 793 | static u64 prom_limit0, prom_limit1; |
788 | 794 | ||
789 | static void map_prom_timers(void) | 795 | static void map_prom_timers(void) |
@@ -839,18 +845,6 @@ static void kill_prom_timer(void) | |||
839 | : "g1", "g2"); | 845 | : "g1", "g2"); |
840 | } | 846 | } |
841 | 847 | ||
842 | void enable_prom_timer(void) | ||
843 | { | ||
844 | if (!prom_timers) | ||
845 | return; | ||
846 | |||
847 | /* Set it to whatever was there before. */ | ||
848 | prom_timers->limit1 = prom_limit1; | ||
849 | prom_timers->count1 = 0; | ||
850 | prom_timers->limit0 = prom_limit0; | ||
851 | prom_timers->count0 = 0; | ||
852 | } | ||
853 | |||
854 | void init_irqwork_curcpu(void) | 848 | void init_irqwork_curcpu(void) |
855 | { | 849 | { |
856 | register struct irq_work_struct *workp asm("o2"); | 850 | register struct irq_work_struct *workp asm("o2"); |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index a0cd2b2494..cffb1c8ab4 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
@@ -621,8 +621,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
621 | memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); | 621 | memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); |
622 | 622 | ||
623 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | | 623 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | |
624 | _TIF_NEWCHILD | | ||
625 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); | 624 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); |
625 | t->new_child = 1; | ||
626 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; | 626 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; |
627 | t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf)); | 627 | t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf)); |
628 | t->fpsaved[0] = 0; | 628 | t->fpsaved[0] = 0; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 7e8e2919e1..b9b42491e1 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -137,7 +137,7 @@ void __init smp_callin(void) | |||
137 | /* Clear this or we will die instantly when we | 137 | /* Clear this or we will die instantly when we |
138 | * schedule back to this idler... | 138 | * schedule back to this idler... |
139 | */ | 139 | */ |
140 | clear_thread_flag(TIF_NEWCHILD); | 140 | current_thread_info()->new_child = 0; |
141 | 141 | ||
142 | /* Attach to the address space of init_task. */ | 142 | /* Attach to the address space of init_task. */ |
143 | atomic_inc(&init_mm.mm_count); | 143 | atomic_inc(&init_mm.mm_count); |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index a9f4596d7c..100b0107c4 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
@@ -2125,6 +2125,8 @@ void __init trap_init(void) | |||
2125 | TI_PCR != offsetof(struct thread_info, pcr_reg) || | 2125 | TI_PCR != offsetof(struct thread_info, pcr_reg) || |
2126 | TI_CEE_STUFF != offsetof(struct thread_info, cee_stuff) || | 2126 | TI_CEE_STUFF != offsetof(struct thread_info, cee_stuff) || |
2127 | TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || | 2127 | TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || |
2128 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || | ||
2129 | TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) || | ||
2128 | TI_FPREGS != offsetof(struct thread_info, fpregs) || | 2130 | TI_FPREGS != offsetof(struct thread_info, fpregs) || |
2129 | (TI_FPREGS & (64 - 1))) | 2131 | (TI_FPREGS & (64 - 1))) |
2130 | thread_info_offsets_are_bolixed_dave(); | 2132 | thread_info_offsets_are_bolixed_dave(); |