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-6.14-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Vasily Gorbik:

- Fix return address recovery of traced function in ftrace to ensure
reliable stack unwinding

- Fix compiler warnings and runtime crashes of vDSO selftests on s390
by introducing a dedicated GNU hash bucket pointer with correct
32-bit entry size

- Fix test_monitor_call() inline asm, which misses CC clobber, by
switching to an instruction that doesn't modify CC

* tag 's390-6.14-6' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/ftrace: Fix return address recovery of traced function
selftests/vDSO: Fix GNU hash table entry size for s390x
s390/traps: Fix test_monitor_call() inline assembly

+10 -9
+2 -1
arch/s390/kernel/ftrace.c
··· 266 266 struct ftrace_ops *op, struct ftrace_regs *fregs) 267 267 { 268 268 unsigned long *parent = &arch_ftrace_regs(fregs)->regs.gprs[14]; 269 + unsigned long sp = arch_ftrace_regs(fregs)->regs.gprs[15]; 269 270 270 271 if (unlikely(ftrace_graph_is_dead())) 271 272 return; 272 273 if (unlikely(atomic_read(&current->tracing_graph_pause))) 273 274 return; 274 - if (!function_graph_enter_regs(*parent, ip, 0, parent, fregs)) 275 + if (!function_graph_enter_regs(*parent, ip, 0, (unsigned long *)sp, fregs)) 275 276 *parent = (unsigned long)&return_to_handler; 276 277 } 277 278
+3 -3
arch/s390/kernel/traps.c
··· 285 285 return; 286 286 asm volatile( 287 287 " mc 0,0\n" 288 - "0: xgr %0,%0\n" 288 + "0: lhi %[val],0\n" 289 289 "1:\n" 290 - EX_TABLE(0b,1b) 291 - : "+d" (val)); 290 + EX_TABLE(0b, 1b) 291 + : [val] "+d" (val)); 292 292 if (!val) 293 293 panic("Monitor call doesn't work!\n"); 294 294 }
+5 -5
tools/testing/selftests/vDSO/parse_vdso.c
··· 53 53 /* Symbol table */ 54 54 ELF(Sym) *symtab; 55 55 const char *symstrings; 56 - ELF(Word) *gnu_hash; 56 + ELF(Word) *gnu_hash, *gnu_bucket; 57 57 ELF_HASH_ENTRY *bucket, *chain; 58 58 ELF_HASH_ENTRY nbucket, nchain; 59 59 ··· 185 185 /* The bucket array is located after the header (4 uint32) and the bloom 186 186 * filter (size_t array of gnu_hash[2] elements). 187 187 */ 188 - vdso_info.bucket = vdso_info.gnu_hash + 4 + 189 - sizeof(size_t) / 4 * vdso_info.gnu_hash[2]; 188 + vdso_info.gnu_bucket = vdso_info.gnu_hash + 4 + 189 + sizeof(size_t) / 4 * vdso_info.gnu_hash[2]; 190 190 } else { 191 191 vdso_info.nbucket = hash[0]; 192 192 vdso_info.nchain = hash[1]; ··· 268 268 if (vdso_info.gnu_hash) { 269 269 uint32_t h1 = gnu_hash(name), h2, *hashval; 270 270 271 - i = vdso_info.bucket[h1 % vdso_info.nbucket]; 271 + i = vdso_info.gnu_bucket[h1 % vdso_info.nbucket]; 272 272 if (i == 0) 273 273 return 0; 274 274 h1 |= 1; 275 - hashval = vdso_info.bucket + vdso_info.nbucket + 275 + hashval = vdso_info.gnu_bucket + vdso_info.nbucket + 276 276 (i - vdso_info.gnu_hash[1]); 277 277 for (;; i++) { 278 278 ELF(Sym) *sym = &vdso_info.symtab[i];