aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/Kconfig8
-rw-r--r--arch/ia64/Makefile2
-rw-r--r--arch/ia64/hp/common/sba_iommu.c3
-rw-r--r--arch/ia64/hp/sim/boot/Makefile2
-rw-r--r--arch/ia64/hp/sim/boot/bootloader.lds3
-rw-r--r--arch/ia64/hp/sim/simeth.c5
-rw-r--r--arch/ia64/hp/sim/simscsi.c1
-rw-r--r--arch/ia64/ia32/binfmt_elf32.c31
-rw-r--r--arch/ia64/kernel/acpi.c2
-rw-r--r--arch/ia64/kernel/efi.c10
-rw-r--r--arch/ia64/kernel/gate.lds.S2
-rw-r--r--arch/ia64/kernel/head.S1
-rw-r--r--arch/ia64/kernel/ia64_ksyms.c3
-rw-r--r--arch/ia64/kernel/iosapic.c21
-rw-r--r--arch/ia64/kernel/irq_ia64.c4
-rw-r--r--arch/ia64/kernel/kprobes.c29
-rw-r--r--arch/ia64/kernel/mca.c33
-rw-r--r--arch/ia64/kernel/module.c11
-rw-r--r--arch/ia64/kernel/process.c7
-rw-r--r--arch/ia64/kernel/setup.c7
-rw-r--r--arch/ia64/kernel/signal.c18
-rw-r--r--arch/ia64/kernel/time.c27
-rw-r--r--arch/ia64/kernel/topology.c26
-rw-r--r--arch/ia64/kernel/unaligned.c11
-rw-r--r--arch/ia64/kernel/uncached.c2
-rw-r--r--arch/ia64/kernel/vmlinux.lds.S11
-rw-r--r--arch/ia64/lib/Makefile4
-rw-r--r--arch/ia64/mm/tlb.c20
-rw-r--r--[-rwxr-xr-x]arch/ia64/scripts/unwcheck.py0
-rw-r--r--arch/ia64/sn/kernel/bte.c4
-rw-r--r--arch/ia64/sn/kernel/bte_error.c8
-rw-r--r--arch/ia64/sn/kernel/io_common.c13
-rw-r--r--arch/ia64/sn/kernel/setup.c11
-rw-r--r--arch/ia64/sn/kernel/xp_nofault.S10
-rw-r--r--arch/ia64/sn/pci/tioce_provider.c2
35 files changed, 178 insertions, 174 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index bef47725d4ad..c9307c99a1dc 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -42,6 +42,11 @@ config MMU
42config SWIOTLB 42config SWIOTLB
43 bool 43 bool
44 44
45config GENERIC_LOCKBREAK
46 bool
47 default y
48 depends on SMP && PREEMPT
49
45config RWSEM_XCHGADD_ALGORITHM 50config RWSEM_XCHGADD_ALGORITHM
46 bool 51 bool
47 default y 52 default y
@@ -75,6 +80,9 @@ config GENERIC_TIME_VSYSCALL
75 bool 80 bool
76 default y 81 default y
77 82
83config HAVE_SETUP_PER_CPU_AREA
84 def_bool y
85
78config DMI 86config DMI
79 bool 87 bool
80 default y 88 default y
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
index 34951aa2370b..b916ccfdef84 100644
--- a/arch/ia64/Makefile
+++ b/arch/ia64/Makefile
@@ -77,7 +77,7 @@ vmlinux.gz: vmlinux
77 $(Q)$(MAKE) $(build)=$(boot) $@ 77 $(Q)$(MAKE) $(build)=$(boot) $@
78 78
79unwcheck: vmlinux 79unwcheck: vmlinux
80 -$(Q)READELF=$(READELF) $(srctree)/arch/ia64/scripts/unwcheck.py $< 80 -$(Q)READELF=$(READELF) python $(srctree)/arch/ia64/scripts/unwcheck.py $<
81 81
82archclean: 82archclean:
83 $(Q)$(MAKE) $(clean)=$(boot) 83 $(Q)$(MAKE) $(clean)=$(boot)
diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
index bc859a311eaf..45bf04eb7d70 100644
--- a/arch/ia64/hp/common/sba_iommu.c
+++ b/arch/ia64/hp/common/sba_iommu.c
@@ -2034,7 +2034,8 @@ sba_init(void)
2034 if (!ia64_platform_is("hpzx1") && !ia64_platform_is("hpzx1_swiotlb")) 2034 if (!ia64_platform_is("hpzx1") && !ia64_platform_is("hpzx1_swiotlb"))
2035 return 0; 2035 return 0;
2036 2036
2037#if defined(CONFIG_IA64_GENERIC) && defined(CONFIG_CRASH_DUMP) 2037#if defined(CONFIG_IA64_GENERIC) && defined(CONFIG_CRASH_DUMP) && \
2038 defined(CONFIG_PROC_FS)
2038 /* If we are booting a kdump kernel, the sba_iommu will 2039 /* If we are booting a kdump kernel, the sba_iommu will
2039 * cause devices that were not shutdown properly to MCA 2040 * cause devices that were not shutdown properly to MCA
2040 * as soon as they are turned back on. Our only option for 2041 * as soon as they are turned back on. Our only option for
diff --git a/arch/ia64/hp/sim/boot/Makefile b/arch/ia64/hp/sim/boot/Makefile
index df6e9968c845..2e805e0cc560 100644
--- a/arch/ia64/hp/sim/boot/Makefile
+++ b/arch/ia64/hp/sim/boot/Makefile
@@ -33,5 +33,5 @@ $(obj)/vmlinux.bin: vmlinux FORCE
33LDFLAGS_bootloader = -static -T 33LDFLAGS_bootloader = -static -T
34 34
35$(obj)/bootloader: $(src)/bootloader.lds $(obj)/bootloader.o $(obj)/boot_head.o $(obj)/fw-emu.o \ 35$(obj)/bootloader: $(src)/bootloader.lds $(obj)/bootloader.o $(obj)/boot_head.o $(obj)/fw-emu.o \
36 lib/lib.a arch/ia64/lib/lib.a FORCE 36 lib/lib.a arch/ia64/lib/built-in.o arch/ia64/lib/lib.a FORCE
37 $(call if_changed,ld) 37 $(call if_changed,ld)
diff --git a/arch/ia64/hp/sim/boot/bootloader.lds b/arch/ia64/hp/sim/boot/bootloader.lds
index 69ae58531033..3977f25a1265 100644
--- a/arch/ia64/hp/sim/boot/bootloader.lds
+++ b/arch/ia64/hp/sim/boot/bootloader.lds
@@ -22,10 +22,11 @@ SECTIONS
22 .sdata : { *(.sdata) } 22 .sdata : { *(.sdata) }
23 _edata = .; 23 _edata = .;
24 24
25 _bss = .; 25 __bss_start = .;
26 .sbss : { *(.sbss) *(.scommon) } 26 .sbss : { *(.sbss) *(.scommon) }
27 .bss : { *(.bss) *(COMMON) } 27 .bss : { *(.bss) *(COMMON) }
28 . = ALIGN(64 / 8); 28 . = ALIGN(64 / 8);
29 __bss_stop = .;
29 _end = . ; 30 _end = . ;
30 31
31 /* Stabs debugging sections. */ 32 /* Stabs debugging sections. */
diff --git a/arch/ia64/hp/sim/simeth.c b/arch/ia64/hp/sim/simeth.c
index 08b117e2c54b..9898febf609a 100644
--- a/arch/ia64/hp/sim/simeth.c
+++ b/arch/ia64/hp/sim/simeth.c
@@ -497,11 +497,6 @@ simeth_interrupt(int irq, void *dev_id)
497{ 497{
498 struct net_device *dev = dev_id; 498 struct net_device *dev = dev_id;
499 499
500 if ( dev == NULL ) {
501 printk(KERN_WARNING "simeth: irq %d for unknown device\n", irq);
502 return IRQ_NONE;
503 }
504
505 /* 500 /*
506 * very simple loop because we get interrupts only when receiving 501 * very simple loop because we get interrupts only when receiving
507 */ 502 */
diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c
index 6ef9b5219930..7661bb065fa5 100644
--- a/arch/ia64/hp/sim/simscsi.c
+++ b/arch/ia64/hp/sim/simscsi.c
@@ -360,7 +360,6 @@ static struct scsi_host_template driver_template = {
360 .max_sectors = 1024, 360 .max_sectors = 1024,
361 .cmd_per_lun = SIMSCSI_REQ_QUEUE_LEN, 361 .cmd_per_lun = SIMSCSI_REQ_QUEUE_LEN,
362 .use_clustering = DISABLE_CLUSTERING, 362 .use_clustering = DISABLE_CLUSTERING,
363 .use_sg_chaining = ENABLE_SG_CHAINING,
364}; 363};
365 364
366static int __init 365static int __init
diff --git a/arch/ia64/ia32/binfmt_elf32.c b/arch/ia64/ia32/binfmt_elf32.c
index f6ae3ec93810..4f0c30c38e99 100644
--- a/arch/ia64/ia32/binfmt_elf32.c
+++ b/arch/ia64/ia32/binfmt_elf32.c
@@ -52,33 +52,29 @@ extern struct page *ia32_shared_page[];
52extern unsigned long *ia32_gdt; 52extern unsigned long *ia32_gdt;
53extern struct page *ia32_gate_page; 53extern struct page *ia32_gate_page;
54 54
55struct page * 55int
56ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int *type) 56ia32_install_shared_page (struct vm_area_struct *vma, struct vm_fault *vmf)
57{ 57{
58 struct page *pg = ia32_shared_page[smp_processor_id()]; 58 vmf->page = ia32_shared_page[smp_processor_id()];
59 get_page(pg); 59 get_page(vmf->page);
60 if (type) 60 return 0;
61 *type = VM_FAULT_MINOR;
62 return pg;
63} 61}
64 62
65struct page * 63int
66ia32_install_gate_page (struct vm_area_struct *vma, unsigned long address, int *type) 64ia32_install_gate_page (struct vm_area_struct *vma, struct vm_fault *vmf)
67{ 65{
68 struct page *pg = ia32_gate_page; 66 vmf->page = ia32_gate_page;
69 get_page(pg); 67 get_page(vmf->page);
70 if (type) 68 return 0;
71 *type = VM_FAULT_MINOR;
72 return pg;
73} 69}
74 70
75 71
76static struct vm_operations_struct ia32_shared_page_vm_ops = { 72static struct vm_operations_struct ia32_shared_page_vm_ops = {
77 .nopage = ia32_install_shared_page 73 .fault = ia32_install_shared_page
78}; 74};
79 75
80static struct vm_operations_struct ia32_gate_page_vm_ops = { 76static struct vm_operations_struct ia32_gate_page_vm_ops = {
81 .nopage = ia32_install_gate_page 77 .fault = ia32_install_gate_page
82}; 78};
83 79
84void 80void
@@ -226,7 +222,8 @@ elf32_set_personality (void)
226} 222}
227 223
228static unsigned long 224static unsigned long
229elf32_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type) 225elf32_map(struct file *filep, unsigned long addr, struct elf_phdr *eppnt,
226 int prot, int type, unsigned long unused)
230{ 227{
231 unsigned long pgoff = (eppnt->p_vaddr) & ~IA32_PAGE_MASK; 228 unsigned long pgoff = (eppnt->p_vaddr) & ~IA32_PAGE_MASK;
232 229
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 897e2083a3b1..00b5d08f6da8 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -860,7 +860,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
860 lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer; 860 lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer;
861 861
862 if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) || 862 if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) ||
863 (!lsapic->lapic_flags & ACPI_MADT_ENABLED)) { 863 (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) {
864 kfree(buffer.pointer); 864 kfree(buffer.pointer);
865 return -EINVAL; 865 return -EINVAL;
866 } 866 }
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
index 8e8f8b6193ee..242d79341120 100644
--- a/arch/ia64/kernel/efi.c
+++ b/arch/ia64/kernel/efi.c
@@ -370,7 +370,7 @@ efi_get_pal_addr (void)
370 continue; 370 continue;
371 } 371 }
372 372
373 if (md->num_pages << EFI_PAGE_SHIFT > IA64_GRANULE_SIZE) 373 if (efi_md_size(md) > IA64_GRANULE_SIZE)
374 panic("Woah! PAL code size bigger than a granule!"); 374 panic("Woah! PAL code size bigger than a granule!");
375 375
376#if EFI_DEBUG 376#if EFI_DEBUG
@@ -378,7 +378,7 @@ efi_get_pal_addr (void)
378 378
379 printk(KERN_INFO "CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n", 379 printk(KERN_INFO "CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n",
380 smp_processor_id(), md->phys_addr, 380 smp_processor_id(), md->phys_addr,
381 md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), 381 md->phys_addr + efi_md_size(md),
382 vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE); 382 vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
383#endif 383#endif
384 return __va(md->phys_addr); 384 return __va(md->phys_addr);
@@ -523,7 +523,7 @@ efi_init (void)
523 md = p; 523 md = p;
524 printk("mem%02u: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) (%luMB)\n", 524 printk("mem%02u: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) (%luMB)\n",
525 i, md->type, md->attribute, md->phys_addr, 525 i, md->type, md->attribute, md->phys_addr,
526 md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), 526 md->phys_addr + efi_md_size(md),
527 md->num_pages >> (20 - EFI_PAGE_SHIFT)); 527 md->num_pages >> (20 - EFI_PAGE_SHIFT));
528 } 528 }
529 } 529 }
@@ -656,7 +656,7 @@ efi_memory_descriptor (unsigned long phys_addr)
656 for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) { 656 for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
657 md = p; 657 md = p;
658 658
659 if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT)) 659 if (phys_addr - md->phys_addr < efi_md_size(md))
660 return md; 660 return md;
661 } 661 }
662 return NULL; 662 return NULL;
@@ -1158,7 +1158,7 @@ efi_initialize_iomem_resources(struct resource *code_resource,
1158 1158
1159 res->name = name; 1159 res->name = name;
1160 res->start = md->phys_addr; 1160 res->start = md->phys_addr;
1161 res->end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1; 1161 res->end = md->phys_addr + efi_md_size(md) - 1;
1162 res->flags = flags; 1162 res->flags = flags;
1163 1163
1164 if (insert_resource(&iomem_resource, res) < 0) 1164 if (insert_resource(&iomem_resource, res) < 0)
diff --git a/arch/ia64/kernel/gate.lds.S b/arch/ia64/kernel/gate.lds.S
index 454d7a7dfa9d..3cb1abc00e24 100644
--- a/arch/ia64/kernel/gate.lds.S
+++ b/arch/ia64/kernel/gate.lds.S
@@ -30,7 +30,7 @@ SECTIONS
30 * the dynamic symbol table et al. If this amount is insufficient, 30 * the dynamic symbol table et al. If this amount is insufficient,
31 * ld -shared will barf. Just increase it here. 31 * ld -shared will barf. Just increase it here.
32 */ 32 */
33 . = GATE_ADDR + 0x500; 33 . = GATE_ADDR + 0x600;
34 34
35 .data.patch : { 35 .data.patch : {
36 __start_gate_mckinley_e9_patchlist = .; 36 __start_gate_mckinley_e9_patchlist = .;
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
index 4e5e27540e27..d3a41d5f8d12 100644
--- a/arch/ia64/kernel/head.S
+++ b/arch/ia64/kernel/head.S
@@ -1176,6 +1176,7 @@ tlb_purge_done:
1176 RESTORE_REG(cr.dcr, r25, r17);; 1176 RESTORE_REG(cr.dcr, r25, r17);;
1177 RESTORE_REG(cr.iva, r25, r17);; 1177 RESTORE_REG(cr.iva, r25, r17);;
1178 RESTORE_REG(cr.pta, r25, r17);; 1178 RESTORE_REG(cr.pta, r25, r17);;
1179 srlz.d;; // required not to violate RAW dependency
1179 RESTORE_REG(cr.itv, r25, r17);; 1180 RESTORE_REG(cr.itv, r25, r17);;
1180 RESTORE_REG(cr.pmv, r25, r17);; 1181 RESTORE_REG(cr.pmv, r25, r17);;
1181 RESTORE_REG(cr.cmcv, r25, r17);; 1182 RESTORE_REG(cr.cmcv, r25, r17);;
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
index bd17190bebb6..c3b4412ccc67 100644
--- a/arch/ia64/kernel/ia64_ksyms.c
+++ b/arch/ia64/kernel/ia64_ksyms.c
@@ -63,6 +63,9 @@ EXPORT_SYMBOL(__udivdi3);
63EXPORT_SYMBOL(__moddi3); 63EXPORT_SYMBOL(__moddi3);
64EXPORT_SYMBOL(__umoddi3); 64EXPORT_SYMBOL(__umoddi3);
65 65
66#include <asm/page.h>
67EXPORT_SYMBOL(copy_page);
68
66#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) 69#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
67extern void xor_ia64_2(void); 70extern void xor_ia64_2(void);
68extern void xor_ia64_3(void); 71extern void xor_ia64_3(void);
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
index 274a59383043..398e2fd1cd25 100644
--- a/arch/ia64/kernel/iosapic.c
+++ b/arch/ia64/kernel/iosapic.c
@@ -199,19 +199,6 @@ static inline int __gsi_to_irq(unsigned int gsi)
199 return -1; 199 return -1;
200} 200}
201 201
202/*
203 * Translate GSI number to the corresponding IA-64 interrupt vector. If no
204 * entry exists, return -1.
205 */
206inline int
207gsi_to_vector (unsigned int gsi)
208{
209 int irq = __gsi_to_irq(gsi);
210 if (check_irq_used(irq) < 0)
211 return -1;
212 return irq_to_vector(irq);
213}
214
215int 202int
216gsi_to_irq (unsigned int gsi) 203gsi_to_irq (unsigned int gsi)
217{ 204{
@@ -429,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq)
429#define iosapic_disable_level_irq mask_irq 416#define iosapic_disable_level_irq mask_irq
430#define iosapic_ack_level_irq nop 417#define iosapic_ack_level_irq nop
431 418
432struct irq_chip irq_type_iosapic_level = { 419static struct irq_chip irq_type_iosapic_level = {
433 .name = "IO-SAPIC-level", 420 .name = "IO-SAPIC-level",
434 .startup = iosapic_startup_level_irq, 421 .startup = iosapic_startup_level_irq,
435 .shutdown = iosapic_shutdown_level_irq, 422 .shutdown = iosapic_shutdown_level_irq,
@@ -478,7 +465,7 @@ iosapic_ack_edge_irq (unsigned int irq)
478#define iosapic_disable_edge_irq nop 465#define iosapic_disable_edge_irq nop
479#define iosapic_end_edge_irq nop 466#define iosapic_end_edge_irq nop
480 467
481struct irq_chip irq_type_iosapic_edge = { 468static struct irq_chip irq_type_iosapic_edge = {
482 .name = "IO-SAPIC-edge", 469 .name = "IO-SAPIC-edge",
483 .startup = iosapic_startup_edge_irq, 470 .startup = iosapic_startup_edge_irq,
484 .shutdown = iosapic_disable_edge_irq, 471 .shutdown = iosapic_disable_edge_irq,
@@ -491,7 +478,7 @@ struct irq_chip irq_type_iosapic_edge = {
491 .set_affinity = iosapic_set_affinity 478 .set_affinity = iosapic_set_affinity
492}; 479};
493 480
494unsigned int 481static unsigned int
495iosapic_version (char __iomem *addr) 482iosapic_version (char __iomem *addr)
496{ 483{
497 /* 484 /*
@@ -938,7 +925,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
938 case ACPI_INTERRUPT_CPEI: 925 case ACPI_INTERRUPT_CPEI:
939 irq = vector = IA64_CPE_VECTOR; 926 irq = vector = IA64_CPE_VECTOR;
940 BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL)); 927 BUG_ON(bind_irq_vector(irq, vector, CPU_MASK_ALL));
941 delivery = IOSAPIC_LOWEST_PRIORITY; 928 delivery = IOSAPIC_FIXED;
942 mask = 1; 929 mask = 1;
943 break; 930 break;
944 default: 931 default:
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c
index 00a4599e5f47..0b52f19ed046 100644
--- a/arch/ia64/kernel/irq_ia64.c
+++ b/arch/ia64/kernel/irq_ia64.c
@@ -200,7 +200,7 @@ assign_irq_vector (int irq)
200{ 200{
201 unsigned long flags; 201 unsigned long flags;
202 int vector, cpu; 202 int vector, cpu;
203 cpumask_t domain; 203 cpumask_t domain = CPU_MASK_NONE;
204 204
205 vector = -ENOSPC; 205 vector = -ENOSPC;
206 206
@@ -340,7 +340,7 @@ int create_irq(void)
340{ 340{
341 unsigned long flags; 341 unsigned long flags;
342 int irq, vector, cpu; 342 int irq, vector, cpu;
343 cpumask_t domain; 343 cpumask_t domain = CPU_MASK_NONE;
344 344
345 irq = vector = -ENOSPC; 345 irq = vector = -ENOSPC;
346 spin_lock_irqsave(&vector_lock, flags); 346 spin_lock_irqsave(&vector_lock, flags);
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c
index 5fd65d8302c8..fc4d2676264f 100644
--- a/arch/ia64/kernel/kprobes.c
+++ b/arch/ia64/kernel/kprobes.c
@@ -182,8 +182,8 @@ static int __kprobes unsupported_inst(uint template, uint slot,
182 qp = kprobe_inst & 0x3f; 182 qp = kprobe_inst & 0x3f;
183 if (is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst)) { 183 if (is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst)) {
184 if (slot == 1 && qp) { 184 if (slot == 1 && qp) {
185 printk(KERN_WARNING "Kprobes on cmp unc" 185 printk(KERN_WARNING "Kprobes on cmp unc "
186 "instruction on slot 1 at <0x%lx>" 186 "instruction on slot 1 at <0x%lx> "
187 "is not supported\n", addr); 187 "is not supported\n", addr);
188 return -EINVAL; 188 return -EINVAL;
189 189
@@ -221,8 +221,8 @@ static int __kprobes unsupported_inst(uint template, uint slot,
221 * bit 12 to be equal to 1 221 * bit 12 to be equal to 1
222 */ 222 */
223 if (slot == 1 && qp) { 223 if (slot == 1 && qp) {
224 printk(KERN_WARNING "Kprobes on test bit" 224 printk(KERN_WARNING "Kprobes on test bit "
225 "instruction on slot at <0x%lx>" 225 "instruction on slot at <0x%lx> "
226 "is not supported\n", addr); 226 "is not supported\n", addr);
227 return -EINVAL; 227 return -EINVAL;
228 } 228 }
@@ -242,7 +242,7 @@ static int __kprobes unsupported_inst(uint template, uint slot,
242 */ 242 */
243 int x6=(kprobe_inst >> 27) & 0x3F; 243 int x6=(kprobe_inst >> 27) & 0x3F;
244 if ((x6 == 0x10) || (x6 == 0x11)) { 244 if ((x6 == 0x10) || (x6 == 0x11)) {
245 printk(KERN_WARNING "Kprobes on" 245 printk(KERN_WARNING "Kprobes on "
246 "Indirect Predict is not supported\n"); 246 "Indirect Predict is not supported\n");
247 return -EINVAL; 247 return -EINVAL;
248 } 248 }
@@ -435,6 +435,23 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
435 /* another task is sharing our hash bucket */ 435 /* another task is sharing our hash bucket */
436 continue; 436 continue;
437 437
438 orig_ret_address = (unsigned long)ri->ret_addr;
439 if (orig_ret_address != trampoline_address)
440 /*
441 * This is the real return address. Any other
442 * instances associated with this task are for
443 * other calls deeper on the call stack
444 */
445 break;
446 }
447
448 regs->cr_iip = orig_ret_address;
449
450 hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
451 if (ri->task != current)
452 /* another task is sharing our hash bucket */
453 continue;
454
438 if (ri->rp && ri->rp->handler) 455 if (ri->rp && ri->rp->handler)
439 ri->rp->handler(ri, regs); 456 ri->rp->handler(ri, regs);
440 457
@@ -452,8 +469,6 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
452 469
453 kretprobe_assert(ri, orig_ret_address, trampoline_address); 470 kretprobe_assert(ri, orig_ret_address, trampoline_address);
454 471
455 regs->cr_iip = orig_ret_address;
456
457 reset_current_kprobe(); 472 reset_current_kprobe();
458 spin_unlock_irqrestore(&kretprobe_lock, flags); 473 spin_unlock_irqrestore(&kretprobe_lock, flags);
459 preempt_enable_no_resched(); 474 preempt_enable_no_resched();
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
index 10b48cd15a87..6dbf5919d2d0 100644
--- a/arch/ia64/kernel/mca.c
+++ b/arch/ia64/kernel/mca.c
@@ -75,6 +75,7 @@
75#include <linux/workqueue.h> 75#include <linux/workqueue.h>
76#include <linux/cpumask.h> 76#include <linux/cpumask.h>
77#include <linux/kdebug.h> 77#include <linux/kdebug.h>
78#include <linux/cpu.h>
78 79
79#include <asm/delay.h> 80#include <asm/delay.h>
80#include <asm/machvec.h> 81#include <asm/machvec.h>
@@ -1813,6 +1814,36 @@ ia64_mca_cpu_init(void *cpu_data)
1813 PAGE_KERNEL)); 1814 PAGE_KERNEL));
1814} 1815}
1815 1816
1817static void __cpuinit ia64_mca_cmc_vector_adjust(void *dummy)
1818{
1819 unsigned long flags;
1820
1821 local_irq_save(flags);
1822 if (!cmc_polling_enabled)
1823 ia64_mca_cmc_vector_enable(NULL);
1824 local_irq_restore(flags);
1825}
1826
1827static int __cpuinit mca_cpu_callback(struct notifier_block *nfb,
1828 unsigned long action,
1829 void *hcpu)
1830{
1831 int hotcpu = (unsigned long) hcpu;
1832
1833 switch (action) {
1834 case CPU_ONLINE:
1835 case CPU_ONLINE_FROZEN:
1836 smp_call_function_single(hotcpu, ia64_mca_cmc_vector_adjust,
1837 NULL, 1, 0);
1838 break;
1839 }
1840 return NOTIFY_OK;
1841}
1842
1843static struct notifier_block mca_cpu_notifier __cpuinitdata = {
1844 .notifier_call = mca_cpu_callback
1845};
1846
1816/* 1847/*
1817 * ia64_mca_init 1848 * ia64_mca_init
1818 * 1849 *
@@ -1996,6 +2027,8 @@ ia64_mca_late_init(void)
1996 if (!mca_init) 2027 if (!mca_init)
1997 return 0; 2028 return 0;
1998 2029
2030 register_hotcpu_notifier(&mca_cpu_notifier);
2031
1999 /* Setup the CMCI/P vector and handler */ 2032 /* Setup the CMCI/P vector and handler */
2000 init_timer(&cmc_poll_timer); 2033 init_timer(&cmc_poll_timer);
2001 cmc_poll_timer.function = ia64_mca_cmc_poll; 2034 cmc_poll_timer.function = ia64_mca_cmc_poll;
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
index 196287928bae..e58f4367cf11 100644
--- a/arch/ia64/kernel/module.c
+++ b/arch/ia64/kernel/module.c
@@ -940,14 +940,3 @@ module_arch_cleanup (struct module *mod)
940 if (mod->arch.core_unw_table) 940 if (mod->arch.core_unw_table)
941 unw_remove_unwind_table(mod->arch.core_unw_table); 941 unw_remove_unwind_table(mod->arch.core_unw_table);
942} 942}
943
944#ifdef CONFIG_SMP
945void
946percpu_modcopy (void *pcpudst, const void *src, unsigned long size)
947{
948 unsigned int i;
949 for_each_possible_cpu(i) {
950 memcpy(pcpudst + __per_cpu_offset[i], src, size);
951 }
952}
953#endif /* CONFIG_SMP */
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index 2418289ee5ca..7377d323131d 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -27,6 +27,7 @@
27#include <linux/interrupt.h> 27#include <linux/interrupt.h>
28#include <linux/delay.h> 28#include <linux/delay.h>
29#include <linux/kdebug.h> 29#include <linux/kdebug.h>
30#include <linux/utsname.h>
30 31
31#include <asm/cpu.h> 32#include <asm/cpu.h>
32#include <asm/delay.h> 33#include <asm/delay.h>
@@ -107,8 +108,9 @@ show_regs (struct pt_regs *regs)
107 print_modules(); 108 print_modules();
108 printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current), 109 printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current),
109 smp_processor_id(), current->comm); 110 smp_processor_id(), current->comm);
110 printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s\n", 111 printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
111 regs->cr_ipsr, regs->cr_ifs, ip, print_tainted()); 112 regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
113 init_utsname()->release);
112 print_symbol("ip is at %s\n", ip); 114 print_symbol("ip is at %s\n", ip);
113 printk("unat: %016lx pfs : %016lx rsc : %016lx\n", 115 printk("unat: %016lx pfs : %016lx rsc : %016lx\n",
114 regs->ar_unat, regs->ar_pfs, regs->ar_rsc); 116 regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
@@ -737,6 +739,7 @@ flush_thread (void)
737 ia32_drop_ia64_partial_page_list(current); 739 ia32_drop_ia64_partial_page_list(current);
738 current->thread.task_size = IA32_PAGE_OFFSET; 740 current->thread.task_size = IA32_PAGE_OFFSET;
739 set_fs(USER_DS); 741 set_fs(USER_DS);
742 memset(current->thread.tls_array, 0, sizeof(current->thread.tls_array));
740 } 743 }
741#endif 744#endif
742} 745}
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
index 2b3751eef5ce..86028c69861e 100644
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -71,8 +71,6 @@ unsigned long __per_cpu_offset[NR_CPUS];
71EXPORT_SYMBOL(__per_cpu_offset); 71EXPORT_SYMBOL(__per_cpu_offset);
72#endif 72#endif
73 73
74extern void ia64_setup_printk_clock(void);
75
76DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info); 74DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
77DEFINE_PER_CPU(unsigned long, local_per_cpu_offset); 75DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
78unsigned long ia64_cycles_per_usec; 76unsigned long ia64_cycles_per_usec;
@@ -95,7 +93,6 @@ static struct resource bss_resource = {
95 .name = "Kernel bss", 93 .name = "Kernel bss",
96 .flags = IORESOURCE_BUSY | IORESOURCE_MEM 94 .flags = IORESOURCE_BUSY | IORESOURCE_MEM
97}; 95};
98extern char _text[], _end[], _etext[], _edata[], _bss[];
99 96
100unsigned long ia64_max_cacheline_size; 97unsigned long ia64_max_cacheline_size;
101 98
@@ -206,7 +203,7 @@ static int __init register_memory(void)
206 code_resource.end = ia64_tpa(_etext) - 1; 203 code_resource.end = ia64_tpa(_etext) - 1;
207 data_resource.start = ia64_tpa(_etext); 204 data_resource.start = ia64_tpa(_etext);
208 data_resource.end = ia64_tpa(_edata) - 1; 205 data_resource.end = ia64_tpa(_edata) - 1;
209 bss_resource.start = ia64_tpa(_bss); 206 bss_resource.start = ia64_tpa(__bss_start);
210 bss_resource.end = ia64_tpa(_end) - 1; 207 bss_resource.end = ia64_tpa(_end) - 1;
211 efi_initialize_iomem_resources(&code_resource, &data_resource, 208 efi_initialize_iomem_resources(&code_resource, &data_resource,
212 &bss_resource); 209 &bss_resource);
@@ -508,8 +505,6 @@ setup_arch (char **cmdline_p)
508 /* process SAL system table: */ 505 /* process SAL system table: */
509 ia64_sal_init(__va(efi.sal_systab)); 506 ia64_sal_init(__va(efi.sal_systab));
510 507
511 ia64_setup_printk_clock();
512
513#ifdef CONFIG_SMP 508#ifdef CONFIG_SMP
514 cpu_physical_id(0) = hard_smp_processor_id(); 509 cpu_physical_id(0) = hard_smp_processor_id();
515#endif 510#endif
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index cdb64cc4d9c8..309da3567bc8 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -98,7 +98,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
98 if ((flags & IA64_SC_FLAG_FPH_VALID) != 0) { 98 if ((flags & IA64_SC_FLAG_FPH_VALID) != 0) {
99 struct ia64_psr *psr = ia64_psr(&scr->pt); 99 struct ia64_psr *psr = ia64_psr(&scr->pt);
100 100
101 __copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16); 101 err |= __copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
102 psr->mfh = 0; /* drop signal handler's fph contents... */ 102 psr->mfh = 0; /* drop signal handler's fph contents... */
103 preempt_disable(); 103 preempt_disable();
104 if (psr->dfh) 104 if (psr->dfh)
@@ -244,7 +244,7 @@ static long
244setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratch *scr) 244setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratch *scr)
245{ 245{
246 unsigned long flags = 0, ifs, cfm, nat; 246 unsigned long flags = 0, ifs, cfm, nat;
247 long err; 247 long err = 0;
248 248
249 ifs = scr->pt.cr_ifs; 249 ifs = scr->pt.cr_ifs;
250 250
@@ -257,12 +257,12 @@ setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratc
257 ia64_flush_fph(current); 257 ia64_flush_fph(current);
258 if ((current->thread.flags & IA64_THREAD_FPH_VALID)) { 258 if ((current->thread.flags & IA64_THREAD_FPH_VALID)) {
259 flags |= IA64_SC_FLAG_FPH_VALID; 259 flags |= IA64_SC_FLAG_FPH_VALID;
260 __copy_to_user(&sc->sc_fr[32], current->thread.fph, 96*16); 260 err = __copy_to_user(&sc->sc_fr[32], current->thread.fph, 96*16);
261 } 261 }
262 262
263 nat = ia64_get_scratch_nat_bits(&scr->pt, scr->scratch_unat); 263 nat = ia64_get_scratch_nat_bits(&scr->pt, scr->scratch_unat);
264 264
265 err = __put_user(flags, &sc->sc_flags); 265 err |= __put_user(flags, &sc->sc_flags);
266 err |= __put_user(nat, &sc->sc_nat); 266 err |= __put_user(nat, &sc->sc_nat);
267 err |= PUT_SIGSET(mask, &sc->sc_mask); 267 err |= PUT_SIGSET(mask, &sc->sc_mask);
268 err |= __put_user(cfm, &sc->sc_cfm); 268 err |= __put_user(cfm, &sc->sc_cfm);
@@ -280,15 +280,7 @@ setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratc
280 err |= __copy_to_user(&sc->sc_gr[15], &scr->pt.r15, 8); /* r15 */ 280 err |= __copy_to_user(&sc->sc_gr[15], &scr->pt.r15, 8); /* r15 */
281 err |= __put_user(scr->pt.cr_iip + ia64_psr(&scr->pt)->ri, &sc->sc_ip); 281 err |= __put_user(scr->pt.cr_iip + ia64_psr(&scr->pt)->ri, &sc->sc_ip);
282 282
283 if (flags & IA64_SC_FLAG_IN_SYSCALL) { 283 if (!(flags & IA64_SC_FLAG_IN_SYSCALL)) {
284 /* Clear scratch registers if the signal interrupted a system call. */
285 err |= __put_user(0, &sc->sc_ar_ccv); /* ar.ccv */
286 err |= __put_user(0, &sc->sc_br[7]); /* b7 */
287 err |= __put_user(0, &sc->sc_gr[14]); /* r14 */
288 err |= __clear_user(&sc->sc_ar25, 2*8); /* ar.csd & ar.ssd */
289 err |= __clear_user(&sc->sc_gr[2], 2*8); /* r2-r3 */
290 err |= __clear_user(&sc->sc_gr[16], 16*8); /* r16-r31 */
291 } else {
292 /* Copy scratch regs to sigcontext if the signal didn't interrupt a syscall. */ 284 /* Copy scratch regs to sigcontext if the signal didn't interrupt a syscall. */
293 err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); /* ar.ccv */ 285 err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); /* ar.ccv */
294 err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */ 286 err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
index 2bb84214e5f1..3ab042720970 100644
--- a/arch/ia64/kernel/time.c
+++ b/arch/ia64/kernel/time.c
@@ -344,33 +344,6 @@ udelay (unsigned long usecs)
344} 344}
345EXPORT_SYMBOL(udelay); 345EXPORT_SYMBOL(udelay);
346 346
347static unsigned long long ia64_itc_printk_clock(void)
348{
349 if (ia64_get_kr(IA64_KR_PER_CPU_DATA))
350 return sched_clock();
351 return 0;
352}
353
354static unsigned long long ia64_default_printk_clock(void)
355{
356 return (unsigned long long)(jiffies_64 - INITIAL_JIFFIES) *
357 (1000000000/HZ);
358}
359
360unsigned long long (*ia64_printk_clock)(void) = &ia64_default_printk_clock;
361
362unsigned long long printk_clock(void)
363{
364 return ia64_printk_clock();
365}
366
367void __init
368ia64_setup_printk_clock(void)
369{
370 if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT))
371 ia64_printk_clock = ia64_itc_printk_clock;
372}
373
374/* IA64 doesn't cache the timezone */ 347/* IA64 doesn't cache the timezone */
375void update_vsyscall_tz(void) 348void update_vsyscall_tz(void)
376{ 349{
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c
index 14261fee5f4d..a2484fc1a06c 100644
--- a/arch/ia64/kernel/topology.c
+++ b/arch/ia64/kernel/topology.c
@@ -354,27 +354,27 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
354 if (unlikely(retval < 0)) 354 if (unlikely(retval < 0))
355 return retval; 355 return retval;
356 356
357 all_cpu_cache_info[cpu].kobj.parent = &sys_dev->kobj; 357 retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj,
358 kobject_set_name(&all_cpu_cache_info[cpu].kobj, "%s", "cache"); 358 &cache_ktype_percpu_entry, &sys_dev->kobj,
359 all_cpu_cache_info[cpu].kobj.ktype = &cache_ktype_percpu_entry; 359 "%s", "cache");
360 retval = kobject_register(&all_cpu_cache_info[cpu].kobj);
361 360
362 for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { 361 for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) {
363 this_object = LEAF_KOBJECT_PTR(cpu,i); 362 this_object = LEAF_KOBJECT_PTR(cpu,i);
364 this_object->kobj.parent = &all_cpu_cache_info[cpu].kobj; 363 retval = kobject_init_and_add(&(this_object->kobj),
365 kobject_set_name(&(this_object->kobj), "index%1lu", i); 364 &cache_ktype,
366 this_object->kobj.ktype = &cache_ktype; 365 &all_cpu_cache_info[cpu].kobj,
367 retval = kobject_register(&(this_object->kobj)); 366 "index%1lu", i);
368 if (unlikely(retval)) { 367 if (unlikely(retval)) {
369 for (j = 0; j < i; j++) { 368 for (j = 0; j < i; j++) {
370 kobject_unregister( 369 kobject_put(&(LEAF_KOBJECT_PTR(cpu,j)->kobj));
371 &(LEAF_KOBJECT_PTR(cpu,j)->kobj));
372 } 370 }
373 kobject_unregister(&all_cpu_cache_info[cpu].kobj); 371 kobject_put(&all_cpu_cache_info[cpu].kobj);
374 cpu_cache_sysfs_exit(cpu); 372 cpu_cache_sysfs_exit(cpu);
375 break; 373 break;
376 } 374 }
375 kobject_uevent(&(this_object->kobj), KOBJ_ADD);
377 } 376 }
377 kobject_uevent(&all_cpu_cache_info[cpu].kobj, KOBJ_ADD);
378 return retval; 378 return retval;
379} 379}
380 380
@@ -385,10 +385,10 @@ static int __cpuinit cache_remove_dev(struct sys_device * sys_dev)
385 unsigned long i; 385 unsigned long i;
386 386
387 for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) 387 for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++)
388 kobject_unregister(&(LEAF_KOBJECT_PTR(cpu,i)->kobj)); 388 kobject_put(&(LEAF_KOBJECT_PTR(cpu,i)->kobj));
389 389
390 if (all_cpu_cache_info[cpu].kobj.parent) { 390 if (all_cpu_cache_info[cpu].kobj.parent) {
391 kobject_unregister(&all_cpu_cache_info[cpu].kobj); 391 kobject_put(&all_cpu_cache_info[cpu].kobj);
392 memset(&all_cpu_cache_info[cpu].kobj, 392 memset(&all_cpu_cache_info[cpu].kobj,
393 0, 393 0,
394 sizeof(struct kobject)); 394 sizeof(struct kobject));
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c
index 2173de9fe917..f6a1aeb742b3 100644
--- a/arch/ia64/kernel/unaligned.c
+++ b/arch/ia64/kernel/unaligned.c
@@ -1488,16 +1488,19 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
1488 case LDFA_OP: 1488 case LDFA_OP:
1489 case LDFCCLR_OP: 1489 case LDFCCLR_OP:
1490 case LDFCNC_OP: 1490 case LDFCNC_OP:
1491 case LDF_IMM_OP:
1492 case LDFA_IMM_OP:
1493 case LDFCCLR_IMM_OP:
1494 case LDFCNC_IMM_OP:
1495 if (u.insn.x) 1491 if (u.insn.x)
1496 ret = emulate_load_floatpair(ifa, u.insn, regs); 1492 ret = emulate_load_floatpair(ifa, u.insn, regs);
1497 else 1493 else
1498 ret = emulate_load_float(ifa, u.insn, regs); 1494 ret = emulate_load_float(ifa, u.insn, regs);
1499 break; 1495 break;
1500 1496
1497 case LDF_IMM_OP:
1498 case LDFA_IMM_OP:
1499 case LDFCCLR_IMM_OP:
1500 case LDFCNC_IMM_OP:
1501 ret = emulate_load_float(ifa, u.insn, regs);
1502 break;
1503
1501 case STF_OP: 1504 case STF_OP:
1502 case STF_IMM_OP: 1505 case STF_IMM_OP:
1503 ret = emulate_store_float(ifa, u.insn, regs); 1506 ret = emulate_store_float(ifa, u.insn, regs);
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c
index a7be4f203420..2a90c32024f4 100644
--- a/arch/ia64/kernel/uncached.c
+++ b/arch/ia64/kernel/uncached.c
@@ -118,7 +118,7 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)
118 for (i = 0; i < (IA64_GRANULE_SIZE / PAGE_SIZE); i++) 118 for (i = 0; i < (IA64_GRANULE_SIZE / PAGE_SIZE); i++)
119 SetPageUncached(&page[i]); 119 SetPageUncached(&page[i]);
120 120
121 flush_tlb_kernel_range(uc_addr, uc_adddr + IA64_GRANULE_SIZE); 121 flush_tlb_kernel_range(uc_addr, uc_addr + IA64_GRANULE_SIZE);
122 122
123 status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL); 123 status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
124 if (status == PAL_VISIBILITY_OK_REMOTE_NEEDED) { 124 if (status == PAL_VISIBILITY_OK_REMOTE_NEEDED) {
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
index 00232b4357ba..80622acc95de 100644
--- a/arch/ia64/kernel/vmlinux.lds.S
+++ b/arch/ia64/kernel/vmlinux.lds.S
@@ -27,8 +27,8 @@ SECTIONS
27{ 27{
28 /* Sections to be discarded */ 28 /* Sections to be discarded */
29 /DISCARD/ : { 29 /DISCARD/ : {
30 *(.exit.text) 30 EXIT_TEXT
31 *(.exit.data) 31 EXIT_DATA
32 *(.exitcall.exit) 32 *(.exitcall.exit)
33 *(.IA_64.unwind.exit.text) 33 *(.IA_64.unwind.exit.text)
34 *(.IA_64.unwind_info.exit.text) 34 *(.IA_64.unwind_info.exit.text)
@@ -119,12 +119,12 @@ SECTIONS
119 .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) 119 .init.text : AT(ADDR(.init.text) - LOAD_OFFSET)
120 { 120 {
121 _sinittext = .; 121 _sinittext = .;
122 *(.init.text) 122 INIT_TEXT
123 _einittext = .; 123 _einittext = .;
124 } 124 }
125 125
126 .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) 126 .init.data : AT(ADDR(.init.data) - LOAD_OFFSET)
127 { *(.init.data) } 127 { INIT_DATA }
128 128
129#ifdef CONFIG_BLK_DEV_INITRD 129#ifdef CONFIG_BLK_DEV_INITRD
130 .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) 130 .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET)
@@ -240,11 +240,12 @@ SECTIONS
240 .sdata : AT(ADDR(.sdata) - LOAD_OFFSET) 240 .sdata : AT(ADDR(.sdata) - LOAD_OFFSET)
241 { *(.sdata) *(.sdata1) *(.srdata) } 241 { *(.sdata) *(.sdata1) *(.srdata) }
242 _edata = .; 242 _edata = .;
243 _bss = .; 243 __bss_start = .;
244 .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) 244 .sbss : AT(ADDR(.sbss) - LOAD_OFFSET)
245 { *(.sbss) *(.scommon) } 245 { *(.sbss) *(.scommon) }
246 .bss : AT(ADDR(.bss) - LOAD_OFFSET) 246 .bss : AT(ADDR(.bss) - LOAD_OFFSET)
247 { *(.bss) *(COMMON) } 247 { *(.bss) *(COMMON) }
248 __bss_stop = .;
248 249
249 _end = .; 250 _end = .;
250 251
diff --git a/arch/ia64/lib/Makefile b/arch/ia64/lib/Makefile
index 46edf8444c7e..98771e2a78af 100644
--- a/arch/ia64/lib/Makefile
+++ b/arch/ia64/lib/Makefile
@@ -11,8 +11,8 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \
11 flush.o ip_fast_csum.o do_csum.o \ 11 flush.o ip_fast_csum.o do_csum.o \
12 memset.o strlen.o xor.o 12 memset.o strlen.o xor.o
13 13
14lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o 14obj-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o
15lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o 15obj-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o
16lib-$(CONFIG_PERFMON) += carta_random.o 16lib-$(CONFIG_PERFMON) += carta_random.o
17 17
18AFLAGS___divdi3.o = 18AFLAGS___divdi3.o =
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c
index 1682fc639038..655da240d13c 100644
--- a/arch/ia64/mm/tlb.c
+++ b/arch/ia64/mm/tlb.c
@@ -10,6 +10,7 @@
10 * IPI based ptc implementation and A-step IPI implementation. 10 * IPI based ptc implementation and A-step IPI implementation.
11 * Rohit Seth <rohit.seth@intel.com> 11 * Rohit Seth <rohit.seth@intel.com>
12 * Ken Chen <kenneth.w.chen@intel.com> 12 * Ken Chen <kenneth.w.chen@intel.com>
13 * Christophe de Dinechin <ddd@hp.com>: Avoid ptc.e on memory allocation
13 */ 14 */
14#include <linux/module.h> 15#include <linux/module.h>
15#include <linux/init.h> 16#include <linux/init.h>
@@ -89,9 +90,16 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start,
89{ 90{
90 static DEFINE_SPINLOCK(ptcg_lock); 91 static DEFINE_SPINLOCK(ptcg_lock);
91 92
92 if (mm != current->active_mm || !current->mm) { 93 struct mm_struct *active_mm = current->active_mm;
93 flush_tlb_all(); 94
94 return; 95 if (mm != active_mm) {
96 /* Restore region IDs for mm */
97 if (mm && active_mm) {
98 activate_context(mm);
99 } else {
100 flush_tlb_all();
101 return;
102 }
95 } 103 }
96 104
97 /* HW requires global serialization of ptc.ga. */ 105 /* HW requires global serialization of ptc.ga. */
@@ -107,6 +115,10 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start,
107 } while (start < end); 115 } while (start < end);
108 } 116 }
109 spin_unlock(&ptcg_lock); 117 spin_unlock(&ptcg_lock);
118
119 if (mm != active_mm) {
120 activate_context(active_mm);
121 }
110} 122}
111 123
112void 124void
@@ -180,7 +192,7 @@ ia64_tlb_init (void)
180 long status; 192 long status;
181 193
182 if ((status = ia64_pal_vm_page_size(&tr_pgbits, &purge.mask)) != 0) { 194 if ((status = ia64_pal_vm_page_size(&tr_pgbits, &purge.mask)) != 0) {
183 printk(KERN_ERR "PAL_VM_PAGE_SIZE failed with status=%ld;" 195 printk(KERN_ERR "PAL_VM_PAGE_SIZE failed with status=%ld; "
184 "defaulting to architected purge page-sizes.\n", status); 196 "defaulting to architected purge page-sizes.\n", status);
185 purge.mask = 0x115557000UL; 197 purge.mask = 0x115557000UL;
186 } 198 }
diff --git a/arch/ia64/scripts/unwcheck.py b/arch/ia64/scripts/unwcheck.py
index c27849889e19..c27849889e19 100755..100644
--- a/arch/ia64/scripts/unwcheck.py
+++ b/arch/ia64/scripts/unwcheck.py
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c
index b362d6d6a8c8..9456d4034024 100644
--- a/arch/ia64/sn/kernel/bte.c
+++ b/arch/ia64/sn/kernel/bte.c
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. 6 * Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved.
7 */ 7 */
8 8
9#include <linux/module.h> 9#include <linux/module.h>
@@ -227,7 +227,7 @@ retry_bteop:
227 BTE_LNSTAT_LOAD(bte), *bte->most_rcnt_na)); 227 BTE_LNSTAT_LOAD(bte), *bte->most_rcnt_na));
228 228
229 if (transfer_stat & IBLS_ERROR) { 229 if (transfer_stat & IBLS_ERROR) {
230 bte_status = transfer_stat & ~IBLS_ERROR; 230 bte_status = BTE_GET_ERROR_STATUS(transfer_stat);
231 } else { 231 } else {
232 bte_status = BTE_SUCCESS; 232 bte_status = BTE_SUCCESS;
233 } 233 }
diff --git a/arch/ia64/sn/kernel/bte_error.c b/arch/ia64/sn/kernel/bte_error.c
index 27c5936ccfe9..4cb09f3f1efc 100644
--- a/arch/ia64/sn/kernel/bte_error.c
+++ b/arch/ia64/sn/kernel/bte_error.c
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. 6 * Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved.
7 */ 7 */
8 8
9#include <linux/types.h> 9#include <linux/types.h>
@@ -148,7 +148,11 @@ int shub2_bte_error_handler(unsigned long _nodepda)
148 for (i = 0; i < BTES_PER_NODE; i++) { 148 for (i = 0; i < BTES_PER_NODE; i++) {
149 bte = &err_nodepda->bte_if[i]; 149 bte = &err_nodepda->bte_if[i];
150 status = BTE_LNSTAT_LOAD(bte); 150 status = BTE_LNSTAT_LOAD(bte);
151 if ((status & IBLS_ERROR) || !(status & IBLS_BUSY)) 151 if (status & IBLS_ERROR) {
152 bte->bh_error = BTE_SHUB2_ERROR(status);
153 continue;
154 }
155 if (!(status & IBLS_BUSY))
152 continue; 156 continue;
153 mod_timer(recovery_timer, jiffies + (HZ * 5)); 157 mod_timer(recovery_timer, jiffies + (HZ * 5));
154 BTE_PRINTK(("eh:%p:%d Marked Giving up\n", err_nodepda, 158 BTE_PRINTK(("eh:%p:%d Marked Giving up\n", err_nodepda,
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c
index 4594770e685a..c4eb84f9e781 100644
--- a/arch/ia64/sn/kernel/io_common.c
+++ b/arch/ia64/sn/kernel/io_common.c
@@ -347,7 +347,7 @@ sn_common_bus_fixup(struct pci_bus *bus,
347 if (controller->node >= num_online_nodes()) { 347 if (controller->node >= num_online_nodes()) {
348 struct pcibus_bussoft *b = SN_PCIBUS_BUSSOFT(bus); 348 struct pcibus_bussoft *b = SN_PCIBUS_BUSSOFT(bus);
349 349
350 printk(KERN_WARNING "Device ASIC=%u XID=%u PBUSNUM=%u" 350 printk(KERN_WARNING "Device ASIC=%u XID=%u PBUSNUM=%u "
351 "L_IO=%lx L_MEM=%lx BASE=%lx\n", 351 "L_IO=%lx L_MEM=%lx BASE=%lx\n",
352 b->bs_asic_type, b->bs_xid, b->bs_persist_busnum, 352 b->bs_asic_type, b->bs_xid, b->bs_persist_busnum,
353 b->bs_legacy_io, b->bs_legacy_mem, b->bs_base); 353 b->bs_legacy_io, b->bs_legacy_mem, b->bs_base);
@@ -545,19 +545,18 @@ sn_io_late_init(void)
545 nasid = NASID_GET(bussoft->bs_base); 545 nasid = NASID_GET(bussoft->bs_base);
546 cnode = nasid_to_cnodeid(nasid); 546 cnode = nasid_to_cnodeid(nasid);
547 if ((bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCP) || 547 if ((bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCP) ||
548 (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCE)) { 548 (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCE) ||
549 /* TIO PCI Bridge: find nearest node with CPUs */ 549 (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_PIC)) {
550 /* PCI Bridge: find nearest node with CPUs */
550 int e = sn_hwperf_get_nearest_node(cnode, NULL, 551 int e = sn_hwperf_get_nearest_node(cnode, NULL,
551 &near_cnode); 552 &near_cnode);
552 if (e < 0) { 553 if (e < 0) {
553 near_cnode = (cnodeid_t)-1; /* use any node */ 554 near_cnode = (cnodeid_t)-1; /* use any node */
554 printk(KERN_WARNING "pcibr_bus_fixup: failed " 555 printk(KERN_WARNING "sn_io_late_init: failed "
555 "to find near node with CPUs to TIO " 556 "to find near node with CPUs for "
556 "node %d, err=%d\n", cnode, e); 557 "node %d, err=%d\n", cnode, e);
557 } 558 }
558 PCI_CONTROLLER(bus)->node = near_cnode; 559 PCI_CONTROLLER(bus)->node = near_cnode;
559 } else if (bussoft->bs_asic_type == PCIIO_ASIC_TYPE_PIC) {
560 PCI_CONTROLLER(bus)->node = cnode;
561 } 560 }
562 } 561 }
563 562
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index 1f38a3a68390..bb1d24929640 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -64,7 +64,6 @@ extern void sn_timer_init(void);
64extern unsigned long last_time_offset; 64extern unsigned long last_time_offset;
65extern void (*ia64_mark_idle) (int); 65extern void (*ia64_mark_idle) (int);
66extern void snidle(int); 66extern void snidle(int);
67extern unsigned long long (*ia64_printk_clock)(void);
68 67
69unsigned long sn_rtc_cycles_per_second; 68unsigned long sn_rtc_cycles_per_second;
70EXPORT_SYMBOL(sn_rtc_cycles_per_second); 69EXPORT_SYMBOL(sn_rtc_cycles_per_second);
@@ -360,14 +359,6 @@ sn_scan_pcdp(void)
360 359
361static unsigned long sn2_rtc_initial; 360static unsigned long sn2_rtc_initial;
362 361
363static unsigned long long ia64_sn2_printk_clock(void)
364{
365 unsigned long rtc_now = rtc_time();
366
367 return (rtc_now - sn2_rtc_initial) *
368 (1000000000 / sn_rtc_cycles_per_second);
369}
370
371/** 362/**
372 * sn_setup - SN platform setup routine 363 * sn_setup - SN platform setup routine
373 * @cmdline_p: kernel command line 364 * @cmdline_p: kernel command line
@@ -468,8 +459,6 @@ void __init sn_setup(char **cmdline_p)
468 459
469 platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR; 460 platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR;
470 461
471 ia64_printk_clock = ia64_sn2_printk_clock;
472
473 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF); 462 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
474 463
475 /* 464 /*
diff --git a/arch/ia64/sn/kernel/xp_nofault.S b/arch/ia64/sn/kernel/xp_nofault.S
index 54e8973b6e99..98e7c7dbfdd8 100644
--- a/arch/ia64/sn/kernel/xp_nofault.S
+++ b/arch/ia64/sn/kernel/xp_nofault.S
@@ -3,7 +3,7 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (c) 2004-2005 Silicon Graphics, Inc. All Rights Reserved. 6 * Copyright (c) 2004-2007 Silicon Graphics, Inc. All Rights Reserved.
7 */ 7 */
8 8
9 9
@@ -14,6 +14,11 @@
14 * PIO read fails, the MCA handler will force the error to look 14 * PIO read fails, the MCA handler will force the error to look
15 * corrected and vector to the xp_error_PIOR which will return an error. 15 * corrected and vector to the xp_error_PIOR which will return an error.
16 * 16 *
17 * The definition of "consumption" and the time it takes for an MCA
18 * to surface is processor implementation specific. This code
19 * is sufficient on Itanium through the Montvale processor family.
20 * It may need to be adjusted for future processor implementations.
21 *
17 * extern int xp_nofault_PIOR(void *remote_register); 22 * extern int xp_nofault_PIOR(void *remote_register);
18 */ 23 */
19 24
@@ -22,11 +27,10 @@ xp_nofault_PIOR:
22 mov r8=r0 // Stage a success return value 27 mov r8=r0 // Stage a success return value
23 ld8.acq r9=[r32];; // PIO Read the specified register 28 ld8.acq r9=[r32];; // PIO Read the specified register
24 adds r9=1,r9;; // Add to force consumption 29 adds r9=1,r9;; // Add to force consumption
25 or r9=r9,r9;; // Or to force consumption 30 srlz.i;; // Allow time for MCA to surface
26 br.ret.sptk.many b0;; // Return success 31 br.ret.sptk.many b0;; // Return success
27 32
28 .global xp_error_PIOR 33 .global xp_error_PIOR
29xp_error_PIOR: 34xp_error_PIOR:
30 mov r8=1 // Return value of 1 35 mov r8=1 // Return value of 1
31 br.ret.sptk.many b0;; // Return failure 36 br.ret.sptk.many b0;; // Return failure
32
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c
index cee9379d44e0..e1a3e19d3d9c 100644
--- a/arch/ia64/sn/pci/tioce_provider.c
+++ b/arch/ia64/sn/pci/tioce_provider.c
@@ -41,7 +41,7 @@
41 * } else 41 * } else
42 * do desired mmr access 42 * do desired mmr access
43 * 43 *
44 * According to hw, we can use reads instead of writes to the above addres 44 * According to hw, we can use reads instead of writes to the above address
45 * 45 *
46 * Note this WAR can only to be used for accessing internal MMR's in the 46 * Note this WAR can only to be used for accessing internal MMR's in the
47 * TIOCE Coretalk Address Range 0x0 - 0x07ff_ffff. This includes the 47 * TIOCE Coretalk Address Range 0x0 - 0x07ff_ffff. This includes the