diff options
Diffstat (limited to 'arch/sparc64/kernel')
31 files changed, 184 insertions, 224 deletions
diff --git a/arch/sparc64/kernel/central.c b/arch/sparc64/kernel/central.c index b61b8dfb09cf..f2e87d0d7e1d 100644 --- a/arch/sparc64/kernel/central.c +++ b/arch/sparc64/kernel/central.c | |||
@@ -16,8 +16,8 @@ | |||
16 | #include <asm/fhc.h> | 16 | #include <asm/fhc.h> |
17 | #include <asm/starfire.h> | 17 | #include <asm/starfire.h> |
18 | 18 | ||
19 | struct linux_central *central_bus = NULL; | 19 | static struct linux_central *central_bus = NULL; |
20 | struct linux_fhc *fhc_list = NULL; | 20 | static struct linux_fhc *fhc_list = NULL; |
21 | 21 | ||
22 | #define IS_CENTRAL_FHC(__fhc) ((__fhc) == central_bus->child) | 22 | #define IS_CENTRAL_FHC(__fhc) ((__fhc) == central_bus->child) |
23 | 23 | ||
@@ -79,9 +79,9 @@ static void adjust_regs(struct linux_prom_registers *regp, int nregs, | |||
79 | } | 79 | } |
80 | 80 | ||
81 | /* Apply probed fhc ranges to registers passed, if no ranges return. */ | 81 | /* Apply probed fhc ranges to registers passed, if no ranges return. */ |
82 | void apply_fhc_ranges(struct linux_fhc *fhc, | 82 | static void apply_fhc_ranges(struct linux_fhc *fhc, |
83 | struct linux_prom_registers *regs, | 83 | struct linux_prom_registers *regs, |
84 | int nregs) | 84 | int nregs) |
85 | { | 85 | { |
86 | if (fhc->num_fhc_ranges) | 86 | if (fhc->num_fhc_ranges) |
87 | adjust_regs(regs, nregs, fhc->fhc_ranges, | 87 | adjust_regs(regs, nregs, fhc->fhc_ranges, |
@@ -89,8 +89,8 @@ void apply_fhc_ranges(struct linux_fhc *fhc, | |||
89 | } | 89 | } |
90 | 90 | ||
91 | /* Apply probed central ranges to registers passed, if no ranges return. */ | 91 | /* Apply probed central ranges to registers passed, if no ranges return. */ |
92 | void apply_central_ranges(struct linux_central *central, | 92 | static void apply_central_ranges(struct linux_central *central, |
93 | struct linux_prom_registers *regs, int nregs) | 93 | struct linux_prom_registers *regs, int nregs) |
94 | { | 94 | { |
95 | if (central->num_central_ranges) | 95 | if (central->num_central_ranges) |
96 | adjust_regs(regs, nregs, central->central_ranges, | 96 | adjust_regs(regs, nregs, central->central_ranges, |
diff --git a/arch/sparc64/kernel/compat_audit.c b/arch/sparc64/kernel/compat_audit.c index c1979482aa92..c831b0a4e660 100644 --- a/arch/sparc64/kernel/compat_audit.c +++ b/arch/sparc64/kernel/compat_audit.c | |||
@@ -1,4 +1,4 @@ | |||
1 | #include <asm-sparc/unistd.h> | 1 | #include <asm/unistd_32.h> |
2 | 2 | ||
3 | unsigned sparc32_dir_class[] = { | 3 | unsigned sparc32_dir_class[] = { |
4 | #include <asm-generic/audit_dir_write.h> | 4 | #include <asm-generic/audit_dir_write.h> |
diff --git a/arch/sparc64/kernel/ds.c b/arch/sparc64/kernel/ds.c index edb74f5a1186..d0fa5aa38934 100644 --- a/arch/sparc64/kernel/ds.c +++ b/arch/sparc64/kernel/ds.c | |||
@@ -159,7 +159,7 @@ static void ds_var_data(struct ds_info *dp, | |||
159 | struct ds_cap_state *cp, | 159 | struct ds_cap_state *cp, |
160 | void *buf, int len); | 160 | void *buf, int len); |
161 | 161 | ||
162 | struct ds_cap_state ds_states_template[] = { | 162 | static struct ds_cap_state ds_states_template[] = { |
163 | { | 163 | { |
164 | .service_id = "md-update", | 164 | .service_id = "md-update", |
165 | .data = md_update_data, | 165 | .data = md_update_data, |
diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c index c49d0388b793..4d58d7ce708d 100644 --- a/arch/sparc64/kernel/ebus.c +++ b/arch/sparc64/kernel/ebus.c | |||
@@ -401,7 +401,7 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de | |||
401 | dev->ofdev.node = dp; | 401 | dev->ofdev.node = dp; |
402 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; | 402 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; |
403 | dev->ofdev.dev.bus = &ebus_bus_type; | 403 | dev->ofdev.dev.bus = &ebus_bus_type; |
404 | sprintf(dev->ofdev.dev.bus_id, "ebus[%08x]", dp->node); | 404 | dev_set_name(&dev->ofdev.dev, "ebus[%08x]", dp->node); |
405 | 405 | ||
406 | /* Register with core */ | 406 | /* Register with core */ |
407 | if (of_device_register(&dev->ofdev) != 0) | 407 | if (of_device_register(&dev->ofdev) != 0) |
@@ -501,7 +501,7 @@ void __init ebus_init(void) | |||
501 | ebus->ofdev.node = dp; | 501 | ebus->ofdev.node = dp; |
502 | ebus->ofdev.dev.parent = &pdev->dev; | 502 | ebus->ofdev.dev.parent = &pdev->dev; |
503 | ebus->ofdev.dev.bus = &ebus_bus_type; | 503 | ebus->ofdev.dev.bus = &ebus_bus_type; |
504 | sprintf(ebus->ofdev.dev.bus_id, "ebus%d", num_ebus); | 504 | dev_set_name(&ebus->ofdev.dev, "ebus%d", num_ebus); |
505 | 505 | ||
506 | /* Register with core */ | 506 | /* Register with core */ |
507 | if (of_device_register(&ebus->ofdev) != 0) | 507 | if (of_device_register(&ebus->ofdev) != 0) |
diff --git a/arch/sparc64/kernel/entry.h b/arch/sparc64/kernel/entry.h index 32fbab620852..fc294a292899 100644 --- a/arch/sparc64/kernel/entry.h +++ b/arch/sparc64/kernel/entry.h | |||
@@ -22,8 +22,7 @@ extern void do_notify_resume(struct pt_regs *regs, | |||
22 | unsigned long orig_i0, | 22 | unsigned long orig_i0, |
23 | unsigned long thread_info_flags); | 23 | unsigned long thread_info_flags); |
24 | 24 | ||
25 | extern asmlinkage void syscall_trace(struct pt_regs *regs, | 25 | extern asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p); |
26 | int syscall_exit_p); | ||
27 | 26 | ||
28 | extern void bad_trap_tl1(struct pt_regs *regs, long lvl); | 27 | extern void bad_trap_tl1(struct pt_regs *regs, long lvl); |
29 | 28 | ||
diff --git a/arch/sparc64/kernel/hvapi.c b/arch/sparc64/kernel/hvapi.c index f34f5d6181ef..691760b5b012 100644 --- a/arch/sparc64/kernel/hvapi.c +++ b/arch/sparc64/kernel/hvapi.c | |||
@@ -34,8 +34,12 @@ static struct api_info api_table[] = { | |||
34 | { .group = HV_GRP_LDOM, }, | 34 | { .group = HV_GRP_LDOM, }, |
35 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, | 35 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, |
36 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, | 36 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, |
37 | { .group = HV_GRP_RNG, }, | ||
37 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, | 38 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, |
38 | { .group = HV_GRP_FIRE_PERF, }, | 39 | { .group = HV_GRP_FIRE_PERF, }, |
40 | { .group = HV_GRP_N2_CPU, }, | ||
41 | { .group = HV_GRP_NIU, }, | ||
42 | { .group = HV_GRP_VF_CPU, }, | ||
39 | { .group = HV_GRP_DIAG, .flags = FLAG_PRE_API }, | 43 | { .group = HV_GRP_DIAG, .flags = FLAG_PRE_API }, |
40 | }; | 44 | }; |
41 | 45 | ||
diff --git a/arch/sparc64/kernel/iommu_common.h b/arch/sparc64/kernel/iommu_common.h index f3575a614fa2..53b19c8231a9 100644 --- a/arch/sparc64/kernel/iommu_common.h +++ b/arch/sparc64/kernel/iommu_common.h | |||
@@ -23,7 +23,7 @@ | |||
23 | #define IO_PAGE_SHIFT 13 | 23 | #define IO_PAGE_SHIFT 13 |
24 | #define IO_PAGE_SIZE (1UL << IO_PAGE_SHIFT) | 24 | #define IO_PAGE_SIZE (1UL << IO_PAGE_SHIFT) |
25 | #define IO_PAGE_MASK (~(IO_PAGE_SIZE-1)) | 25 | #define IO_PAGE_MASK (~(IO_PAGE_SIZE-1)) |
26 | #define IO_PAGE_ALIGN(addr) (((addr)+IO_PAGE_SIZE-1)&IO_PAGE_MASK) | 26 | #define IO_PAGE_ALIGN(addr) ALIGN(addr, IO_PAGE_SIZE) |
27 | 27 | ||
28 | #define IO_TSB_ENTRIES (128*1024) | 28 | #define IO_TSB_ENTRIES (128*1024) |
29 | #define IO_TSB_SIZE (IO_TSB_ENTRIES * 8) | 29 | #define IO_TSB_SIZE (IO_TSB_ENTRIES * 8) |
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index b441a26b73b0..c481673d249c 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
@@ -621,8 +621,9 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino) | |||
621 | unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) | 621 | unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) |
622 | { | 622 | { |
623 | struct irq_handler_data *data; | 623 | struct irq_handler_data *data; |
624 | struct ino_bucket *bucket; | ||
625 | unsigned long hv_err, cookie; | 624 | unsigned long hv_err, cookie; |
625 | struct ino_bucket *bucket; | ||
626 | struct irq_desc *desc; | ||
626 | unsigned int virt_irq; | 627 | unsigned int virt_irq; |
627 | 628 | ||
628 | bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC); | 629 | bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC); |
@@ -643,6 +644,13 @@ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) | |||
643 | if (unlikely(!data)) | 644 | if (unlikely(!data)) |
644 | return 0; | 645 | return 0; |
645 | 646 | ||
647 | /* In order to make the LDC channel startup sequence easier, | ||
648 | * especially wrt. locking, we do not let request_irq() enable | ||
649 | * the interrupt. | ||
650 | */ | ||
651 | desc = irq_desc + virt_irq; | ||
652 | desc->status |= IRQ_NOAUTOEN; | ||
653 | |||
646 | set_irq_chip_data(virt_irq, data); | 654 | set_irq_chip_data(virt_irq, data); |
647 | 655 | ||
648 | /* Catch accidental accesses to these things. IMAP/ICLR handling | 656 | /* Catch accidental accesses to these things. IMAP/ICLR handling |
diff --git a/arch/sparc64/kernel/kprobes.c b/arch/sparc64/kernel/kprobes.c index f43b5d755354..201a6e547e4a 100644 --- a/arch/sparc64/kernel/kprobes.c +++ b/arch/sparc64/kernel/kprobes.c | |||
@@ -478,9 +478,9 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
478 | return 0; | 478 | return 0; |
479 | } | 479 | } |
480 | 480 | ||
481 | /* Called with kretprobe_lock held. The value stored in the return | 481 | /* The value stored in the return address register is actually 2 |
482 | * address register is actually 2 instructions before where the | 482 | * instructions before where the callee will return to. |
483 | * callee will return to. Sequences usually look something like this | 483 | * Sequences usually look something like this |
484 | * | 484 | * |
485 | * call some_function <--- return register points here | 485 | * call some_function <--- return register points here |
486 | * nop <--- call delay slot | 486 | * nop <--- call delay slot |
@@ -512,8 +512,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
512 | unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline; | 512 | unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline; |
513 | 513 | ||
514 | INIT_HLIST_HEAD(&empty_rp); | 514 | INIT_HLIST_HEAD(&empty_rp); |
515 | spin_lock_irqsave(&kretprobe_lock, flags); | 515 | kretprobe_hash_lock(current, &head, &flags); |
516 | head = kretprobe_inst_table_head(current); | ||
517 | 516 | ||
518 | /* | 517 | /* |
519 | * It is possible to have multiple instances associated with a given | 518 | * It is possible to have multiple instances associated with a given |
@@ -553,7 +552,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
553 | regs->tnpc = orig_ret_address + 4; | 552 | regs->tnpc = orig_ret_address + 4; |
554 | 553 | ||
555 | reset_current_kprobe(); | 554 | reset_current_kprobe(); |
556 | spin_unlock_irqrestore(&kretprobe_lock, flags); | 555 | kretprobe_hash_unlock(current, &flags); |
557 | preempt_enable_no_resched(); | 556 | preempt_enable_no_resched(); |
558 | 557 | ||
559 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { | 558 | hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { |
diff --git a/arch/sparc64/kernel/ldc.c b/arch/sparc64/kernel/ldc.c index 63969f610284..d68982330f66 100644 --- a/arch/sparc64/kernel/ldc.c +++ b/arch/sparc64/kernel/ldc.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* ldc.c: Logical Domain Channel link-layer protocol driver. | 1 | /* ldc.c: Logical Domain Channel link-layer protocol driver. |
2 | * | 2 | * |
3 | * Copyright (C) 2007 David S. Miller <davem@davemloft.net> | 3 | * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
@@ -23,8 +23,8 @@ | |||
23 | 23 | ||
24 | #define DRV_MODULE_NAME "ldc" | 24 | #define DRV_MODULE_NAME "ldc" |
25 | #define PFX DRV_MODULE_NAME ": " | 25 | #define PFX DRV_MODULE_NAME ": " |
26 | #define DRV_MODULE_VERSION "1.0" | 26 | #define DRV_MODULE_VERSION "1.1" |
27 | #define DRV_MODULE_RELDATE "June 25, 2007" | 27 | #define DRV_MODULE_RELDATE "July 22, 2008" |
28 | 28 | ||
29 | static char version[] __devinitdata = | 29 | static char version[] __devinitdata = |
30 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 30 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
@@ -1235,13 +1235,9 @@ int ldc_bind(struct ldc_channel *lp, const char *name) | |||
1235 | unsigned long hv_err, flags; | 1235 | unsigned long hv_err, flags; |
1236 | int err = -EINVAL; | 1236 | int err = -EINVAL; |
1237 | 1237 | ||
1238 | spin_lock_irqsave(&lp->lock, flags); | 1238 | if (!name || |
1239 | 1239 | (lp->state != LDC_STATE_INIT)) | |
1240 | if (!name) | 1240 | return -EINVAL; |
1241 | goto out_err; | ||
1242 | |||
1243 | if (lp->state != LDC_STATE_INIT) | ||
1244 | goto out_err; | ||
1245 | 1241 | ||
1246 | snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name); | 1242 | snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name); |
1247 | snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name); | 1243 | snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name); |
@@ -1250,25 +1246,32 @@ int ldc_bind(struct ldc_channel *lp, const char *name) | |||
1250 | IRQF_SAMPLE_RANDOM | IRQF_SHARED, | 1246 | IRQF_SAMPLE_RANDOM | IRQF_SHARED, |
1251 | lp->rx_irq_name, lp); | 1247 | lp->rx_irq_name, lp); |
1252 | if (err) | 1248 | if (err) |
1253 | goto out_err; | 1249 | return err; |
1254 | 1250 | ||
1255 | err = request_irq(lp->cfg.tx_irq, ldc_tx, | 1251 | err = request_irq(lp->cfg.tx_irq, ldc_tx, |
1256 | IRQF_SAMPLE_RANDOM | IRQF_SHARED, | 1252 | IRQF_SAMPLE_RANDOM | IRQF_SHARED, |
1257 | lp->tx_irq_name, lp); | 1253 | lp->tx_irq_name, lp); |
1258 | if (err) | 1254 | if (err) { |
1259 | goto out_free_rx_irq; | 1255 | free_irq(lp->cfg.rx_irq, lp); |
1256 | return err; | ||
1257 | } | ||
1258 | |||
1260 | 1259 | ||
1260 | spin_lock_irqsave(&lp->lock, flags); | ||
1261 | |||
1262 | enable_irq(lp->cfg.rx_irq); | ||
1263 | enable_irq(lp->cfg.tx_irq); | ||
1261 | 1264 | ||
1262 | lp->flags |= LDC_FLAG_REGISTERED_IRQS; | 1265 | lp->flags |= LDC_FLAG_REGISTERED_IRQS; |
1263 | 1266 | ||
1264 | err = -ENODEV; | 1267 | err = -ENODEV; |
1265 | hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0); | 1268 | hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0); |
1266 | if (hv_err) | 1269 | if (hv_err) |
1267 | goto out_free_tx_irq; | 1270 | goto out_free_irqs; |
1268 | 1271 | ||
1269 | hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries); | 1272 | hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries); |
1270 | if (hv_err) | 1273 | if (hv_err) |
1271 | goto out_free_tx_irq; | 1274 | goto out_free_irqs; |
1272 | 1275 | ||
1273 | hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0); | 1276 | hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0); |
1274 | if (hv_err) | 1277 | if (hv_err) |
@@ -1304,14 +1307,11 @@ out_unmap_rx: | |||
1304 | out_unmap_tx: | 1307 | out_unmap_tx: |
1305 | sun4v_ldc_tx_qconf(lp->id, 0, 0); | 1308 | sun4v_ldc_tx_qconf(lp->id, 0, 0); |
1306 | 1309 | ||
1307 | out_free_tx_irq: | 1310 | out_free_irqs: |
1308 | lp->flags &= ~LDC_FLAG_REGISTERED_IRQS; | 1311 | lp->flags &= ~LDC_FLAG_REGISTERED_IRQS; |
1309 | free_irq(lp->cfg.tx_irq, lp); | 1312 | free_irq(lp->cfg.tx_irq, lp); |
1310 | |||
1311 | out_free_rx_irq: | ||
1312 | free_irq(lp->cfg.rx_irq, lp); | 1313 | free_irq(lp->cfg.rx_irq, lp); |
1313 | 1314 | ||
1314 | out_err: | ||
1315 | spin_unlock_irqrestore(&lp->lock, flags); | 1315 | spin_unlock_irqrestore(&lp->lock, flags); |
1316 | 1316 | ||
1317 | return err; | 1317 | return err; |
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c index d569f60c24b8..4fd48ab7dda4 100644 --- a/arch/sparc64/kernel/of_device.c +++ b/arch/sparc64/kernel/of_device.c | |||
@@ -797,9 +797,9 @@ static struct of_device * __init scan_one_device(struct device_node *dp, | |||
797 | op->dev.parent = parent; | 797 | op->dev.parent = parent; |
798 | op->dev.bus = &of_platform_bus_type; | 798 | op->dev.bus = &of_platform_bus_type; |
799 | if (!parent) | 799 | if (!parent) |
800 | strcpy(op->dev.bus_id, "root"); | 800 | dev_set_name(&op->dev, "root"); |
801 | else | 801 | else |
802 | sprintf(op->dev.bus_id, "%08x", dp->node); | 802 | dev_set_name(&op->dev, "%08x", dp->node); |
803 | 803 | ||
804 | if (of_device_register(op)) { | 804 | if (of_device_register(op)) { |
805 | printk("%s: Could not register of device.\n", | 805 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index d00a3656c287..55096195458f 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
@@ -408,7 +408,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | |||
408 | dev->class = class >> 8; | 408 | dev->class = class >> 8; |
409 | dev->revision = class & 0xff; | 409 | dev->revision = class & 0xff; |
410 | 410 | ||
411 | sprintf(dev->dev.bus_id, "%04x:%02x:%02x.%d", pci_domain_nr(bus), | 411 | dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
412 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); | 412 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
413 | 413 | ||
414 | if (ofpci_verbose) | 414 | if (ofpci_verbose) |
diff --git a/arch/sparc64/kernel/pci_msi.c b/arch/sparc64/kernel/pci_msi.c index db5e8fd8f674..60c71e350212 100644 --- a/arch/sparc64/kernel/pci_msi.c +++ b/arch/sparc64/kernel/pci_msi.c | |||
@@ -120,9 +120,9 @@ static struct irq_chip msi_irq = { | |||
120 | /* XXX affinity XXX */ | 120 | /* XXX affinity XXX */ |
121 | }; | 121 | }; |
122 | 122 | ||
123 | int sparc64_setup_msi_irq(unsigned int *virt_irq_p, | 123 | static int sparc64_setup_msi_irq(unsigned int *virt_irq_p, |
124 | struct pci_dev *pdev, | 124 | struct pci_dev *pdev, |
125 | struct msi_desc *entry) | 125 | struct msi_desc *entry) |
126 | { | 126 | { |
127 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; | 127 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; |
128 | const struct sparc64_msiq_ops *ops = pbm->msi_ops; | 128 | const struct sparc64_msiq_ops *ops = pbm->msi_ops; |
@@ -179,8 +179,8 @@ out_err: | |||
179 | return err; | 179 | return err; |
180 | } | 180 | } |
181 | 181 | ||
182 | void sparc64_teardown_msi_irq(unsigned int virt_irq, | 182 | static void sparc64_teardown_msi_irq(unsigned int virt_irq, |
183 | struct pci_dev *pdev) | 183 | struct pci_dev *pdev) |
184 | { | 184 | { |
185 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; | 185 | struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; |
186 | const struct sparc64_msiq_ops *ops = pbm->msi_ops; | 186 | const struct sparc64_msiq_ops *ops = pbm->msi_ops; |
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c index e2bb9790039c..a104c80d319d 100644 --- a/arch/sparc64/kernel/pci_sun4v.c +++ b/arch/sparc64/kernel/pci_sun4v.c | |||
@@ -531,7 +531,7 @@ static void dma_4v_sync_sg_for_cpu(struct device *dev, | |||
531 | /* Nothing to do... */ | 531 | /* Nothing to do... */ |
532 | } | 532 | } |
533 | 533 | ||
534 | const struct dma_ops sun4v_dma_ops = { | 534 | static const struct dma_ops sun4v_dma_ops = { |
535 | .alloc_coherent = dma_4v_alloc_coherent, | 535 | .alloc_coherent = dma_4v_alloc_coherent, |
536 | .free_coherent = dma_4v_free_coherent, | 536 | .free_coherent = dma_4v_free_coherent, |
537 | .map_single = dma_4v_map_single, | 537 | .map_single = dma_4v_map_single, |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 2084f81a76e1..8a9cd3e165b9 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/kallsyms.h> | ||
19 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
20 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
21 | #include <linux/smp.h> | 20 | #include <linux/smp.h> |
@@ -97,7 +96,7 @@ void cpu_idle(void) | |||
97 | set_thread_flag(TIF_POLLING_NRFLAG); | 96 | set_thread_flag(TIF_POLLING_NRFLAG); |
98 | 97 | ||
99 | while(1) { | 98 | while(1) { |
100 | tick_nohz_stop_sched_tick(); | 99 | tick_nohz_stop_sched_tick(1); |
101 | 100 | ||
102 | while (!need_resched() && !cpu_is_offline(cpu)) | 101 | while (!need_resched() && !cpu_is_offline(cpu)) |
103 | sparc64_yield(cpu); | 102 | sparc64_yield(cpu); |
@@ -211,7 +210,7 @@ static void show_regwindow(struct pt_regs *regs) | |||
211 | printk("i4: %016lx i5: %016lx i6: %016lx i7: %016lx\n", | 210 | printk("i4: %016lx i5: %016lx i6: %016lx i7: %016lx\n", |
212 | rwk->ins[4], rwk->ins[5], rwk->ins[6], rwk->ins[7]); | 211 | rwk->ins[4], rwk->ins[5], rwk->ins[6], rwk->ins[7]); |
213 | if (regs->tstate & TSTATE_PRIV) | 212 | if (regs->tstate & TSTATE_PRIV) |
214 | print_symbol("I7: <%s>\n", rwk->ins[7]); | 213 | printk("I7: <%pS>\n", (void *) rwk->ins[7]); |
215 | } | 214 | } |
216 | 215 | ||
217 | #ifdef CONFIG_SMP | 216 | #ifdef CONFIG_SMP |
@@ -232,7 +231,7 @@ void __show_regs(struct pt_regs * regs) | |||
232 | #endif | 231 | #endif |
233 | printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x %s\n", regs->tstate, | 232 | printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x %s\n", regs->tstate, |
234 | regs->tpc, regs->tnpc, regs->y, print_tainted()); | 233 | regs->tpc, regs->tnpc, regs->y, print_tainted()); |
235 | print_symbol("TPC: <%s>\n", regs->tpc); | 234 | printk("TPC: <%pS>\n", (void *) regs->tpc); |
236 | printk("g0: %016lx g1: %016lx g2: %016lx g3: %016lx\n", | 235 | printk("g0: %016lx g1: %016lx g2: %016lx g3: %016lx\n", |
237 | regs->u_regs[0], regs->u_regs[1], regs->u_regs[2], | 236 | regs->u_regs[0], regs->u_regs[1], regs->u_regs[2], |
238 | regs->u_regs[3]); | 237 | regs->u_regs[3]); |
@@ -245,7 +244,7 @@ void __show_regs(struct pt_regs * regs) | |||
245 | printk("o4: %016lx o5: %016lx sp: %016lx ret_pc: %016lx\n", | 244 | printk("o4: %016lx o5: %016lx sp: %016lx ret_pc: %016lx\n", |
246 | regs->u_regs[12], regs->u_regs[13], regs->u_regs[14], | 245 | regs->u_regs[12], regs->u_regs[13], regs->u_regs[14], |
247 | regs->u_regs[15]); | 246 | regs->u_regs[15]); |
248 | print_symbol("RPC: <%s>\n", regs->u_regs[15]); | 247 | printk("RPC: <%pS>\n", (void *) regs->u_regs[15]); |
249 | show_regwindow(regs); | 248 | show_regwindow(regs); |
250 | #ifdef CONFIG_SMP | 249 | #ifdef CONFIG_SMP |
251 | spin_unlock(®dump_lock); | 250 | spin_unlock(®dump_lock); |
@@ -346,9 +345,6 @@ static void sysrq_handle_globreg(int key, struct tty_struct *tty) | |||
346 | { | 345 | { |
347 | struct thread_info *tp = current_thread_info(); | 346 | struct thread_info *tp = current_thread_info(); |
348 | struct pt_regs *regs = get_irq_regs(); | 347 | struct pt_regs *regs = get_irq_regs(); |
349 | #ifdef CONFIG_KALLSYMS | ||
350 | char buffer[KSYM_SYMBOL_LEN]; | ||
351 | #endif | ||
352 | unsigned long flags; | 348 | unsigned long flags; |
353 | int this_cpu, cpu; | 349 | int this_cpu, cpu; |
354 | 350 | ||
@@ -377,17 +373,13 @@ static void sysrq_handle_globreg(int key, struct tty_struct *tty) | |||
377 | gp->tstate, gp->tpc, gp->tnpc, | 373 | gp->tstate, gp->tpc, gp->tnpc, |
378 | ((tp && tp->task) ? tp->task->comm : "NULL"), | 374 | ((tp && tp->task) ? tp->task->comm : "NULL"), |
379 | ((tp && tp->task) ? tp->task->pid : -1)); | 375 | ((tp && tp->task) ? tp->task->pid : -1)); |
380 | #ifdef CONFIG_KALLSYMS | 376 | |
381 | if (gp->tstate & TSTATE_PRIV) { | 377 | if (gp->tstate & TSTATE_PRIV) { |
382 | sprint_symbol(buffer, gp->tpc); | 378 | printk(" TPC[%pS] O7[%pS] I7[%pS]\n", |
383 | printk(" TPC[%s] ", buffer); | 379 | (void *) gp->tpc, |
384 | sprint_symbol(buffer, gp->o7); | 380 | (void *) gp->o7, |
385 | printk("O7[%s] ", buffer); | 381 | (void *) gp->i7); |
386 | sprint_symbol(buffer, gp->i7); | 382 | } else { |
387 | printk("I7[%s]\n", buffer); | ||
388 | } else | ||
389 | #endif | ||
390 | { | ||
391 | printk(" TPC[%lx] O7[%lx] I7[%lx]\n", | 383 | printk(" TPC[%lx] O7[%lx] I7[%lx]\n", |
392 | gp->tpc, gp->o7, gp->i7); | 384 | gp->tpc, gp->o7, gp->i7); |
393 | } | 385 | } |
@@ -691,9 +683,9 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
691 | ((unsigned long) child_sf) - STACK_BIAS; | 683 | ((unsigned long) child_sf) - STACK_BIAS; |
692 | 684 | ||
693 | /* Special case, if we are spawning a kernel thread from | 685 | /* Special case, if we are spawning a kernel thread from |
694 | * a userspace task (via KMOD, NFS, or similar) we must | 686 | * a userspace task (usermode helper, NFS or similar), we |
695 | * disable performance counters in the child because the | 687 | * must disable performance counters in the child because |
696 | * address space and protection realm are changing. | 688 | * the address space and protection realm are changing. |
697 | */ | 689 | */ |
698 | if (t->flags & _TIF_PERFCTR) { | 690 | if (t->flags & _TIF_PERFCTR) { |
699 | t->user_cntd0 = t->user_cntd1 = NULL; | 691 | t->user_cntd0 = t->user_cntd1 = NULL; |
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index f6c9fc92921d..bd578cc4856d 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/audit.h> | 23 | #include <linux/audit.h> |
24 | #include <linux/signal.h> | 24 | #include <linux/signal.h> |
25 | #include <linux/regset.h> | 25 | #include <linux/regset.h> |
26 | #include <linux/tracehook.h> | ||
26 | #include <linux/compat.h> | 27 | #include <linux/compat.h> |
27 | #include <linux/elf.h> | 28 | #include <linux/elf.h> |
28 | 29 | ||
@@ -1049,8 +1050,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
1049 | return ret; | 1050 | return ret; |
1050 | } | 1051 | } |
1051 | 1052 | ||
1052 | asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p) | 1053 | asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p) |
1053 | { | 1054 | { |
1055 | int ret = 0; | ||
1056 | |||
1054 | /* do the secure computing check first */ | 1057 | /* do the secure computing check first */ |
1055 | secure_computing(regs->u_regs[UREG_G1]); | 1058 | secure_computing(regs->u_regs[UREG_G1]); |
1056 | 1059 | ||
@@ -1064,27 +1067,14 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p) | |||
1064 | audit_syscall_exit(result, regs->u_regs[UREG_I0]); | 1067 | audit_syscall_exit(result, regs->u_regs[UREG_I0]); |
1065 | } | 1068 | } |
1066 | 1069 | ||
1067 | if (!(current->ptrace & PT_PTRACED)) | 1070 | if (test_thread_flag(TIF_SYSCALL_TRACE)) { |
1068 | goto out; | 1071 | if (syscall_exit_p) |
1069 | 1072 | tracehook_report_syscall_exit(regs, 0); | |
1070 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 1073 | else |
1071 | goto out; | 1074 | ret = tracehook_report_syscall_entry(regs); |
1072 | |||
1073 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | ||
1074 | ? 0x80 : 0)); | ||
1075 | |||
1076 | /* | ||
1077 | * this isn't the same as continuing with a signal, but it will do | ||
1078 | * for normal use. strace only continues with a signal if the | ||
1079 | * stopping signal is not SIGTRAP. -brl | ||
1080 | */ | ||
1081 | if (current->exit_code) { | ||
1082 | send_sig(current->exit_code, current, 1); | ||
1083 | current->exit_code = 0; | ||
1084 | } | 1075 | } |
1085 | 1076 | ||
1086 | out: | 1077 | if (unlikely(current->audit_context) && !syscall_exit_p && !ret) |
1087 | if (unlikely(current->audit_context) && !syscall_exit_p) | ||
1088 | audit_syscall_entry((test_thread_flag(TIF_32BIT) ? | 1078 | audit_syscall_entry((test_thread_flag(TIF_32BIT) ? |
1089 | AUDIT_ARCH_SPARC : | 1079 | AUDIT_ARCH_SPARC : |
1090 | AUDIT_ARCH_SPARC64), | 1080 | AUDIT_ARCH_SPARC64), |
@@ -1093,4 +1083,6 @@ out: | |||
1093 | regs->u_regs[UREG_I1], | 1083 | regs->u_regs[UREG_I1], |
1094 | regs->u_regs[UREG_I2], | 1084 | regs->u_regs[UREG_I2], |
1095 | regs->u_regs[UREG_I3]); | 1085 | regs->u_regs[UREG_I3]); |
1086 | |||
1087 | return ret; | ||
1096 | } | 1088 | } |
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index c6fc695fe1fe..97a993c1f7f3 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S | |||
@@ -46,7 +46,7 @@ __handle_user_windows: | |||
46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 46 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
47 | ldx [%g6 + TI_FLAGS], %l0 | 47 | ldx [%g6 + TI_FLAGS], %l0 |
48 | 48 | ||
49 | 1: andcc %l0, _TIF_SIGPENDING, %g0 | 49 | 1: andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0 |
50 | be,pt %xcc, __handle_user_windows_continue | 50 | be,pt %xcc, __handle_user_windows_continue |
51 | nop | 51 | nop |
52 | mov %l5, %o1 | 52 | mov %l5, %o1 |
@@ -86,7 +86,7 @@ __handle_perfctrs: | |||
86 | wrpr %g0, RTRAP_PSTATE, %pstate | 86 | wrpr %g0, RTRAP_PSTATE, %pstate |
87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate | 87 | wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
88 | ldx [%g6 + TI_FLAGS], %l0 | 88 | ldx [%g6 + TI_FLAGS], %l0 |
89 | 1: andcc %l0, _TIF_SIGPENDING, %g0 | 89 | 1: andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0 |
90 | 90 | ||
91 | be,pt %xcc, __handle_perfctrs_continue | 91 | be,pt %xcc, __handle_perfctrs_continue |
92 | sethi %hi(TSTATE_PEF), %o0 | 92 | sethi %hi(TSTATE_PEF), %o0 |
@@ -195,7 +195,7 @@ __handle_preemption_continue: | |||
195 | andcc %l1, %o0, %g0 | 195 | andcc %l1, %o0, %g0 |
196 | andcc %l0, _TIF_NEED_RESCHED, %g0 | 196 | andcc %l0, _TIF_NEED_RESCHED, %g0 |
197 | bne,pn %xcc, __handle_preemption | 197 | bne,pn %xcc, __handle_preemption |
198 | andcc %l0, _TIF_SIGPENDING, %g0 | 198 | andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0 |
199 | bne,pn %xcc, __handle_signal | 199 | bne,pn %xcc, __handle_signal |
200 | __handle_signal_continue: | 200 | __handle_signal_continue: |
201 | ldub [%g6 + TI_WSAVED], %o2 | 201 | ldub [%g6 + TI_WSAVED], %o2 |
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 9667e96fd513..d1b84456a9ee 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -17,11 +17,13 @@ | |||
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/wait.h> | 18 | #include <linux/wait.h> |
19 | #include <linux/ptrace.h> | 19 | #include <linux/ptrace.h> |
20 | #include <linux/tracehook.h> | ||
20 | #include <linux/unistd.h> | 21 | #include <linux/unistd.h> |
21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
22 | #include <linux/tty.h> | 23 | #include <linux/tty.h> |
23 | #include <linux/binfmts.h> | 24 | #include <linux/binfmts.h> |
24 | #include <linux/bitops.h> | 25 | #include <linux/bitops.h> |
26 | #include <linux/tracehook.h> | ||
25 | 27 | ||
26 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
27 | #include <asm/ptrace.h> | 29 | #include <asm/ptrace.h> |
@@ -574,6 +576,8 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
574 | * clear the TS_RESTORE_SIGMASK flag. | 576 | * clear the TS_RESTORE_SIGMASK flag. |
575 | */ | 577 | */ |
576 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 578 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
579 | |||
580 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
577 | return; | 581 | return; |
578 | } | 582 | } |
579 | if (restart_syscall && | 583 | if (restart_syscall && |
@@ -605,4 +609,8 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long | |||
605 | { | 609 | { |
606 | if (thread_info_flags & _TIF_SIGPENDING) | 610 | if (thread_info_flags & _TIF_SIGPENDING) |
607 | do_signal(regs, orig_i0); | 611 | do_signal(regs, orig_i0); |
612 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
613 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
614 | tracehook_notify_resume(regs); | ||
615 | } | ||
608 | } | 616 | } |
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 97cdd1bf4a10..ba5b09ad6666 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/binfmts.h> | 19 | #include <linux/binfmts.h> |
20 | #include <linux/compat.h> | 20 | #include <linux/compat.h> |
21 | #include <linux/bitops.h> | 21 | #include <linux/bitops.h> |
22 | #include <linux/tracehook.h> | ||
22 | 23 | ||
23 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
24 | #include <asm/ptrace.h> | 25 | #include <asm/ptrace.h> |
@@ -794,6 +795,8 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
794 | * clear the TS_RESTORE_SIGMASK flag. | 795 | * clear the TS_RESTORE_SIGMASK flag. |
795 | */ | 796 | */ |
796 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 797 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
798 | |||
799 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
797 | return; | 800 | return; |
798 | } | 801 | } |
799 | if (restart_syscall && | 802 | if (restart_syscall && |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index c099d96f1239..7cf72b4bb108 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -788,89 +788,36 @@ static void smp_start_sync_tick_client(int cpu) | |||
788 | 0, 0, 0, mask); | 788 | 0, 0, 0, mask); |
789 | } | 789 | } |
790 | 790 | ||
791 | /* Send cross call to all processors except self. */ | ||
792 | #define smp_cross_call(func, ctx, data1, data2) \ | ||
793 | smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map) | ||
794 | |||
795 | struct call_data_struct { | ||
796 | void (*func) (void *info); | ||
797 | void *info; | ||
798 | atomic_t finished; | ||
799 | int wait; | ||
800 | }; | ||
801 | |||
802 | static struct call_data_struct *call_data; | ||
803 | |||
804 | extern unsigned long xcall_call_function; | 791 | extern unsigned long xcall_call_function; |
805 | 792 | ||
806 | /** | 793 | void arch_send_call_function_ipi(cpumask_t mask) |
807 | * smp_call_function(): Run a function on all other CPUs. | ||
808 | * @func: The function to run. This must be fast and non-blocking. | ||
809 | * @info: An arbitrary pointer to pass to the function. | ||
810 | * @wait: If true, wait (atomically) until function has completed on other CPUs. | ||
811 | * | ||
812 | * Returns 0 on success, else a negative status code. Does not return until | ||
813 | * remote CPUs are nearly ready to execute <<func>> or are or have executed. | ||
814 | * | ||
815 | * You must not call this function with disabled interrupts or from a | ||
816 | * hardware interrupt handler or from a bottom half handler. | ||
817 | */ | ||
818 | static int sparc64_smp_call_function_mask(void (*func)(void *info), void *info, | ||
819 | int wait, cpumask_t mask) | ||
820 | { | 794 | { |
821 | struct call_data_struct data; | ||
822 | int cpus; | ||
823 | |||
824 | /* Can deadlock when called with interrupts disabled */ | ||
825 | WARN_ON(irqs_disabled()); | ||
826 | |||
827 | data.func = func; | ||
828 | data.info = info; | ||
829 | atomic_set(&data.finished, 0); | ||
830 | data.wait = wait; | ||
831 | |||
832 | spin_lock(&call_lock); | ||
833 | |||
834 | cpu_clear(smp_processor_id(), mask); | ||
835 | cpus = cpus_weight(mask); | ||
836 | if (!cpus) | ||
837 | goto out_unlock; | ||
838 | |||
839 | call_data = &data; | ||
840 | mb(); | ||
841 | |||
842 | smp_cross_call_masked(&xcall_call_function, 0, 0, 0, mask); | 795 | smp_cross_call_masked(&xcall_call_function, 0, 0, 0, mask); |
796 | } | ||
843 | 797 | ||
844 | /* Wait for response */ | 798 | extern unsigned long xcall_call_function_single; |
845 | while (atomic_read(&data.finished) != cpus) | ||
846 | cpu_relax(); | ||
847 | 799 | ||
848 | out_unlock: | 800 | void arch_send_call_function_single_ipi(int cpu) |
849 | spin_unlock(&call_lock); | 801 | { |
802 | cpumask_t mask = cpumask_of_cpu(cpu); | ||
850 | 803 | ||
851 | return 0; | 804 | smp_cross_call_masked(&xcall_call_function_single, 0, 0, 0, mask); |
852 | } | 805 | } |
853 | 806 | ||
854 | int smp_call_function(void (*func)(void *info), void *info, int wait) | 807 | /* Send cross call to all processors except self. */ |
855 | { | 808 | #define smp_cross_call(func, ctx, data1, data2) \ |
856 | return sparc64_smp_call_function_mask(func, info, wait, cpu_online_map); | 809 | smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map) |
857 | } | ||
858 | 810 | ||
859 | void smp_call_function_client(int irq, struct pt_regs *regs) | 811 | void smp_call_function_client(int irq, struct pt_regs *regs) |
860 | { | 812 | { |
861 | void (*func) (void *info) = call_data->func; | 813 | clear_softint(1 << irq); |
862 | void *info = call_data->info; | 814 | generic_smp_call_function_interrupt(); |
815 | } | ||
863 | 816 | ||
817 | void smp_call_function_single_client(int irq, struct pt_regs *regs) | ||
818 | { | ||
864 | clear_softint(1 << irq); | 819 | clear_softint(1 << irq); |
865 | if (call_data->wait) { | 820 | generic_smp_call_function_single_interrupt(); |
866 | /* let initiator proceed only after completion */ | ||
867 | func(info); | ||
868 | atomic_inc(&call_data->finished); | ||
869 | } else { | ||
870 | /* let initiator proceed after getting data */ | ||
871 | atomic_inc(&call_data->finished); | ||
872 | func(info); | ||
873 | } | ||
874 | } | 821 | } |
875 | 822 | ||
876 | static void tsb_sync(void *info) | 823 | static void tsb_sync(void *info) |
@@ -890,7 +837,7 @@ static void tsb_sync(void *info) | |||
890 | 837 | ||
891 | void smp_tsb_sync(struct mm_struct *mm) | 838 | void smp_tsb_sync(struct mm_struct *mm) |
892 | { | 839 | { |
893 | sparc64_smp_call_function_mask(tsb_sync, mm, 1, mm->cpu_vm_mask); | 840 | smp_call_function_mask(mm->cpu_vm_mask, tsb_sync, mm, 1); |
894 | } | 841 | } |
895 | 842 | ||
896 | extern unsigned long xcall_flush_tlb_mm; | 843 | extern unsigned long xcall_flush_tlb_mm; |
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 49d3ea50c247..504e678ee128 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c | |||
@@ -108,8 +108,6 @@ EXPORT_SYMBOL(__read_unlock); | |||
108 | EXPORT_SYMBOL(__write_lock); | 108 | EXPORT_SYMBOL(__write_lock); |
109 | EXPORT_SYMBOL(__write_unlock); | 109 | EXPORT_SYMBOL(__write_unlock); |
110 | EXPORT_SYMBOL(__write_trylock); | 110 | EXPORT_SYMBOL(__write_trylock); |
111 | |||
112 | EXPORT_SYMBOL(smp_call_function); | ||
113 | #endif /* CONFIG_SMP */ | 111 | #endif /* CONFIG_SMP */ |
114 | 112 | ||
115 | #ifdef CONFIG_MCOUNT | 113 | #ifdef CONFIG_MCOUNT |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index ac1bff58c1ac..39749e32dc7e 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -418,7 +418,7 @@ asmlinkage long sparc_pipe(struct pt_regs *regs) | |||
418 | int fd[2]; | 418 | int fd[2]; |
419 | int error; | 419 | int error; |
420 | 420 | ||
421 | error = do_pipe(fd); | 421 | error = do_pipe_flags(fd, 0); |
422 | if (error) | 422 | if (error) |
423 | goto out; | 423 | goto out; |
424 | regs->u_regs[UREG_I1] = fd[1]; | 424 | regs->u_regs[UREG_I1] = fd[1]; |
@@ -542,7 +542,7 @@ asmlinkage long sparc64_personality(unsigned long personality) | |||
542 | return ret; | 542 | return ret; |
543 | } | 543 | } |
544 | 544 | ||
545 | int sparc64_mmap_check(unsigned long addr, unsigned long len) | 545 | int sparc_mmap_check(unsigned long addr, unsigned long len) |
546 | { | 546 | { |
547 | if (test_thread_flag(TIF_32BIT)) { | 547 | if (test_thread_flag(TIF_32BIT)) { |
548 | if (len >= STACK_TOP32) | 548 | if (len >= STACK_TOP32) |
@@ -614,9 +614,9 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, | |||
614 | goto out; | 614 | goto out; |
615 | if (unlikely(new_len >= VA_EXCLUDE_START)) | 615 | if (unlikely(new_len >= VA_EXCLUDE_START)) |
616 | goto out; | 616 | goto out; |
617 | if (unlikely(sparc64_mmap_check(addr, old_len))) | 617 | if (unlikely(sparc_mmap_check(addr, old_len))) |
618 | goto out; | 618 | goto out; |
619 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) | 619 | if (unlikely(sparc_mmap_check(new_addr, new_len))) |
620 | goto out; | 620 | goto out; |
621 | 621 | ||
622 | down_write(¤t->mm->mmap_sem); | 622 | down_write(¤t->mm->mmap_sem); |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index ba5bd626b39e..97b77fb5c50e 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -359,7 +359,8 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) | |||
359 | return err; | 359 | return err; |
360 | } | 360 | } |
361 | 361 | ||
362 | int cp_compat_stat64(struct kstat *stat, struct compat_stat64 __user *statbuf) | 362 | static int cp_compat_stat64(struct kstat *stat, |
363 | struct compat_stat64 __user *statbuf) | ||
363 | { | 364 | { |
364 | int err; | 365 | int err; |
365 | 366 | ||
@@ -870,9 +871,9 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, | |||
870 | unsigned long ret = -EINVAL; | 871 | unsigned long ret = -EINVAL; |
871 | unsigned long new_addr = __new_addr; | 872 | unsigned long new_addr = __new_addr; |
872 | 873 | ||
873 | if (unlikely(sparc64_mmap_check(addr, old_len))) | 874 | if (unlikely(sparc_mmap_check(addr, old_len))) |
874 | goto out; | 875 | goto out; |
875 | if (unlikely(sparc64_mmap_check(new_addr, new_len))) | 876 | if (unlikely(sparc_mmap_check(new_addr, new_len))) |
876 | goto out; | 877 | goto out; |
877 | down_write(¤t->mm->mmap_sem); | 878 | down_write(¤t->mm->mmap_sem); |
878 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 879 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
diff --git a/arch/sparc64/kernel/syscalls.S b/arch/sparc64/kernel/syscalls.S index db19ed67acf6..a2f24270ed8a 100644 --- a/arch/sparc64/kernel/syscalls.S +++ b/arch/sparc64/kernel/syscalls.S | |||
@@ -162,6 +162,8 @@ linux_syscall_trace32: | |||
162 | add %sp, PTREGS_OFF, %o0 | 162 | add %sp, PTREGS_OFF, %o0 |
163 | call syscall_trace | 163 | call syscall_trace |
164 | clr %o1 | 164 | clr %o1 |
165 | brnz,pn %o0, 3f | ||
166 | mov -ENOSYS, %o0 | ||
165 | srl %i0, 0, %o0 | 167 | srl %i0, 0, %o0 |
166 | srl %i4, 0, %o4 | 168 | srl %i4, 0, %o4 |
167 | srl %i1, 0, %o1 | 169 | srl %i1, 0, %o1 |
@@ -173,6 +175,8 @@ linux_syscall_trace: | |||
173 | add %sp, PTREGS_OFF, %o0 | 175 | add %sp, PTREGS_OFF, %o0 |
174 | call syscall_trace | 176 | call syscall_trace |
175 | clr %o1 | 177 | clr %o1 |
178 | brnz,pn %o0, 3f | ||
179 | mov -ENOSYS, %o0 | ||
176 | mov %i0, %o0 | 180 | mov %i0, %o0 |
177 | mov %i1, %o1 | 181 | mov %i1, %o1 |
178 | mov %i2, %o2 | 182 | mov %i2, %o2 |
diff --git a/arch/sparc64/kernel/sysfs.c b/arch/sparc64/kernel/sysfs.c index e885034a6b73..84e5ce146713 100644 --- a/arch/sparc64/kernel/sysfs.c +++ b/arch/sparc64/kernel/sysfs.c | |||
@@ -14,7 +14,8 @@ | |||
14 | static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64))); | 14 | static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64))); |
15 | 15 | ||
16 | #define SHOW_MMUSTAT_ULONG(NAME) \ | 16 | #define SHOW_MMUSTAT_ULONG(NAME) \ |
17 | static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ | 17 | static ssize_t show_##NAME(struct sys_device *dev, \ |
18 | struct sysdev_attribute *attr, char *buf) \ | ||
18 | { \ | 19 | { \ |
19 | struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \ | 20 | struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \ |
20 | return sprintf(buf, "%lu\n", p->NAME); \ | 21 | return sprintf(buf, "%lu\n", p->NAME); \ |
@@ -135,13 +136,16 @@ static unsigned long write_mmustat_enable(unsigned long val) | |||
135 | return sun4v_mmustat_conf(ra, &orig_ra); | 136 | return sun4v_mmustat_conf(ra, &orig_ra); |
136 | } | 137 | } |
137 | 138 | ||
138 | static ssize_t show_mmustat_enable(struct sys_device *s, char *buf) | 139 | static ssize_t show_mmustat_enable(struct sys_device *s, |
140 | struct sysdev_attribute *attr, char *buf) | ||
139 | { | 141 | { |
140 | unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0); | 142 | unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0); |
141 | return sprintf(buf, "%lx\n", val); | 143 | return sprintf(buf, "%lx\n", val); |
142 | } | 144 | } |
143 | 145 | ||
144 | static ssize_t store_mmustat_enable(struct sys_device *s, const char *buf, size_t count) | 146 | static ssize_t store_mmustat_enable(struct sys_device *s, |
147 | struct sysdev_attribute *attr, const char *buf, | ||
148 | size_t count) | ||
145 | { | 149 | { |
146 | unsigned long val, err; | 150 | unsigned long val, err; |
147 | int ret = sscanf(buf, "%ld", &val); | 151 | int ret = sscanf(buf, "%ld", &val); |
@@ -179,14 +183,16 @@ static void unregister_mmu_stats(struct sys_device *s) | |||
179 | #endif | 183 | #endif |
180 | 184 | ||
181 | #define SHOW_CPUDATA_ULONG_NAME(NAME, MEMBER) \ | 185 | #define SHOW_CPUDATA_ULONG_NAME(NAME, MEMBER) \ |
182 | static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ | 186 | static ssize_t show_##NAME(struct sys_device *dev, \ |
187 | struct sysdev_attribute *attr, char *buf) \ | ||
183 | { \ | 188 | { \ |
184 | cpuinfo_sparc *c = &cpu_data(dev->id); \ | 189 | cpuinfo_sparc *c = &cpu_data(dev->id); \ |
185 | return sprintf(buf, "%lu\n", c->MEMBER); \ | 190 | return sprintf(buf, "%lu\n", c->MEMBER); \ |
186 | } | 191 | } |
187 | 192 | ||
188 | #define SHOW_CPUDATA_UINT_NAME(NAME, MEMBER) \ | 193 | #define SHOW_CPUDATA_UINT_NAME(NAME, MEMBER) \ |
189 | static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ | 194 | static ssize_t show_##NAME(struct sys_device *dev, \ |
195 | struct sysdev_attribute *attr, char *buf) \ | ||
190 | { \ | 196 | { \ |
191 | cpuinfo_sparc *c = &cpu_data(dev->id); \ | 197 | cpuinfo_sparc *c = &cpu_data(dev->id); \ |
192 | return sprintf(buf, "%u\n", c->MEMBER); \ | 198 | return sprintf(buf, "%u\n", c->MEMBER); \ |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 8b5282d433c4..1095bf4c5100 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -81,7 +81,8 @@ sys_call_table32: | |||
81 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages, compat_sys_mbind, compat_sys_get_mempolicy | 81 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages, compat_sys_mbind, compat_sys_get_mempolicy |
82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | ||
85 | 86 | ||
86 | #endif /* CONFIG_COMPAT */ | 87 | #endif /* CONFIG_COMPAT */ |
87 | 88 | ||
@@ -154,4 +155,5 @@ sys_call_table: | |||
154 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages, sys_mbind, sys_get_mempolicy | 155 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages, sys_mbind, sys_get_mempolicy |
155 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
156 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
157 | .word sys_timerfd_settime, sys_timerfd_gettime | 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | ||
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index bedc4c159b1c..a0c6a97eec6e 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c | |||
@@ -884,6 +884,16 @@ static struct notifier_block sparc64_cpufreq_notifier_block = { | |||
884 | .notifier_call = sparc64_cpufreq_notifier | 884 | .notifier_call = sparc64_cpufreq_notifier |
885 | }; | 885 | }; |
886 | 886 | ||
887 | static int __init register_sparc64_cpufreq_notifier(void) | ||
888 | { | ||
889 | |||
890 | cpufreq_register_notifier(&sparc64_cpufreq_notifier_block, | ||
891 | CPUFREQ_TRANSITION_NOTIFIER); | ||
892 | return 0; | ||
893 | } | ||
894 | |||
895 | core_initcall(register_sparc64_cpufreq_notifier); | ||
896 | |||
887 | #endif /* CONFIG_CPU_FREQ */ | 897 | #endif /* CONFIG_CPU_FREQ */ |
888 | 898 | ||
889 | static int sparc64_next_event(unsigned long delta, | 899 | static int sparc64_next_event(unsigned long delta, |
@@ -1050,11 +1060,6 @@ void __init time_init(void) | |||
1050 | sparc64_clockevent.mult, sparc64_clockevent.shift); | 1060 | sparc64_clockevent.mult, sparc64_clockevent.shift); |
1051 | 1061 | ||
1052 | setup_sparc64_timer(); | 1062 | setup_sparc64_timer(); |
1053 | |||
1054 | #ifdef CONFIG_CPU_FREQ | ||
1055 | cpufreq_register_notifier(&sparc64_cpufreq_notifier_block, | ||
1056 | CPUFREQ_TRANSITION_NOTIFIER); | ||
1057 | #endif | ||
1058 | } | 1063 | } |
1059 | 1064 | ||
1060 | unsigned long long sched_clock(void) | 1065 | unsigned long long sched_clock(void) |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index 369749262653..bd30ecba5630 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* arch/sparc64/kernel/traps.c | 1 | /* arch/sparc64/kernel/traps.c |
2 | * | 2 | * |
3 | * Copyright (C) 1995,1997 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 1995,1997,2008 David S. Miller (davem@davemloft.net) |
4 | * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com) | 4 | * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com) |
5 | */ | 5 | */ |
6 | 6 | ||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/kallsyms.h> | ||
15 | #include <linux/signal.h> | 14 | #include <linux/signal.h> |
16 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
17 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
@@ -37,9 +36,6 @@ | |||
37 | #include <asm/processor.h> | 36 | #include <asm/processor.h> |
38 | #include <asm/timer.h> | 37 | #include <asm/timer.h> |
39 | #include <asm/head.h> | 38 | #include <asm/head.h> |
40 | #ifdef CONFIG_KMOD | ||
41 | #include <linux/kmod.h> | ||
42 | #endif | ||
43 | #include <asm/prom.h> | 39 | #include <asm/prom.h> |
44 | 40 | ||
45 | #include "entry.h" | 41 | #include "entry.h" |
@@ -74,7 +70,7 @@ static void dump_tl1_traplog(struct tl1_traplog *p) | |||
74 | i + 1, | 70 | i + 1, |
75 | p->trapstack[i].tstate, p->trapstack[i].tpc, | 71 | p->trapstack[i].tstate, p->trapstack[i].tpc, |
76 | p->trapstack[i].tnpc, p->trapstack[i].tt); | 72 | p->trapstack[i].tnpc, p->trapstack[i].tt); |
77 | print_symbol("TRAPLOG: TPC<%s>\n", p->trapstack[i].tpc); | 73 | printk("TRAPLOG: TPC<%pS>\n", (void *) p->trapstack[i].tpc); |
78 | } | 74 | } |
79 | } | 75 | } |
80 | 76 | ||
@@ -1081,7 +1077,7 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in | |||
1081 | regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate); | 1077 | regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate); |
1082 | printk("%s" "ERROR(%d): ", | 1078 | printk("%s" "ERROR(%d): ", |
1083 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id()); | 1079 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id()); |
1084 | print_symbol("TPC<%s>\n", regs->tpc); | 1080 | printk("TPC<%pS>\n", (void *) regs->tpc); |
1085 | printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n", | 1081 | printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n", |
1086 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1082 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1087 | (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT, | 1083 | (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT, |
@@ -1689,7 +1685,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) | |||
1689 | smp_processor_id(), | 1685 | smp_processor_id(), |
1690 | (type & 0x1) ? 'I' : 'D', | 1686 | (type & 0x1) ? 'I' : 'D', |
1691 | regs->tpc); | 1687 | regs->tpc); |
1692 | print_symbol(KERN_EMERG "TPC<%s>\n", regs->tpc); | 1688 | printk(KERN_EMERG "TPC<%pS>\n", (void *) regs->tpc); |
1693 | panic("Irrecoverable Cheetah+ parity error."); | 1689 | panic("Irrecoverable Cheetah+ parity error."); |
1694 | } | 1690 | } |
1695 | 1691 | ||
@@ -1697,7 +1693,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) | |||
1697 | smp_processor_id(), | 1693 | smp_processor_id(), |
1698 | (type & 0x1) ? 'I' : 'D', | 1694 | (type & 0x1) ? 'I' : 'D', |
1699 | regs->tpc); | 1695 | regs->tpc); |
1700 | print_symbol(KERN_WARNING "TPC<%s>\n", regs->tpc); | 1696 | printk(KERN_WARNING "TPC<%pS>\n", (void *) regs->tpc); |
1701 | } | 1697 | } |
1702 | 1698 | ||
1703 | struct sun4v_error_entry { | 1699 | struct sun4v_error_entry { |
@@ -1904,9 +1900,10 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl) | |||
1904 | 1900 | ||
1905 | printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", | 1901 | printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", |
1906 | regs->tpc, tl); | 1902 | regs->tpc, tl); |
1907 | print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc); | 1903 | printk(KERN_EMERG "SUN4V-ITLB: TPC<%pS>\n", (void *) regs->tpc); |
1908 | printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]); | 1904 | printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]); |
1909 | print_symbol(KERN_EMERG "SUN4V-ITLB: O7<%s>\n", regs->u_regs[UREG_I7]); | 1905 | printk(KERN_EMERG "SUN4V-ITLB: O7<%pS>\n", |
1906 | (void *) regs->u_regs[UREG_I7]); | ||
1910 | printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " | 1907 | printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " |
1911 | "pte[%lx] error[%lx]\n", | 1908 | "pte[%lx] error[%lx]\n", |
1912 | sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx, | 1909 | sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx, |
@@ -1927,9 +1924,10 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl) | |||
1927 | 1924 | ||
1928 | printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", | 1925 | printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", |
1929 | regs->tpc, tl); | 1926 | regs->tpc, tl); |
1930 | print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc); | 1927 | printk(KERN_EMERG "SUN4V-DTLB: TPC<%pS>\n", (void *) regs->tpc); |
1931 | printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]); | 1928 | printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]); |
1932 | print_symbol(KERN_EMERG "SUN4V-DTLB: O7<%s>\n", regs->u_regs[UREG_I7]); | 1929 | printk(KERN_EMERG "SUN4V-DTLB: O7<%pS>\n", |
1930 | (void *) regs->u_regs[UREG_I7]); | ||
1933 | printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " | 1931 | printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " |
1934 | "pte[%lx] error[%lx]\n", | 1932 | "pte[%lx] error[%lx]\n", |
1935 | sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx, | 1933 | sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx, |
@@ -2111,10 +2109,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
2111 | fp = ksp + STACK_BIAS; | 2109 | fp = ksp + STACK_BIAS; |
2112 | thread_base = (unsigned long) tp; | 2110 | thread_base = (unsigned long) tp; |
2113 | 2111 | ||
2114 | printk("Call Trace:"); | 2112 | printk("Call Trace:\n"); |
2115 | #ifdef CONFIG_KALLSYMS | ||
2116 | printk("\n"); | ||
2117 | #endif | ||
2118 | do { | 2113 | do { |
2119 | struct sparc_stackf *sf; | 2114 | struct sparc_stackf *sf; |
2120 | struct pt_regs *regs; | 2115 | struct pt_regs *regs; |
@@ -2137,12 +2132,8 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) | |||
2137 | fp = (unsigned long)sf->fp + STACK_BIAS; | 2132 | fp = (unsigned long)sf->fp + STACK_BIAS; |
2138 | } | 2133 | } |
2139 | 2134 | ||
2140 | printk(" [%016lx] ", pc); | 2135 | printk(" [%016lx] %pS\n", pc, (void *) pc); |
2141 | print_symbol("%s\n", pc); | ||
2142 | } while (++count < 16); | 2136 | } while (++count < 16); |
2143 | #ifndef CONFIG_KALLSYMS | ||
2144 | printk("\n"); | ||
2145 | #endif | ||
2146 | } | 2137 | } |
2147 | 2138 | ||
2148 | void dump_stack(void) | 2139 | void dump_stack(void) |
@@ -2211,9 +2202,8 @@ void die_if_kernel(char *str, struct pt_regs *regs) | |||
2211 | while (rw && | 2202 | while (rw && |
2212 | count++ < 30&& | 2203 | count++ < 30&& |
2213 | is_kernel_stack(current, rw)) { | 2204 | is_kernel_stack(current, rw)) { |
2214 | printk("Caller[%016lx]", rw->ins[7]); | 2205 | printk("Caller[%016lx]: %pS\n", rw->ins[7], |
2215 | print_symbol(": %s", rw->ins[7]); | 2206 | (void *) rw->ins[7]); |
2216 | printk("\n"); | ||
2217 | 2207 | ||
2218 | rw = kernel_stack_up(rw); | 2208 | rw = kernel_stack_up(rw); |
2219 | } | 2209 | } |
diff --git a/arch/sparc64/kernel/ttable.S b/arch/sparc64/kernel/ttable.S index 450053af039e..1ade3d6fb7fc 100644 --- a/arch/sparc64/kernel/ttable.S +++ b/arch/sparc64/kernel/ttable.S | |||
@@ -58,7 +58,12 @@ tl0_irq3: BTRAP(0x43) | |||
58 | tl0_irq4: BTRAP(0x44) | 58 | tl0_irq4: BTRAP(0x44) |
59 | #endif | 59 | #endif |
60 | tl0_irq5: TRAP_IRQ(handler_irq, 5) | 60 | tl0_irq5: TRAP_IRQ(handler_irq, 5) |
61 | tl0_irq6: BTRAP(0x46) BTRAP(0x47) BTRAP(0x48) BTRAP(0x49) | 61 | #ifdef CONFIG_SMP |
62 | tl0_irq6: TRAP_IRQ(smp_call_function_single_client, 6) | ||
63 | #else | ||
64 | tl0_irq6: BTRAP(0x46) | ||
65 | #endif | ||
66 | tl0_irq7: BTRAP(0x47) BTRAP(0x48) BTRAP(0x49) | ||
62 | tl0_irq10: BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d) | 67 | tl0_irq10: BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d) |
63 | tl0_irq14: TRAP_IRQ(timer_interrupt, 14) | 68 | tl0_irq14: TRAP_IRQ(timer_interrupt, 14) |
64 | tl0_irq15: TRAP_IRQ(handler_irq, 15) | 69 | tl0_irq15: TRAP_IRQ(handler_irq, 15) |
diff --git a/arch/sparc64/kernel/unaligned.c b/arch/sparc64/kernel/unaligned.c index afa7fc4f5193..203ddfad9f27 100644 --- a/arch/sparc64/kernel/unaligned.c +++ b/arch/sparc64/kernel/unaligned.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * unaligned.c: Unaligned load/store trap handling with special | 2 | * unaligned.c: Unaligned load/store trap handling with special |
3 | * cases for the kernel to do them more quickly. | 3 | * cases for the kernel to do them more quickly. |
4 | * | 4 | * |
5 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 5 | * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net) |
6 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 6 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
7 | */ | 7 | */ |
8 | 8 | ||
@@ -20,7 +20,6 @@ | |||
20 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
21 | #include <linux/smp.h> | 21 | #include <linux/smp.h> |
22 | #include <linux/bitops.h> | 22 | #include <linux/bitops.h> |
23 | #include <linux/kallsyms.h> | ||
24 | #include <asm/fpumacro.h> | 23 | #include <asm/fpumacro.h> |
25 | 24 | ||
26 | /* #define DEBUG_MNA */ | 25 | /* #define DEBUG_MNA */ |
@@ -289,8 +288,8 @@ static void log_unaligned(struct pt_regs *regs) | |||
289 | if (count < 5) { | 288 | if (count < 5) { |
290 | last_time = jiffies; | 289 | last_time = jiffies; |
291 | count++; | 290 | count++; |
292 | printk("Kernel unaligned access at TPC[%lx] ", regs->tpc); | 291 | printk("Kernel unaligned access at TPC[%lx] %pS\n", |
293 | print_symbol("%s\n", regs->tpc); | 292 | regs->tpc, (void *) regs->tpc); |
294 | } | 293 | } |
295 | } | 294 | } |
296 | 295 | ||
diff --git a/arch/sparc64/kernel/vio.c b/arch/sparc64/kernel/vio.c index e78b3517940b..a490077891a4 100644 --- a/arch/sparc64/kernel/vio.c +++ b/arch/sparc64/kernel/vio.c | |||
@@ -224,7 +224,7 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
224 | if (!strcmp(type, "domain-services-port")) | 224 | if (!strcmp(type, "domain-services-port")) |
225 | bus_id_name = "ds"; | 225 | bus_id_name = "ds"; |
226 | 226 | ||
227 | if (strlen(bus_id_name) >= KOBJ_NAME_LEN - 4) { | 227 | if (strlen(bus_id_name) >= BUS_ID_SIZE - 4) { |
228 | printk(KERN_ERR "VIO: bus_id_name [%s] is too long.\n", | 228 | printk(KERN_ERR "VIO: bus_id_name [%s] is too long.\n", |
229 | bus_id_name); | 229 | bus_id_name); |
230 | return NULL; | 230 | return NULL; |
@@ -260,16 +260,14 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
260 | vio_fill_channel_info(hp, mp, vdev); | 260 | vio_fill_channel_info(hp, mp, vdev); |
261 | 261 | ||
262 | if (!id) { | 262 | if (!id) { |
263 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s", | 263 | dev_set_name(&vdev->dev, "%s", bus_id_name); |
264 | bus_id_name); | ||
265 | vdev->dev_no = ~(u64)0; | 264 | vdev->dev_no = ~(u64)0; |
266 | } else if (!cfg_handle) { | 265 | } else if (!cfg_handle) { |
267 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s-%lu", | 266 | dev_set_name(&vdev->dev, "%s-%lu", bus_id_name, *id); |
268 | bus_id_name, *id); | ||
269 | vdev->dev_no = *id; | 267 | vdev->dev_no = *id; |
270 | } else { | 268 | } else { |
271 | snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%s-%lu-%lu", | 269 | dev_set_name(&vdev->dev, "%s-%lu-%lu", bus_id_name, |
272 | bus_id_name, *cfg_handle, *id); | 270 | *cfg_handle, *id); |
273 | vdev->dev_no = *cfg_handle; | 271 | vdev->dev_no = *cfg_handle; |
274 | } | 272 | } |
275 | 273 | ||
@@ -292,12 +290,12 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, | |||
292 | } | 290 | } |
293 | vdev->dp = dp; | 291 | vdev->dp = dp; |
294 | 292 | ||
295 | printk(KERN_INFO "VIO: Adding device %s\n", vdev->dev.bus_id); | 293 | printk(KERN_INFO "VIO: Adding device %s\n", dev_name(&vdev->dev)); |
296 | 294 | ||
297 | err = device_register(&vdev->dev); | 295 | err = device_register(&vdev->dev); |
298 | if (err) { | 296 | if (err) { |
299 | printk(KERN_ERR "VIO: Could not register device %s, err=%d\n", | 297 | printk(KERN_ERR "VIO: Could not register device %s, err=%d\n", |
300 | vdev->dev.bus_id, err); | 298 | dev_name(&vdev->dev), err); |
301 | kfree(vdev); | 299 | kfree(vdev); |
302 | return NULL; | 300 | return NULL; |
303 | } | 301 | } |
@@ -330,7 +328,7 @@ static void vio_remove(struct mdesc_handle *hp, u64 node) | |||
330 | dev = device_find_child(&root_vdev->dev, (void *) node, | 328 | dev = device_find_child(&root_vdev->dev, (void *) node, |
331 | vio_md_node_match); | 329 | vio_md_node_match); |
332 | if (dev) { | 330 | if (dev) { |
333 | printk(KERN_INFO "VIO: Removing device %s\n", dev->bus_id); | 331 | printk(KERN_INFO "VIO: Removing device %s\n", dev_name(dev)); |
334 | 332 | ||
335 | device_unregister(dev); | 333 | device_unregister(dev); |
336 | } | 334 | } |