Commit f005de01 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'powerpc-4.19-3' of https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Michael writes:
  "powerpc fixes for 4.19 #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
parents 900915f9 7e0cf1c9
...@@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex); ...@@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex);
extern unsigned int rtas_data; extern unsigned int rtas_data;
extern unsigned long long memory_limit; extern unsigned long long memory_limit;
extern bool init_mem_is_free;
extern unsigned long klimit; extern unsigned long klimit;
extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
......
...@@ -1314,9 +1314,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100) ...@@ -1314,9 +1314,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
#ifdef CONFIG_PPC_DENORMALISATION #ifdef CONFIG_PPC_DENORMALISATION
mfspr r10,SPRN_HSRR1 mfspr r10,SPRN_HSRR1
mfspr r11,SPRN_HSRR0 /* save HSRR0 */
andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */ andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */
addi r11,r11,-4 /* HSRR0 is next instruction */
bne+ denorm_assist bne+ denorm_assist
#endif #endif
...@@ -1382,6 +1380,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) ...@@ -1382,6 +1380,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
*/ */
XVCPSGNDP32(32) XVCPSGNDP32(32)
denorm_done: denorm_done:
mfspr r11,SPRN_HSRR0
subi r11,r11,4
mtspr SPRN_HSRR0,r11 mtspr SPRN_HSRR0,r11
mtcrf 0x80,r9 mtcrf 0x80,r9
ld r9,PACA_EXGEN+EX_R9(r13) ld r9,PACA_EXGEN+EX_R9(r13)
......
...@@ -176,13 +176,27 @@ _GLOBAL(tm_reclaim) ...@@ -176,13 +176,27 @@ _GLOBAL(tm_reclaim)
std r1, PACATMSCRATCH(r13) std r1, PACATMSCRATCH(r13)
ld r1, PACAR1(r13) ld r1, PACAR1(r13)
/* Store the PPR in r11 and reset to decent value */
std r11, GPR11(r1) /* Temporary stash */ 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 */ /* Reset MSR RI so we can take SLB faults again */
li r11, MSR_RI li r11, MSR_RI
mtmsrd r11, 1 mtmsrd r11, 1
/* Store the PPR in r11 and reset to decent value */
mfspr r11, SPRN_PPR mfspr r11, SPRN_PPR
HMT_MEDIUM HMT_MEDIUM
...@@ -207,11 +221,11 @@ _GLOBAL(tm_reclaim) ...@@ -207,11 +221,11 @@ _GLOBAL(tm_reclaim)
SAVE_GPR(8, r7) /* user r8 */ SAVE_GPR(8, r7) /* user r8 */
SAVE_GPR(9, r7) /* user r9 */ SAVE_GPR(9, r7) /* user r9 */
SAVE_GPR(10, r7) /* user r10 */ 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 r4, GPR7(r1) /* user r7 */
ld r5, GPR11(r1) /* user r11 */ ld r5, GPR11(r1) /* user r11 */
ld r6, GPR12(r1) /* user r12 */ ld r6, GPR12(r1) /* user r12 */
GET_SCRATCH0(8) /* user r13 */ ld r8, GPR13(r1) /* user r13 */
std r3, GPR1(r7) std r3, GPR1(r7)
std r4, GPR7(r7) std r4, GPR7(r7)
std r5, GPR11(r7) std r5, GPR11(r7)
......
...@@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic) ...@@ -443,6 +443,9 @@ _GLOBAL(csum_ipv6_magic)
addc r0, r8, r9 addc r0, r8, r9
ld r10, 0(r4) ld r10, 0(r4)
ld r11, 8(r4) ld r11, 8(r4)
#ifdef CONFIG_CPU_LITTLE_ENDIAN
rotldi r5, r5, 8
#endif
adde r0, r0, r10 adde r0, r0, r10
add r5, r5, r7 add r5, r5, r7
adde r0, r0, r11 adde r0, r0, r11
......
...@@ -28,6 +28,12 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, ...@@ -28,6 +28,12 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,
{ {
int err; 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); __put_user_size(instr, patch_addr, 4, err);
if (err) if (err)
return err; return err;
......
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#endif #endif
unsigned long long memory_limit; unsigned long long memory_limit;
bool init_mem_is_free;
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
pte_t *kmap_pte; pte_t *kmap_pte;
...@@ -396,6 +397,7 @@ void free_initmem(void) ...@@ -396,6 +397,7 @@ void free_initmem(void)
{ {
ppc_md.progress = ppc_printk_progress; ppc_md.progress = ppc_printk_progress;
mark_initmem_nx(); mark_initmem_nx();
init_mem_is_free = true;
free_initmem_default(POISON_FREE_INITMEM); free_initmem_default(POISON_FREE_INITMEM);
} }
......
...@@ -1204,7 +1204,9 @@ int find_and_online_cpu_nid(int cpu) ...@@ -1204,7 +1204,9 @@ int find_and_online_cpu_nid(int cpu)
int new_nid; int new_nid;
/* Use associativity from first thread for all siblings */ /* 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); new_nid = associativity_to_nid(associativity);
if (new_nid < 0 || !node_possible(new_nid)) if (new_nid < 0 || !node_possible(new_nid))
new_nid = first_online_node; new_nid = first_online_node;
...@@ -1452,6 +1454,7 @@ static struct timer_list topology_timer; ...@@ -1452,6 +1454,7 @@ static struct timer_list topology_timer;
static void reset_topology_timer(void) static void reset_topology_timer(void)
{ {
if (vphn_enabled)
mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ); mod_timer(&topology_timer, jiffies + topology_timer_secs * HZ);
} }
......
...@@ -45,7 +45,7 @@ static void scan_pkey_feature(void) ...@@ -45,7 +45,7 @@ static void scan_pkey_feature(void)
* Since any pkey can be used for data or execute, we will just treat * Since any pkey can be used for data or execute, we will just treat
* all keys as equal and track them as one entity. * 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; pkeys_devtree_defined = true;
} }
......
...@@ -276,7 +276,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset, ...@@ -276,7 +276,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset,
level_shift = entries_shift + 3; level_shift = entries_shift + 3;
level_shift = max_t(unsigned int, level_shift, PAGE_SHIFT); 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; return -EINVAL;
/* Allocate TCE table */ /* Allocate TCE table */
......
TEST_GEN_PROGS := copy_first_unaligned alignment_handler TEST_GEN_PROGS := copy_first_unaligned alignment_handler
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c ../utils.c $(TEST_GEN_PROGS): ../harness.c ../utils.c
...@@ -4,6 +4,7 @@ TEST_GEN_FILES := exec_target ...@@ -4,6 +4,7 @@ TEST_GEN_FILES := exec_target
CFLAGS += -O2 CFLAGS += -O2
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
......
...@@ -5,6 +5,7 @@ all: $(TEST_PROGS) ...@@ -5,6 +5,7 @@ all: $(TEST_PROGS)
$(TEST_PROGS): ../harness.c ../utils.c $(TEST_PROGS): ../harness.c ../utils.c
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
clean: clean:
......
...@@ -17,6 +17,7 @@ TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \ ...@@ -17,6 +17,7 @@ TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \
EXTRA_SOURCES := validate.c ../harness.c stubs.S EXTRA_SOURCES := validate.c ../harness.c stubs.S
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(OUTPUT)/copyuser_64_t%: copyuser_64.S $(EXTRA_SOURCES) $(OUTPUT)/copyuser_64_t%: copyuser_64.S $(EXTRA_SOURCES)
......
...@@ -3,6 +3,7 @@ TEST_GEN_PROGS := dscr_default_test dscr_explicit_test dscr_user_test \ ...@@ -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_inherit_test dscr_inherit_exec_test dscr_sysfs_test \
dscr_sysfs_thread_test dscr_sysfs_thread_test
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(OUTPUT)/dscr_default_test: LDLIBS += -lpthread $(OUTPUT)/dscr_default_test: LDLIBS += -lpthread
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
TEST_GEN_PROGS := fpu_syscall fpu_preempt fpu_signal vmx_syscall vmx_preempt vmx_signal vsx_preempt TEST_GEN_PROGS := fpu_syscall fpu_preempt fpu_signal vmx_syscall vmx_preempt vmx_signal vsx_preempt
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
......
...@@ -5,6 +5,7 @@ noarg: ...@@ -5,6 +5,7 @@ noarg:
TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors
TEST_GEN_FILES := tempfile TEST_GEN_FILES := tempfile
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
......
...@@ -5,6 +5,7 @@ noarg: ...@@ -5,6 +5,7 @@ noarg:
TEST_GEN_PROGS := count_instructions l3_bank_test per_event_excludes TEST_GEN_PROGS := count_instructions l3_bank_test per_event_excludes
EXTRA_SOURCES := ../harness.c event.c lib.c ../utils.c EXTRA_SOURCES := ../harness.c event.c lib.c ../utils.c
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
all: $(TEST_GEN_PROGS) ebb all: $(TEST_GEN_PROGS) ebb
......
...@@ -17,6 +17,7 @@ TEST_GEN_PROGS := reg_access_test event_attributes_test cycles_test \ ...@@ -17,6 +17,7 @@ TEST_GEN_PROGS := reg_access_test event_attributes_test cycles_test \
lost_exception_test no_handler_test \ lost_exception_test no_handler_test \
cycles_with_mmcr2_test cycles_with_mmcr2_test
top_srcdir = ../../../../../..
include ../../../lib.mk include ../../../lib.mk
$(TEST_GEN_PROGS): ../../harness.c ../../utils.c ../event.c ../lib.c \ $(TEST_GEN_PROGS): ../../harness.c ../../utils.c ../event.c ../lib.c \
......
...@@ -2,6 +2,7 @@ CFLAGS += -I$(CURDIR) ...@@ -2,6 +2,7 @@ CFLAGS += -I$(CURDIR)
TEST_GEN_PROGS := load_unaligned_zeropad TEST_GEN_PROGS := load_unaligned_zeropad
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
...@@ -4,6 +4,7 @@ TEST_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \ ...@@ -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 \ ptrace-tm-spd-vsx ptrace-tm-spr ptrace-hwbreak ptrace-pkey core-pkey \
perf-hwbreak perf-hwbreak
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
all: $(TEST_PROGS) all: $(TEST_PROGS)
......
...@@ -8,6 +8,7 @@ $(TEST_PROGS): ../harness.c ../utils.c signal.S ...@@ -8,6 +8,7 @@ $(TEST_PROGS): ../harness.c ../utils.c signal.S
CFLAGS += -maltivec CFLAGS += -maltivec
signal_tm: CFLAGS += -mhtm signal_tm: CFLAGS += -mhtm
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
clean: clean:
......
...@@ -29,6 +29,7 @@ endif ...@@ -29,6 +29,7 @@ endif
ASFLAGS = $(CFLAGS) ASFLAGS = $(CFLAGS)
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): $(EXTRA_SOURCES) $(TEST_GEN_PROGS): $(EXTRA_SOURCES)
...@@ -5,6 +5,7 @@ ASFLAGS += -O2 -Wall -g -nostdlib -m64 ...@@ -5,6 +5,7 @@ ASFLAGS += -O2 -Wall -g -nostdlib -m64
EXTRA_CLEAN = $(OUTPUT)/*.o $(OUTPUT)/check-reversed.S EXTRA_CLEAN = $(OUTPUT)/*.o $(OUTPUT)/check-reversed.S
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(OUTPUT)/switch_endian_test: $(OUTPUT)/check-reversed.S $(OUTPUT)/switch_endian_test: $(OUTPUT)/check-reversed.S
......
...@@ -2,6 +2,7 @@ TEST_GEN_PROGS := ipc_unmuxed ...@@ -2,6 +2,7 @@ TEST_GEN_PROGS := ipc_unmuxed
CFLAGS += -I../../../../../usr/include CFLAGS += -I../../../../../usr/include
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
...@@ -6,6 +6,7 @@ TEST_GEN_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack ...@@ -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 \ tm-vmxcopy tm-fork tm-tar tm-tmspr tm-vmx-unavail tm-unavailable tm-trap \
$(SIGNAL_CONTEXT_CHK_TESTS) tm-sigreturn $(SIGNAL_CONTEXT_CHK_TESTS) tm-sigreturn
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c ../utils.c $(TEST_GEN_PROGS): ../harness.c ../utils.c
......
...@@ -2,6 +2,7 @@ TEST_GEN_PROGS := test-vphn ...@@ -2,6 +2,7 @@ TEST_GEN_PROGS := test-vphn
CFLAGS += -m64 CFLAGS += -m64
top_srcdir = ../../../../..
include ../../lib.mk include ../../lib.mk
$(TEST_GEN_PROGS): ../harness.c $(TEST_GEN_PROGS): ../harness.c
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment