Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Martin Schwidefsky:
"Another two bug fixes:

- ptrace partial write information leak

- a guest page hinting regression introduced with v4.6"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/mm: Fix cmma unused transfer from pgste into pte
s390/ptrace: Preserve previous registers for short regset write

+12 -3
+8
arch/s390/kernel/ptrace.c
··· 963 if (target == current) 964 save_fpu_regs(); 965 966 /* If setting FPC, must validate it first. */ 967 if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) { 968 u32 ufpc[2] = { target->thread.fpu.fpc, 0 }; ··· 1071 return -ENODEV; 1072 if (target == current) 1073 save_fpu_regs(); 1074 1075 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1); 1076 if (rc == 0)
··· 963 if (target == current) 964 save_fpu_regs(); 965 966 + if (MACHINE_HAS_VX) 967 + convert_vx_to_fp(fprs, target->thread.fpu.vxrs); 968 + else 969 + memcpy(&fprs, target->thread.fpu.fprs, sizeof(fprs)); 970 + 971 /* If setting FPC, must validate it first. */ 972 if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) { 973 u32 ufpc[2] = { target->thread.fpu.fpc, 0 }; ··· 1066 return -ENODEV; 1067 if (target == current) 1068 save_fpu_regs(); 1069 + 1070 + for (i = 0; i < __NUM_VXRS_LOW; i++) 1071 + vxrs[i] = *((__u64 *)(target->thread.fpu.vxrs + i) + 1); 1072 1073 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1); 1074 if (rc == 0)
+4 -3
arch/s390/mm/pgtable.c
··· 202 return pgste; 203 } 204 205 - static inline void ptep_xchg_commit(struct mm_struct *mm, 206 unsigned long addr, pte_t *ptep, 207 pgste_t pgste, pte_t old, pte_t new) 208 { ··· 220 } else { 221 *ptep = new; 222 } 223 } 224 225 pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr, ··· 232 preempt_disable(); 233 pgste = ptep_xchg_start(mm, addr, ptep); 234 old = ptep_flush_direct(mm, addr, ptep); 235 - ptep_xchg_commit(mm, addr, ptep, pgste, old, new); 236 preempt_enable(); 237 return old; 238 } ··· 247 preempt_disable(); 248 pgste = ptep_xchg_start(mm, addr, ptep); 249 old = ptep_flush_lazy(mm, addr, ptep); 250 - ptep_xchg_commit(mm, addr, ptep, pgste, old, new); 251 preempt_enable(); 252 return old; 253 }
··· 202 return pgste; 203 } 204 205 + static inline pte_t ptep_xchg_commit(struct mm_struct *mm, 206 unsigned long addr, pte_t *ptep, 207 pgste_t pgste, pte_t old, pte_t new) 208 { ··· 220 } else { 221 *ptep = new; 222 } 223 + return old; 224 } 225 226 pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr, ··· 231 preempt_disable(); 232 pgste = ptep_xchg_start(mm, addr, ptep); 233 old = ptep_flush_direct(mm, addr, ptep); 234 + old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new); 235 preempt_enable(); 236 return old; 237 } ··· 246 preempt_disable(); 247 pgste = ptep_xchg_start(mm, addr, ptep); 248 old = ptep_flush_lazy(mm, addr, ptep); 249 + old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new); 250 preempt_enable(); 251 return old; 252 }