diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/setup.c | 4 | ||||
-rw-r--r-- | arch/arm/kernel/smp.c | 21 | ||||
-rw-r--r-- | arch/arm/kernel/time.c | 7 | ||||
-rw-r--r-- | arch/arm/kernel/vmlinux.lds.S | 8 |
4 files changed, 22 insertions, 18 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 6bbd93dd186a..29efc9f82057 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -357,6 +357,9 @@ static void __init setup_processor(void) | |||
357 | #ifndef CONFIG_VFP | 357 | #ifndef CONFIG_VFP |
358 | elf_hwcap &= ~HWCAP_VFP; | 358 | elf_hwcap &= ~HWCAP_VFP; |
359 | #endif | 359 | #endif |
360 | #ifndef CONFIG_IWMMXT | ||
361 | elf_hwcap &= ~HWCAP_IWMMXT; | ||
362 | #endif | ||
360 | 363 | ||
361 | cpu_proc_init(); | 364 | cpu_proc_init(); |
362 | } | 365 | } |
@@ -854,6 +857,7 @@ static const char *hwcap_str[] = { | |||
854 | "vfp", | 857 | "vfp", |
855 | "edsp", | 858 | "edsp", |
856 | "java", | 859 | "java", |
860 | "iwmmxt", | ||
857 | NULL | 861 | NULL |
858 | }; | 862 | }; |
859 | 863 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 421329f5e18e..070bcb7a6306 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/module.h> | ||
10 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
12 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
@@ -19,6 +20,7 @@ | |||
19 | #include <linux/cpu.h> | 20 | #include <linux/cpu.h> |
20 | #include <linux/smp.h> | 21 | #include <linux/smp.h> |
21 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
23 | #include <linux/irq.h> | ||
22 | 24 | ||
23 | #include <asm/atomic.h> | 25 | #include <asm/atomic.h> |
24 | #include <asm/cacheflush.h> | 26 | #include <asm/cacheflush.h> |
@@ -449,6 +451,7 @@ int smp_call_function(void (*func)(void *info), void *info, int retry, | |||
449 | return smp_call_function_on_cpu(func, info, retry, wait, | 451 | return smp_call_function_on_cpu(func, info, retry, wait, |
450 | cpu_online_map); | 452 | cpu_online_map); |
451 | } | 453 | } |
454 | EXPORT_SYMBOL_GPL(smp_call_function); | ||
452 | 455 | ||
453 | void show_ipi_list(struct seq_file *p) | 456 | void show_ipi_list(struct seq_file *p) |
454 | { | 457 | { |
@@ -474,25 +477,26 @@ void show_local_irqs(struct seq_file *p) | |||
474 | seq_putc(p, '\n'); | 477 | seq_putc(p, '\n'); |
475 | } | 478 | } |
476 | 479 | ||
477 | static void ipi_timer(struct pt_regs *regs) | 480 | static void ipi_timer(void) |
478 | { | 481 | { |
479 | int user = user_mode(regs); | ||
480 | |||
481 | irq_enter(); | 482 | irq_enter(); |
482 | profile_tick(CPU_PROFILING, regs); | 483 | profile_tick(CPU_PROFILING); |
483 | update_process_times(user); | 484 | update_process_times(user_mode(get_irq_regs())); |
484 | irq_exit(); | 485 | irq_exit(); |
485 | } | 486 | } |
486 | 487 | ||
487 | #ifdef CONFIG_LOCAL_TIMERS | 488 | #ifdef CONFIG_LOCAL_TIMERS |
488 | asmlinkage void do_local_timer(struct pt_regs *regs) | 489 | asmlinkage void do_local_timer(struct pt_regs *regs) |
489 | { | 490 | { |
491 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
490 | int cpu = smp_processor_id(); | 492 | int cpu = smp_processor_id(); |
491 | 493 | ||
492 | if (local_timer_ack()) { | 494 | if (local_timer_ack()) { |
493 | irq_stat[cpu].local_timer_irqs++; | 495 | irq_stat[cpu].local_timer_irqs++; |
494 | ipi_timer(regs); | 496 | ipi_timer(); |
495 | } | 497 | } |
498 | |||
499 | set_irq_regs(old_regs); | ||
496 | } | 500 | } |
497 | #endif | 501 | #endif |
498 | 502 | ||
@@ -551,6 +555,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
551 | { | 555 | { |
552 | unsigned int cpu = smp_processor_id(); | 556 | unsigned int cpu = smp_processor_id(); |
553 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); | 557 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); |
558 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
554 | 559 | ||
555 | ipi->ipi_count++; | 560 | ipi->ipi_count++; |
556 | 561 | ||
@@ -574,7 +579,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
574 | 579 | ||
575 | switch (nextmsg) { | 580 | switch (nextmsg) { |
576 | case IPI_TIMER: | 581 | case IPI_TIMER: |
577 | ipi_timer(regs); | 582 | ipi_timer(); |
578 | break; | 583 | break; |
579 | 584 | ||
580 | case IPI_RESCHEDULE: | 585 | case IPI_RESCHEDULE: |
@@ -599,6 +604,8 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
599 | } | 604 | } |
600 | } while (msgs); | 605 | } while (msgs); |
601 | } | 606 | } |
607 | |||
608 | set_irq_regs(old_regs); | ||
602 | } | 609 | } |
603 | 610 | ||
604 | void smp_send_reschedule(int cpu) | 611 | void smp_send_reschedule(int cpu) |
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index c03cab5c4c79..6ff5e3ff6cb5 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c | |||
@@ -220,10 +220,10 @@ EXPORT_SYMBOL(leds_event); | |||
220 | #ifdef CONFIG_LEDS_TIMER | 220 | #ifdef CONFIG_LEDS_TIMER |
221 | static inline void do_leds(void) | 221 | static inline void do_leds(void) |
222 | { | 222 | { |
223 | static unsigned int count = 50; | 223 | static unsigned int count = HZ/2; |
224 | 224 | ||
225 | if (--count == 0) { | 225 | if (--count == 0) { |
226 | count = 50; | 226 | count = HZ/2; |
227 | leds_event(led_timer); | 227 | leds_event(led_timer); |
228 | } | 228 | } |
229 | } | 229 | } |
@@ -327,13 +327,12 @@ EXPORT_SYMBOL(restore_time_delta); | |||
327 | */ | 327 | */ |
328 | void timer_tick(void) | 328 | void timer_tick(void) |
329 | { | 329 | { |
330 | struct pt_regs *regs = get_irq_regs(); | ||
331 | profile_tick(CPU_PROFILING); | 330 | profile_tick(CPU_PROFILING); |
332 | do_leds(); | 331 | do_leds(); |
333 | do_set_rtc(); | 332 | do_set_rtc(); |
334 | do_timer(1); | 333 | do_timer(1); |
335 | #ifndef CONFIG_SMP | 334 | #ifndef CONFIG_SMP |
336 | update_process_times(user_mode(regs)); | 335 | update_process_times(user_mode(get_irq_regs())); |
337 | #endif | 336 | #endif |
338 | } | 337 | } |
339 | 338 | ||
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 3ca574ee2772..a8fa75ea07a9 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -45,13 +45,7 @@ SECTIONS | |||
45 | *(.early_param.init) | 45 | *(.early_param.init) |
46 | __early_end = .; | 46 | __early_end = .; |
47 | __initcall_start = .; | 47 | __initcall_start = .; |
48 | *(.initcall1.init) | 48 | INITCALLS |
49 | *(.initcall2.init) | ||
50 | *(.initcall3.init) | ||
51 | *(.initcall4.init) | ||
52 | *(.initcall5.init) | ||
53 | *(.initcall6.init) | ||
54 | *(.initcall7.init) | ||
55 | __initcall_end = .; | 49 | __initcall_end = .; |
56 | __con_initcall_start = .; | 50 | __con_initcall_start = .; |
57 | *(.con_initcall.init) | 51 | *(.con_initcall.init) |