Browse Source

Merge tag 'powerpc-4.8-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:
 "Fixes marked for stable:
   - Don't alias user region to other regions below PAGE_OFFSET from
     Paul Mackerras
   - Fix again csum_partial_copy_generic() on 32-bit from Christophe
     Leroy
   - Fix corrupted PE allocation bitmap on releasing PE from Gavin Shan

  Fixes for code merged this cycle:
   - Fix crash on releasing compound PE from Gavin Shan
   - Fix processor numbers in OPAL ICP from Benjamin Herrenschmidt
   - Fix little endian build with CONFIG_KEXEC=n from Thiago Jung
     Bauermann"

* tag 'powerpc-4.8-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/mm: Don't alias user region to other regions below PAGE_OFFSET
  powerpc/32: Fix again csum_partial_copy_generic()
  powerpc/powernv: Fix corrupted PE allocation bitmap on releasing PE
  powerpc/powernv: Fix crash on releasing compound PE
  powerpc/xics/opal: Fix processor numbers in OPAL ICP
  powerpc/pseries: Fix little endian build with CONFIG_KEXEC=n
Linus Torvalds 9 years ago
parent
commit
2771fc8ed6

+ 4 - 3
arch/powerpc/lib/checksum_32.S

@@ -127,18 +127,19 @@ _GLOBAL(csum_partial_copy_generic)
 	stw	r7,12(r1)
 	stw	r7,12(r1)
 	stw	r8,8(r1)
 	stw	r8,8(r1)
 
 
-	rlwinm	r0,r4,3,0x8
-	rlwnm	r6,r6,r0,0,31	/* odd destination address: rotate one byte */
-	cmplwi	cr7,r0,0	/* is destination address even ? */
 	addic	r12,r6,0
 	addic	r12,r6,0
 	addi	r6,r4,-4
 	addi	r6,r4,-4
 	neg	r0,r4
 	neg	r0,r4
 	addi	r4,r3,-4
 	addi	r4,r3,-4
 	andi.	r0,r0,CACHELINE_MASK	/* # bytes to start of cache line */
 	andi.	r0,r0,CACHELINE_MASK	/* # bytes to start of cache line */
+	crset	4*cr7+eq
 	beq	58f
 	beq	58f
 
 
 	cmplw	0,r5,r0			/* is this more than total to do? */
 	cmplw	0,r5,r0			/* is this more than total to do? */
 	blt	63f			/* if not much to do */
 	blt	63f			/* if not much to do */
+	rlwinm	r7,r6,3,0x8
+	rlwnm	r12,r12,r7,0,31	/* odd destination address: rotate one byte */
+	cmplwi	cr7,r7,0	/* is destination address even ? */
 	andi.	r8,r0,3			/* get it word-aligned first */
 	andi.	r8,r0,3			/* get it word-aligned first */
 	mtctr	r8
 	mtctr	r8
 	beq+	61f
 	beq+	61f

+ 6 - 1
arch/powerpc/mm/slb_low.S

@@ -113,7 +113,12 @@ BEGIN_FTR_SECTION
 END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
 END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
 	b	slb_finish_load_1T
 	b	slb_finish_load_1T
 
 
-0:
+0:	/*
+	 * For userspace addresses, make sure this is region 0.
+	 */
+	cmpdi	r9, 0
+	bne	8f
+
 	/* when using slices, we extract the psize off the slice bitmaps
 	/* when using slices, we extract the psize off the slice bitmaps
 	 * and then we need to get the sllp encoding off the mmu_psize_defs
 	 * and then we need to get the sllp encoding off the mmu_psize_defs
 	 * array.
 	 * array.

+ 11 - 7
arch/powerpc/platforms/powernv/pci-ioda.c

@@ -162,11 +162,12 @@ static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb)
 static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe)
 static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe)
 {
 {
 	struct pnv_phb *phb = pe->phb;
 	struct pnv_phb *phb = pe->phb;
+	unsigned int pe_num = pe->pe_number;
 
 
 	WARN_ON(pe->pdev);
 	WARN_ON(pe->pdev);
 
 
 	memset(pe, 0, sizeof(struct pnv_ioda_pe));
 	memset(pe, 0, sizeof(struct pnv_ioda_pe));
-	clear_bit(pe->pe_number, phb->ioda.pe_alloc);
+	clear_bit(pe_num, phb->ioda.pe_alloc);
 }
 }
 
 
 /* The default M64 BAR is shared by all PEs */
 /* The default M64 BAR is shared by all PEs */
@@ -3402,12 +3403,6 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe)
 	struct pnv_phb *phb = pe->phb;
 	struct pnv_phb *phb = pe->phb;
 	struct pnv_ioda_pe *slave, *tmp;
 	struct pnv_ioda_pe *slave, *tmp;
 
 
-	/* Release slave PEs in compound PE */
-	if (pe->flags & PNV_IODA_PE_MASTER) {
-		list_for_each_entry_safe(slave, tmp, &pe->slaves, list)
-			pnv_ioda_release_pe(slave);
-	}
-
 	list_del(&pe->list);
 	list_del(&pe->list);
 	switch (phb->type) {
 	switch (phb->type) {
 	case PNV_PHB_IODA1:
 	case PNV_PHB_IODA1:
@@ -3422,6 +3417,15 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe)
 
 
 	pnv_ioda_release_pe_seg(pe);
 	pnv_ioda_release_pe_seg(pe);
 	pnv_ioda_deconfigure_pe(pe->phb, pe);
 	pnv_ioda_deconfigure_pe(pe->phb, pe);
+
+	/* Release slave PEs in the compound PE */
+	if (pe->flags & PNV_IODA_PE_MASTER) {
+		list_for_each_entry_safe(slave, tmp, &pe->slaves, list) {
+			list_del(&slave->list);
+			pnv_ioda_free_pe(slave);
+		}
+	}
+
 	pnv_ioda_free_pe(pe);
 	pnv_ioda_free_pe(pe);
 }
 }
 
 

+ 1 - 1
arch/powerpc/platforms/pseries/setup.c

@@ -41,7 +41,6 @@
 #include <linux/root_dev.h>
 #include <linux/root_dev.h>
 #include <linux/of.h>
 #include <linux/of.h>
 #include <linux/of_pci.h>
 #include <linux/of_pci.h>
-#include <linux/kexec.h>
 
 
 #include <asm/mmu.h>
 #include <asm/mmu.h>
 #include <asm/processor.h>
 #include <asm/processor.h>
@@ -66,6 +65,7 @@
 #include <asm/eeh.h>
 #include <asm/eeh.h>
 #include <asm/reg.h>
 #include <asm/reg.h>
 #include <asm/plpar_wrappers.h>
 #include <asm/plpar_wrappers.h>
+#include <asm/kexec.h>
 
 
 #include "pseries.h"
 #include "pseries.h"
 
 

+ 7 - 5
arch/powerpc/sysdev/xics/icp-opal.c

@@ -23,10 +23,10 @@
 
 
 static void icp_opal_teardown_cpu(void)
 static void icp_opal_teardown_cpu(void)
 {
 {
-	int cpu = smp_processor_id();
+	int hw_cpu = hard_smp_processor_id();
 
 
 	/* Clear any pending IPI */
 	/* Clear any pending IPI */
-	opal_int_set_mfrr(cpu, 0xff);
+	opal_int_set_mfrr(hw_cpu, 0xff);
 }
 }
 
 
 static void icp_opal_flush_ipi(void)
 static void icp_opal_flush_ipi(void)
@@ -101,14 +101,16 @@ static void icp_opal_eoi(struct irq_data *d)
 
 
 static void icp_opal_cause_ipi(int cpu, unsigned long data)
 static void icp_opal_cause_ipi(int cpu, unsigned long data)
 {
 {
-	opal_int_set_mfrr(cpu, IPI_PRIORITY);
+	int hw_cpu = get_hard_smp_processor_id(cpu);
+
+	opal_int_set_mfrr(hw_cpu, IPI_PRIORITY);
 }
 }
 
 
 static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id)
 static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id)
 {
 {
-	int cpu = smp_processor_id();
+	int hw_cpu = hard_smp_processor_id();
 
 
-	opal_int_set_mfrr(cpu, 0xff);
+	opal_int_set_mfrr(hw_cpu, 0xff);
 
 
 	return smp_ipi_demux();
 	return smp_ipi_demux();
 }
 }