diff options
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/Kconfig | 8 | ||||
-rw-r--r-- | arch/ia64/ia32/ia32priv.h | 4 | ||||
-rw-r--r-- | arch/ia64/ia32/sys_ia32.c | 75 | ||||
-rw-r--r-- | arch/ia64/kernel/Makefile | 3 | ||||
-rw-r--r-- | arch/ia64/kernel/acpi.c | 6 | ||||
-rw-r--r-- | arch/ia64/kernel/efi.c | 62 | ||||
-rw-r--r-- | arch/ia64/kernel/kprobes.c | 51 | ||||
-rw-r--r-- | arch/ia64/kernel/mca.c | 3 | ||||
-rw-r--r-- | arch/ia64/kernel/process.c | 8 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 10 | ||||
-rw-r--r-- | arch/ia64/kernel/traps.c | 6 | ||||
-rw-r--r-- | arch/ia64/lib/Makefile | 2 | ||||
-rw-r--r-- | arch/ia64/lib/bitop.c | 88 | ||||
-rw-r--r-- | arch/ia64/mm/Makefile | 2 | ||||
-rw-r--r-- | arch/ia64/mm/discontig.c | 33 | ||||
-rw-r--r-- | arch/ia64/mm/init.c | 2 | ||||
-rw-r--r-- | arch/ia64/mm/ioremap.c | 43 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/setup.c | 5 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/sn2/sn_proc_fs.c | 39 |
19 files changed, 180 insertions, 270 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 10b6b9e7716b..edffe25a477a 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -34,6 +34,10 @@ config RWSEM_XCHGADD_ALGORITHM | |||
34 | bool | 34 | bool |
35 | default y | 35 | default y |
36 | 36 | ||
37 | config GENERIC_FIND_NEXT_BIT | ||
38 | bool | ||
39 | default y | ||
40 | |||
37 | config GENERIC_CALIBRATE_DELAY | 41 | config GENERIC_CALIBRATE_DELAY |
38 | bool | 42 | bool |
39 | default y | 43 | default y |
@@ -42,6 +46,10 @@ config TIME_INTERPOLATION | |||
42 | bool | 46 | bool |
43 | default y | 47 | default y |
44 | 48 | ||
49 | config DMI | ||
50 | bool | ||
51 | default y | ||
52 | |||
45 | config EFI | 53 | config EFI |
46 | bool | 54 | bool |
47 | default y | 55 | default y |
diff --git a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h index 68ceb4e690c7..ccb98ed48e58 100644 --- a/arch/ia64/ia32/ia32priv.h +++ b/arch/ia64/ia32/ia32priv.h | |||
@@ -29,9 +29,9 @@ | |||
29 | struct partial_page { | 29 | struct partial_page { |
30 | struct partial_page *next; /* linked list, sorted by address */ | 30 | struct partial_page *next; /* linked list, sorted by address */ |
31 | struct rb_node pp_rb; | 31 | struct rb_node pp_rb; |
32 | /* 64K is the largest "normal" page supported by ia64 ABI. So 4K*32 | 32 | /* 64K is the largest "normal" page supported by ia64 ABI. So 4K*64 |
33 | * should suffice.*/ | 33 | * should suffice.*/ |
34 | unsigned int bitmap; | 34 | unsigned long bitmap; |
35 | unsigned int base; | 35 | unsigned int base; |
36 | }; | 36 | }; |
37 | 37 | ||
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index 13e739e4c84d..5366b3b23d09 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/resource.h> | 25 | #include <linux/resource.h> |
26 | #include <linux/times.h> | 26 | #include <linux/times.h> |
27 | #include <linux/utsname.h> | 27 | #include <linux/utsname.h> |
28 | #include <linux/timex.h> | ||
29 | #include <linux/smp.h> | 28 | #include <linux/smp.h> |
30 | #include <linux/smp_lock.h> | 29 | #include <linux/smp_lock.h> |
31 | #include <linux/sem.h> | 30 | #include <linux/sem.h> |
@@ -2591,78 +2590,4 @@ sys32_setresgid(compat_gid_t rgid, compat_gid_t egid, | |||
2591 | ssgid = (sgid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)sgid); | 2590 | ssgid = (sgid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)sgid); |
2592 | return sys_setresgid(srgid, segid, ssgid); | 2591 | return sys_setresgid(srgid, segid, ssgid); |
2593 | } | 2592 | } |
2594 | |||
2595 | /* Handle adjtimex compatibility. */ | ||
2596 | |||
2597 | struct timex32 { | ||
2598 | u32 modes; | ||
2599 | s32 offset, freq, maxerror, esterror; | ||
2600 | s32 status, constant, precision, tolerance; | ||
2601 | struct compat_timeval time; | ||
2602 | s32 tick; | ||
2603 | s32 ppsfreq, jitter, shift, stabil; | ||
2604 | s32 jitcnt, calcnt, errcnt, stbcnt; | ||
2605 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
2606 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
2607 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
2608 | }; | ||
2609 | |||
2610 | extern int do_adjtimex(struct timex *); | ||
2611 | |||
2612 | asmlinkage long | ||
2613 | sys32_adjtimex(struct timex32 *utp) | ||
2614 | { | ||
2615 | struct timex txc; | ||
2616 | int ret; | ||
2617 | |||
2618 | memset(&txc, 0, sizeof(struct timex)); | ||
2619 | |||
2620 | if(get_user(txc.modes, &utp->modes) || | ||
2621 | __get_user(txc.offset, &utp->offset) || | ||
2622 | __get_user(txc.freq, &utp->freq) || | ||
2623 | __get_user(txc.maxerror, &utp->maxerror) || | ||
2624 | __get_user(txc.esterror, &utp->esterror) || | ||
2625 | __get_user(txc.status, &utp->status) || | ||
2626 | __get_user(txc.constant, &utp->constant) || | ||
2627 | __get_user(txc.precision, &utp->precision) || | ||
2628 | __get_user(txc.tolerance, &utp->tolerance) || | ||
2629 | __get_user(txc.time.tv_sec, &utp->time.tv_sec) || | ||
2630 | __get_user(txc.time.tv_usec, &utp->time.tv_usec) || | ||
2631 | __get_user(txc.tick, &utp->tick) || | ||
2632 | __get_user(txc.ppsfreq, &utp->ppsfreq) || | ||
2633 | __get_user(txc.jitter, &utp->jitter) || | ||
2634 | __get_user(txc.shift, &utp->shift) || | ||
2635 | __get_user(txc.stabil, &utp->stabil) || | ||
2636 | __get_user(txc.jitcnt, &utp->jitcnt) || | ||
2637 | __get_user(txc.calcnt, &utp->calcnt) || | ||
2638 | __get_user(txc.errcnt, &utp->errcnt) || | ||
2639 | __get_user(txc.stbcnt, &utp->stbcnt)) | ||
2640 | return -EFAULT; | ||
2641 | |||
2642 | ret = do_adjtimex(&txc); | ||
2643 | |||
2644 | if(put_user(txc.modes, &utp->modes) || | ||
2645 | __put_user(txc.offset, &utp->offset) || | ||
2646 | __put_user(txc.freq, &utp->freq) || | ||
2647 | __put_user(txc.maxerror, &utp->maxerror) || | ||
2648 | __put_user(txc.esterror, &utp->esterror) || | ||
2649 | __put_user(txc.status, &utp->status) || | ||
2650 | __put_user(txc.constant, &utp->constant) || | ||
2651 | __put_user(txc.precision, &utp->precision) || | ||
2652 | __put_user(txc.tolerance, &utp->tolerance) || | ||
2653 | __put_user(txc.time.tv_sec, &utp->time.tv_sec) || | ||
2654 | __put_user(txc.time.tv_usec, &utp->time.tv_usec) || | ||
2655 | __put_user(txc.tick, &utp->tick) || | ||
2656 | __put_user(txc.ppsfreq, &utp->ppsfreq) || | ||
2657 | __put_user(txc.jitter, &utp->jitter) || | ||
2658 | __put_user(txc.shift, &utp->shift) || | ||
2659 | __put_user(txc.stabil, &utp->stabil) || | ||
2660 | __put_user(txc.jitcnt, &utp->jitcnt) || | ||
2661 | __put_user(txc.calcnt, &utp->calcnt) || | ||
2662 | __put_user(txc.errcnt, &utp->errcnt) || | ||
2663 | __put_user(txc.stbcnt, &utp->stbcnt)) | ||
2664 | ret = -EFAULT; | ||
2665 | |||
2666 | return ret; | ||
2667 | } | ||
2668 | #endif /* NOTYET */ | 2593 | #endif /* NOTYET */ |
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index 09a0dbc17fb6..59e871dae742 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile | |||
@@ -7,7 +7,7 @@ extra-y := head.o init_task.o vmlinux.lds | |||
7 | obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ | 7 | obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ |
8 | irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ | 8 | irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ |
9 | salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ | 9 | salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ |
10 | unwind.o mca.o mca_asm.o topology.o | 10 | unwind.o mca.o mca_asm.o topology.o dmi_scan.o |
11 | 11 | ||
12 | obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o | 12 | obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o |
13 | obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o | 13 | obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o |
@@ -30,6 +30,7 @@ obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o | |||
30 | obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o | 30 | obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o |
31 | obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o | 31 | obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o |
32 | mca_recovery-y += mca_drv.o mca_drv_asm.o | 32 | mca_recovery-y += mca_drv.o mca_drv_asm.o |
33 | dmi_scan-y += ../../i386/kernel/dmi_scan.o | ||
33 | 34 | ||
34 | # The gate DSO image is built using a special linker script. | 35 | # The gate DSO image is built using a special linker script. |
35 | targets += gate.so gate-syms.o | 36 | targets += gate.so gate-syms.o |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index a4e218ce2edb..58c93a30348c 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -651,9 +651,9 @@ unsigned long __init acpi_find_rsdp(void) | |||
651 | { | 651 | { |
652 | unsigned long rsdp_phys = 0; | 652 | unsigned long rsdp_phys = 0; |
653 | 653 | ||
654 | if (efi.acpi20) | 654 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
655 | rsdp_phys = __pa(efi.acpi20); | 655 | rsdp_phys = efi.acpi20; |
656 | else if (efi.acpi) | 656 | else if (efi.acpi != EFI_INVALID_TABLE_ADDR) |
657 | printk(KERN_WARNING PREFIX | 657 | printk(KERN_WARNING PREFIX |
658 | "v1.0/r0.71 tables no longer supported\n"); | 658 | "v1.0/r0.71 tables no longer supported\n"); |
659 | return rsdp_phys; | 659 | return rsdp_phys; |
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 9990320b6f9a..12cfedce73b1 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -458,24 +458,33 @@ efi_init (void) | |||
458 | printk(KERN_INFO "EFI v%u.%.02u by %s:", | 458 | printk(KERN_INFO "EFI v%u.%.02u by %s:", |
459 | efi.systab->hdr.revision >> 16, efi.systab->hdr.revision & 0xffff, vendor); | 459 | efi.systab->hdr.revision >> 16, efi.systab->hdr.revision & 0xffff, vendor); |
460 | 460 | ||
461 | efi.mps = EFI_INVALID_TABLE_ADDR; | ||
462 | efi.acpi = EFI_INVALID_TABLE_ADDR; | ||
463 | efi.acpi20 = EFI_INVALID_TABLE_ADDR; | ||
464 | efi.smbios = EFI_INVALID_TABLE_ADDR; | ||
465 | efi.sal_systab = EFI_INVALID_TABLE_ADDR; | ||
466 | efi.boot_info = EFI_INVALID_TABLE_ADDR; | ||
467 | efi.hcdp = EFI_INVALID_TABLE_ADDR; | ||
468 | efi.uga = EFI_INVALID_TABLE_ADDR; | ||
469 | |||
461 | for (i = 0; i < (int) efi.systab->nr_tables; i++) { | 470 | for (i = 0; i < (int) efi.systab->nr_tables; i++) { |
462 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { | 471 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { |
463 | efi.mps = __va(config_tables[i].table); | 472 | efi.mps = config_tables[i].table; |
464 | printk(" MPS=0x%lx", config_tables[i].table); | 473 | printk(" MPS=0x%lx", config_tables[i].table); |
465 | } else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { | 474 | } else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { |
466 | efi.acpi20 = __va(config_tables[i].table); | 475 | efi.acpi20 = config_tables[i].table; |
467 | printk(" ACPI 2.0=0x%lx", config_tables[i].table); | 476 | printk(" ACPI 2.0=0x%lx", config_tables[i].table); |
468 | } else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { | 477 | } else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { |
469 | efi.acpi = __va(config_tables[i].table); | 478 | efi.acpi = config_tables[i].table; |
470 | printk(" ACPI=0x%lx", config_tables[i].table); | 479 | printk(" ACPI=0x%lx", config_tables[i].table); |
471 | } else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { | 480 | } else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { |
472 | efi.smbios = __va(config_tables[i].table); | 481 | efi.smbios = config_tables[i].table; |
473 | printk(" SMBIOS=0x%lx", config_tables[i].table); | 482 | printk(" SMBIOS=0x%lx", config_tables[i].table); |
474 | } else if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) == 0) { | 483 | } else if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) == 0) { |
475 | efi.sal_systab = __va(config_tables[i].table); | 484 | efi.sal_systab = config_tables[i].table; |
476 | printk(" SALsystab=0x%lx", config_tables[i].table); | 485 | printk(" SALsystab=0x%lx", config_tables[i].table); |
477 | } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { | 486 | } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { |
478 | efi.hcdp = __va(config_tables[i].table); | 487 | efi.hcdp = config_tables[i].table; |
479 | printk(" HCDP=0x%lx", config_tables[i].table); | 488 | printk(" HCDP=0x%lx", config_tables[i].table); |
480 | } | 489 | } |
481 | } | 490 | } |
@@ -677,27 +686,34 @@ EXPORT_SYMBOL(efi_mem_attributes); | |||
677 | /* | 686 | /* |
678 | * Determines whether the memory at phys_addr supports the desired | 687 | * Determines whether the memory at phys_addr supports the desired |
679 | * attribute (WB, UC, etc). If this returns 1, the caller can safely | 688 | * attribute (WB, UC, etc). If this returns 1, the caller can safely |
680 | * access *size bytes at phys_addr with the specified attribute. | 689 | * access size bytes at phys_addr with the specified attribute. |
681 | */ | 690 | */ |
682 | static int | 691 | int |
683 | efi_mem_attribute_range (unsigned long phys_addr, unsigned long *size, u64 attr) | 692 | efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, u64 attr) |
684 | { | 693 | { |
694 | unsigned long end = phys_addr + size; | ||
685 | efi_memory_desc_t *md = efi_memory_descriptor(phys_addr); | 695 | efi_memory_desc_t *md = efi_memory_descriptor(phys_addr); |
686 | unsigned long md_end; | ||
687 | 696 | ||
688 | if (!md || (md->attribute & attr) != attr) | 697 | /* |
698 | * Some firmware doesn't report MMIO regions in the EFI memory | ||
699 | * map. The Intel BigSur (a.k.a. HP i2000) has this problem. | ||
700 | * On those platforms, we have to assume UC is valid everywhere. | ||
701 | */ | ||
702 | if (!md || (md->attribute & attr) != attr) { | ||
703 | if (attr == EFI_MEMORY_UC && !efi_memmap_has_mmio()) | ||
704 | return 1; | ||
689 | return 0; | 705 | return 0; |
706 | } | ||
690 | 707 | ||
691 | do { | 708 | do { |
692 | md_end = efi_md_end(md); | 709 | unsigned long md_end = efi_md_end(md); |
693 | if (phys_addr + *size <= md_end) | 710 | |
711 | if (end <= md_end) | ||
694 | return 1; | 712 | return 1; |
695 | 713 | ||
696 | md = efi_memory_descriptor(md_end); | 714 | md = efi_memory_descriptor(md_end); |
697 | if (!md || (md->attribute & attr) != attr) { | 715 | if (!md || (md->attribute & attr) != attr) |
698 | *size = md_end - phys_addr; | 716 | return 0; |
699 | return 1; | ||
700 | } | ||
701 | } while (md); | 717 | } while (md); |
702 | return 0; | 718 | return 0; |
703 | } | 719 | } |
@@ -708,7 +724,7 @@ efi_mem_attribute_range (unsigned long phys_addr, unsigned long *size, u64 attr) | |||
708 | * control access size. | 724 | * control access size. |
709 | */ | 725 | */ |
710 | int | 726 | int |
711 | valid_phys_addr_range (unsigned long phys_addr, unsigned long *size) | 727 | valid_phys_addr_range (unsigned long phys_addr, unsigned long size) |
712 | { | 728 | { |
713 | return efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB); | 729 | return efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB); |
714 | } | 730 | } |
@@ -723,7 +739,7 @@ valid_phys_addr_range (unsigned long phys_addr, unsigned long *size) | |||
723 | * because that doesn't appear in the boot-time EFI memory map. | 739 | * because that doesn't appear in the boot-time EFI memory map. |
724 | */ | 740 | */ |
725 | int | 741 | int |
726 | valid_mmap_phys_addr_range (unsigned long phys_addr, unsigned long *size) | 742 | valid_mmap_phys_addr_range (unsigned long phys_addr, unsigned long size) |
727 | { | 743 | { |
728 | if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB)) | 744 | if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_WB)) |
729 | return 1; | 745 | return 1; |
@@ -731,14 +747,6 @@ valid_mmap_phys_addr_range (unsigned long phys_addr, unsigned long *size) | |||
731 | if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_UC)) | 747 | if (efi_mem_attribute_range(phys_addr, size, EFI_MEMORY_UC)) |
732 | return 1; | 748 | return 1; |
733 | 749 | ||
734 | /* | ||
735 | * Some firmware doesn't report MMIO regions in the EFI memory map. | ||
736 | * The Intel BigSur (a.k.a. HP i2000) has this problem. In this | ||
737 | * case, we can't use the EFI memory map to validate mmap requests. | ||
738 | */ | ||
739 | if (!efi_memmap_has_mmio()) | ||
740 | return 1; | ||
741 | |||
742 | return 0; | 750 | return 0; |
743 | } | 751 | } |
744 | 752 | ||
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 50ae8c7d453d..789881ca83d4 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
35 | #include <asm/kdebug.h> | 35 | #include <asm/kdebug.h> |
36 | #include <asm/sections.h> | 36 | #include <asm/sections.h> |
37 | #include <asm/uaccess.h> | ||
37 | 38 | ||
38 | extern void jprobe_inst_return(void); | 39 | extern void jprobe_inst_return(void); |
39 | 40 | ||
@@ -722,13 +723,50 @@ static int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) | |||
722 | struct kprobe *cur = kprobe_running(); | 723 | struct kprobe *cur = kprobe_running(); |
723 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 724 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
724 | 725 | ||
725 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
726 | return 1; | ||
727 | 726 | ||
728 | if (kcb->kprobe_status & KPROBE_HIT_SS) { | 727 | switch(kcb->kprobe_status) { |
729 | resume_execution(cur, regs); | 728 | case KPROBE_HIT_SS: |
730 | reset_current_kprobe(); | 729 | case KPROBE_REENTER: |
730 | /* | ||
731 | * We are here because the instruction being single | ||
732 | * stepped caused a page fault. We reset the current | ||
733 | * kprobe and the instruction pointer points back to | ||
734 | * the probe address and allow the page fault handler | ||
735 | * to continue as a normal page fault. | ||
736 | */ | ||
737 | regs->cr_iip = ((unsigned long)cur->addr) & ~0xFULL; | ||
738 | ia64_psr(regs)->ri = ((unsigned long)cur->addr) & 0xf; | ||
739 | if (kcb->kprobe_status == KPROBE_REENTER) | ||
740 | restore_previous_kprobe(kcb); | ||
741 | else | ||
742 | reset_current_kprobe(); | ||
731 | preempt_enable_no_resched(); | 743 | preempt_enable_no_resched(); |
744 | break; | ||
745 | case KPROBE_HIT_ACTIVE: | ||
746 | case KPROBE_HIT_SSDONE: | ||
747 | /* | ||
748 | * We increment the nmissed count for accounting, | ||
749 | * we can also use npre/npostfault count for accouting | ||
750 | * these specific fault cases. | ||
751 | */ | ||
752 | kprobes_inc_nmissed_count(cur); | ||
753 | |||
754 | /* | ||
755 | * We come here because instructions in the pre/post | ||
756 | * handler caused the page_fault, this could happen | ||
757 | * if handler tries to access user space by | ||
758 | * copy_from_user(), get_user() etc. Let the | ||
759 | * user-specified handler try to fix it first. | ||
760 | */ | ||
761 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
762 | return 1; | ||
763 | |||
764 | /* | ||
765 | * Let ia64_do_page_fault() fix it. | ||
766 | */ | ||
767 | break; | ||
768 | default: | ||
769 | break; | ||
732 | } | 770 | } |
733 | 771 | ||
734 | return 0; | 772 | return 0; |
@@ -740,6 +778,9 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
740 | struct die_args *args = (struct die_args *)data; | 778 | struct die_args *args = (struct die_args *)data; |
741 | int ret = NOTIFY_DONE; | 779 | int ret = NOTIFY_DONE; |
742 | 780 | ||
781 | if (args->regs && user_mode(args->regs)) | ||
782 | return ret; | ||
783 | |||
743 | switch(val) { | 784 | switch(val) { |
744 | case DIE_BREAK: | 785 | case DIE_BREAK: |
745 | /* err is break number from ia64_bad_break() */ | 786 | /* err is break number from ia64_bad_break() */ |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 87ff7fe33cfb..8963171788d5 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -69,6 +69,7 @@ | |||
69 | #include <linux/kernel.h> | 69 | #include <linux/kernel.h> |
70 | #include <linux/smp.h> | 70 | #include <linux/smp.h> |
71 | #include <linux/workqueue.h> | 71 | #include <linux/workqueue.h> |
72 | #include <linux/cpumask.h> | ||
72 | 73 | ||
73 | #include <asm/delay.h> | 74 | #include <asm/delay.h> |
74 | #include <asm/kdebug.h> | 75 | #include <asm/kdebug.h> |
@@ -1505,7 +1506,7 @@ format_mca_init_stack(void *mca_data, unsigned long offset, | |||
1505 | ti->cpu = cpu; | 1506 | ti->cpu = cpu; |
1506 | p->thread_info = ti; | 1507 | p->thread_info = ti; |
1507 | p->state = TASK_UNINTERRUPTIBLE; | 1508 | p->state = TASK_UNINTERRUPTIBLE; |
1508 | __set_bit(cpu, &p->cpus_allowed); | 1509 | cpu_set(cpu, p->cpus_allowed); |
1509 | INIT_LIST_HEAD(&p->tasks); | 1510 | INIT_LIST_HEAD(&p->tasks); |
1510 | p->parent = p->real_parent = p->group_leader = p; | 1511 | p->parent = p->real_parent = p->group_leader = p; |
1511 | INIT_LIST_HEAD(&p->children); | 1512 | INIT_LIST_HEAD(&p->children); |
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 309d59658e5f..355d57970ba3 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/efi.h> | 30 | #include <linux/efi.h> |
31 | #include <linux/interrupt.h> | 31 | #include <linux/interrupt.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/kprobes.h> | ||
34 | 33 | ||
35 | #include <asm/cpu.h> | 34 | #include <asm/cpu.h> |
36 | #include <asm/delay.h> | 35 | #include <asm/delay.h> |
@@ -738,13 +737,6 @@ void | |||
738 | exit_thread (void) | 737 | exit_thread (void) |
739 | { | 738 | { |
740 | 739 | ||
741 | /* | ||
742 | * Remove function-return probe instances associated with this task | ||
743 | * and put them back on the free list. Do not insert an exit probe for | ||
744 | * this function, it will be disabled by kprobe_flush_task if you do. | ||
745 | */ | ||
746 | kprobe_flush_task(current); | ||
747 | |||
748 | ia64_drop_fpu(current); | 740 | ia64_drop_fpu(current); |
749 | #ifdef CONFIG_PERFMON | 741 | #ifdef CONFIG_PERFMON |
750 | /* if needed, stop monitoring and flush state to perfmon context */ | 742 | /* if needed, stop monitoring and flush state to perfmon context */ |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index eb388e271b2b..e4dfda1eb7dd 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/string.h> | 37 | #include <linux/string.h> |
38 | #include <linux/threads.h> | 38 | #include <linux/threads.h> |
39 | #include <linux/tty.h> | 39 | #include <linux/tty.h> |
40 | #include <linux/dmi.h> | ||
40 | #include <linux/serial.h> | 41 | #include <linux/serial.h> |
41 | #include <linux/serial_core.h> | 42 | #include <linux/serial_core.h> |
42 | #include <linux/efi.h> | 43 | #include <linux/efi.h> |
@@ -433,7 +434,7 @@ setup_arch (char **cmdline_p) | |||
433 | find_memory(); | 434 | find_memory(); |
434 | 435 | ||
435 | /* process SAL system table: */ | 436 | /* process SAL system table: */ |
436 | ia64_sal_init(efi.sal_systab); | 437 | ia64_sal_init(__va(efi.sal_systab)); |
437 | 438 | ||
438 | ia64_setup_printk_clock(); | 439 | ia64_setup_printk_clock(); |
439 | 440 | ||
@@ -887,3 +888,10 @@ check_bugs (void) | |||
887 | ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles, | 888 | ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles, |
888 | (unsigned long) __end___mckinley_e9_bundles); | 889 | (unsigned long) __end___mckinley_e9_bundles); |
889 | } | 890 | } |
891 | |||
892 | static int __init run_dmi_scan(void) | ||
893 | { | ||
894 | dmi_scan_machine(); | ||
895 | return 0; | ||
896 | } | ||
897 | core_initcall(run_dmi_scan); | ||
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index dabd6c32641e..7c1ddc8ac443 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
@@ -30,19 +30,19 @@ extern spinlock_t timerlist_lock; | |||
30 | fpswa_interface_t *fpswa_interface; | 30 | fpswa_interface_t *fpswa_interface; |
31 | EXPORT_SYMBOL(fpswa_interface); | 31 | EXPORT_SYMBOL(fpswa_interface); |
32 | 32 | ||
33 | struct notifier_block *ia64die_chain; | 33 | ATOMIC_NOTIFIER_HEAD(ia64die_chain); |
34 | 34 | ||
35 | int | 35 | int |
36 | register_die_notifier(struct notifier_block *nb) | 36 | register_die_notifier(struct notifier_block *nb) |
37 | { | 37 | { |
38 | return notifier_chain_register(&ia64die_chain, nb); | 38 | return atomic_notifier_chain_register(&ia64die_chain, nb); |
39 | } | 39 | } |
40 | EXPORT_SYMBOL_GPL(register_die_notifier); | 40 | EXPORT_SYMBOL_GPL(register_die_notifier); |
41 | 41 | ||
42 | int | 42 | int |
43 | unregister_die_notifier(struct notifier_block *nb) | 43 | unregister_die_notifier(struct notifier_block *nb) |
44 | { | 44 | { |
45 | return notifier_chain_unregister(&ia64die_chain, nb); | 45 | return atomic_notifier_chain_unregister(&ia64die_chain, nb); |
46 | } | 46 | } |
47 | EXPORT_SYMBOL_GPL(unregister_die_notifier); | 47 | EXPORT_SYMBOL_GPL(unregister_die_notifier); |
48 | 48 | ||
diff --git a/arch/ia64/lib/Makefile b/arch/ia64/lib/Makefile index ac64664a1807..d8536a2c22a9 100644 --- a/arch/ia64/lib/Makefile +++ b/arch/ia64/lib/Makefile | |||
@@ -6,7 +6,7 @@ obj-y := io.o | |||
6 | 6 | ||
7 | lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \ | 7 | lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \ |
8 | __divdi3.o __udivdi3.o __moddi3.o __umoddi3.o \ | 8 | __divdi3.o __udivdi3.o __moddi3.o __umoddi3.o \ |
9 | bitop.o checksum.o clear_page.o csum_partial_copy.o \ | 9 | checksum.o clear_page.o csum_partial_copy.o \ |
10 | clear_user.o strncpy_from_user.o strlen_user.o strnlen_user.o \ | 10 | clear_user.o strncpy_from_user.o strlen_user.o strnlen_user.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 | 12 | memset.o strlen.o |
diff --git a/arch/ia64/lib/bitop.c b/arch/ia64/lib/bitop.c deleted file mode 100644 index 82e299c8464e..000000000000 --- a/arch/ia64/lib/bitop.c +++ /dev/null | |||
@@ -1,88 +0,0 @@ | |||
1 | #include <linux/compiler.h> | ||
2 | #include <linux/types.h> | ||
3 | #include <asm/intrinsics.h> | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/bitops.h> | ||
6 | |||
7 | /* | ||
8 | * Find next zero bit in a bitmap reasonably efficiently.. | ||
9 | */ | ||
10 | |||
11 | int __find_next_zero_bit (const void *addr, unsigned long size, unsigned long offset) | ||
12 | { | ||
13 | unsigned long *p = ((unsigned long *) addr) + (offset >> 6); | ||
14 | unsigned long result = offset & ~63UL; | ||
15 | unsigned long tmp; | ||
16 | |||
17 | if (offset >= size) | ||
18 | return size; | ||
19 | size -= result; | ||
20 | offset &= 63UL; | ||
21 | if (offset) { | ||
22 | tmp = *(p++); | ||
23 | tmp |= ~0UL >> (64-offset); | ||
24 | if (size < 64) | ||
25 | goto found_first; | ||
26 | if (~tmp) | ||
27 | goto found_middle; | ||
28 | size -= 64; | ||
29 | result += 64; | ||
30 | } | ||
31 | while (size & ~63UL) { | ||
32 | if (~(tmp = *(p++))) | ||
33 | goto found_middle; | ||
34 | result += 64; | ||
35 | size -= 64; | ||
36 | } | ||
37 | if (!size) | ||
38 | return result; | ||
39 | tmp = *p; | ||
40 | found_first: | ||
41 | tmp |= ~0UL << size; | ||
42 | if (tmp == ~0UL) /* any bits zero? */ | ||
43 | return result + size; /* nope */ | ||
44 | found_middle: | ||
45 | return result + ffz(tmp); | ||
46 | } | ||
47 | EXPORT_SYMBOL(__find_next_zero_bit); | ||
48 | |||
49 | /* | ||
50 | * Find next bit in a bitmap reasonably efficiently.. | ||
51 | */ | ||
52 | int __find_next_bit(const void *addr, unsigned long size, unsigned long offset) | ||
53 | { | ||
54 | unsigned long *p = ((unsigned long *) addr) + (offset >> 6); | ||
55 | unsigned long result = offset & ~63UL; | ||
56 | unsigned long tmp; | ||
57 | |||
58 | if (offset >= size) | ||
59 | return size; | ||
60 | size -= result; | ||
61 | offset &= 63UL; | ||
62 | if (offset) { | ||
63 | tmp = *(p++); | ||
64 | tmp &= ~0UL << offset; | ||
65 | if (size < 64) | ||
66 | goto found_first; | ||
67 | if (tmp) | ||
68 | goto found_middle; | ||
69 | size -= 64; | ||
70 | result += 64; | ||
71 | } | ||
72 | while (size & ~63UL) { | ||
73 | if ((tmp = *(p++))) | ||
74 | goto found_middle; | ||
75 | result += 64; | ||
76 | size -= 64; | ||
77 | } | ||
78 | if (!size) | ||
79 | return result; | ||
80 | tmp = *p; | ||
81 | found_first: | ||
82 | tmp &= ~0UL >> (64-size); | ||
83 | if (tmp == 0UL) /* Are any bits set? */ | ||
84 | return result + size; /* Nope. */ | ||
85 | found_middle: | ||
86 | return result + __ffs(tmp); | ||
87 | } | ||
88 | EXPORT_SYMBOL(__find_next_bit); | ||
diff --git a/arch/ia64/mm/Makefile b/arch/ia64/mm/Makefile index d78d20f0a0f0..bb0a01a81878 100644 --- a/arch/ia64/mm/Makefile +++ b/arch/ia64/mm/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the ia64-specific parts of the memory manager. | 2 | # Makefile for the ia64-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := init.o fault.o tlb.o extable.o | 5 | obj-y := init.o fault.o tlb.o extable.o ioremap.o |
6 | 6 | ||
7 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 7 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
8 | obj-$(CONFIG_NUMA) += numa.o | 8 | obj-$(CONFIG_NUMA) += numa.o |
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 2f5e44862e91..ec9eeb89975d 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -379,31 +379,6 @@ static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize) | |||
379 | } | 379 | } |
380 | 380 | ||
381 | /** | 381 | /** |
382 | * pgdat_insert - insert the pgdat into global pgdat_list | ||
383 | * @pgdat: the pgdat for a node. | ||
384 | */ | ||
385 | static void __init pgdat_insert(pg_data_t *pgdat) | ||
386 | { | ||
387 | pg_data_t *prev = NULL, *next; | ||
388 | |||
389 | for_each_pgdat(next) | ||
390 | if (pgdat->node_id < next->node_id) | ||
391 | break; | ||
392 | else | ||
393 | prev = next; | ||
394 | |||
395 | if (prev) { | ||
396 | prev->pgdat_next = pgdat; | ||
397 | pgdat->pgdat_next = next; | ||
398 | } else { | ||
399 | pgdat->pgdat_next = pgdat_list; | ||
400 | pgdat_list = pgdat; | ||
401 | } | ||
402 | |||
403 | return; | ||
404 | } | ||
405 | |||
406 | /** | ||
407 | * memory_less_nodes - allocate and initialize CPU only nodes pernode | 382 | * memory_less_nodes - allocate and initialize CPU only nodes pernode |
408 | * information. | 383 | * information. |
409 | */ | 384 | */ |
@@ -560,7 +535,7 @@ void show_mem(void) | |||
560 | printk("Mem-info:\n"); | 535 | printk("Mem-info:\n"); |
561 | show_free_areas(); | 536 | show_free_areas(); |
562 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 537 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
563 | for_each_pgdat(pgdat) { | 538 | for_each_online_pgdat(pgdat) { |
564 | unsigned long present; | 539 | unsigned long present; |
565 | unsigned long flags; | 540 | unsigned long flags; |
566 | int shared = 0, cached = 0, reserved = 0; | 541 | int shared = 0, cached = 0, reserved = 0; |
@@ -745,11 +720,5 @@ void __init paging_init(void) | |||
745 | pfn_offset, zholes_size); | 720 | pfn_offset, zholes_size); |
746 | } | 721 | } |
747 | 722 | ||
748 | /* | ||
749 | * Make memory less nodes become a member of the known nodes. | ||
750 | */ | ||
751 | for_each_node_mask(node, memory_less_mask) | ||
752 | pgdat_insert(mem_data[node].pgdat); | ||
753 | |||
754 | zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); | 723 | zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); |
755 | } | 724 | } |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index ff4f31fcd330..2ef1151cde90 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -600,7 +600,7 @@ mem_init (void) | |||
600 | kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START); | 600 | kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START); |
601 | kclist_add(&kcore_kernel, _stext, _end - _stext); | 601 | kclist_add(&kcore_kernel, _stext, _end - _stext); |
602 | 602 | ||
603 | for_each_pgdat(pgdat) | 603 | for_each_online_pgdat(pgdat) |
604 | if (pgdat->bdata->node_bootmem_map) | 604 | if (pgdat->bdata->node_bootmem_map) |
605 | totalram_pages += free_all_bootmem_node(pgdat); | 605 | totalram_pages += free_all_bootmem_node(pgdat); |
606 | 606 | ||
diff --git a/arch/ia64/mm/ioremap.c b/arch/ia64/mm/ioremap.c new file mode 100644 index 000000000000..62328621f99c --- /dev/null +++ b/arch/ia64/mm/ioremap.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * (c) Copyright 2006 Hewlett-Packard Development Company, L.P. | ||
3 | * Bjorn Helgaas <bjorn.helgaas@hp.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | */ | ||
9 | |||
10 | #include <linux/compiler.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/efi.h> | ||
13 | #include <asm/io.h> | ||
14 | |||
15 | static inline void __iomem * | ||
16 | __ioremap (unsigned long offset, unsigned long size) | ||
17 | { | ||
18 | return (void __iomem *) (__IA64_UNCACHED_OFFSET | offset); | ||
19 | } | ||
20 | |||
21 | void __iomem * | ||
22 | ioremap (unsigned long offset, unsigned long size) | ||
23 | { | ||
24 | if (efi_mem_attribute_range(offset, size, EFI_MEMORY_UC)) | ||
25 | return __ioremap(offset, size); | ||
26 | |||
27 | if (efi_mem_attribute_range(offset, size, EFI_MEMORY_WB)) | ||
28 | return phys_to_virt(offset); | ||
29 | |||
30 | /* | ||
31 | * Someday this should check ACPI resources so we | ||
32 | * can do the right thing for hot-plugged regions. | ||
33 | */ | ||
34 | return __ioremap(offset, size); | ||
35 | } | ||
36 | EXPORT_SYMBOL(ioremap); | ||
37 | |||
38 | void __iomem * | ||
39 | ioremap_nocache (unsigned long offset, unsigned long size) | ||
40 | { | ||
41 | return __ioremap(offset, size); | ||
42 | } | ||
43 | EXPORT_SYMBOL(ioremap_nocache); | ||
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index 8b6d5c844708..30988dfbddff 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -327,10 +327,11 @@ sn_scan_pcdp(void) | |||
327 | struct pcdp_interface_pci if_pci; | 327 | struct pcdp_interface_pci if_pci; |
328 | extern struct efi efi; | 328 | extern struct efi efi; |
329 | 329 | ||
330 | pcdp = efi.hcdp; | 330 | if (efi.hcdp == EFI_INVALID_TABLE_ADDR) |
331 | if (! pcdp) | ||
332 | return; /* no hcdp/pcdp table */ | 331 | return; /* no hcdp/pcdp table */ |
333 | 332 | ||
333 | pcdp = __va(efi.hcdp); | ||
334 | |||
334 | if (pcdp->rev < 3) | 335 | if (pcdp->rev < 3) |
335 | return; /* only support PCDP (rev >= 3) */ | 336 | return; /* only support PCDP (rev >= 3) */ |
336 | 337 | ||
diff --git a/arch/ia64/sn/kernel/sn2/sn_proc_fs.c b/arch/ia64/sn/kernel/sn2/sn_proc_fs.c index c686d9c12f7b..5100261310f7 100644 --- a/arch/ia64/sn/kernel/sn2/sn_proc_fs.c +++ b/arch/ia64/sn/kernel/sn2/sn_proc_fs.c | |||
@@ -93,19 +93,22 @@ static int coherence_id_open(struct inode *inode, struct file *file) | |||
93 | static struct proc_dir_entry | 93 | static struct proc_dir_entry |
94 | *sn_procfs_create_entry(const char *name, struct proc_dir_entry *parent, | 94 | *sn_procfs_create_entry(const char *name, struct proc_dir_entry *parent, |
95 | int (*openfunc)(struct inode *, struct file *), | 95 | int (*openfunc)(struct inode *, struct file *), |
96 | int (*releasefunc)(struct inode *, struct file *)) | 96 | int (*releasefunc)(struct inode *, struct file *), |
97 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)) | ||
97 | { | 98 | { |
98 | struct proc_dir_entry *e = create_proc_entry(name, 0444, parent); | 99 | struct proc_dir_entry *e = create_proc_entry(name, 0444, parent); |
99 | 100 | ||
100 | if (e) { | 101 | if (e) { |
101 | e->proc_fops = (struct file_operations *)kmalloc( | 102 | struct file_operations *f; |
102 | sizeof(struct file_operations), GFP_KERNEL); | 103 | |
103 | if (e->proc_fops) { | 104 | f = kzalloc(sizeof(*f), GFP_KERNEL); |
104 | memset(e->proc_fops, 0, sizeof(struct file_operations)); | 105 | if (f) { |
105 | e->proc_fops->open = openfunc; | 106 | f->open = openfunc; |
106 | e->proc_fops->read = seq_read; | 107 | f->read = seq_read; |
107 | e->proc_fops->llseek = seq_lseek; | 108 | f->llseek = seq_lseek; |
108 | e->proc_fops->release = releasefunc; | 109 | f->release = releasefunc; |
110 | f->write = write; | ||
111 | e->proc_fops = f; | ||
109 | } | 112 | } |
110 | } | 113 | } |
111 | 114 | ||
@@ -119,31 +122,29 @@ extern int sn_topology_release(struct inode *, struct file *); | |||
119 | void register_sn_procfs(void) | 122 | void register_sn_procfs(void) |
120 | { | 123 | { |
121 | static struct proc_dir_entry *sgi_proc_dir = NULL; | 124 | static struct proc_dir_entry *sgi_proc_dir = NULL; |
122 | struct proc_dir_entry *e; | ||
123 | 125 | ||
124 | BUG_ON(sgi_proc_dir != NULL); | 126 | BUG_ON(sgi_proc_dir != NULL); |
125 | if (!(sgi_proc_dir = proc_mkdir("sgi_sn", NULL))) | 127 | if (!(sgi_proc_dir = proc_mkdir("sgi_sn", NULL))) |
126 | return; | 128 | return; |
127 | 129 | ||
128 | sn_procfs_create_entry("partition_id", sgi_proc_dir, | 130 | sn_procfs_create_entry("partition_id", sgi_proc_dir, |
129 | partition_id_open, single_release); | 131 | partition_id_open, single_release, NULL); |
130 | 132 | ||
131 | sn_procfs_create_entry("system_serial_number", sgi_proc_dir, | 133 | sn_procfs_create_entry("system_serial_number", sgi_proc_dir, |
132 | system_serial_number_open, single_release); | 134 | system_serial_number_open, single_release, NULL); |
133 | 135 | ||
134 | sn_procfs_create_entry("licenseID", sgi_proc_dir, | 136 | sn_procfs_create_entry("licenseID", sgi_proc_dir, |
135 | licenseID_open, single_release); | 137 | licenseID_open, single_release, NULL); |
136 | 138 | ||
137 | e = sn_procfs_create_entry("sn_force_interrupt", sgi_proc_dir, | 139 | sn_procfs_create_entry("sn_force_interrupt", sgi_proc_dir, |
138 | sn_force_interrupt_open, single_release); | 140 | sn_force_interrupt_open, single_release, |
139 | if (e) | 141 | sn_force_interrupt_write_proc); |
140 | e->proc_fops->write = sn_force_interrupt_write_proc; | ||
141 | 142 | ||
142 | sn_procfs_create_entry("coherence_id", sgi_proc_dir, | 143 | sn_procfs_create_entry("coherence_id", sgi_proc_dir, |
143 | coherence_id_open, single_release); | 144 | coherence_id_open, single_release, NULL); |
144 | 145 | ||
145 | sn_procfs_create_entry("sn_topology", sgi_proc_dir, | 146 | sn_procfs_create_entry("sn_topology", sgi_proc_dir, |
146 | sn_topology_open, sn_topology_release); | 147 | sn_topology_open, sn_topology_release, NULL); |
147 | } | 148 | } |
148 | 149 | ||
149 | #endif /* CONFIG_PROC_FS */ | 150 | #endif /* CONFIG_PROC_FS */ |