diff options
-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 | ||||
-rw-r--r-- | drivers/parisc/dino.c | 2 | ||||
-rw-r--r-- | drivers/parisc/eisa.c | 2 | ||||
-rw-r--r-- | drivers/parisc/gsc.c | 2 | ||||
-rw-r--r-- | drivers/parisc/iosapic.c | 2 | ||||
-rw-r--r-- | drivers/parisc/led.c | 59 | ||||
-rw-r--r-- | drivers/parisc/superio.c | 2 |
13 files changed, 94 insertions, 60 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 | } | ||
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index d69bde6a2343..c542c7bb7454 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
@@ -354,7 +354,7 @@ static unsigned int dino_startup_irq(unsigned int irq) | |||
354 | } | 354 | } |
355 | 355 | ||
356 | static struct irq_chip dino_interrupt_type = { | 356 | static struct irq_chip dino_interrupt_type = { |
357 | .typename = "GSC-PCI", | 357 | .name = "GSC-PCI", |
358 | .startup = dino_startup_irq, | 358 | .startup = dino_startup_irq, |
359 | .shutdown = dino_disable_irq, | 359 | .shutdown = dino_disable_irq, |
360 | .enable = dino_enable_irq, | 360 | .enable = dino_enable_irq, |
diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 51220749cb65..46f503fb7fc5 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c | |||
@@ -189,7 +189,7 @@ static unsigned int eisa_startup_irq(unsigned int irq) | |||
189 | } | 189 | } |
190 | 190 | ||
191 | static struct irq_chip eisa_interrupt_type = { | 191 | static struct irq_chip eisa_interrupt_type = { |
192 | .typename = "EISA", | 192 | .name = "EISA", |
193 | .startup = eisa_startup_irq, | 193 | .startup = eisa_startup_irq, |
194 | .shutdown = eisa_disable_irq, | 194 | .shutdown = eisa_disable_irq, |
195 | .enable = eisa_enable_irq, | 195 | .enable = eisa_enable_irq, |
diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index 647adc9f85ad..c4e1f3c3c2fa 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c | |||
@@ -149,7 +149,7 @@ static unsigned int gsc_asic_startup_irq(unsigned int irq) | |||
149 | } | 149 | } |
150 | 150 | ||
151 | static struct irq_chip gsc_asic_interrupt_type = { | 151 | static struct irq_chip gsc_asic_interrupt_type = { |
152 | .typename = "GSC-ASIC", | 152 | .name = "GSC-ASIC", |
153 | .startup = gsc_asic_startup_irq, | 153 | .startup = gsc_asic_startup_irq, |
154 | .shutdown = gsc_asic_disable_irq, | 154 | .shutdown = gsc_asic_disable_irq, |
155 | .enable = gsc_asic_enable_irq, | 155 | .enable = gsc_asic_enable_irq, |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 88e333553212..c76836727cae 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -730,7 +730,7 @@ static int iosapic_set_affinity_irq(unsigned int irq, | |||
730 | #endif | 730 | #endif |
731 | 731 | ||
732 | static struct irq_chip iosapic_interrupt_type = { | 732 | static struct irq_chip iosapic_interrupt_type = { |
733 | .typename = "IO-SAPIC-level", | 733 | .name = "IO-SAPIC-level", |
734 | .startup = iosapic_startup_irq, | 734 | .startup = iosapic_startup_irq, |
735 | .shutdown = iosapic_disable_irq, | 735 | .shutdown = iosapic_disable_irq, |
736 | .enable = iosapic_enable_irq, | 736 | .enable = iosapic_enable_irq, |
diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 79caf1ca4a29..188bc8496a26 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/kernel_stat.h> | 38 | #include <linux/kernel_stat.h> |
39 | #include <linux/reboot.h> | 39 | #include <linux/reboot.h> |
40 | #include <linux/proc_fs.h> | 40 | #include <linux/proc_fs.h> |
41 | #include <linux/seq_file.h> | ||
41 | #include <linux/ctype.h> | 42 | #include <linux/ctype.h> |
42 | #include <linux/blkdev.h> | 43 | #include <linux/blkdev.h> |
43 | #include <linux/workqueue.h> | 44 | #include <linux/workqueue.h> |
@@ -147,41 +148,34 @@ device_initcall(start_task); | |||
147 | static void (*led_func_ptr) (unsigned char) __read_mostly; | 148 | static void (*led_func_ptr) (unsigned char) __read_mostly; |
148 | 149 | ||
149 | #ifdef CONFIG_PROC_FS | 150 | #ifdef CONFIG_PROC_FS |
150 | static int led_proc_read(char *page, char **start, off_t off, int count, | 151 | static int led_proc_show(struct seq_file *m, void *v) |
151 | int *eof, void *data) | ||
152 | { | 152 | { |
153 | char *out = page; | 153 | switch ((long)m->private) |
154 | int len; | ||
155 | |||
156 | switch ((long)data) | ||
157 | { | 154 | { |
158 | case LED_NOLCD: | 155 | case LED_NOLCD: |
159 | out += sprintf(out, "Heartbeat: %d\n", led_heartbeat); | 156 | seq_printf(m, "Heartbeat: %d\n", led_heartbeat); |
160 | out += sprintf(out, "Disk IO: %d\n", led_diskio); | 157 | seq_printf(m, "Disk IO: %d\n", led_diskio); |
161 | out += sprintf(out, "LAN Rx/Tx: %d\n", led_lanrxtx); | 158 | seq_printf(m, "LAN Rx/Tx: %d\n", led_lanrxtx); |
162 | break; | 159 | break; |
163 | case LED_HASLCD: | 160 | case LED_HASLCD: |
164 | out += sprintf(out, "%s\n", lcd_text); | 161 | seq_printf(m, "%s\n", lcd_text); |
165 | break; | 162 | break; |
166 | default: | 163 | default: |
167 | *eof = 1; | ||
168 | return 0; | 164 | return 0; |
169 | } | 165 | } |
166 | return 0; | ||
167 | } | ||
170 | 168 | ||
171 | len = out - page - off; | 169 | static int led_proc_open(struct inode *inode, struct file *file) |
172 | if (len < count) { | 170 | { |
173 | *eof = 1; | 171 | return single_open(file, led_proc_show, PDE(inode)->data); |
174 | if (len <= 0) return 0; | ||
175 | } else { | ||
176 | len = count; | ||
177 | } | ||
178 | *start = page + off; | ||
179 | return len; | ||
180 | } | 172 | } |
181 | 173 | ||
182 | static int led_proc_write(struct file *file, const char *buf, | 174 | |
183 | unsigned long count, void *data) | 175 | static ssize_t led_proc_write(struct file *file, const char *buf, |
176 | size_t count, loff_t *pos) | ||
184 | { | 177 | { |
178 | void *data = PDE(file->f_path.dentry->d_inode)->data; | ||
185 | char *cur, lbuf[count + 1]; | 179 | char *cur, lbuf[count + 1]; |
186 | int d; | 180 | int d; |
187 | 181 | ||
@@ -234,6 +228,15 @@ parse_error: | |||
234 | return -EINVAL; | 228 | return -EINVAL; |
235 | } | 229 | } |
236 | 230 | ||
231 | static const struct file_operations led_proc_fops = { | ||
232 | .owner = THIS_MODULE, | ||
233 | .open = led_proc_open, | ||
234 | .read = seq_read, | ||
235 | .llseek = seq_lseek, | ||
236 | .release = single_release, | ||
237 | .write = led_proc_write, | ||
238 | }; | ||
239 | |||
237 | static int __init led_create_procfs(void) | 240 | static int __init led_create_procfs(void) |
238 | { | 241 | { |
239 | struct proc_dir_entry *proc_pdc_root = NULL; | 242 | struct proc_dir_entry *proc_pdc_root = NULL; |
@@ -243,19 +246,15 @@ static int __init led_create_procfs(void) | |||
243 | 246 | ||
244 | proc_pdc_root = proc_mkdir("pdc", 0); | 247 | proc_pdc_root = proc_mkdir("pdc", 0); |
245 | if (!proc_pdc_root) return -1; | 248 | if (!proc_pdc_root) return -1; |
246 | ent = create_proc_entry("led", S_IFREG|S_IRUGO|S_IWUSR, proc_pdc_root); | 249 | ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root, |
250 | &led_proc_fops, (void *)LED_NOLCD); /* LED */ | ||
247 | if (!ent) return -1; | 251 | if (!ent) return -1; |
248 | ent->data = (void *)LED_NOLCD; /* LED */ | ||
249 | ent->read_proc = led_proc_read; | ||
250 | ent->write_proc = led_proc_write; | ||
251 | 252 | ||
252 | if (led_type == LED_HASLCD) | 253 | if (led_type == LED_HASLCD) |
253 | { | 254 | { |
254 | ent = create_proc_entry("lcd", S_IFREG|S_IRUGO|S_IWUSR, proc_pdc_root); | 255 | ent = proc_create_data("lcd", S_IRUGO|S_IWUSR, proc_pdc_root, |
256 | &led_proc_fops, (void *)LED_HASLCD); /* LCD */ | ||
255 | if (!ent) return -1; | 257 | if (!ent) return -1; |
256 | ent->data = (void *)LED_HASLCD; /* LCD */ | ||
257 | ent->read_proc = led_proc_read; | ||
258 | ent->write_proc = led_proc_write; | ||
259 | } | 258 | } |
260 | 259 | ||
261 | return 0; | 260 | return 0; |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 675f04e6597a..a35c9c5b89e8 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
@@ -326,7 +326,7 @@ static unsigned int superio_startup_irq(unsigned int irq) | |||
326 | } | 326 | } |
327 | 327 | ||
328 | static struct irq_chip superio_interrupt_type = { | 328 | static struct irq_chip superio_interrupt_type = { |
329 | .typename = SUPERIO, | 329 | .name = SUPERIO, |
330 | .startup = superio_startup_irq, | 330 | .startup = superio_startup_irq, |
331 | .shutdown = superio_disable_irq, | 331 | .shutdown = superio_disable_irq, |
332 | .enable = superio_enable_irq, | 332 | .enable = superio_enable_irq, |