mirror of https://gitee.com/openkylin/linux.git
powerpc fixes for 4.14 #3
Four fixes for the new instruction emulation code. A fix for CPU offline on bare metal machines when certain idle states are not supported, and a fix for a device_node refcounting oops during CPU hotplug, caused by recent changes. Going to stable are a fix for an oops during core dump on machines that have TM (Transactional Memory) disabled. Reordering some EEH initialisation to avoid trashing memory, and another device_node refcounting fix. And a few other minor things. Thanks to: Anton Blanchard, Benjamin Herrenschmidt, Cyril Bur, Gautham R. Shenoy, Gustavo Romero, Kamalesh Babulal, Matthew Weber, Matt Weber, Naveen N. Rao, Nicholas Piggin, Pavithra Prakash, Ravi Bangoria, Ronak Desai, Scott Wood, Tyrel Datwyler. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJZxPnDAAoJEFHr6jzI4aWAPBgP+wVskXfJQXxm3kvnOm1UZ56m pKEjoH1n54gKyPcNpQmd7sqMWzdBqzBToeOSr+zMbTm7+xcjURJDulEBh3Fhiame YnJDal5SYxiWZLylHwLseu8t7J7n5J+dWXYkZI7eIupWsKxuL4kr5GHtFpezbA/a kFhx2aNLZ5iy/mLJ6p01/qwn1bUKkjSTuvn75JG3kSdoUCB9d+l8VfYqT1cLC7sl doyKQ2AEHDMV8hFs4A2S1bgNdenq9IAmIMiZf6BkoTkIMg9QxRNsjHvY8wa4N/by 4iHK9Ig30qfMIXWr6hmpl8HmR9BL1BZ2nJOX+0ilUI1ktXz/amEdr4bL0NrCKZKk waUg+aK5HDNMTi8dOv+zuF4oCHBwGz8HKNLiuQDv2ek3BSlG3Fb4ge/Quibsn3je jj9bY7kC0i+w7By9NRo7nL1GV0LV4LArjhHmOqBtW++vKwl3dseMydj2Ml9mpSr7 U385dGBoazxOkdsO84WHgMcFuP61LYRA14boMqFkdRd9G7tRT2DCAdpALyz1Mr/E TqiNRu65ZGaMZzOS14VBP+1xpNEx5a6CtoambES94MC2IBH5SrOTsmYkyZJL9PbO USznplm5hcEt8obdNYSMpGsV5U2iGm9XwDcFxJW4JtmoPxQwa0ap1M3eP7aJXVIk N5KhYUgsYAdqb6skvLcM =Eiyz -----END PGP SIGNATURE----- Merge tag 'powerpc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fixes from Michael Ellerman: "It turns out our single-fix pull from last week was too good to be true. I missed a few fixes in that pull that had already come in because I was on leave, but also we hadn't found the bugs yet. So this week it's a bit bigger, though not ridiculous. Hopefully things will settle down from here on. Four fixes for the new instruction emulation code. A fix for CPU offline on bare metal machines when certain idle states are not supported, and a fix for a device_node refcounting oops during CPU hotplug, caused by recent changes. Going to stable are a fix for an oops during core dump on machines that have TM (Transactional Memory) disabled. Reordering some EEH initialisation to avoid trashing memory, and another device_node refcounting fix. And a few other minor things. Thanks to: Anton Blanchard, Benjamin Herrenschmidt, Cyril Bur, Gautham R. Shenoy, Gustavo Romero, Kamalesh Babulal, Matthew Weber, Matt Weber, Naveen N. Rao, Nicholas Piggin, Pavithra Prakash, Ravi Bangoria, Ronak Desai, Scott Wood, Tyrel Datwyler" * tag 'powerpc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/pseries: Fix parent_dn reference leak in add_dt_node() powerpc/pseries: Fix "OF: ERROR: Bad of_node_put() on /cpus" during DLPAR powerpc/eeh: Create PHB PEs after EEH is initialized powerpc/kprobes: Update optprobes to use emulate_update_regs() powerpc/powernv: Clear LPCR[PECE1] via stop-api only for deep state offline powerpc/sstep: mullw should calculate a 64 bit signed result powerpc/sstep: Fix issues with mcrf powerpc/sstep: Fix issues with set_cr0() powerpc/tm: Flush TM only if CPU has TM feature powerpc/sysrq: Fix oops whem ppmu is not registered powerpc/configs: Update for CONFIG_SND changes powerpc/e6500: Update machine check for L1D cache err
This commit is contained in:
commit
d6396a7331
|
@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||
|
|
|
@ -64,11 +64,12 @@ CONFIG_LOGO=y
|
|||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_GENERIC=y
|
||||
|
|
|
@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_USB_AUDIO=y
|
||||
CONFIG_SND_USB_USX2Y=y
|
||||
|
|
|
@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_DUMMY=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
|
|
|
@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_AOA=m
|
||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||
|
|
|
@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_HID_DRAGONRISE=y
|
||||
CONFIG_HID_GYRATION=y
|
||||
CONFIG_HID_TWINHAN=y
|
||||
|
|
|
@ -789,17 +789,18 @@ CONFIG_LOGO=y
|
|||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_DYNAMIC_MINORS=y
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
CONFIG_SND_VERBOSE_PRINTK=y
|
||||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_DEBUG_VERBOSE=y
|
||||
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_SEQUENCER_OSS=m
|
||||
CONFIG_SND_DUMMY=m
|
||||
CONFIG_SND_VIRMIDI=m
|
||||
CONFIG_SND_MTPAV=m
|
||||
|
|
|
@ -79,11 +79,12 @@ CONFIG_FB=y
|
|||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_HID_APPLE=m
|
||||
CONFIG_HID_WACOM=m
|
||||
CONFIG_MMC=y
|
||||
|
|
|
@ -1019,6 +1019,10 @@ int eeh_init(void)
|
|||
} else if ((ret = eeh_ops->init()))
|
||||
return ret;
|
||||
|
||||
/* Initialize PHB PEs */
|
||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||
eeh_dev_phb_init_dynamic(hose);
|
||||
|
||||
/* Initialize EEH event */
|
||||
ret = eeh_event_init();
|
||||
if (ret)
|
||||
|
|
|
@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
|
|||
/* EEH PE for PHB */
|
||||
eeh_phb_pe_create(phb);
|
||||
}
|
||||
|
||||
/**
|
||||
* eeh_dev_phb_init - Create EEH devices for devices included in existing PHBs
|
||||
*
|
||||
* Scan all the existing PHBs and create EEH devices for their OF
|
||||
* nodes and their children OF nodes
|
||||
*/
|
||||
static int __init eeh_dev_phb_init(void)
|
||||
{
|
||||
struct pci_controller *phb, *tmp;
|
||||
|
||||
list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
|
||||
eeh_dev_phb_init_dynamic(phb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(eeh_dev_phb_init);
|
||||
|
|
|
@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p)
|
|||
* and that can be emulated.
|
||||
*/
|
||||
if (!is_conditional_branch(*p->ainsn.insn) &&
|
||||
analyse_instr(&op, ®s, *p->ainsn.insn))
|
||||
analyse_instr(&op, ®s, *p->ainsn.insn) == 1) {
|
||||
emulate_update_regs(®s, &op);
|
||||
nip = regs.nip;
|
||||
}
|
||||
|
||||
return nip;
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
|
|||
* in the appropriate thread structures from live.
|
||||
*/
|
||||
|
||||
if (tsk != current)
|
||||
if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
|
||||
return;
|
||||
|
||||
if (MSR_TM_SUSPENDED(mfmsr())) {
|
||||
|
|
|
@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
|
|||
int machine_check_e500mc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long mcsr = mfspr(SPRN_MCSR);
|
||||
unsigned long pvr = mfspr(SPRN_PVR);
|
||||
unsigned long reason = mcsr;
|
||||
int recoverable = 1;
|
||||
|
||||
|
@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
|
|||
* may still get logged and cause a machine check. We should
|
||||
* only treat the non-write shadow case as non-recoverable.
|
||||
*/
|
||||
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
||||
recoverable = 0;
|
||||
/* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
|
||||
* is not implemented but L1 data cache always runs in write
|
||||
* shadow mode. Hence on data cache parity errors HW will
|
||||
* automatically invalidate the L1 Data Cache.
|
||||
*/
|
||||
if (PVR_VER(pvr) != PVR_VER_E6500) {
|
||||
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
||||
recoverable = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (reason & MCSR_L2MMU_MHIT) {
|
||||
|
|
|
@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);
|
|||
: "r" (addr), "i" (-EFAULT), "0" (err))
|
||||
|
||||
static nokprobe_inline void set_cr0(const struct pt_regs *regs,
|
||||
struct instruction_op *op, int rd)
|
||||
struct instruction_op *op)
|
||||
{
|
||||
long val = regs->gpr[rd];
|
||||
long val = op->val;
|
||||
|
||||
op->type |= SETCC;
|
||||
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
|
||||
|
@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
case 13: /* addic. */
|
||||
imm = (short) instr;
|
||||
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
|
||||
set_cr0(regs, op, rd);
|
||||
set_cr0(regs, op);
|
||||
return 1;
|
||||
|
||||
case 14: /* addi */
|
||||
|
@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
|
||||
case 28: /* andi. */
|
||||
op->val = regs->gpr[rd] & (unsigned short) instr;
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
goto logical_done_nocc;
|
||||
|
||||
case 29: /* andis. */
|
||||
imm = (unsigned short) instr;
|
||||
op->val = regs->gpr[rd] & (imm << 16);
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
goto logical_done_nocc;
|
||||
|
||||
#ifdef __powerpc64__
|
||||
|
@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
op->type = COMPUTE + SETCC;
|
||||
imm = 0xf0000000UL;
|
||||
val = regs->gpr[rd];
|
||||
op->val = regs->ccr;
|
||||
op->ccval = regs->ccr;
|
||||
for (sh = 0; sh < 8; ++sh) {
|
||||
if (instr & (0x80000 >> sh))
|
||||
op->val = (op->val & ~imm) |
|
||||
op->ccval = (op->ccval & ~imm) |
|
||||
(val & imm);
|
||||
imm >>= 4;
|
||||
}
|
||||
|
@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
goto arith_done;
|
||||
|
||||
case 235: /* mullw */
|
||||
op->val = (unsigned int) regs->gpr[ra] *
|
||||
(unsigned int) regs->gpr[rb];
|
||||
op->val = (long)(int) regs->gpr[ra] *
|
||||
(int) regs->gpr[rb];
|
||||
|
||||
goto arith_done;
|
||||
|
||||
case 266: /* add */
|
||||
|
@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
|
||||
logical_done:
|
||||
if (instr & 1)
|
||||
set_cr0(regs, op, ra);
|
||||
set_cr0(regs, op);
|
||||
logical_done_nocc:
|
||||
op->reg = ra;
|
||||
op->type |= SETREG;
|
||||
|
@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
|
||||
arith_done:
|
||||
if (instr & 1)
|
||||
set_cr0(regs, op, rd);
|
||||
set_cr0(regs, op);
|
||||
compute_done:
|
||||
op->reg = rd;
|
||||
op->type |= SETREG;
|
||||
|
|
|
@ -793,6 +793,11 @@ void perf_event_print_debug(void)
|
|||
u32 pmcs[MAX_HWEVENTS];
|
||||
int i;
|
||||
|
||||
if (!ppmu) {
|
||||
pr_info("Performance monitor hardware not registered.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ppmu->n_counter)
|
||||
return;
|
||||
|
||||
|
|
|
@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
|
|||
u64 pir = get_hard_smp_processor_id(cpu);
|
||||
|
||||
mtspr(SPRN_LPCR, lpcr_val);
|
||||
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
||||
|
||||
/*
|
||||
* Program the LPCR via stop-api only if the deepest stop state
|
||||
* can lose hypervisor context.
|
||||
*/
|
||||
if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
|
||||
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent)
|
|||
return rc;
|
||||
}
|
||||
|
||||
of_node_put(dn->parent);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
|
|||
}
|
||||
|
||||
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
|
||||
of_node_put(parent);
|
||||
if (!dn) {
|
||||
pr_warn("Failed call to configure-connector, drc index: %x\n",
|
||||
drc_index);
|
||||
dlpar_release_drc(drc_index);
|
||||
of_node_put(parent);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = dlpar_attach_node(dn, parent);
|
||||
|
||||
/* Regardless we are done with parent now */
|
||||
of_node_put(parent);
|
||||
|
||||
if (rc) {
|
||||
saved_rc = rc;
|
||||
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
|
||||
|
|
|
@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
|
|||
return -ENOENT;
|
||||
|
||||
dn = dlpar_configure_connector(drc_index, parent_dn);
|
||||
if (!dn)
|
||||
if (!dn) {
|
||||
of_node_put(parent_dn);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
rc = dlpar_attach_node(dn, parent_dn);
|
||||
if (rc)
|
||||
|
|
Loading…
Reference in New Issue