diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/parisc/include/asm/bug.h | 4 | ||||
-rw-r--r-- | arch/parisc/include/asm/ftrace.h | 14 | ||||
-rw-r--r-- | arch/parisc/kernel/asm-offsets.c | 3 | ||||
-rw-r--r-- | arch/parisc/kernel/irq.c | 4 | ||||
-rw-r--r-- | arch/parisc/kernel/signal.c | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/smp.c | 9 | ||||
-rw-r--r-- | arch/parisc/kernel/unwind.c | 50 |
7 files changed, 60 insertions, 25 deletions
diff --git a/arch/parisc/include/asm/bug.h b/arch/parisc/include/asm/bug.h index 8cfc553fc837..75e46c557a16 100644 --- a/arch/parisc/include/asm/bug.h +++ b/arch/parisc/include/asm/bug.h | |||
@@ -32,14 +32,14 @@ | |||
32 | "\t.popsection" \ | 32 | "\t.popsection" \ |
33 | : : "i" (__FILE__), "i" (__LINE__), \ | 33 | : : "i" (__FILE__), "i" (__LINE__), \ |
34 | "i" (0), "i" (sizeof(struct bug_entry)) ); \ | 34 | "i" (0), "i" (sizeof(struct bug_entry)) ); \ |
35 | for(;;) ; \ | 35 | unreachable(); \ |
36 | } while(0) | 36 | } while(0) |
37 | 37 | ||
38 | #else | 38 | #else |
39 | #define BUG() \ | 39 | #define BUG() \ |
40 | do { \ | 40 | do { \ |
41 | asm volatile(PARISC_BUG_BREAK_ASM : : ); \ | 41 | asm volatile(PARISC_BUG_BREAK_ASM : : ); \ |
42 | for(;;) ; \ | 42 | unreachable(); \ |
43 | } while(0) | 43 | } while(0) |
44 | #endif | 44 | #endif |
45 | 45 | ||
diff --git a/arch/parisc/include/asm/ftrace.h b/arch/parisc/include/asm/ftrace.h index 2fa05dd6aeee..72c0fafaa039 100644 --- a/arch/parisc/include/asm/ftrace.h +++ b/arch/parisc/include/asm/ftrace.h | |||
@@ -20,6 +20,20 @@ struct ftrace_ret_stack { | |||
20 | * Defined in entry.S | 20 | * Defined in entry.S |
21 | */ | 21 | */ |
22 | extern void return_to_handler(void); | 22 | extern void return_to_handler(void); |
23 | |||
24 | |||
25 | extern unsigned long return_address(unsigned int); | ||
26 | |||
27 | #define HAVE_ARCH_CALLER_ADDR | ||
28 | |||
29 | #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | ||
30 | #define CALLER_ADDR1 return_address(1) | ||
31 | #define CALLER_ADDR2 return_address(2) | ||
32 | #define CALLER_ADDR3 return_address(3) | ||
33 | #define CALLER_ADDR4 return_address(4) | ||
34 | #define CALLER_ADDR5 return_address(5) | ||
35 | #define CALLER_ADDR6 return_address(6) | ||
36 | |||
23 | #endif /* __ASSEMBLY__ */ | 37 | #endif /* __ASSEMBLY__ */ |
24 | 38 | ||
25 | #endif /* _ASM_PARISC_FTRACE_H */ | 39 | #endif /* _ASM_PARISC_FTRACE_H */ |
diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c index fcd3c707bf12..ec787b411e9a 100644 --- a/arch/parisc/kernel/asm-offsets.c +++ b/arch/parisc/kernel/asm-offsets.c | |||
@@ -244,9 +244,6 @@ int main(void) | |||
244 | DEFINE(THREAD_SZ, sizeof(struct thread_info)); | 244 | DEFINE(THREAD_SZ, sizeof(struct thread_info)); |
245 | DEFINE(THREAD_SZ_ALGN, align(sizeof(struct thread_info), 64)); | 245 | DEFINE(THREAD_SZ_ALGN, align(sizeof(struct thread_info), 64)); |
246 | BLANK(); | 246 | BLANK(); |
247 | DEFINE(IRQSTAT_SIRQ_PEND, offsetof(irq_cpustat_t, __softirq_pending)); | ||
248 | DEFINE(IRQSTAT_SZ, sizeof(irq_cpustat_t)); | ||
249 | BLANK(); | ||
250 | DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base)); | 247 | DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base)); |
251 | DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride)); | 248 | DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride)); |
252 | DEFINE(ICACHE_COUNT, offsetof(struct pdc_cache_info, ic_count)); | 249 | DEFINE(ICACHE_COUNT, offsetof(struct pdc_cache_info, ic_count)); |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index f47465e8d040..efbcee5d2220 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -145,7 +145,7 @@ static int cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | |||
145 | #endif | 145 | #endif |
146 | 146 | ||
147 | static struct irq_chip cpu_interrupt_type = { | 147 | static struct irq_chip cpu_interrupt_type = { |
148 | .typename = "CPU", | 148 | .name = "CPU", |
149 | .startup = cpu_startup_irq, | 149 | .startup = cpu_startup_irq, |
150 | .shutdown = cpu_disable_irq, | 150 | .shutdown = cpu_disable_irq, |
151 | .enable = cpu_enable_irq, | 151 | .enable = cpu_enable_irq, |
@@ -192,7 +192,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
192 | seq_printf(p, "%10u ", kstat_irqs(i)); | 192 | seq_printf(p, "%10u ", kstat_irqs(i)); |
193 | #endif | 193 | #endif |
194 | 194 | ||
195 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 195 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
196 | #ifndef PARISC_IRQ_CR16_COUNTS | 196 | #ifndef PARISC_IRQ_CR16_COUNTS |
197 | seq_printf(p, " %s", action->name); | 197 | seq_printf(p, " %s", action->name); |
198 | 198 | ||
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index e8467e4aa8d1..fb37ac52e46c 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/stddef.h> | 26 | #include <linux/stddef.h> |
27 | #include <linux/compat.h> | 27 | #include <linux/compat.h> |
28 | #include <linux/elf.h> | 28 | #include <linux/elf.h> |
29 | #include <linux/tracehook.h> | ||
30 | #include <asm/ucontext.h> | 29 | #include <asm/ucontext.h> |
31 | #include <asm/rt_sigframe.h> | 30 | #include <asm/rt_sigframe.h> |
32 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 1fd0f0cec037..3f2fce8ce6b6 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -60,8 +60,6 @@ static int smp_debug_lvl = 0; | |||
60 | #define smp_debug(lvl, ...) do { } while(0) | 60 | #define smp_debug(lvl, ...) do { } while(0) |
61 | #endif /* DEBUG_SMP */ | 61 | #endif /* DEBUG_SMP */ |
62 | 62 | ||
63 | DEFINE_SPINLOCK(smp_lock); | ||
64 | |||
65 | volatile struct task_struct *smp_init_current_idle_task; | 63 | volatile struct task_struct *smp_init_current_idle_task; |
66 | 64 | ||
67 | /* track which CPU is booting */ | 65 | /* track which CPU is booting */ |
@@ -69,7 +67,7 @@ static volatile int cpu_now_booting __cpuinitdata; | |||
69 | 67 | ||
70 | static int parisc_max_cpus __cpuinitdata = 1; | 68 | static int parisc_max_cpus __cpuinitdata = 1; |
71 | 69 | ||
72 | DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED; | 70 | static DEFINE_PER_CPU(spinlock_t, ipi_lock); |
73 | 71 | ||
74 | enum ipi_message_type { | 72 | enum ipi_message_type { |
75 | IPI_NOP=0, | 73 | IPI_NOP=0, |
@@ -438,6 +436,11 @@ void __init smp_prepare_boot_cpu(void) | |||
438 | */ | 436 | */ |
439 | void __init smp_prepare_cpus(unsigned int max_cpus) | 437 | void __init smp_prepare_cpus(unsigned int max_cpus) |
440 | { | 438 | { |
439 | int cpu; | ||
440 | |||
441 | for_each_possible_cpu(cpu) | ||
442 | spin_lock_init(&per_cpu(ipi_lock, cpu)); | ||
443 | |||
441 | init_cpu_present(cpumask_of(0)); | 444 | init_cpu_present(cpumask_of(0)); |
442 | 445 | ||
443 | parisc_max_cpus = max_cpus; | 446 | parisc_max_cpus = max_cpus; |
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index a36799e85693..d58eac1a8288 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
15 | #include <linux/kallsyms.h> | 15 | #include <linux/kallsyms.h> |
16 | #include <linux/sort.h> | ||
16 | 17 | ||
17 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
18 | #include <asm/assembly.h> | 19 | #include <asm/assembly.h> |
@@ -115,24 +116,18 @@ unwind_table_init(struct unwind_table *table, const char *name, | |||
115 | } | 116 | } |
116 | } | 117 | } |
117 | 118 | ||
119 | static int cmp_unwind_table_entry(const void *a, const void *b) | ||
120 | { | ||
121 | return ((const struct unwind_table_entry *)a)->region_start | ||
122 | - ((const struct unwind_table_entry *)b)->region_start; | ||
123 | } | ||
124 | |||
118 | static void | 125 | static void |
119 | unwind_table_sort(struct unwind_table_entry *start, | 126 | unwind_table_sort(struct unwind_table_entry *start, |
120 | struct unwind_table_entry *finish) | 127 | struct unwind_table_entry *finish) |
121 | { | 128 | { |
122 | struct unwind_table_entry el, *p, *q; | 129 | sort(start, finish - start, sizeof(struct unwind_table_entry), |
123 | 130 | cmp_unwind_table_entry, NULL); | |
124 | for (p = start + 1; p < finish; ++p) { | ||
125 | if (p[0].region_start < p[-1].region_start) { | ||
126 | el = *p; | ||
127 | q = p; | ||
128 | do { | ||
129 | q[0] = q[-1]; | ||
130 | --q; | ||
131 | } while (q > start && | ||
132 | el.region_start < q[-1].region_start); | ||
133 | *q = el; | ||
134 | } | ||
135 | } | ||
136 | } | 131 | } |
137 | 132 | ||
138 | struct unwind_table * | 133 | struct unwind_table * |
@@ -417,3 +412,30 @@ int unwind_to_user(struct unwind_frame_info *info) | |||
417 | 412 | ||
418 | return ret; | 413 | return ret; |
419 | } | 414 | } |
415 | |||
416 | unsigned long return_address(unsigned int level) | ||
417 | { | ||
418 | struct unwind_frame_info info; | ||
419 | struct pt_regs r; | ||
420 | unsigned long sp; | ||
421 | |||
422 | /* initialize unwind info */ | ||
423 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | ||
424 | memset(&r, 0, sizeof(struct pt_regs)); | ||
425 | r.iaoq[0] = (unsigned long) current_text_addr(); | ||
426 | r.gr[2] = (unsigned long) __builtin_return_address(0); | ||
427 | r.gr[30] = sp; | ||
428 | unwind_frame_init(&info, current, &r); | ||
429 | |||
430 | /* unwind stack */ | ||
431 | ++level; | ||
432 | do { | ||
433 | if (unwind_once(&info) < 0 || info.ip == 0) | ||
434 | return 0; | ||
435 | if (!__kernel_text_address(info.ip)) { | ||
436 | return 0; | ||
437 | } | ||
438 | } while (info.ip && level--); | ||
439 | |||
440 | return info.ip; | ||
441 | } | ||