Skip to content

Commit

Permalink
Merge tag 'powerpc-4.19-3' of https://git.kernel.org/pub/scm/linux/ke…
Browse files Browse the repository at this point in the history
…rnel/git/powerpc/linux

Michael writes:
  "powerpc fixes for 4.19 fail0verflow#3

   A reasonably big batch of fixes due to me being away for a few weeks.

   A fix for the TM emulation support on Power9, which could result in
   corrupting the guest r11 when running under KVM.

   Two fixes to the TM code which could lead to userspace GPR corruption
   if we take an SLB miss at exactly the wrong time.

   Our dynamic patching code had a bug that meant we could patch freed
   __init text, which could lead to corrupting userspace memory.

   csum_ipv6_magic() didn't work on little endian platforms since we
   optimised it recently.

   A fix for an endian bug when reading a device tree property telling
   us how many storage keys the machine has available.

   Fix a crash seen on some configurations of PowerVM when migrating the
   partition from one machine to another.

   A fix for a regression in the setup of our CPU to NUMA node mapping
   in KVM guests.

   A fix to our selftest Makefiles to make them work since a recent
   change to the shared Makefile logic."

* tag 'powerpc-4.19-3' of https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  selftests/powerpc: Fix Makefiles for headers_install change
  powerpc/numa: Use associativity if VPHN hcall is successful
  powerpc/tm: Avoid possible userspace r1 corruption on reclaim
  powerpc/tm: Fix userspace r13 corruption
  powerpc/pseries: Fix unitialized timer reset on migration
  powerpc/pkeys: Fix reading of ibm, processor-storage-keys property
  powerpc: fix csum_ipv6_magic() on little endian platforms
  powerpc/powernv/ioda2: Reduce upper limit for DMA window size (again)
  powerpc: Avoid code patching freed init sections
  KVM: PPC: Book3S HV: Fix guest r11 corruption with POWER9 TM workarounds
  • Loading branch information
gregkh committed Sep 29, 2018
2 parents 900915f + 7e0cf1c commit f005de0
Show file tree
Hide file tree
Showing 26 changed files with 55 additions and 9 deletions.
1 change: 1 addition & 0 deletions arch/powerpc/include/asm/setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex);

extern unsigned int rtas_data;
extern unsigned long long memory_limit;
extern bool init_mem_is_free;
extern unsigned long klimit;
extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);

Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/kernel/exceptions-64s.S
Original file line number Diff line number Diff line change
Expand Up @@ -1314,9 +1314,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)

#ifdef CONFIG_PPC_DENORMALISATION
mfspr r10,SPRN_HSRR1
mfspr r11,SPRN_HSRR0 /* save HSRR0 */
andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */
addi r11,r11,-4 /* HSRR0 is next instruction */
bne+ denorm_assist
#endif

Expand Down Expand Up @@ -1382,6 +1380,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
*/
XVCPSGNDP32(32)
denorm_done:
mfspr r11,SPRN_HSRR0
subi r11,r11,4
mtspr SPRN_HSRR0,r11
mtcrf 0x80,r9
ld r9,PACA_EXGEN+EX_R9(r13)
Expand Down
20 changes: 17 additions & 3 deletions arch/powerpc/kernel/tm.S
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,27 @@ _GLOBAL(tm_reclaim)
std r1, PACATMSCRATCH(r13)
ld r1, PACAR1(r13)

/* Store the PPR in r11 and reset to decent value */
std r11, GPR11(r1) /* Temporary stash */

/*
* Move the saved user r1 to the kernel stack in case PACATMSCRATCH is
* clobbered by an exception once we turn on MSR_RI below.
*/
ld r11, PACATMSCRATCH(r13)
std r11, GPR1(r1)

/*
* Store r13 away so we can free up the scratch SPR for the SLB fault
* handler (needed once we start accessing the thread_struct).
*/
GET_SCRATCH0(r11)
std r11, GPR13(r1)

/* Reset MSR RI so we can take SLB faults again */
li r11, MSR_RI
mtmsrd r11, 1

/* Store the PPR in r11 and reset to decent value */
mfspr r11, SPRN_PPR
HMT_MEDIUM

Expand All @@ -207,11 +221,11 @@ _GLOBAL(tm_reclaim)
SAVE_GPR(8, r7) /* user r8 */
SAVE_GPR(9, r7) /* user r9 */
SAVE_GPR(10, r7) /* user r10 */
ld r3, PACATMSCRATCH(r13) /* user r1 */
ld r3, GPR1(r1) /* user r1 */
ld r4, GPR7(r1) /* user r7 */
ld r5, GPR11(r1) /* user r11 */
ld r6, GPR12(r1) /* user r12 */
GET_SCRATCH0(8) /* user r13 */
ld r8, GPR13(r1) /* user r13 */
std r3, GPR1(r7)
std r4, GPR7(r7)
std r5, GPR11(r7)
Expand Down
3 changes: 3 additions & 0 deletions arch/powerpc/lib/checksum_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic)
addc r0, r8, r9
ld r10, 0(r4)
ld r11, 8(r4)
#ifdef CONFIG_CPU_LITTLE_ENDIAN
rotldi r5, r5, 8
#endif
adde r0, r0, r10
add r5, r5, r7
adde r0, r0, r11
Expand Down
6 changes: 6 additions & 0 deletions arch/powerpc/lib/code-patching.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,
{
int err;

/* Make sure we aren't patching a freed init section */
if (init_mem_is_free && init_section_contains(exec_addr, 4)) {
pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr);
return 0;
}

__put_user_size(instr, patch_addr, 4, err);
if (err)
return err;
Expand Down
2 changes: 2 additions & 0 deletions arch/powerpc/mm/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
#endif

unsigned long long memory_limit;
bool init_mem_is_free;

#ifdef CONFIG_HIGHMEM
pte_t *kmap_pte;
Expand Down Expand Up @@ -396,6 +397,7 @@ void free_initmem(void)
{
ppc_md.progress = ppc_printk_progress;
mark_initmem_nx();
init_mem_is_free = true;
free_initmem_default(POISON_FREE_INITMEM);
}

Expand Down
7 changes: 5 additions & 2 deletions arch/powerpc/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,9 @@ int find_and_online_cpu_nid(int cpu)
int new_nid;

/* Use associativity from first thread for all siblings */
vphn_get_associativity(cpu, associativity);
if (vphn_get_associativity(cpu, associativity))
return cpu_to_node(cpu);

new_nid = associativity_to_nid(associativity);
if (new_nid < 0 || !node_possible(new_nid))
new_nid = first_online_node;
Expand Down Expand Up @@ -1452,7 +1454,8 @@ static struct timer_list topology_timer;

static void reset_topology_timer(void)
{
mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ);
if (vphn_enabled)
mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ);
}

#ifdef CONFIG_SMP
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/mm/pkeys.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ static void scan_pkey_feature(void)
* Since any pkey can be used for data or execute, we will just treat
* all keys as equal and track them as one entity.
*/
pkeys_total = be32_to_cpu(vals[0]);
pkeys_total = vals[0];
pkeys_devtree_defined = true;
}

Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/powernv/pci-ioda-tce.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset,
level_shift = entries_shift + 3;
level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT);

if ((level_shift - 3) * levels + page_shift >= 60)
if ((level_shift - 3) * levels + page_shift >= 55)
return -EINVAL;

/* Allocate TCE table */
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/alignment/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
TEST_GEN_PROGS := copy_first_unaligned alignment_handler

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c ../utils.c
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/benchmarks/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ TEST_GEN_FILES := exec_target

CFLAGS += -O2

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/cache_shape/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ all: $(TEST_PROGS)

$(TEST_PROGS): ../harness.c ../utils.c

top_srcdir = ../../../../..
include ../../lib.mk

clean:
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/copyloops/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \

EXTRA_SOURCES := validate.c ../harness.c stubs.S

top_srcdir = ../../../../..
include ../../lib.mk

$(OUTPUT)/copyuser_64_t%: copyuser_64.S $(EXTRA_SOURCES)
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/dscr/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ TEST_GEN_PROGS := dscr_default_test dscr_explicit_test dscr_user_test \
dscr_inherit_test dscr_inherit_exec_test dscr_sysfs_test \
dscr_sysfs_thread_test

top_srcdir = ../../../../..
include ../../lib.mk

$(OUTPUT)/dscr_default_test: LDLIBS += -lpthread
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/math/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
TEST_GEN_PROGS := fpu_syscall fpu_preempt fpu_signal vmx_syscall vmx_preempt vmx_signal vsx_preempt

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/mm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ noarg:
TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors
TEST_GEN_FILES := tempfile

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/pmu/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ noarg:
TEST_GEN_PROGS := count_instructions l3_bank_test per_event_excludes
EXTRA_SOURCES := ../harness.c event.c lib.c ../utils.c

top_srcdir = ../../../../..
include ../../lib.mk

all: $(TEST_GEN_PROGS) ebb
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/pmu/ebb/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ TEST_GEN_PROGS := reg_access_test event_attributes_test cycles_test \
lost_exception_test no_handler_test \
cycles_with_mmcr2_test

top_srcdir = ../../../../../..
include ../../../lib.mk

$(TEST_GEN_PROGS): ../../harness.c ../../utils.c ../event.c ../lib.c \
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/primitives/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ CFLAGS += -I$(CURDIR)

TEST_GEN_PROGS := load_unaligned_zeropad

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/ptrace/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ TEST_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \
ptrace-tm-spd-vsx ptrace-tm-spr ptrace-hwbreak ptrace-pkey core-pkey \
perf-hwbreak

top_srcdir = ../../../../..
include ../../lib.mk

all: $(TEST_PROGS)
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/signal/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ $(TEST_PROGS): ../harness.c ../utils.c signal.S
CFLAGS += -maltivec
signal_tm: CFLAGS += -mhtm

top_srcdir = ../../../../..
include ../../lib.mk

clean:
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/stringloops/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ endif

ASFLAGS = $(CFLAGS)

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): $(EXTRA_SOURCES)
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/switch_endian/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ ASFLAGS += -O2 -Wall -g -nostdlib -m64

EXTRA_CLEAN = $(OUTPUT)/*.o $(OUTPUT)/check-reversed.S

top_srcdir = ../../../../..
include ../../lib.mk

$(OUTPUT)/switch_endian_test: $(OUTPUT)/check-reversed.S
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/syscalls/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ TEST_GEN_PROGS := ipc_unmuxed

CFLAGS += -I../../../../../usr/include

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/tm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ TEST_GEN_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack
tm-vmxcopy tm-fork tm-tar tm-tmspr tm-vmx-unavail tm-unavailable tm-trap \
$(SIGNAL_CONTEXT_CHK_TESTS) tm-sigreturn

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c ../utils.c
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/vphn/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ TEST_GEN_PROGS := test-vphn

CFLAGS += -m64

top_srcdir = ../../../../..
include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
Expand Down

0 comments on commit f005de0

Please sign in to comment.