Merge branch 'linus' into x86/asm, to pick up recent fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -41,7 +41,7 @@ obj-$(CONFIG_VDSO32) += vdso32/
|
||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o hmi.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o
|
||||
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o
|
||||
|
@@ -368,13 +368,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
tabort_syscall:
|
||||
/* Firstly we need to enable TM in the kernel */
|
||||
mfmsr r10
|
||||
li r13, 1
|
||||
rldimi r10, r13, MSR_TM_LG, 63-MSR_TM_LG
|
||||
li r9, 1
|
||||
rldimi r10, r9, MSR_TM_LG, 63-MSR_TM_LG
|
||||
mtmsrd r10, 0
|
||||
|
||||
/* tabort, this dooms the transaction, nothing else */
|
||||
li r13, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
||||
TABORT(R13)
|
||||
li r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
||||
TABORT(R9)
|
||||
|
||||
/*
|
||||
* Return directly to userspace. We have corrupted user register state,
|
||||
@@ -382,8 +382,8 @@ tabort_syscall:
|
||||
* resume after the tbegin of the aborted transaction with the
|
||||
* checkpointed register state.
|
||||
*/
|
||||
li r13, MSR_RI
|
||||
andc r10, r10, r13
|
||||
li r9, MSR_RI
|
||||
andc r10, r10, r9
|
||||
mtmsrd r10, 1
|
||||
mtspr SPRN_SRR0, r11
|
||||
mtspr SPRN_SRR1, r12
|
||||
|
@@ -485,7 +485,23 @@ machine_check_fwnmi:
|
||||
EXCEPTION_PROLOG_0(PACA_EXMC)
|
||||
machine_check_pSeries_0:
|
||||
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
||||
EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
|
||||
/*
|
||||
* The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
|
||||
* difference that MSR_RI is not enabled, because PACA_EXMC is being
|
||||
* used, so nested machine check corrupts it. machine_check_common
|
||||
* enables MSR_RI.
|
||||
*/
|
||||
ld r12,PACAKBASE(r13)
|
||||
ld r10,PACAKMSR(r13)
|
||||
xori r10,r10,MSR_RI
|
||||
mfspr r11,SPRN_SRR0
|
||||
LOAD_HANDLER(r12, machine_check_common)
|
||||
mtspr SPRN_SRR0,r12
|
||||
mfspr r12,SPRN_SRR1
|
||||
mtspr SPRN_SRR1,r10
|
||||
rfid
|
||||
b . /* prevent speculative execution */
|
||||
|
||||
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
||||
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
||||
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
||||
@@ -969,14 +985,17 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
||||
machine_check_common:
|
||||
|
||||
mfspr r10,SPRN_DAR
|
||||
std r10,PACA_EXGEN+EX_DAR(r13)
|
||||
std r10,PACA_EXMC+EX_DAR(r13)
|
||||
mfspr r10,SPRN_DSISR
|
||||
stw r10,PACA_EXGEN+EX_DSISR(r13)
|
||||
stw r10,PACA_EXMC+EX_DSISR(r13)
|
||||
EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
|
||||
FINISH_NAP
|
||||
RECONCILE_IRQ_STATE(r10, r11)
|
||||
ld r3,PACA_EXGEN+EX_DAR(r13)
|
||||
lwz r4,PACA_EXGEN+EX_DSISR(r13)
|
||||
ld r3,PACA_EXMC+EX_DAR(r13)
|
||||
lwz r4,PACA_EXMC+EX_DSISR(r13)
|
||||
/* Enable MSR_RI when finished with PACA_EXMC */
|
||||
li r10,MSR_RI
|
||||
mtmsrd r10,1
|
||||
std r3,_DAR(r1)
|
||||
std r4,_DSISR(r1)
|
||||
bl save_nvgprs
|
||||
|
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Hypervisor Maintenance Interrupt (HMI) handling.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program.
|
||||
*
|
||||
* Copyright 2015 IBM Corporation
|
||||
* Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/hmi.h>
|
||||
|
||||
void wait_for_subcore_guest_exit(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* NULL bitmap pointer indicates that KVM module hasn't
|
||||
* been loaded yet and hence no guests are running.
|
||||
* If no KVM is in use, no need to co-ordinate among threads
|
||||
* as all of them will always be in host and no one is going
|
||||
* to modify TB other than the opal hmi handler.
|
||||
* Hence, just return from here.
|
||||
*/
|
||||
if (!local_paca->sibling_subcore_state)
|
||||
return;
|
||||
|
||||
for (i = 0; i < MAX_SUBCORE_PER_CORE; i++)
|
||||
while (local_paca->sibling_subcore_state->in_guest[i])
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
void wait_for_tb_resync(void)
|
||||
{
|
||||
if (!local_paca->sibling_subcore_state)
|
||||
return;
|
||||
|
||||
while (test_bit(CORE_TB_RESYNC_REQ_BIT,
|
||||
&local_paca->sibling_subcore_state->flags))
|
||||
cpu_relax();
|
||||
}
|
@@ -29,7 +29,7 @@
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/code-patching.h>
|
||||
|
@@ -153,6 +153,42 @@ void pcibios_free_controller(struct pci_controller *phb)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pcibios_free_controller);
|
||||
|
||||
/*
|
||||
* This function is used to call pcibios_free_controller()
|
||||
* in a deferred manner: a callback from the PCI subsystem.
|
||||
*
|
||||
* _*DO NOT*_ call pcibios_free_controller() explicitly if
|
||||
* this is used (or it may access an invalid *phb pointer).
|
||||
*
|
||||
* The callback occurs when all references to the root bus
|
||||
* are dropped (e.g., child buses/devices and their users).
|
||||
*
|
||||
* It's called as .release_fn() of 'struct pci_host_bridge'
|
||||
* which is associated with the 'struct pci_controller.bus'
|
||||
* (root bus) - it expects .release_data to hold a pointer
|
||||
* to 'struct pci_controller'.
|
||||
*
|
||||
* In order to use it, register .release_fn()/release_data
|
||||
* like this:
|
||||
*
|
||||
* pci_set_host_bridge_release(bridge,
|
||||
* pcibios_free_controller_deferred
|
||||
* (void *) phb);
|
||||
*
|
||||
* e.g. in the pcibios_root_bridge_prepare() callback from
|
||||
* pci_create_root_bus().
|
||||
*/
|
||||
void pcibios_free_controller_deferred(struct pci_host_bridge *bridge)
|
||||
{
|
||||
struct pci_controller *phb = (struct pci_controller *)
|
||||
bridge->release_data;
|
||||
|
||||
pr_debug("domain %d, dynamic %d\n", phb->global_number, phb->is_dynamic);
|
||||
|
||||
pcibios_free_controller(phb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pcibios_free_controller_deferred);
|
||||
|
||||
/*
|
||||
* The function is used to return the minimal alignment
|
||||
* for memory or I/O windows of the associated P2P bridge.
|
||||
|
@@ -695,7 +695,7 @@ unsigned char ibm_architecture_vec[] = {
|
||||
OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */
|
||||
|
||||
/* option vector 5: PAPR/OF options */
|
||||
VECTOR_LENGTH(18), /* length */
|
||||
VECTOR_LENGTH(21), /* length */
|
||||
0, /* don't ignore, don't halt */
|
||||
OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
|
||||
OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
|
||||
@@ -726,8 +726,11 @@ unsigned char ibm_architecture_vec[] = {
|
||||
0,
|
||||
0,
|
||||
OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
|
||||
OV5_FEAT(OV5_PFO_HW_842),
|
||||
OV5_FEAT(OV5_SUB_PROCESSORS),
|
||||
OV5_FEAT(OV5_PFO_HW_842), /* Byte 17 */
|
||||
0, /* Byte 18 */
|
||||
0, /* Byte 19 */
|
||||
0, /* Byte 20 */
|
||||
OV5_FEAT(OV5_SUB_PROCESSORS), /* Byte 21 */
|
||||
|
||||
/* option vector 6: IBM PAPR hints */
|
||||
VECTOR_LENGTH(3), /* length */
|
||||
|
@@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
||||
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
||||
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
||||
goto bad;
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
/*
|
||||
* If there is a transactional state then throw it away.
|
||||
* The purpose of a sigreturn is to destroy all traces of the
|
||||
* signal frame, this includes any transactional state created
|
||||
* within in. We only check for suspended as we can never be
|
||||
* active in the kernel, we are active, there is nothing better to
|
||||
* do than go ahead and Bad Thing later.
|
||||
* The cause is not important as there will never be a
|
||||
* recheckpoint so it's not user visible.
|
||||
*/
|
||||
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||
tm_reclaim_current(0);
|
||||
|
||||
if (__get_user(tmp, &rt_sf->uc.uc_link))
|
||||
goto bad;
|
||||
uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
|
||||
|
@@ -676,7 +676,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
||||
goto badframe;
|
||||
set_current_blocked(&set);
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
/*
|
||||
* If there is a transactional state then throw it away.
|
||||
* The purpose of a sigreturn is to destroy all traces of the
|
||||
* signal frame, this includes any transactional state created
|
||||
* within in. We only check for suspended as we can never be
|
||||
* active in the kernel, we are active, there is nothing better to
|
||||
* do than go ahead and Bad Thing later.
|
||||
* The cause is not important as there will never be a
|
||||
* recheckpoint so it's not user visible.
|
||||
*/
|
||||
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||
tm_reclaim_current(0);
|
||||
|
||||
if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
|
||||
goto badframe;
|
||||
if (MSR_TM_ACTIVE(msr)) {
|
||||
|
@@ -830,7 +830,7 @@ int __cpu_disable(void)
|
||||
|
||||
/* Update sibling maps */
|
||||
base = cpu_first_thread_sibling(cpu);
|
||||
for (i = 0; i < threads_per_core; i++) {
|
||||
for (i = 0; i < threads_per_core && base + i < nr_cpu_ids; i++) {
|
||||
cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i));
|
||||
cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu));
|
||||
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
||||
|
@@ -25,7 +25,8 @@
|
||||
#include <linux/user.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/module.h> /* print_modules */
|
||||
#include <linux/prctl.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
Reference in New Issue
Block a user