Merge tag 'v3.13-rc4' into perf/core
Merge Linux 3.13-rc4, to refresh this branch with the latest fixes. Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -686,6 +686,15 @@ void eeh_save_bars(struct eeh_dev *edev)
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
eeh_ops->read_config(dn, i * 4, 4, &edev->config_space[i]);
|
||||
|
||||
/*
|
||||
* For PCI bridges including root port, we need enable bus
|
||||
* master explicitly. Otherwise, it can't fetch IODA table
|
||||
* entries correctly. So we cache the bit in advance so that
|
||||
* we can restore it after reset, either PHB range or PE range.
|
||||
*/
|
||||
if (edev->mode & EEH_DEV_BRIDGE)
|
||||
edev->config_space[1] |= PCI_COMMAND_MASTER;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -74,8 +74,13 @@ static int eeh_event_handler(void * dummy)
|
||||
pe = event->pe;
|
||||
if (pe) {
|
||||
eeh_pe_state_mark(pe, EEH_PE_RECOVERING);
|
||||
pr_info("EEH: Detected PCI bus error on PHB#%d-PE#%x\n",
|
||||
pe->phb->global_number, pe->addr);
|
||||
if (pe->type & EEH_PE_PHB)
|
||||
pr_info("EEH: Detected error on PHB#%d\n",
|
||||
pe->phb->global_number);
|
||||
else
|
||||
pr_info("EEH: Detected PCI bus error on "
|
||||
"PHB#%d-PE#%x\n",
|
||||
pe->phb->global_number, pe->addr);
|
||||
eeh_handle_event(pe);
|
||||
eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
|
||||
} else {
|
||||
|
@@ -18,6 +18,7 @@
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
@@ -75,6 +76,17 @@ void arch_crash_save_vmcoreinfo(void)
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
VMCOREINFO_SYMBOL(contig_page_data);
|
||||
#endif
|
||||
#if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP)
|
||||
VMCOREINFO_SYMBOL(vmemmap_list);
|
||||
VMCOREINFO_SYMBOL(mmu_vmemmap_psize);
|
||||
VMCOREINFO_SYMBOL(mmu_psize_defs);
|
||||
VMCOREINFO_STRUCT_SIZE(vmemmap_backing);
|
||||
VMCOREINFO_OFFSET(vmemmap_backing, list);
|
||||
VMCOREINFO_OFFSET(vmemmap_backing, phys);
|
||||
VMCOREINFO_OFFSET(vmemmap_backing, virt_addr);
|
||||
VMCOREINFO_STRUCT_SIZE(mmu_psize_def);
|
||||
VMCOREINFO_OFFSET(mmu_psize_def, shift);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -136,7 +148,7 @@ void __init reserve_crashkernel(void)
|
||||
* a small SLB (128MB) since the crash kernel needs to place
|
||||
* itself and some stacks to be in the first segment.
|
||||
*/
|
||||
crashk_res.start = min(0x80000000ULL, (ppc64_rma_size / 2));
|
||||
crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2));
|
||||
#else
|
||||
crashk_res.start = KDUMP_KERNELBASE;
|
||||
#endif
|
||||
|
@@ -246,8 +246,8 @@ _GLOBAL(__bswapdi2)
|
||||
or r3,r7,r9
|
||||
blr
|
||||
|
||||
#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
|
||||
|
||||
#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
|
||||
_GLOBAL(rmci_on)
|
||||
sync
|
||||
isync
|
||||
@@ -277,6 +277,9 @@ _GLOBAL(rmci_off)
|
||||
isync
|
||||
sync
|
||||
blr
|
||||
#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
|
||||
|
||||
#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
|
||||
|
||||
/*
|
||||
* Do an IO access in real mode
|
||||
|
@@ -210,7 +210,7 @@ static void __init nvram_print_partitions(char * label)
|
||||
printk(KERN_WARNING "--------%s---------\n", label);
|
||||
printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n");
|
||||
list_for_each_entry(tmp_part, &nvram_partitions, partition) {
|
||||
printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12s\n",
|
||||
printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12.12s\n",
|
||||
tmp_part->index, tmp_part->header.signature,
|
||||
tmp_part->header.checksum, tmp_part->header.length,
|
||||
tmp_part->header.name);
|
||||
|
@@ -858,17 +858,21 @@ void show_regs(struct pt_regs * regs)
|
||||
printk("MSR: "REG" ", regs->msr);
|
||||
printbits(regs->msr, msr_bits);
|
||||
printk(" CR: %08lx XER: %08lx\n", regs->ccr, regs->xer);
|
||||
#ifdef CONFIG_PPC64
|
||||
printk("SOFTE: %ld\n", regs->softe);
|
||||
#endif
|
||||
trap = TRAP(regs);
|
||||
if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
|
||||
printk("CFAR: "REG"\n", regs->orig_gpr3);
|
||||
if (trap == 0x300 || trap == 0x600)
|
||||
printk("CFAR: "REG" ", regs->orig_gpr3);
|
||||
if (trap == 0x200 || trap == 0x300 || trap == 0x600)
|
||||
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
|
||||
printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
|
||||
printk("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr);
|
||||
#else
|
||||
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
||||
printk("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr);
|
||||
#endif
|
||||
#ifdef CONFIG_PPC64
|
||||
printk("SOFTE: %ld ", regs->softe);
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
if (MSR_TM_ACTIVE(regs->msr))
|
||||
printk("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
@@ -886,9 +890,6 @@ void show_regs(struct pt_regs * regs)
|
||||
*/
|
||||
printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip);
|
||||
printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link);
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
printk("PACATMSCRATCH [%llx]\n", get_paca()->tm_scratch);
|
||||
#endif
|
||||
show_stack(current, (unsigned long *) regs->gpr[1]);
|
||||
if (!user_mode(regs))
|
||||
@@ -1086,25 +1087,45 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
||||
regs->msr = MSR_USER;
|
||||
#else
|
||||
if (!is_32bit_task()) {
|
||||
unsigned long entry, toc;
|
||||
unsigned long entry;
|
||||
|
||||
/* start is a relocated pointer to the function descriptor for
|
||||
* the elf _start routine. The first entry in the function
|
||||
* descriptor is the entry address of _start and the second
|
||||
* entry is the TOC value we need to use.
|
||||
*/
|
||||
__get_user(entry, (unsigned long __user *)start);
|
||||
__get_user(toc, (unsigned long __user *)start+1);
|
||||
if (is_elf2_task()) {
|
||||
/* Look ma, no function descriptors! */
|
||||
entry = start;
|
||||
|
||||
/* Check whether the e_entry function descriptor entries
|
||||
* need to be relocated before we can use them.
|
||||
*/
|
||||
if (load_addr != 0) {
|
||||
entry += load_addr;
|
||||
toc += load_addr;
|
||||
/*
|
||||
* Ulrich says:
|
||||
* The latest iteration of the ABI requires that when
|
||||
* calling a function (at its global entry point),
|
||||
* the caller must ensure r12 holds the entry point
|
||||
* address (so that the function can quickly
|
||||
* establish addressability).
|
||||
*/
|
||||
regs->gpr[12] = start;
|
||||
/* Make sure that's restored on entry to userspace. */
|
||||
set_thread_flag(TIF_RESTOREALL);
|
||||
} else {
|
||||
unsigned long toc;
|
||||
|
||||
/* start is a relocated pointer to the function
|
||||
* descriptor for the elf _start routine. The first
|
||||
* entry in the function descriptor is the entry
|
||||
* address of _start and the second entry is the TOC
|
||||
* value we need to use.
|
||||
*/
|
||||
__get_user(entry, (unsigned long __user *)start);
|
||||
__get_user(toc, (unsigned long __user *)start+1);
|
||||
|
||||
/* Check whether the e_entry function descriptor entries
|
||||
* need to be relocated before we can use them.
|
||||
*/
|
||||
if (load_addr != 0) {
|
||||
entry += load_addr;
|
||||
toc += load_addr;
|
||||
}
|
||||
regs->gpr[2] = toc;
|
||||
}
|
||||
regs->nip = entry;
|
||||
regs->gpr[2] = toc;
|
||||
regs->msr = MSR_USER64;
|
||||
} else {
|
||||
regs->nip = start;
|
||||
|
@@ -777,6 +777,26 @@ int of_get_ibm_chip_id(struct device_node *np)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* cpu_to_chip_id - Return the cpus chip-id
|
||||
* @cpu: The logical cpu number.
|
||||
*
|
||||
* Return the value of the ibm,chip-id property corresponding to the given
|
||||
* logical cpu number. If the chip-id can not be found, returns -1.
|
||||
*/
|
||||
int cpu_to_chip_id(int cpu)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_get_cpu_node(cpu, NULL);
|
||||
if (!np)
|
||||
return -1;
|
||||
|
||||
of_node_put(np);
|
||||
return of_get_ibm_chip_id(np);
|
||||
}
|
||||
EXPORT_SYMBOL(cpu_to_chip_id);
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/*
|
||||
* Fix up the uninitialized fields in a new device node:
|
||||
|
@@ -445,6 +445,12 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
if (copy_fpr_to_user(&frame->mc_fregs, current))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Clear the MSR VSX bit to indicate there is no valid state attached
|
||||
* to this context, except in the specific case below where we set it.
|
||||
*/
|
||||
msr &= ~MSR_VSX;
|
||||
#ifdef CONFIG_VSX
|
||||
/*
|
||||
* Copy VSR 0-31 upper half from thread_struct to local
|
||||
|
@@ -122,6 +122,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||
flush_fp_to_thread(current);
|
||||
/* copy fpr regs and fpscr */
|
||||
err |= copy_fpr_to_user(&sc->fp_regs, current);
|
||||
|
||||
/*
|
||||
* Clear the MSR VSX bit to indicate there is no valid state attached
|
||||
* to this context, except in the specific case below where we set it.
|
||||
*/
|
||||
msr &= ~MSR_VSX;
|
||||
#ifdef CONFIG_VSX
|
||||
/*
|
||||
* Copy VSX low doubleword to local buffer for formatting,
|
||||
@@ -701,12 +707,6 @@ badframe:
|
||||
int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
|
||||
sigset_t *set, struct pt_regs *regs)
|
||||
{
|
||||
/* Handler is *really* a pointer to the function descriptor for
|
||||
* the signal routine. The first entry in the function
|
||||
* descriptor is the entry address of signal and the second
|
||||
* entry is the TOC value we need to use.
|
||||
*/
|
||||
func_descr_t __user *funct_desc_ptr;
|
||||
struct rt_sigframe __user *frame;
|
||||
unsigned long newsp = 0;
|
||||
long err = 0;
|
||||
@@ -766,19 +766,32 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
|
||||
goto badframe;
|
||||
regs->link = (unsigned long) &frame->tramp[0];
|
||||
}
|
||||
funct_desc_ptr = (func_descr_t __user *) ka->sa.sa_handler;
|
||||
|
||||
/* Allocate a dummy caller frame for the signal handler. */
|
||||
newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE;
|
||||
err |= put_user(regs->gpr[1], (unsigned long __user *)newsp);
|
||||
|
||||
/* Set up "regs" so we "return" to the signal handler. */
|
||||
err |= get_user(regs->nip, &funct_desc_ptr->entry);
|
||||
if (is_elf2_task()) {
|
||||
regs->nip = (unsigned long) ka->sa.sa_handler;
|
||||
regs->gpr[12] = regs->nip;
|
||||
} else {
|
||||
/* Handler is *really* a pointer to the function descriptor for
|
||||
* the signal routine. The first entry in the function
|
||||
* descriptor is the entry address of signal and the second
|
||||
* entry is the TOC value we need to use.
|
||||
*/
|
||||
func_descr_t __user *funct_desc_ptr =
|
||||
(func_descr_t __user *) ka->sa.sa_handler;
|
||||
|
||||
err |= get_user(regs->nip, &funct_desc_ptr->entry);
|
||||
err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
|
||||
}
|
||||
|
||||
/* enter the signal handler in native-endian mode */
|
||||
regs->msr &= ~MSR_LE;
|
||||
regs->msr |= (MSR_KERNEL & MSR_LE);
|
||||
regs->gpr[1] = newsp;
|
||||
err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
|
||||
regs->gpr[3] = signr;
|
||||
regs->result = 0;
|
||||
if (ka->sa.sa_flags & SA_SIGINFO) {
|
||||
|
@@ -597,22 +597,6 @@ out:
|
||||
return id;
|
||||
}
|
||||
|
||||
/* Return the value of the chip-id property corresponding
|
||||
* to the given logical cpu.
|
||||
*/
|
||||
int cpu_to_chip_id(int cpu)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_get_cpu_node(cpu, NULL);
|
||||
if (!np)
|
||||
return -1;
|
||||
|
||||
of_node_put(np);
|
||||
return of_get_ibm_chip_id(np);
|
||||
}
|
||||
EXPORT_SYMBOL(cpu_to_chip_id);
|
||||
|
||||
/* Helper routines for cpu to core mapping */
|
||||
int cpu_core_index_of_thread(int cpu)
|
||||
{
|
||||
|
@@ -213,8 +213,6 @@ static u64 scan_dispatch_log(u64 stop_tb)
|
||||
if (i == be64_to_cpu(vpa->dtl_idx))
|
||||
return 0;
|
||||
while (i < be64_to_cpu(vpa->dtl_idx)) {
|
||||
if (dtl_consumer)
|
||||
dtl_consumer(dtl, i);
|
||||
dtb = be64_to_cpu(dtl->timebase);
|
||||
tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) +
|
||||
be32_to_cpu(dtl->ready_to_enqueue_time);
|
||||
@@ -227,6 +225,8 @@ static u64 scan_dispatch_log(u64 stop_tb)
|
||||
}
|
||||
if (dtb > stop_tb)
|
||||
break;
|
||||
if (dtl_consumer)
|
||||
dtl_consumer(dtl, i);
|
||||
stolen += tb_delta;
|
||||
++i;
|
||||
++dtl;
|
||||
|
@@ -232,9 +232,15 @@ __do_get_tspec:
|
||||
lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
|
||||
|
||||
/* Get a stable TB value */
|
||||
#ifdef CONFIG_8xx
|
||||
2: mftbu r3
|
||||
mftbl r4
|
||||
mftbu r0
|
||||
#else
|
||||
2: mfspr r3, SPRN_TBRU
|
||||
mfspr r4, SPRN_TBRL
|
||||
mfspr r0, SPRN_TBRU
|
||||
#endif
|
||||
cmplw cr0,r3,r0
|
||||
bne- 2b
|
||||
|
||||
|
@@ -142,6 +142,13 @@ V_FUNCTION_END(__kernel_sigtramp_rt64)
|
||||
/* Size of CR reg in DWARF unwind info. */
|
||||
#define CRSIZE 4
|
||||
|
||||
/* Offset of CR reg within a full word. */
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
#define CROFF 0
|
||||
#else
|
||||
#define CROFF (RSIZE - CRSIZE)
|
||||
#endif
|
||||
|
||||
/* This is the offset of the VMX reg pointer. */
|
||||
#define VREGS 48*RSIZE+33*8
|
||||
|
||||
@@ -181,7 +188,14 @@ V_FUNCTION_END(__kernel_sigtramp_rt64)
|
||||
rsave (31, 31*RSIZE); \
|
||||
rsave (67, 32*RSIZE); /* ap, used as temp for nip */ \
|
||||
rsave (65, 36*RSIZE); /* lr */ \
|
||||
rsave (70, 38*RSIZE + (RSIZE - CRSIZE)) /* cr */
|
||||
rsave (68, 38*RSIZE + CROFF); /* cr fields */ \
|
||||
rsave (69, 38*RSIZE + CROFF); \
|
||||
rsave (70, 38*RSIZE + CROFF); \
|
||||
rsave (71, 38*RSIZE + CROFF); \
|
||||
rsave (72, 38*RSIZE + CROFF); \
|
||||
rsave (73, 38*RSIZE + CROFF); \
|
||||
rsave (74, 38*RSIZE + CROFF); \
|
||||
rsave (75, 38*RSIZE + CROFF)
|
||||
|
||||
/* Describe where the FP regs are saved. */
|
||||
#define EH_FRAME_FP \
|
||||
|
@@ -1419,7 +1419,7 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node)
|
||||
|
||||
/* needed to ensure proper operation of coherent allocations
|
||||
* later, in case driver doesn't set it explicitly */
|
||||
dma_set_mask_and_coherent(&viodev->dev, DMA_BIT_MASK(64));
|
||||
dma_coerce_mask_and_coherent(&viodev->dev, DMA_BIT_MASK(64));
|
||||
}
|
||||
|
||||
/* register with generic device framework */
|
||||
|
Reference in New Issue
Block a user