diff options
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/eeh.c | 9 | ||||
| -rw-r--r-- | arch/powerpc/kernel/eeh_event.c | 9 | ||||
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec.c | 14 | ||||
| -rw-r--r-- | arch/powerpc/kernel/misc_64.S | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/nvram_64.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/process.c | 71 | ||||
| -rw-r--r-- | arch/powerpc/kernel/prom.c | 20 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_32.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_64.c | 31 | ||||
| -rw-r--r-- | arch/powerpc/kernel/smp.c | 16 | ||||
| -rw-r--r-- | arch/powerpc/kernel/time.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/vdso32/gettimeofday.S | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/vdso64/sigtramp.S | 16 | ||||
| -rw-r--r-- | arch/powerpc/kernel/vio.c | 2 |
14 files changed, 152 insertions, 59 deletions
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index 671302065347..4bd687d5e7aa 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c | |||
| @@ -686,6 +686,15 @@ void eeh_save_bars(struct eeh_dev *edev) | |||
| 686 | 686 | ||
| 687 | for (i = 0; i < 16; i++) | 687 | for (i = 0; i < 16; i++) |
| 688 | eeh_ops->read_config(dn, i * 4, 4, &edev->config_space[i]); | 688 | eeh_ops->read_config(dn, i * 4, 4, &edev->config_space[i]); |
| 689 | |||
| 690 | /* | ||
| 691 | * For PCI bridges including root port, we need enable bus | ||
| 692 | * master explicitly. Otherwise, it can't fetch IODA table | ||
| 693 | * entries correctly. So we cache the bit in advance so that | ||
| 694 | * we can restore it after reset, either PHB range or PE range. | ||
| 695 | */ | ||
| 696 | if (edev->mode & EEH_DEV_BRIDGE) | ||
| 697 | edev->config_space[1] |= PCI_COMMAND_MASTER; | ||
| 689 | } | 698 | } |
| 690 | 699 | ||
| 691 | /** | 700 | /** |
diff --git a/arch/powerpc/kernel/eeh_event.c b/arch/powerpc/kernel/eeh_event.c index d27c5afc90ae..72d748b56c86 100644 --- a/arch/powerpc/kernel/eeh_event.c +++ b/arch/powerpc/kernel/eeh_event.c | |||
| @@ -74,8 +74,13 @@ static int eeh_event_handler(void * dummy) | |||
| 74 | pe = event->pe; | 74 | pe = event->pe; |
| 75 | if (pe) { | 75 | if (pe) { |
| 76 | eeh_pe_state_mark(pe, EEH_PE_RECOVERING); | 76 | eeh_pe_state_mark(pe, EEH_PE_RECOVERING); |
| 77 | pr_info("EEH: Detected PCI bus error on PHB#%d-PE#%x\n", | 77 | if (pe->type & EEH_PE_PHB) |
| 78 | pe->phb->global_number, pe->addr); | 78 | pr_info("EEH: Detected error on PHB#%d\n", |
| 79 | pe->phb->global_number); | ||
| 80 | else | ||
| 81 | pr_info("EEH: Detected PCI bus error on " | ||
| 82 | "PHB#%d-PE#%x\n", | ||
| 83 | pe->phb->global_number, pe->addr); | ||
| 79 | eeh_handle_event(pe); | 84 | eeh_handle_event(pe); |
| 80 | eeh_pe_state_clear(pe, EEH_PE_RECOVERING); | 85 | eeh_pe_state_clear(pe, EEH_PE_RECOVERING); |
| 81 | } else { | 86 | } else { |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index e1ec57e87b3b..75d4f7340da8 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/ftrace.h> | 18 | #include <linux/ftrace.h> |
| 19 | 19 | ||
| 20 | #include <asm/machdep.h> | 20 | #include <asm/machdep.h> |
| 21 | #include <asm/pgalloc.h> | ||
| 21 | #include <asm/prom.h> | 22 | #include <asm/prom.h> |
| 22 | #include <asm/sections.h> | 23 | #include <asm/sections.h> |
| 23 | 24 | ||
| @@ -75,6 +76,17 @@ void arch_crash_save_vmcoreinfo(void) | |||
| 75 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 76 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
| 76 | VMCOREINFO_SYMBOL(contig_page_data); | 77 | VMCOREINFO_SYMBOL(contig_page_data); |
| 77 | #endif | 78 | #endif |
| 79 | #if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP) | ||
| 80 | VMCOREINFO_SYMBOL(vmemmap_list); | ||
| 81 | VMCOREINFO_SYMBOL(mmu_vmemmap_psize); | ||
| 82 | VMCOREINFO_SYMBOL(mmu_psize_defs); | ||
| 83 | VMCOREINFO_STRUCT_SIZE(vmemmap_backing); | ||
| 84 | VMCOREINFO_OFFSET(vmemmap_backing, list); | ||
| 85 | VMCOREINFO_OFFSET(vmemmap_backing, phys); | ||
| 86 | VMCOREINFO_OFFSET(vmemmap_backing, virt_addr); | ||
| 87 | VMCOREINFO_STRUCT_SIZE(mmu_psize_def); | ||
| 88 | VMCOREINFO_OFFSET(mmu_psize_def, shift); | ||
| 89 | #endif | ||
| 78 | } | 90 | } |
| 79 | 91 | ||
| 80 | /* | 92 | /* |
| @@ -136,7 +148,7 @@ void __init reserve_crashkernel(void) | |||
| 136 | * a small SLB (128MB) since the crash kernel needs to place | 148 | * a small SLB (128MB) since the crash kernel needs to place |
| 137 | * itself and some stacks to be in the first segment. | 149 | * itself and some stacks to be in the first segment. |
| 138 | */ | 150 | */ |
| 139 | crashk_res.start = min(0x80000000ULL, (ppc64_rma_size / 2)); | 151 | crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2)); |
| 140 | #else | 152 | #else |
| 141 | crashk_res.start = KDUMP_KERNELBASE; | 153 | crashk_res.start = KDUMP_KERNELBASE; |
| 142 | #endif | 154 | #endif |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index e59caf874d05..64bf8db12b15 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
| @@ -246,8 +246,8 @@ _GLOBAL(__bswapdi2) | |||
| 246 | or r3,r7,r9 | 246 | or r3,r7,r9 |
| 247 | blr | 247 | blr |
| 248 | 248 | ||
| 249 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | ||
| 250 | 249 | ||
| 250 | #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX | ||
| 251 | _GLOBAL(rmci_on) | 251 | _GLOBAL(rmci_on) |
| 252 | sync | 252 | sync |
| 253 | isync | 253 | isync |
| @@ -277,6 +277,9 @@ _GLOBAL(rmci_off) | |||
| 277 | isync | 277 | isync |
| 278 | sync | 278 | sync |
| 279 | blr | 279 | blr |
| 280 | #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */ | ||
| 281 | |||
| 282 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | ||
| 280 | 283 | ||
| 281 | /* | 284 | /* |
| 282 | * Do an IO access in real mode | 285 | * Do an IO access in real mode |
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c index fd82c289ab1c..28b898e68185 100644 --- a/arch/powerpc/kernel/nvram_64.c +++ b/arch/powerpc/kernel/nvram_64.c | |||
| @@ -210,7 +210,7 @@ static void __init nvram_print_partitions(char * label) | |||
| 210 | printk(KERN_WARNING "--------%s---------\n", label); | 210 | printk(KERN_WARNING "--------%s---------\n", label); |
| 211 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); | 211 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); |
| 212 | list_for_each_entry(tmp_part, &nvram_partitions, partition) { | 212 | list_for_each_entry(tmp_part, &nvram_partitions, partition) { |
| 213 | printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12s\n", | 213 | printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12.12s\n", |
| 214 | tmp_part->index, tmp_part->header.signature, | 214 | tmp_part->index, tmp_part->header.signature, |
| 215 | tmp_part->header.checksum, tmp_part->header.length, | 215 | tmp_part->header.checksum, tmp_part->header.length, |
| 216 | tmp_part->header.name); | 216 | tmp_part->header.name); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 75c2d1009985..3386d8ab7eb0 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -858,17 +858,21 @@ void show_regs(struct pt_regs * regs) | |||
| 858 | printk("MSR: "REG" ", regs->msr); | 858 | printk("MSR: "REG" ", regs->msr); |
| 859 | printbits(regs->msr, msr_bits); | 859 | printbits(regs->msr, msr_bits); |
| 860 | printk(" CR: %08lx XER: %08lx\n", regs->ccr, regs->xer); | 860 | printk(" CR: %08lx XER: %08lx\n", regs->ccr, regs->xer); |
| 861 | #ifdef CONFIG_PPC64 | ||
| 862 | printk("SOFTE: %ld\n", regs->softe); | ||
| 863 | #endif | ||
| 864 | trap = TRAP(regs); | 861 | trap = TRAP(regs); |
| 865 | if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR)) | 862 | if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR)) |
| 866 | printk("CFAR: "REG"\n", regs->orig_gpr3); | 863 | printk("CFAR: "REG" ", regs->orig_gpr3); |
| 867 | if (trap == 0x300 || trap == 0x600) | 864 | if (trap == 0x200 || trap == 0x300 || trap == 0x600) |
| 868 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) | 865 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) |
| 869 | printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr); | 866 | printk("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr); |
| 870 | #else | 867 | #else |
| 871 | printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr); | 868 | printk("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr); |
| 869 | #endif | ||
| 870 | #ifdef CONFIG_PPC64 | ||
| 871 | printk("SOFTE: %ld ", regs->softe); | ||
| 872 | #endif | ||
| 873 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 874 | if (MSR_TM_ACTIVE(regs->msr)) | ||
| 875 | printk("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch); | ||
| 872 | #endif | 876 | #endif |
| 873 | 877 | ||
| 874 | for (i = 0; i < 32; i++) { | 878 | for (i = 0; i < 32; i++) { |
| @@ -887,9 +891,6 @@ void show_regs(struct pt_regs * regs) | |||
| 887 | printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); | 891 | printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); |
| 888 | printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); | 892 | printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); |
| 889 | #endif | 893 | #endif |
| 890 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 891 | printk("PACATMSCRATCH [%llx]\n", get_paca()->tm_scratch); | ||
| 892 | #endif | ||
| 893 | show_stack(current, (unsigned long *) regs->gpr[1]); | 894 | show_stack(current, (unsigned long *) regs->gpr[1]); |
| 894 | if (!user_mode(regs)) | 895 | if (!user_mode(regs)) |
| 895 | show_instructions(regs); | 896 | show_instructions(regs); |
| @@ -1086,25 +1087,45 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) | |||
| 1086 | regs->msr = MSR_USER; | 1087 | regs->msr = MSR_USER; |
| 1087 | #else | 1088 | #else |
| 1088 | if (!is_32bit_task()) { | 1089 | if (!is_32bit_task()) { |
| 1089 | unsigned long entry, toc; | 1090 | unsigned long entry; |
| 1090 | 1091 | ||
| 1091 | /* start is a relocated pointer to the function descriptor for | 1092 | if (is_elf2_task()) { |
| 1092 | * the elf _start routine. The first entry in the function | 1093 | /* Look ma, no function descriptors! */ |
| 1093 | * descriptor is the entry address of _start and the second | 1094 | entry = start; |
| 1094 | * entry is the TOC value we need to use. | ||
| 1095 | */ | ||
| 1096 | __get_user(entry, (unsigned long __user *)start); | ||
| 1097 | __get_user(toc, (unsigned long __user *)start+1); | ||
| 1098 | 1095 | ||
| 1099 | /* Check whether the e_entry function descriptor entries | 1096 | /* |
| 1100 | * need to be relocated before we can use them. | 1097 | * Ulrich says: |
| 1101 | */ | 1098 | * The latest iteration of the ABI requires that when |
| 1102 | if (load_addr != 0) { | 1099 | * calling a function (at its global entry point), |
| 1103 | entry += load_addr; | 1100 | * the caller must ensure r12 holds the entry point |
| 1104 | toc += load_addr; | 1101 | * address (so that the function can quickly |
| 1102 | * establish addressability). | ||
| 1103 | */ | ||
| 1104 | regs->gpr[12] = start; | ||
| 1105 | /* Make sure that's restored on entry to userspace. */ | ||
| 1106 | set_thread_flag(TIF_RESTOREALL); | ||
| 1107 | } else { | ||
| 1108 | unsigned long toc; | ||
| 1109 | |||
| 1110 | /* start is a relocated pointer to the function | ||
| 1111 | * descriptor for the elf _start routine. The first | ||
| 1112 | * entry in the function descriptor is the entry | ||
| 1113 | * address of _start and the second entry is the TOC | ||
| 1114 | * value we need to use. | ||
| 1115 | */ | ||
| 1116 | __get_user(entry, (unsigned long __user *)start); | ||
| 1117 | __get_user(toc, (unsigned long __user *)start+1); | ||
| 1118 | |||
| 1119 | /* Check whether the e_entry function descriptor entries | ||
| 1120 | * need to be relocated before we can use them. | ||
| 1121 | */ | ||
| 1122 | if (load_addr != 0) { | ||
| 1123 | entry += load_addr; | ||
| 1124 | toc += load_addr; | ||
| 1125 | } | ||
| 1126 | regs->gpr[2] = toc; | ||
| 1105 | } | 1127 | } |
| 1106 | regs->nip = entry; | 1128 | regs->nip = entry; |
| 1107 | regs->gpr[2] = toc; | ||
| 1108 | regs->msr = MSR_USER64; | 1129 | regs->msr = MSR_USER64; |
| 1109 | } else { | 1130 | } else { |
| 1110 | regs->nip = start; | 1131 | regs->nip = start; |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index f3a47098fb8e..fa0ad8aafbcc 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
| @@ -777,6 +777,26 @@ int of_get_ibm_chip_id(struct device_node *np) | |||
| 777 | return -1; | 777 | return -1; |
| 778 | } | 778 | } |
| 779 | 779 | ||
| 780 | /** | ||
| 781 | * cpu_to_chip_id - Return the cpus chip-id | ||
| 782 | * @cpu: The logical cpu number. | ||
| 783 | * | ||
| 784 | * Return the value of the ibm,chip-id property corresponding to the given | ||
| 785 | * logical cpu number. If the chip-id can not be found, returns -1. | ||
| 786 | */ | ||
| 787 | int cpu_to_chip_id(int cpu) | ||
| 788 | { | ||
| 789 | struct device_node *np; | ||
| 790 | |||
| 791 | np = of_get_cpu_node(cpu, NULL); | ||
| 792 | if (!np) | ||
| 793 | return -1; | ||
| 794 | |||
| 795 | of_node_put(np); | ||
| 796 | return of_get_ibm_chip_id(np); | ||
| 797 | } | ||
| 798 | EXPORT_SYMBOL(cpu_to_chip_id); | ||
| 799 | |||
| 780 | #ifdef CONFIG_PPC_PSERIES | 800 | #ifdef CONFIG_PPC_PSERIES |
| 781 | /* | 801 | /* |
| 782 | * Fix up the uninitialized fields in a new device node: | 802 | * Fix up the uninitialized fields in a new device node: |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 749778e0a69d..68027bfa5f8e 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
| @@ -445,6 +445,12 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | |||
| 445 | #endif /* CONFIG_ALTIVEC */ | 445 | #endif /* CONFIG_ALTIVEC */ |
| 446 | if (copy_fpr_to_user(&frame->mc_fregs, current)) | 446 | if (copy_fpr_to_user(&frame->mc_fregs, current)) |
| 447 | return 1; | 447 | return 1; |
| 448 | |||
| 449 | /* | ||
| 450 | * Clear the MSR VSX bit to indicate there is no valid state attached | ||
| 451 | * to this context, except in the specific case below where we set it. | ||
| 452 | */ | ||
| 453 | msr &= ~MSR_VSX; | ||
| 448 | #ifdef CONFIG_VSX | 454 | #ifdef CONFIG_VSX |
| 449 | /* | 455 | /* |
| 450 | * Copy VSR 0-31 upper half from thread_struct to local | 456 | * Copy VSR 0-31 upper half from thread_struct to local |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index b3c615764c9b..42991045349f 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -122,6 +122,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
| 122 | flush_fp_to_thread(current); | 122 | flush_fp_to_thread(current); |
| 123 | /* copy fpr regs and fpscr */ | 123 | /* copy fpr regs and fpscr */ |
| 124 | err |= copy_fpr_to_user(&sc->fp_regs, current); | 124 | err |= copy_fpr_to_user(&sc->fp_regs, current); |
| 125 | |||
| 126 | /* | ||
| 127 | * Clear the MSR VSX bit to indicate there is no valid state attached | ||
| 128 | * to this context, except in the specific case below where we set it. | ||
| 129 | */ | ||
| 130 | msr &= ~MSR_VSX; | ||
| 125 | #ifdef CONFIG_VSX | 131 | #ifdef CONFIG_VSX |
| 126 | /* | 132 | /* |
| 127 | * Copy VSX low doubleword to local buffer for formatting, | 133 | * Copy VSX low doubleword to local buffer for formatting, |
| @@ -701,12 +707,6 @@ badframe: | |||
| 701 | int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | 707 | int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, |
| 702 | sigset_t *set, struct pt_regs *regs) | 708 | sigset_t *set, struct pt_regs *regs) |
| 703 | { | 709 | { |
| 704 | /* Handler is *really* a pointer to the function descriptor for | ||
| 705 | * the signal routine. The first entry in the function | ||
| 706 | * descriptor is the entry address of signal and the second | ||
| 707 | * entry is the TOC value we need to use. | ||
| 708 | */ | ||
| 709 | func_descr_t __user *funct_desc_ptr; | ||
| 710 | struct rt_sigframe __user *frame; | 710 | struct rt_sigframe __user *frame; |
| 711 | unsigned long newsp = 0; | 711 | unsigned long newsp = 0; |
| 712 | long err = 0; | 712 | long err = 0; |
| @@ -766,19 +766,32 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
| 766 | goto badframe; | 766 | goto badframe; |
| 767 | regs->link = (unsigned long) &frame->tramp[0]; | 767 | regs->link = (unsigned long) &frame->tramp[0]; |
| 768 | } | 768 | } |
| 769 | funct_desc_ptr = (func_descr_t __user *) ka->sa.sa_handler; | ||
| 770 | 769 | ||
| 771 | /* Allocate a dummy caller frame for the signal handler. */ | 770 | /* Allocate a dummy caller frame for the signal handler. */ |
| 772 | newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE; | 771 | newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE; |
| 773 | err |= put_user(regs->gpr[1], (unsigned long __user *)newsp); | 772 | err |= put_user(regs->gpr[1], (unsigned long __user *)newsp); |
| 774 | 773 | ||
| 775 | /* Set up "regs" so we "return" to the signal handler. */ | 774 | /* Set up "regs" so we "return" to the signal handler. */ |
| 776 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | 775 | if (is_elf2_task()) { |
| 776 | regs->nip = (unsigned long) ka->sa.sa_handler; | ||
| 777 | regs->gpr[12] = regs->nip; | ||
| 778 | } else { | ||
| 779 | /* Handler is *really* a pointer to the function descriptor for | ||
| 780 | * the signal routine. The first entry in the function | ||
| 781 | * descriptor is the entry address of signal and the second | ||
| 782 | * entry is the TOC value we need to use. | ||
| 783 | */ | ||
| 784 | func_descr_t __user *funct_desc_ptr = | ||
| 785 | (func_descr_t __user *) ka->sa.sa_handler; | ||
| 786 | |||
| 787 | err |= get_user(regs->nip, &funct_desc_ptr->entry); | ||
| 788 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | ||
| 789 | } | ||
| 790 | |||
| 777 | /* enter the signal handler in native-endian mode */ | 791 | /* enter the signal handler in native-endian mode */ |
| 778 | regs->msr &= ~MSR_LE; | 792 | regs->msr &= ~MSR_LE; |
| 779 | regs->msr |= (MSR_KERNEL & MSR_LE); | 793 | regs->msr |= (MSR_KERNEL & MSR_LE); |
| 780 | regs->gpr[1] = newsp; | 794 | regs->gpr[1] = newsp; |
| 781 | err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); | ||
| 782 | regs->gpr[3] = signr; | 795 | regs->gpr[3] = signr; |
| 783 | regs->result = 0; | 796 | regs->result = 0; |
| 784 | if (ka->sa.sa_flags & SA_SIGINFO) { | 797 | if (ka->sa.sa_flags & SA_SIGINFO) { |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 930cd8af3503..a3b64f3bf9a2 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -597,22 +597,6 @@ out: | |||
| 597 | return id; | 597 | return id; |
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | /* Return the value of the chip-id property corresponding | ||
| 601 | * to the given logical cpu. | ||
| 602 | */ | ||
| 603 | int cpu_to_chip_id(int cpu) | ||
| 604 | { | ||
| 605 | struct device_node *np; | ||
| 606 | |||
| 607 | np = of_get_cpu_node(cpu, NULL); | ||
| 608 | if (!np) | ||
| 609 | return -1; | ||
| 610 | |||
| 611 | of_node_put(np); | ||
| 612 | return of_get_ibm_chip_id(np); | ||
| 613 | } | ||
| 614 | EXPORT_SYMBOL(cpu_to_chip_id); | ||
| 615 | |||
| 616 | /* Helper routines for cpu to core mapping */ | 600 | /* Helper routines for cpu to core mapping */ |
| 617 | int cpu_core_index_of_thread(int cpu) | 601 | int cpu_core_index_of_thread(int cpu) |
| 618 | { | 602 | { |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 192b051df97e..b3b144121cc9 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -213,8 +213,6 @@ static u64 scan_dispatch_log(u64 stop_tb) | |||
| 213 | if (i == be64_to_cpu(vpa->dtl_idx)) | 213 | if (i == be64_to_cpu(vpa->dtl_idx)) |
| 214 | return 0; | 214 | return 0; |
| 215 | while (i < be64_to_cpu(vpa->dtl_idx)) { | 215 | while (i < be64_to_cpu(vpa->dtl_idx)) { |
| 216 | if (dtl_consumer) | ||
| 217 | dtl_consumer(dtl, i); | ||
| 218 | dtb = be64_to_cpu(dtl->timebase); | 216 | dtb = be64_to_cpu(dtl->timebase); |
| 219 | tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) + | 217 | tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) + |
| 220 | be32_to_cpu(dtl->ready_to_enqueue_time); | 218 | be32_to_cpu(dtl->ready_to_enqueue_time); |
| @@ -227,6 +225,8 @@ static u64 scan_dispatch_log(u64 stop_tb) | |||
| 227 | } | 225 | } |
| 228 | if (dtb > stop_tb) | 226 | if (dtb > stop_tb) |
| 229 | break; | 227 | break; |
| 228 | if (dtl_consumer) | ||
| 229 | dtl_consumer(dtl, i); | ||
| 230 | stolen += tb_delta; | 230 | stolen += tb_delta; |
| 231 | ++i; | 231 | ++i; |
| 232 | ++dtl; | 232 | ++dtl; |
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S index 6b1f2a6d5517..6b2b69616e77 100644 --- a/arch/powerpc/kernel/vdso32/gettimeofday.S +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S | |||
| @@ -232,9 +232,15 @@ __do_get_tspec: | |||
| 232 | lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) | 232 | lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) |
| 233 | 233 | ||
| 234 | /* Get a stable TB value */ | 234 | /* Get a stable TB value */ |
| 235 | #ifdef CONFIG_8xx | ||
| 236 | 2: mftbu r3 | ||
| 237 | mftbl r4 | ||
| 238 | mftbu r0 | ||
| 239 | #else | ||
| 235 | 2: mfspr r3, SPRN_TBRU | 240 | 2: mfspr r3, SPRN_TBRU |
| 236 | mfspr r4, SPRN_TBRL | 241 | mfspr r4, SPRN_TBRL |
| 237 | mfspr r0, SPRN_TBRU | 242 | mfspr r0, SPRN_TBRU |
| 243 | #endif | ||
| 238 | cmplw cr0,r3,r0 | 244 | cmplw cr0,r3,r0 |
| 239 | bne- 2b | 245 | bne- 2b |
| 240 | 246 | ||
diff --git a/arch/powerpc/kernel/vdso64/sigtramp.S b/arch/powerpc/kernel/vdso64/sigtramp.S index 45ea281e9a21..542c6f422e4d 100644 --- a/arch/powerpc/kernel/vdso64/sigtramp.S +++ b/arch/powerpc/kernel/vdso64/sigtramp.S | |||
| @@ -142,6 +142,13 @@ V_FUNCTION_END(__kernel_sigtramp_rt64) | |||
| 142 | /* Size of CR reg in DWARF unwind info. */ | 142 | /* Size of CR reg in DWARF unwind info. */ |
| 143 | #define CRSIZE 4 | 143 | #define CRSIZE 4 |
| 144 | 144 | ||
| 145 | /* Offset of CR reg within a full word. */ | ||
| 146 | #ifdef __LITTLE_ENDIAN__ | ||
| 147 | #define CROFF 0 | ||
| 148 | #else | ||
| 149 | #define CROFF (RSIZE - CRSIZE) | ||
| 150 | #endif | ||
| 151 | |||
| 145 | /* This is the offset of the VMX reg pointer. */ | 152 | /* This is the offset of the VMX reg pointer. */ |
| 146 | #define VREGS 48*RSIZE+33*8 | 153 | #define VREGS 48*RSIZE+33*8 |
| 147 | 154 | ||
| @@ -181,7 +188,14 @@ V_FUNCTION_END(__kernel_sigtramp_rt64) | |||
| 181 | rsave (31, 31*RSIZE); \ | 188 | rsave (31, 31*RSIZE); \ |
| 182 | rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \ | 189 | rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \ |
| 183 | rsave (65, 36*RSIZE); /* lr */ \ | 190 | rsave (65, 36*RSIZE); /* lr */ \ |
| 184 | rsave (70, 38*RSIZE + (RSIZE - CRSIZE)) /* cr */ | 191 | rsave (68, 38*RSIZE + CROFF); /* cr fields */ \ |
| 192 | rsave (69, 38*RSIZE + CROFF); \ | ||
| 193 | rsave (70, 38*RSIZE + CROFF); \ | ||
| 194 | rsave (71, 38*RSIZE + CROFF); \ | ||
| 195 | rsave (72, 38*RSIZE + CROFF); \ | ||
| 196 | rsave (73, 38*RSIZE + CROFF); \ | ||
| 197 | rsave (74, 38*RSIZE + CROFF); \ | ||
| 198 | rsave (75, 38*RSIZE + CROFF) | ||
| 185 | 199 | ||
| 186 | /* Describe where the FP regs are saved. */ | 200 | /* Describe where the FP regs are saved. */ |
| 187 | #define EH_FRAME_FP \ | 201 | #define EH_FRAME_FP \ |
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index e7d0c88f621a..76a64821f4a2 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c | |||
| @@ -1419,7 +1419,7 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node) | |||
| 1419 | 1419 | ||
| 1420 | /* needed to ensure proper operation of coherent allocations | 1420 | /* needed to ensure proper operation of coherent allocations |
| 1421 | * later, in case driver doesn't set it explicitly */ | 1421 | * later, in case driver doesn't set it explicitly */ |
| 1422 | dma_set_mask_and_coherent(&viodev->dev, DMA_BIT_MASK(64)); | 1422 | dma_coerce_mask_and_coherent(&viodev->dev, DMA_BIT_MASK(64)); |
| 1423 | } | 1423 | } |
| 1424 | 1424 | ||
| 1425 | /* register with generic device framework */ | 1425 | /* register with generic device framework */ |
