Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 's390-5.17-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Vasily Gorbik:

- Fix HAVE_DYNAMIC_FTRACE_WITH_ARGS implementation by providing correct
switching between ftrace_caller/ftrace_regs_caller and supplying
pt_regs only when ftrace_regs_caller is activated.

- Fix exception table sorting.

- Fix breakage of kdump tooling by preserving metadata it cannot
function without.

* tag 's390-5.17-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/extable: fix exception table sorting
s390/ftrace: fix arch_ftrace_get_regs implementation
s390/ftrace: fix ftrace_caller/ftrace_regs_caller generation
s390/setup: preserve memory at OLDMEM_BASE and OLDMEM_SIZE

+62 -7
+7 -2
arch/s390/include/asm/extable.h
··· 69 69 { 70 70 a->fixup = b->fixup + delta; 71 71 b->fixup = tmp.fixup - delta; 72 - a->handler = b->handler + delta; 73 - b->handler = tmp.handler - delta; 72 + a->handler = b->handler; 73 + if (a->handler) 74 + a->handler += delta; 75 + b->handler = tmp.handler; 76 + if (b->handler) 77 + b->handler -= delta; 74 78 } 79 + #define swap_ex_entry_fixup swap_ex_entry_fixup 75 80 76 81 #endif
+6 -4
arch/s390/include/asm/ftrace.h
··· 47 47 48 48 static __always_inline struct pt_regs *arch_ftrace_get_regs(struct ftrace_regs *fregs) 49 49 { 50 - return &fregs->regs; 50 + struct pt_regs *regs = &fregs->regs; 51 + 52 + if (test_pt_regs_flag(regs, PIF_FTRACE_FULL_REGS)) 53 + return regs; 54 + return NULL; 51 55 } 52 56 53 57 static __always_inline void ftrace_instruction_pointer_set(struct ftrace_regs *fregs, 54 58 unsigned long ip) 55 59 { 56 - struct pt_regs *regs = arch_ftrace_get_regs(fregs); 57 - 58 - regs->psw.addr = ip; 60 + fregs->regs.psw.addr = ip; 59 61 } 60 62 61 63 /*
+2
arch/s390/include/asm/ptrace.h
··· 15 15 #define PIF_EXECVE_PGSTE_RESTART 1 /* restart execve for PGSTE binaries */ 16 16 #define PIF_SYSCALL_RET_SET 2 /* return value was set via ptrace */ 17 17 #define PIF_GUEST_FAULT 3 /* indicates program check in sie64a */ 18 + #define PIF_FTRACE_FULL_REGS 4 /* all register contents valid (ftrace) */ 18 19 19 20 #define _PIF_SYSCALL BIT(PIF_SYSCALL) 20 21 #define _PIF_EXECVE_PGSTE_RESTART BIT(PIF_EXECVE_PGSTE_RESTART) 21 22 #define _PIF_SYSCALL_RET_SET BIT(PIF_SYSCALL_RET_SET) 22 23 #define _PIF_GUEST_FAULT BIT(PIF_GUEST_FAULT) 24 + #define _PIF_FTRACE_FULL_REGS BIT(PIF_FTRACE_FULL_REGS) 23 25 24 26 #ifndef __ASSEMBLY__ 25 27
+36 -1
arch/s390/kernel/ftrace.c
··· 159 159 return 0; 160 160 } 161 161 162 + static struct ftrace_hotpatch_trampoline *ftrace_get_trampoline(struct dyn_ftrace *rec) 163 + { 164 + struct ftrace_hotpatch_trampoline *trampoline; 165 + struct ftrace_insn insn; 166 + s64 disp; 167 + u16 opc; 168 + 169 + if (copy_from_kernel_nofault(&insn, (void *)rec->ip, sizeof(insn))) 170 + return ERR_PTR(-EFAULT); 171 + disp = (s64)insn.disp * 2; 172 + trampoline = (void *)(rec->ip + disp); 173 + if (get_kernel_nofault(opc, &trampoline->brasl_opc)) 174 + return ERR_PTR(-EFAULT); 175 + if (opc != 0xc015) 176 + return ERR_PTR(-EINVAL); 177 + return trampoline; 178 + } 179 + 162 180 int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, 163 181 unsigned long addr) 164 182 { 183 + struct ftrace_hotpatch_trampoline *trampoline; 184 + u64 old; 185 + 186 + trampoline = ftrace_get_trampoline(rec); 187 + if (IS_ERR(trampoline)) 188 + return PTR_ERR(trampoline); 189 + if (get_kernel_nofault(old, &trampoline->interceptor)) 190 + return -EFAULT; 191 + if (old != old_addr) 192 + return -EINVAL; 193 + s390_kernel_write(&trampoline->interceptor, &addr, sizeof(addr)); 165 194 return 0; 166 195 } 167 196 ··· 217 188 218 189 int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) 219 190 { 191 + struct ftrace_hotpatch_trampoline *trampoline; 192 + 193 + trampoline = ftrace_get_trampoline(rec); 194 + if (IS_ERR(trampoline)) 195 + return PTR_ERR(trampoline); 196 + s390_kernel_write(&trampoline->interceptor, &addr, sizeof(addr)); 220 197 brcl_enable((void *)rec->ip); 221 198 return 0; 222 199 } ··· 326 291 327 292 regs = ftrace_get_regs(fregs); 328 293 p = get_kprobe((kprobe_opcode_t *)ip); 329 - if (unlikely(!p) || kprobe_disabled(p)) 294 + if (!regs || unlikely(!p) || kprobe_disabled(p)) 330 295 goto out; 331 296 332 297 if (kprobe_running()) {
+9
arch/s390/kernel/mcount.S
··· 27 27 #define STACK_PTREGS_GPRS (STACK_PTREGS + __PT_GPRS) 28 28 #define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW) 29 29 #define STACK_PTREGS_ORIG_GPR2 (STACK_PTREGS + __PT_ORIG_GPR2) 30 + #define STACK_PTREGS_FLAGS (STACK_PTREGS + __PT_FLAGS) 30 31 #ifdef __PACK_STACK 31 32 /* allocate just enough for r14, r15 and backchain */ 32 33 #define TRACED_FUNC_FRAME_SIZE 24 ··· 58 57 .if \allregs == 1 59 58 stg %r14,(STACK_PTREGS_PSW)(%r15) 60 59 stosm (STACK_PTREGS_PSW)(%r15),0 60 + #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES 61 + mvghi STACK_PTREGS_FLAGS(%r15),_PIF_FTRACE_FULL_REGS 62 + #else 63 + lghi %r14,_PIF_FTRACE_FULL_REGS 64 + stg %r14,STACK_PTREGS_FLAGS(%r15) 65 + #endif 66 + .else 67 + xc STACK_PTREGS_FLAGS(8,%r15),STACK_PTREGS_FLAGS(%r15) 61 68 .endif 62 69 63 70 lg %r14,(__SF_GPRS+8*8)(%r1) # restore original return address
+2
arch/s390/kernel/setup.c
··· 800 800 static void __init reserve_kernel(void) 801 801 { 802 802 memblock_reserve(0, STARTUP_NORMAL_OFFSET); 803 + memblock_reserve(OLDMEM_BASE, sizeof(unsigned long)); 804 + memblock_reserve(OLDMEM_SIZE, sizeof(unsigned long)); 803 805 memblock_reserve(__amode31_base, __eamode31 - __samode31); 804 806 memblock_reserve(__pa(sclp_early_sccb), EXT_SCCB_READ_SCP); 805 807 memblock_reserve(__pa(_stext), _end - _stext);