diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/entry-header.S | 2 | ||||
-rw-r--r-- | arch/arm/kernel/kgdb.c | 13 | ||||
-rw-r--r-- | arch/arm/kernel/perf_event.c | 5 | ||||
-rw-r--r-- | arch/arm/kernel/smp.c | 4 |
4 files changed, 21 insertions, 3 deletions
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 7e9ed1eea40a..d93f976fb389 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
@@ -102,6 +102,8 @@ | |||
102 | .else | 102 | .else |
103 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr | 103 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr |
104 | .endif | 104 | .endif |
105 | mov r0, r0 @ ARMv5T and earlier require a nop | ||
106 | @ after ldm {}^ | ||
105 | add sp, sp, #S_FRAME_SIZE - S_PC | 107 | add sp, sp, #S_FRAME_SIZE - S_PC |
106 | movs pc, lr @ return & move spsr_svc into cpsr | 108 | movs pc, lr @ return & move spsr_svc into cpsr |
107 | .endm | 109 | .endm |
diff --git a/arch/arm/kernel/kgdb.c b/arch/arm/kernel/kgdb.c index ba8ccfede964..a5b846b9895d 100644 --- a/arch/arm/kernel/kgdb.c +++ b/arch/arm/kernel/kgdb.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * Authors: George Davis <davis_g@mvista.com> | 9 | * Authors: George Davis <davis_g@mvista.com> |
10 | * Deepak Saxena <dsaxena@plexity.net> | 10 | * Deepak Saxena <dsaxena@plexity.net> |
11 | */ | 11 | */ |
12 | #include <linux/irq.h> | ||
12 | #include <linux/kgdb.h> | 13 | #include <linux/kgdb.h> |
13 | #include <asm/traps.h> | 14 | #include <asm/traps.h> |
14 | 15 | ||
@@ -158,6 +159,18 @@ static struct undef_hook kgdb_compiled_brkpt_hook = { | |||
158 | .fn = kgdb_compiled_brk_fn | 159 | .fn = kgdb_compiled_brk_fn |
159 | }; | 160 | }; |
160 | 161 | ||
162 | static void kgdb_call_nmi_hook(void *ignored) | ||
163 | { | ||
164 | kgdb_nmicallback(raw_smp_processor_id(), get_irq_regs()); | ||
165 | } | ||
166 | |||
167 | void kgdb_roundup_cpus(unsigned long flags) | ||
168 | { | ||
169 | local_irq_enable(); | ||
170 | smp_call_function(kgdb_call_nmi_hook, NULL, 0); | ||
171 | local_irq_disable(); | ||
172 | } | ||
173 | |||
161 | /** | 174 | /** |
162 | * kgdb_arch_init - Perform any architecture specific initalization. | 175 | * kgdb_arch_init - Perform any architecture specific initalization. |
163 | * | 176 | * |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 3875d99cc40f..9e70f2053f9a 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -332,7 +332,8 @@ armpmu_reserve_hardware(void) | |||
332 | 332 | ||
333 | for (i = 0; i < pmu_irqs->num_irqs; ++i) { | 333 | for (i = 0; i < pmu_irqs->num_irqs; ++i) { |
334 | err = request_irq(pmu_irqs->irqs[i], armpmu->handle_irq, | 334 | err = request_irq(pmu_irqs->irqs[i], armpmu->handle_irq, |
335 | IRQF_DISABLED, "armpmu", NULL); | 335 | IRQF_DISABLED | IRQF_NOBALANCING, |
336 | "armpmu", NULL); | ||
336 | if (err) { | 337 | if (err) { |
337 | pr_warning("unable to request IRQ%d for ARM " | 338 | pr_warning("unable to request IRQ%d for ARM " |
338 | "perf counters\n", pmu_irqs->irqs[i]); | 339 | "perf counters\n", pmu_irqs->irqs[i]); |
@@ -1624,7 +1625,7 @@ enum armv7_counters { | |||
1624 | /* | 1625 | /* |
1625 | * EVTSEL: Event selection reg | 1626 | * EVTSEL: Event selection reg |
1626 | */ | 1627 | */ |
1627 | #define ARMV7_EVTSEL_MASK 0x7f /* Mask for writable bits */ | 1628 | #define ARMV7_EVTSEL_MASK 0xff /* Mask for writable bits */ |
1628 | 1629 | ||
1629 | /* | 1630 | /* |
1630 | * SELECT: Counter selection reg | 1631 | * SELECT: Counter selection reg |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 57162af53dc9..577543f3857f 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -99,6 +99,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
99 | *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | | 99 | *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | |
100 | PMD_TYPE_SECT | PMD_SECT_AP_WRITE); | 100 | PMD_TYPE_SECT | PMD_SECT_AP_WRITE); |
101 | flush_pmd_entry(pmd); | 101 | flush_pmd_entry(pmd); |
102 | outer_clean_range(__pa(pmd), __pa(pmd + 1)); | ||
102 | 103 | ||
103 | /* | 104 | /* |
104 | * We need to tell the secondary core where to find | 105 | * We need to tell the secondary core where to find |
@@ -106,7 +107,8 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
106 | */ | 107 | */ |
107 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; | 108 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; |
108 | secondary_data.pgdir = virt_to_phys(pgd); | 109 | secondary_data.pgdir = virt_to_phys(pgd); |
109 | wmb(); | 110 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); |
111 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); | ||
110 | 112 | ||
111 | /* | 113 | /* |
112 | * Now bring the CPU into our world. | 114 | * Now bring the CPU into our world. |