1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Ptrace user space interface. 4 * 5 * Copyright IBM Corp. 1999, 2010 6 * Author(s): Denis Joseph Barrow 7 * Martin Schwidefsky (schwidefsky@de.ibm.com) 8 */ 9 10 #include "asm/ptrace.h" 11 #include <linux/kernel.h> 12 #include <linux/sched.h> 13 #include <linux/sched/task_stack.h> 14 #include <linux/mm.h> 15 #include <linux/smp.h> 16 #include <linux/errno.h> 17 #include <linux/ptrace.h> 18 #include <linux/user.h> 19 #include <linux/security.h> 20 #include <linux/audit.h> 21 #include <linux/signal.h> 22 #include <linux/elf.h> 23 #include <linux/regset.h> 24 #include <linux/seccomp.h> 25 #include <linux/compat.h> 26 #include <trace/syscall.h> 27 #include <asm/page.h> 28 #include <linux/uaccess.h> 29 #include <asm/unistd.h> 30 #include <asm/switch_to.h> 31 #include <asm/runtime_instr.h> 32 #include <asm/facility.h> 33 34 #include "entry.h" 35 36 #ifdef CONFIG_COMPAT 37 #include "compat_ptrace.h" 38 #endif 39 40 void update_cr_regs(struct task_struct *task) 41 { 42 struct pt_regs *regs = task_pt_regs(task); 43 struct thread_struct *thread = &task->thread; 44 struct per_regs old, new; 45 union ctlreg0 cr0_old, cr0_new; 46 union ctlreg2 cr2_old, cr2_new; 47 int cr0_changed, cr2_changed; 48 49 __ctl_store(cr0_old.val, 0, 0); 50 __ctl_store(cr2_old.val, 2, 2); 51 cr0_new = cr0_old; 52 cr2_new = cr2_old; 53 /* Take care of the enable/disable of transactional execution. */ 54 if (MACHINE_HAS_TE) { 55 /* Set or clear transaction execution TXC bit 8. */ 56 cr0_new.tcx = 1; 57 if (task->thread.per_flags & PER_FLAG_NO_TE) 58 cr0_new.tcx = 0; 59 /* Set or clear transaction execution TDC bits 62 and 63. */ 60 cr2_new.tdc = 0; 61 if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) { 62 if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND_TEND) 63 cr2_new.tdc = 1; 64 else 65 cr2_new.tdc = 2; 66 } 67 } 68 /* Take care of enable/disable of guarded storage. */ 69 if (MACHINE_HAS_GS) { 70 cr2_new.gse = 0; 71 if (task->thread.gs_cb) 72 cr2_new.gse = 1; 73 } 74 /* Load control register 0/2 iff changed */ 75 cr0_changed = cr0_new.val != cr0_old.val; 76 cr2_changed = cr2_new.val != cr2_old.val; 77 if (cr0_changed) 78 __ctl_load(cr0_new.val, 0, 0); 79 if (cr2_changed) 80 __ctl_load(cr2_new.val, 2, 2); 81 /* Copy user specified PER registers */ 82 new.control = thread->per_user.control; 83 new.start = thread->per_user.start; 84 new.end = thread->per_user.end; 85 86 /* merge TIF_SINGLE_STEP into user specified PER registers. */ 87 if (test_tsk_thread_flag(task, TIF_SINGLE_STEP) || 88 test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP)) { 89 if (test_tsk_thread_flag(task, TIF_BLOCK_STEP)) 90 new.control |= PER_EVENT_BRANCH; 91 else 92 new.control |= PER_EVENT_IFETCH; 93 new.control |= PER_CONTROL_SUSPENSION; 94 new.control |= PER_EVENT_TRANSACTION_END; 95 if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP)) 96 new.control |= PER_EVENT_IFETCH; 97 new.start = 0; 98 new.end = -1UL; 99 } 100 101 /* Take care of the PER enablement bit in the PSW. */ 102 if (!(new.control & PER_EVENT_MASK)) { 103 regs->psw.mask &= ~PSW_MASK_PER; 104 return; 105 } 106 regs->psw.mask |= PSW_MASK_PER; 107 __ctl_store(old, 9, 11); 108 if (memcmp(&new, &old, sizeof(struct per_regs)) != 0) 109 __ctl_load(new, 9, 11); 110 } 111 112 void user_enable_single_step(struct task_struct *task) 113 { 114 clear_tsk_thread_flag(task, TIF_BLOCK_STEP); 115 set_tsk_thread_flag(task, TIF_SINGLE_STEP); 116 } 117 118 void user_disable_single_step(struct task_struct *task) 119 { 120 clear_tsk_thread_flag(task, TIF_BLOCK_STEP); 121 clear_tsk_thread_flag(task, TIF_SINGLE_STEP); 122 } 123 124 void user_enable_block_step(struct task_struct *task) 125 { 126 set_tsk_thread_flag(task, TIF_SINGLE_STEP); 127 set_tsk_thread_flag(task, TIF_BLOCK_STEP); 128 } 129 130 /* 131 * Called by kernel/ptrace.c when detaching.. 132 * 133 * Clear all debugging related fields. 134 */ 135 void ptrace_disable(struct task_struct *task) 136 { 137 memset(&task->thread.per_user, 0, sizeof(task->thread.per_user)); 138 memset(&task->thread.per_event, 0, sizeof(task->thread.per_event)); 139 clear_tsk_thread_flag(task, TIF_SINGLE_STEP); 140 clear_tsk_thread_flag(task, TIF_PER_TRAP); 141 task->thread.per_flags = 0; 142 } 143 144 #define __ADDR_MASK 7 145 146 static inline unsigned long __peek_user_per(struct task_struct *child, 147 addr_t addr) 148 { 149 if (addr == offsetof(struct per_struct_kernel, cr9)) 150 /* Control bits of the active per set. */ 151 return test_thread_flag(TIF_SINGLE_STEP) ? 152 PER_EVENT_IFETCH : child->thread.per_user.control; 153 else if (addr == offsetof(struct per_struct_kernel, cr10)) 154 /* Start address of the active per set. */ 155 return test_thread_flag(TIF_SINGLE_STEP) ? 156 0 : child->thread.per_user.start; 157 else if (addr == offsetof(struct per_struct_kernel, cr11)) 158 /* End address of the active per set. */ 159 return test_thread_flag(TIF_SINGLE_STEP) ? 160 -1UL : child->thread.per_user.end; 161 else if (addr == offsetof(struct per_struct_kernel, bits)) 162 /* Single-step bit. */ 163 return test_thread_flag(TIF_SINGLE_STEP) ? 164 (1UL << (BITS_PER_LONG - 1)) : 0; 165 else if (addr == offsetof(struct per_struct_kernel, starting_addr)) 166 /* Start address of the user specified per set. */ 167 return child->thread.per_user.start; 168 else if (addr == offsetof(struct per_struct_kernel, ending_addr)) 169 /* End address of the user specified per set. */ 170 return child->thread.per_user.end; 171 else if (addr == offsetof(struct per_struct_kernel, perc_atmid)) 172 /* PER code, ATMID and AI of the last PER trap */ 173 return (unsigned long) 174 child->thread.per_event.cause << (BITS_PER_LONG - 16); 175 else if (addr == offsetof(struct per_struct_kernel, address)) 176 /* Address of the last PER trap */ 177 return child->thread.per_event.address; 178 else if (addr == offsetof(struct per_struct_kernel, access_id)) 179 /* Access id of the last PER trap */ 180 return (unsigned long) 181 child->thread.per_event.paid << (BITS_PER_LONG - 8); 182 return 0; 183 } 184 185 /* 186 * Read the word at offset addr from the user area of a process. The 187 * trouble here is that the information is littered over different 188 * locations. The process registers are found on the kernel stack, 189 * the floating point stuff and the trace settings are stored in 190 * the task structure. In addition the different structures in 191 * struct user contain pad bytes that should be read as zeroes. 192 * Lovely... 193 */ 194 static unsigned long __peek_user(struct task_struct *child, addr_t addr) 195 { 196 addr_t offset, tmp; 197 198 if (addr < offsetof(struct user, regs.acrs)) { 199 /* 200 * psw and gprs are stored on the stack 201 */ 202 tmp = *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr); 203 if (addr == offsetof(struct user, regs.psw.mask)) { 204 /* Return a clean psw mask. */ 205 tmp &= PSW_MASK_USER | PSW_MASK_RI; 206 tmp |= PSW_USER_BITS; 207 } 208 209 } else if (addr < offsetof(struct user, regs.orig_gpr2)) { 210 /* 211 * access registers are stored in the thread structure 212 */ 213 offset = addr - offsetof(struct user, regs.acrs); 214 /* 215 * Very special case: old & broken 64 bit gdb reading 216 * from acrs[15]. Result is a 64 bit value. Read the 217 * 32 bit acrs[15] value and shift it by 32. Sick... 218 */ 219 if (addr == offsetof(struct user, regs.acrs[15])) 220 tmp = ((unsigned long) child->thread.acrs[15]) << 32; 221 else 222 tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset); 223 224 } else if (addr == offsetof(struct user, regs.orig_gpr2)) { 225 /* 226 * orig_gpr2 is stored on the kernel stack 227 */ 228 tmp = (addr_t) task_pt_regs(child)->orig_gpr2; 229 230 } else if (addr < offsetof(struct user, regs.fp_regs)) { 231 /* 232 * prevent reads of padding hole between 233 * orig_gpr2 and fp_regs on s390. 234 */ 235 tmp = 0; 236 237 } else if (addr == offsetof(struct user, regs.fp_regs.fpc)) { 238 /* 239 * floating point control reg. is in the thread structure 240 */ 241 tmp = child->thread.fpu.fpc; 242 tmp <<= BITS_PER_LONG - 32; 243 244 } else if (addr < offsetof(struct user, regs.fp_regs) + sizeof(s390_fp_regs)) { 245 /* 246 * floating point regs. are either in child->thread.fpu 247 * or the child->thread.fpu.vxrs array 248 */ 249 offset = addr - offsetof(struct user, regs.fp_regs.fprs); 250 if (MACHINE_HAS_VX) 251 tmp = *(addr_t *) 252 ((addr_t) child->thread.fpu.vxrs + 2*offset); 253 else 254 tmp = *(addr_t *) 255 ((addr_t) child->thread.fpu.fprs + offset); 256 257 } else if (addr < offsetof(struct user, regs.per_info) + sizeof(per_struct)) { 258 /* 259 * Handle access to the per_info structure. 260 */ 261 addr -= offsetof(struct user, regs.per_info); 262 tmp = __peek_user_per(child, addr); 263 264 } else 265 tmp = 0; 266 267 return tmp; 268 } 269 270 static int 271 peek_user(struct task_struct *child, addr_t addr, addr_t data) 272 { 273 addr_t tmp, mask; 274 275 /* 276 * Stupid gdb peeks/pokes the access registers in 64 bit with 277 * an alignment of 4. Programmers from hell... 278 */ 279 mask = __ADDR_MASK; 280 if (addr >= offsetof(struct user, regs.acrs) && 281 addr < offsetof(struct user, regs.orig_gpr2)) 282 mask = 3; 283 if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK) 284 return -EIO; 285 286 tmp = __peek_user(child, addr); 287 return put_user(tmp, (addr_t __user *) data); 288 } 289 290 static inline void __poke_user_per(struct task_struct *child, 291 addr_t addr, addr_t data) 292 { 293 /* 294 * There are only three fields in the per_info struct that the 295 * debugger user can write to. 296 * 1) cr9: the debugger wants to set a new PER event mask 297 * 2) starting_addr: the debugger wants to set a new starting 298 * address to use with the PER event mask. 299 * 3) ending_addr: the debugger wants to set a new ending 300 * address to use with the PER event mask. 301 * The user specified PER event mask and the start and end 302 * addresses are used only if single stepping is not in effect. 303 * Writes to any other field in per_info are ignored. 304 */ 305 if (addr == offsetof(struct per_struct_kernel, cr9)) 306 /* PER event mask of the user specified per set. */ 307 child->thread.per_user.control = 308 data & (PER_EVENT_MASK | PER_CONTROL_MASK); 309 else if (addr == offsetof(struct per_struct_kernel, starting_addr)) 310 /* Starting address of the user specified per set. */ 311 child->thread.per_user.start = data; 312 else if (addr == offsetof(struct per_struct_kernel, ending_addr)) 313 /* Ending address of the user specified per set. */ 314 child->thread.per_user.end = data; 315 } 316 317 /* 318 * Write a word to the user area of a process at location addr. This 319 * operation does have an additional problem compared to peek_user. 320 * Stores to the program status word and on the floating point 321 * control register needs to get checked for validity. 322 */ 323 static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) 324 { 325 addr_t offset; 326 327 328 if (addr < offsetof(struct user, regs.acrs)) { 329 struct pt_regs *regs = task_pt_regs(child); 330 /* 331 * psw and gprs are stored on the stack 332 */ 333 if (addr == offsetof(struct user, regs.psw.mask)) { 334 unsigned long mask = PSW_MASK_USER; 335 336 mask |= is_ri_task(child) ? PSW_MASK_RI : 0; 337 if ((data ^ PSW_USER_BITS) & ~mask) 338 /* Invalid psw mask. */ 339 return -EINVAL; 340 if ((data & PSW_MASK_ASC) == PSW_ASC_HOME) 341 /* Invalid address-space-control bits */ 342 return -EINVAL; 343 if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)) 344 /* Invalid addressing mode bits */ 345 return -EINVAL; 346 } 347 348 if (test_pt_regs_flag(regs, PIF_SYSCALL) && 349 addr == offsetof(struct user, regs.gprs[2])) { 350 struct pt_regs *regs = task_pt_regs(child); 351 352 regs->int_code = 0x20000 | (data & 0xffff); 353 } 354 *(addr_t *)((addr_t) ®s->psw + addr) = data; 355 } else if (addr < offsetof(struct user, regs.orig_gpr2)) { 356 /* 357 * access registers are stored in the thread structure 358 */ 359 offset = addr - offsetof(struct user, regs.acrs); 360 /* 361 * Very special case: old & broken 64 bit gdb writing 362 * to acrs[15] with a 64 bit value. Ignore the lower 363 * half of the value and write the upper 32 bit to 364 * acrs[15]. Sick... 365 */ 366 if (addr == offsetof(struct user, regs.acrs[15])) 367 child->thread.acrs[15] = (unsigned int) (data >> 32); 368 else 369 *(addr_t *)((addr_t) &child->thread.acrs + offset) = data; 370 371 } else if (addr == offsetof(struct user, regs.orig_gpr2)) { 372 /* 373 * orig_gpr2 is stored on the kernel stack 374 */ 375 task_pt_regs(child)->orig_gpr2 = data; 376 377 } else if (addr < offsetof(struct user, regs.fp_regs)) { 378 /* 379 * prevent writes of padding hole between 380 * orig_gpr2 and fp_regs on s390. 381 */ 382 return 0; 383 384 } else if (addr == offsetof(struct user, regs.fp_regs.fpc)) { 385 /* 386 * floating point control reg. is in the thread structure 387 */ 388 save_fpu_regs(); 389 if ((unsigned int) data != 0 || 390 test_fp_ctl(data >> (BITS_PER_LONG - 32))) 391 return -EINVAL; 392 child->thread.fpu.fpc = data >> (BITS_PER_LONG - 32); 393 394 } else if (addr < offsetof(struct user, regs.fp_regs) + sizeof(s390_fp_regs)) { 395 /* 396 * floating point regs. are either in child->thread.fpu 397 * or the child->thread.fpu.vxrs array 398 */ 399 offset = addr - offsetof(struct user, regs.fp_regs.fprs); 400 if (MACHINE_HAS_VX) 401 *(addr_t *)((addr_t) 402 child->thread.fpu.vxrs + 2*offset) = data; 403 else 404 *(addr_t *)((addr_t) 405 child->thread.fpu.fprs + offset) = data; 406 407 } else if (addr < offsetof(struct user, regs.per_info) + sizeof(per_struct)) { 408 /* 409 * Handle access to the per_info structure. 410 */ 411 addr -= offsetof(struct user, regs.per_info); 412 __poke_user_per(child, addr, data); 413 414 } 415 416 return 0; 417 } 418 419 static int poke_user(struct task_struct *child, addr_t addr, addr_t data) 420 { 421 addr_t mask; 422 423 /* 424 * Stupid gdb peeks/pokes the access registers in 64 bit with 425 * an alignment of 4. Programmers from hell indeed... 426 */ 427 mask = __ADDR_MASK; 428 if (addr >= offsetof(struct user, regs.acrs) && 429 addr < offsetof(struct user, regs.orig_gpr2)) 430 mask = 3; 431 if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK) 432 return -EIO; 433 434 return __poke_user(child, addr, data); 435 } 436 437 long arch_ptrace(struct task_struct *child, long request, 438 unsigned long addr, unsigned long data) 439 { 440 ptrace_area parea; 441 int copied, ret; 442 443 switch (request) { 444 case PTRACE_PEEKUSR: 445 /* read the word at location addr in the USER area. */ 446 return peek_user(child, addr, data); 447 448 case PTRACE_POKEUSR: 449 /* write the word at location addr in the USER area */ 450 return poke_user(child, addr, data); 451 452 case PTRACE_PEEKUSR_AREA: 453 case PTRACE_POKEUSR_AREA: 454 if (copy_from_user(&parea, (void __force __user *) addr, 455 sizeof(parea))) 456 return -EFAULT; 457 addr = parea.kernel_addr; 458 data = parea.process_addr; 459 copied = 0; 460 while (copied < parea.len) { 461 if (request == PTRACE_PEEKUSR_AREA) 462 ret = peek_user(child, addr, data); 463 else { 464 addr_t utmp; 465 if (get_user(utmp, 466 (addr_t __force __user *) data)) 467 return -EFAULT; 468 ret = poke_user(child, addr, utmp); 469 } 470 if (ret) 471 return ret; 472 addr += sizeof(unsigned long); 473 data += sizeof(unsigned long); 474 copied += sizeof(unsigned long); 475 } 476 return 0; 477 case PTRACE_GET_LAST_BREAK: 478 return put_user(child->thread.last_break, (unsigned long __user *)data); 479 case PTRACE_ENABLE_TE: 480 if (!MACHINE_HAS_TE) 481 return -EIO; 482 child->thread.per_flags &= ~PER_FLAG_NO_TE; 483 return 0; 484 case PTRACE_DISABLE_TE: 485 if (!MACHINE_HAS_TE) 486 return -EIO; 487 child->thread.per_flags |= PER_FLAG_NO_TE; 488 child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND; 489 return 0; 490 case PTRACE_TE_ABORT_RAND: 491 if (!MACHINE_HAS_TE || (child->thread.per_flags & PER_FLAG_NO_TE)) 492 return -EIO; 493 switch (data) { 494 case 0UL: 495 child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND; 496 break; 497 case 1UL: 498 child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND; 499 child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND_TEND; 500 break; 501 case 2UL: 502 child->thread.per_flags |= PER_FLAG_TE_ABORT_RAND; 503 child->thread.per_flags &= ~PER_FLAG_TE_ABORT_RAND_TEND; 504 break; 505 default: 506 return -EINVAL; 507 } 508 return 0; 509 default: 510 return ptrace_request(child, request, addr, data); 511 } 512 } 513 514 #ifdef CONFIG_COMPAT 515 /* 516 * Now the fun part starts... a 31 bit program running in the 517 * 31 bit emulation tracing another program. PTRACE_PEEKTEXT, 518 * PTRACE_PEEKDATA, PTRACE_POKETEXT and PTRACE_POKEDATA are easy 519 * to handle, the difference to the 64 bit versions of the requests 520 * is that the access is done in multiples of 4 byte instead of 521 * 8 bytes (sizeof(unsigned long) on 31/64 bit). 522 * The ugly part are PTRACE_PEEKUSR, PTRACE_PEEKUSR_AREA, 523 * PTRACE_POKEUSR and PTRACE_POKEUSR_AREA. If the traced program 524 * is a 31 bit program too, the content of struct user can be 525 * emulated. A 31 bit program peeking into the struct user of 526 * a 64 bit program is a no-no. 527 */ 528 529 /* 530 * Same as peek_user_per but for a 31 bit program. 531 */ 532 static inline __u32 __peek_user_per_compat(struct task_struct *child, 533 addr_t addr) 534 { 535 if (addr == offsetof(struct compat_per_struct_kernel, cr9)) 536 /* Control bits of the active per set. */ 537 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ? 538 PER_EVENT_IFETCH : child->thread.per_user.control; 539 else if (addr == offsetof(struct compat_per_struct_kernel, cr10)) 540 /* Start address of the active per set. */ 541 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ? 542 0 : child->thread.per_user.start; 543 else if (addr == offsetof(struct compat_per_struct_kernel, cr11)) 544 /* End address of the active per set. */ 545 return test_thread_flag(TIF_SINGLE_STEP) ? 546 PSW32_ADDR_INSN : child->thread.per_user.end; 547 else if (addr == offsetof(struct compat_per_struct_kernel, bits)) 548 /* Single-step bit. */ 549 return (__u32) test_thread_flag(TIF_SINGLE_STEP) ? 550 0x80000000 : 0; 551 else if (addr == offsetof(struct compat_per_struct_kernel, starting_addr)) 552 /* Start address of the user specified per set. */ 553 return (__u32) child->thread.per_user.start; 554 else if (addr == offsetof(struct compat_per_struct_kernel, ending_addr)) 555 /* End address of the user specified per set. */ 556 return (__u32) child->thread.per_user.end; 557 else if (addr == offsetof(struct compat_per_struct_kernel, perc_atmid)) 558 /* PER code, ATMID and AI of the last PER trap */ 559 return (__u32) child->thread.per_event.cause << 16; 560 else if (addr == offsetof(struct compat_per_struct_kernel, address)) 561 /* Address of the last PER trap */ 562 return (__u32) child->thread.per_event.address; 563 else if (addr == offsetof(struct compat_per_struct_kernel, access_id)) 564 /* Access id of the last PER trap */ 565 return (__u32) child->thread.per_event.paid << 24; 566 return 0; 567 } 568 569 /* 570 * Same as peek_user but for a 31 bit program. 571 */ 572 static u32 __peek_user_compat(struct task_struct *child, addr_t addr) 573 { 574 addr_t offset; 575 __u32 tmp; 576 577 if (addr < offsetof(struct compat_user, regs.acrs)) { 578 struct pt_regs *regs = task_pt_regs(child); 579 /* 580 * psw and gprs are stored on the stack 581 */ 582 if (addr == offsetof(struct compat_user, regs.psw.mask)) { 583 /* Fake a 31 bit psw mask. */ 584 tmp = (__u32)(regs->psw.mask >> 32); 585 tmp &= PSW32_MASK_USER | PSW32_MASK_RI; 586 tmp |= PSW32_USER_BITS; 587 } else if (addr == offsetof(struct compat_user, regs.psw.addr)) { 588 /* Fake a 31 bit psw address. */ 589 tmp = (__u32) regs->psw.addr | 590 (__u32)(regs->psw.mask & PSW_MASK_BA); 591 } else { 592 /* gpr 0-15 */ 593 tmp = *(__u32 *)((addr_t) ®s->psw + addr*2 + 4); 594 } 595 } else if (addr < offsetof(struct compat_user, regs.orig_gpr2)) { 596 /* 597 * access registers are stored in the thread structure 598 */ 599 offset = addr - offsetof(struct compat_user, regs.acrs); 600 tmp = *(__u32*)((addr_t) &child->thread.acrs + offset); 601 602 } else if (addr == offsetof(struct compat_user, regs.orig_gpr2)) { 603 /* 604 * orig_gpr2 is stored on the kernel stack 605 */ 606 tmp = *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4); 607 608 } else if (addr < offsetof(struct compat_user, regs.fp_regs)) { 609 /* 610 * prevent reads of padding hole between 611 * orig_gpr2 and fp_regs on s390. 612 */ 613 tmp = 0; 614 615 } else if (addr == offsetof(struct compat_user, regs.fp_regs.fpc)) { 616 /* 617 * floating point control reg. is in the thread structure 618 */ 619 tmp = child->thread.fpu.fpc; 620 621 } else if (addr < offsetof(struct compat_user, regs.fp_regs) + sizeof(s390_fp_regs)) { 622 /* 623 * floating point regs. are either in child->thread.fpu 624 * or the child->thread.fpu.vxrs array 625 */ 626 offset = addr - offsetof(struct compat_user, regs.fp_regs.fprs); 627 if (MACHINE_HAS_VX) 628 tmp = *(__u32 *) 629 ((addr_t) child->thread.fpu.vxrs + 2*offset); 630 else 631 tmp = *(__u32 *) 632 ((addr_t) child->thread.fpu.fprs + offset); 633 634 } else if (addr < offsetof(struct compat_user, regs.per_info) + sizeof(struct compat_per_struct_kernel)) { 635 /* 636 * Handle access to the per_info structure. 637 */ 638 addr -= offsetof(struct compat_user, regs.per_info); 639 tmp = __peek_user_per_compat(child, addr); 640 641 } else 642 tmp = 0; 643 644 return tmp; 645 } 646 647 static int peek_user_compat(struct task_struct *child, 648 addr_t addr, addr_t data) 649 { 650 __u32 tmp; 651 652 if (!is_compat_task() || (addr & 3) || addr > sizeof(struct user) - 3) 653 return -EIO; 654 655 tmp = __peek_user_compat(child, addr); 656 return put_user(tmp, (__u32 __user *) data); 657 } 658 659 /* 660 * Same as poke_user_per but for a 31 bit program. 661 */ 662 static inline void __poke_user_per_compat(struct task_struct *child, 663 addr_t addr, __u32 data) 664 { 665 if (addr == offsetof(struct compat_per_struct_kernel, cr9)) 666 /* PER event mask of the user specified per set. */ 667 child->thread.per_user.control = 668 data & (PER_EVENT_MASK | PER_CONTROL_MASK); 669 else if (addr == offsetof(struct compat_per_struct_kernel, starting_addr)) 670 /* Starting address of the user specified per set. */ 671 child->thread.per_user.start = data; 672 else if (addr == offsetof(struct compat_per_struct_kernel, ending_addr)) 673 /* Ending address of the user specified per set. */ 674 child->thread.per_user.end = data; 675 } 676 677 /* 678 * Same as poke_user but for a 31 bit program. 679 */ 680 static int __poke_user_compat(struct task_struct *child, 681 addr_t addr, addr_t data) 682 { 683 __u32 tmp = (__u32) data; 684 addr_t offset; 685 686 if (addr < offsetof(struct compat_user, regs.acrs)) { 687 struct pt_regs *regs = task_pt_regs(child); 688 /* 689 * psw, gprs, acrs and orig_gpr2 are stored on the stack 690 */ 691 if (addr == offsetof(struct compat_user, regs.psw.mask)) { 692 __u32 mask = PSW32_MASK_USER; 693 694 mask |= is_ri_task(child) ? PSW32_MASK_RI : 0; 695 /* Build a 64 bit psw mask from 31 bit mask. */ 696 if ((tmp ^ PSW32_USER_BITS) & ~mask) 697 /* Invalid psw mask. */ 698 return -EINVAL; 699 if ((data & PSW32_MASK_ASC) == PSW32_ASC_HOME) 700 /* Invalid address-space-control bits */ 701 return -EINVAL; 702 regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | 703 (regs->psw.mask & PSW_MASK_BA) | 704 (__u64)(tmp & mask) << 32; 705 } else if (addr == offsetof(struct compat_user, regs.psw.addr)) { 706 /* Build a 64 bit psw address from 31 bit address. */ 707 regs->psw.addr = (__u64) tmp & PSW32_ADDR_INSN; 708 /* Transfer 31 bit amode bit to psw mask. */ 709 regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) | 710 (__u64)(tmp & PSW32_ADDR_AMODE); 711 } else { 712 if (test_pt_regs_flag(regs, PIF_SYSCALL) && 713 addr == offsetof(struct compat_user, regs.gprs[2])) { 714 struct pt_regs *regs = task_pt_regs(child); 715 716 regs->int_code = 0x20000 | (data & 0xffff); 717 } 718 /* gpr 0-15 */ 719 *(__u32*)((addr_t) ®s->psw + addr*2 + 4) = tmp; 720 } 721 } else if (addr < offsetof(struct compat_user, regs.orig_gpr2)) { 722 /* 723 * access registers are stored in the thread structure 724 */ 725 offset = addr - offsetof(struct compat_user, regs.acrs); 726 *(__u32*)((addr_t) &child->thread.acrs + offset) = tmp; 727 728 } else if (addr == offsetof(struct compat_user, regs.orig_gpr2)) { 729 /* 730 * orig_gpr2 is stored on the kernel stack 731 */ 732 *(__u32*)((addr_t) &task_pt_regs(child)->orig_gpr2 + 4) = tmp; 733 734 } else if (addr < offsetof(struct compat_user, regs.fp_regs)) { 735 /* 736 * prevent writess of padding hole between 737 * orig_gpr2 and fp_regs on s390. 738 */ 739 return 0; 740 741 } else if (addr == offsetof(struct compat_user, regs.fp_regs.fpc)) { 742 /* 743 * floating point control reg. is in the thread structure 744 */ 745 save_fpu_regs(); 746 if (test_fp_ctl(tmp)) 747 return -EINVAL; 748 child->thread.fpu.fpc = data; 749 750 } else if (addr < offsetof(struct compat_user, regs.fp_regs) + sizeof(s390_fp_regs)) { 751 /* 752 * floating point regs. are either in child->thread.fpu 753 * or the child->thread.fpu.vxrs array 754 */ 755 offset = addr - offsetof(struct compat_user, regs.fp_regs.fprs); 756 if (MACHINE_HAS_VX) 757 *(__u32 *)((addr_t) 758 child->thread.fpu.vxrs + 2*offset) = tmp; 759 else 760 *(__u32 *)((addr_t) 761 child->thread.fpu.fprs + offset) = tmp; 762 763 } else if (addr < offsetof(struct compat_user, regs.per_info) + sizeof(struct compat_per_struct_kernel)) { 764 /* 765 * Handle access to the per_info structure. 766 */ 767 addr -= offsetof(struct compat_user, regs.per_info); 768 __poke_user_per_compat(child, addr, data); 769 } 770 771 return 0; 772 } 773 774 static int poke_user_compat(struct task_struct *child, 775 addr_t addr, addr_t data) 776 { 777 if (!is_compat_task() || (addr & 3) || 778 addr > sizeof(struct compat_user) - 3) 779 return -EIO; 780 781 return __poke_user_compat(child, addr, data); 782 } 783 784 long compat_arch_ptrace(struct task_struct *child, compat_long_t request, 785 compat_ulong_t caddr, compat_ulong_t cdata) 786 { 787 unsigned long addr = caddr; 788 unsigned long data = cdata; 789 compat_ptrace_area parea; 790 int copied, ret; 791 792 switch (request) { 793 case PTRACE_PEEKUSR: 794 /* read the word at location addr in the USER area. */ 795 return peek_user_compat(child, addr, data); 796 797 case PTRACE_POKEUSR: 798 /* write the word at location addr in the USER area */ 799 return poke_user_compat(child, addr, data); 800 801 case PTRACE_PEEKUSR_AREA: 802 case PTRACE_POKEUSR_AREA: 803 if (copy_from_user(&parea, (void __force __user *) addr, 804 sizeof(parea))) 805 return -EFAULT; 806 addr = parea.kernel_addr; 807 data = parea.process_addr; 808 copied = 0; 809 while (copied < parea.len) { 810 if (request == PTRACE_PEEKUSR_AREA) 811 ret = peek_user_compat(child, addr, data); 812 else { 813 __u32 utmp; 814 if (get_user(utmp, 815 (__u32 __force __user *) data)) 816 return -EFAULT; 817 ret = poke_user_compat(child, addr, utmp); 818 } 819 if (ret) 820 return ret; 821 addr += sizeof(unsigned int); 822 data += sizeof(unsigned int); 823 copied += sizeof(unsigned int); 824 } 825 return 0; 826 case PTRACE_GET_LAST_BREAK: 827 return put_user(child->thread.last_break, (unsigned int __user *)data); 828 } 829 return compat_ptrace_request(child, request, addr, data); 830 } 831 #endif 832 833 /* 834 * user_regset definitions. 835 */ 836 837 static int s390_regs_get(struct task_struct *target, 838 const struct user_regset *regset, 839 struct membuf to) 840 { 841 unsigned pos; 842 if (target == current) 843 save_access_regs(target->thread.acrs); 844 845 for (pos = 0; pos < sizeof(s390_regs); pos += sizeof(long)) 846 membuf_store(&to, __peek_user(target, pos)); 847 return 0; 848 } 849 850 static int s390_regs_set(struct task_struct *target, 851 const struct user_regset *regset, 852 unsigned int pos, unsigned int count, 853 const void *kbuf, const void __user *ubuf) 854 { 855 int rc = 0; 856 857 if (target == current) 858 save_access_regs(target->thread.acrs); 859 860 if (kbuf) { 861 const unsigned long *k = kbuf; 862 while (count > 0 && !rc) { 863 rc = __poke_user(target, pos, *k++); 864 count -= sizeof(*k); 865 pos += sizeof(*k); 866 } 867 } else { 868 const unsigned long __user *u = ubuf; 869 while (count > 0 && !rc) { 870 unsigned long word; 871 rc = __get_user(word, u++); 872 if (rc) 873 break; 874 rc = __poke_user(target, pos, word); 875 count -= sizeof(*u); 876 pos += sizeof(*u); 877 } 878 } 879 880 if (rc == 0 && target == current) 881 restore_access_regs(target->thread.acrs); 882 883 return rc; 884 } 885 886 static int s390_fpregs_get(struct task_struct *target, 887 const struct user_regset *regset, 888 struct membuf to) 889 { 890 _s390_fp_regs fp_regs; 891 892 if (target == current) 893 save_fpu_regs(); 894 895 fp_regs.fpc = target->thread.fpu.fpc; 896 fpregs_store(&fp_regs, &target->thread.fpu); 897 898 return membuf_write(&to, &fp_regs, sizeof(fp_regs)); 899 } 900 901 static int s390_fpregs_set(struct task_struct *target, 902 const struct user_regset *regset, unsigned int pos, 903 unsigned int count, const void *kbuf, 904 const void __user *ubuf) 905 { 906 int rc = 0; 907 freg_t fprs[__NUM_FPRS]; 908 909 save_fpu_regs(); 910 if (MACHINE_HAS_VX) 911 convert_vx_to_fp(fprs, target->thread.fpu.vxrs); 912 else 913 memcpy(&fprs, target->thread.fpu.fprs, sizeof(fprs)); 914 915 /* If setting FPC, must validate it first. */ 916 if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) { 917 u32 ufpc[2] = { target->thread.fpu.fpc, 0 }; 918 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ufpc, 919 0, offsetof(s390_fp_regs, fprs)); 920 if (rc) 921 return rc; 922 if (ufpc[1] != 0 || test_fp_ctl(ufpc[0])) 923 return -EINVAL; 924 target->thread.fpu.fpc = ufpc[0]; 925 } 926 927 if (rc == 0 && count > 0) 928 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 929 fprs, offsetof(s390_fp_regs, fprs), -1); 930 if (rc) 931 return rc; 932 933 if (MACHINE_HAS_VX) 934 convert_fp_to_vx(target->thread.fpu.vxrs, fprs); 935 else 936 memcpy(target->thread.fpu.fprs, &fprs, sizeof(fprs)); 937 938 return rc; 939 } 940 941 static int s390_last_break_get(struct task_struct *target, 942 const struct user_regset *regset, 943 struct membuf to) 944 { 945 return membuf_store(&to, target->thread.last_break); 946 } 947 948 static int s390_last_break_set(struct task_struct *target, 949 const struct user_regset *regset, 950 unsigned int pos, unsigned int count, 951 const void *kbuf, const void __user *ubuf) 952 { 953 return 0; 954 } 955 956 static int s390_tdb_get(struct task_struct *target, 957 const struct user_regset *regset, 958 struct membuf to) 959 { 960 struct pt_regs *regs = task_pt_regs(target); 961 size_t size; 962 963 if (!(regs->int_code & 0x200)) 964 return -ENODATA; 965 size = sizeof(target->thread.trap_tdb.data); 966 return membuf_write(&to, target->thread.trap_tdb.data, size); 967 } 968 969 static int s390_tdb_set(struct task_struct *target, 970 const struct user_regset *regset, 971 unsigned int pos, unsigned int count, 972 const void *kbuf, const void __user *ubuf) 973 { 974 return 0; 975 } 976 977 static int s390_vxrs_low_get(struct task_struct *target, 978 const struct user_regset *regset, 979 struct membuf to) 980 { 981 __u64 vxrs[__NUM_VXRS_LOW]; 982 int i; 983 984 if (!MACHINE_HAS_VX) 985 return -ENODEV; 986 if (target == current) 987 save_fpu_regs(); 988 for (i = 0; i < __NUM_VXRS_LOW; i++) 989 vxrs[i] = target->thread.fpu.vxrs[i].low; 990 return membuf_write(&to, vxrs, sizeof(vxrs)); 991 } 992 993 static int s390_vxrs_low_set(struct task_struct *target, 994 const struct user_regset *regset, 995 unsigned int pos, unsigned int count, 996 const void *kbuf, const void __user *ubuf) 997 { 998 __u64 vxrs[__NUM_VXRS_LOW]; 999 int i, rc; 1000 1001 if (!MACHINE_HAS_VX) 1002 return -ENODEV; 1003 if (target == current) 1004 save_fpu_regs(); 1005 1006 for (i = 0; i < __NUM_VXRS_LOW; i++) 1007 vxrs[i] = target->thread.fpu.vxrs[i].low; 1008 1009 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1); 1010 if (rc == 0) 1011 for (i = 0; i < __NUM_VXRS_LOW; i++) 1012 target->thread.fpu.vxrs[i].low = vxrs[i]; 1013 1014 return rc; 1015 } 1016 1017 static int s390_vxrs_high_get(struct task_struct *target, 1018 const struct user_regset *regset, 1019 struct membuf to) 1020 { 1021 if (!MACHINE_HAS_VX) 1022 return -ENODEV; 1023 if (target == current) 1024 save_fpu_regs(); 1025 return membuf_write(&to, target->thread.fpu.vxrs + __NUM_VXRS_LOW, 1026 __NUM_VXRS_HIGH * sizeof(__vector128)); 1027 } 1028 1029 static int s390_vxrs_high_set(struct task_struct *target, 1030 const struct user_regset *regset, 1031 unsigned int pos, unsigned int count, 1032 const void *kbuf, const void __user *ubuf) 1033 { 1034 int rc; 1035 1036 if (!MACHINE_HAS_VX) 1037 return -ENODEV; 1038 if (target == current) 1039 save_fpu_regs(); 1040 1041 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 1042 target->thread.fpu.vxrs + __NUM_VXRS_LOW, 0, -1); 1043 return rc; 1044 } 1045 1046 static int s390_system_call_get(struct task_struct *target, 1047 const struct user_regset *regset, 1048 struct membuf to) 1049 { 1050 return membuf_store(&to, target->thread.system_call); 1051 } 1052 1053 static int s390_system_call_set(struct task_struct *target, 1054 const struct user_regset *regset, 1055 unsigned int pos, unsigned int count, 1056 const void *kbuf, const void __user *ubuf) 1057 { 1058 unsigned int *data = &target->thread.system_call; 1059 return user_regset_copyin(&pos, &count, &kbuf, &ubuf, 1060 data, 0, sizeof(unsigned int)); 1061 } 1062 1063 static int s390_gs_cb_get(struct task_struct *target, 1064 const struct user_regset *regset, 1065 struct membuf to) 1066 { 1067 struct gs_cb *data = target->thread.gs_cb; 1068 1069 if (!MACHINE_HAS_GS) 1070 return -ENODEV; 1071 if (!data) 1072 return -ENODATA; 1073 if (target == current) 1074 save_gs_cb(data); 1075 return membuf_write(&to, data, sizeof(struct gs_cb)); 1076 } 1077 1078 static int s390_gs_cb_set(struct task_struct *target, 1079 const struct user_regset *regset, 1080 unsigned int pos, unsigned int count, 1081 const void *kbuf, const void __user *ubuf) 1082 { 1083 struct gs_cb gs_cb = { }, *data = NULL; 1084 int rc; 1085 1086 if (!MACHINE_HAS_GS) 1087 return -ENODEV; 1088 if (!target->thread.gs_cb) { 1089 data = kzalloc(sizeof(*data), GFP_KERNEL); 1090 if (!data) 1091 return -ENOMEM; 1092 } 1093 if (!target->thread.gs_cb) 1094 gs_cb.gsd = 25; 1095 else if (target == current) 1096 save_gs_cb(&gs_cb); 1097 else 1098 gs_cb = *target->thread.gs_cb; 1099 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 1100 &gs_cb, 0, sizeof(gs_cb)); 1101 if (rc) { 1102 kfree(data); 1103 return -EFAULT; 1104 } 1105 preempt_disable(); 1106 if (!target->thread.gs_cb) 1107 target->thread.gs_cb = data; 1108 *target->thread.gs_cb = gs_cb; 1109 if (target == current) { 1110 __ctl_set_bit(2, 4); 1111 restore_gs_cb(target->thread.gs_cb); 1112 } 1113 preempt_enable(); 1114 return rc; 1115 } 1116 1117 static int s390_gs_bc_get(struct task_struct *target, 1118 const struct user_regset *regset, 1119 struct membuf to) 1120 { 1121 struct gs_cb *data = target->thread.gs_bc_cb; 1122 1123 if (!MACHINE_HAS_GS) 1124 return -ENODEV; 1125 if (!data) 1126 return -ENODATA; 1127 return membuf_write(&to, data, sizeof(struct gs_cb)); 1128 } 1129 1130 static int s390_gs_bc_set(struct task_struct *target, 1131 const struct user_regset *regset, 1132 unsigned int pos, unsigned int count, 1133 const void *kbuf, const void __user *ubuf) 1134 { 1135 struct gs_cb *data = target->thread.gs_bc_cb; 1136 1137 if (!MACHINE_HAS_GS) 1138 return -ENODEV; 1139 if (!data) { 1140 data = kzalloc(sizeof(*data), GFP_KERNEL); 1141 if (!data) 1142 return -ENOMEM; 1143 target->thread.gs_bc_cb = data; 1144 } 1145 return user_regset_copyin(&pos, &count, &kbuf, &ubuf, 1146 data, 0, sizeof(struct gs_cb)); 1147 } 1148 1149 static bool is_ri_cb_valid(struct runtime_instr_cb *cb) 1150 { 1151 return (cb->rca & 0x1f) == 0 && 1152 (cb->roa & 0xfff) == 0 && 1153 (cb->rla & 0xfff) == 0xfff && 1154 cb->s == 1 && 1155 cb->k == 1 && 1156 cb->h == 0 && 1157 cb->reserved1 == 0 && 1158 cb->ps == 1 && 1159 cb->qs == 0 && 1160 cb->pc == 1 && 1161 cb->qc == 0 && 1162 cb->reserved2 == 0 && 1163 cb->reserved3 == 0 && 1164 cb->reserved4 == 0 && 1165 cb->reserved5 == 0 && 1166 cb->reserved6 == 0 && 1167 cb->reserved7 == 0 && 1168 cb->reserved8 == 0 && 1169 cb->rla >= cb->roa && 1170 cb->rca >= cb->roa && 1171 cb->rca <= cb->rla+1 && 1172 cb->m < 3; 1173 } 1174 1175 static int s390_runtime_instr_get(struct task_struct *target, 1176 const struct user_regset *regset, 1177 struct membuf to) 1178 { 1179 struct runtime_instr_cb *data = target->thread.ri_cb; 1180 1181 if (!test_facility(64)) 1182 return -ENODEV; 1183 if (!data) 1184 return -ENODATA; 1185 1186 return membuf_write(&to, data, sizeof(struct runtime_instr_cb)); 1187 } 1188 1189 static int s390_runtime_instr_set(struct task_struct *target, 1190 const struct user_regset *regset, 1191 unsigned int pos, unsigned int count, 1192 const void *kbuf, const void __user *ubuf) 1193 { 1194 struct runtime_instr_cb ri_cb = { }, *data = NULL; 1195 int rc; 1196 1197 if (!test_facility(64)) 1198 return -ENODEV; 1199 1200 if (!target->thread.ri_cb) { 1201 data = kzalloc(sizeof(*data), GFP_KERNEL); 1202 if (!data) 1203 return -ENOMEM; 1204 } 1205 1206 if (target->thread.ri_cb) { 1207 if (target == current) 1208 store_runtime_instr_cb(&ri_cb); 1209 else 1210 ri_cb = *target->thread.ri_cb; 1211 } 1212 1213 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 1214 &ri_cb, 0, sizeof(struct runtime_instr_cb)); 1215 if (rc) { 1216 kfree(data); 1217 return -EFAULT; 1218 } 1219 1220 if (!is_ri_cb_valid(&ri_cb)) { 1221 kfree(data); 1222 return -EINVAL; 1223 } 1224 /* 1225 * Override access key in any case, since user space should 1226 * not be able to set it, nor should it care about it. 1227 */ 1228 ri_cb.key = PAGE_DEFAULT_KEY >> 4; 1229 preempt_disable(); 1230 if (!target->thread.ri_cb) 1231 target->thread.ri_cb = data; 1232 *target->thread.ri_cb = ri_cb; 1233 if (target == current) 1234 load_runtime_instr_cb(target->thread.ri_cb); 1235 preempt_enable(); 1236 1237 return 0; 1238 } 1239 1240 static const struct user_regset s390_regsets[] = { 1241 { 1242 .core_note_type = NT_PRSTATUS, 1243 .n = sizeof(s390_regs) / sizeof(long), 1244 .size = sizeof(long), 1245 .align = sizeof(long), 1246 .regset_get = s390_regs_get, 1247 .set = s390_regs_set, 1248 }, 1249 { 1250 .core_note_type = NT_PRFPREG, 1251 .n = sizeof(s390_fp_regs) / sizeof(long), 1252 .size = sizeof(long), 1253 .align = sizeof(long), 1254 .regset_get = s390_fpregs_get, 1255 .set = s390_fpregs_set, 1256 }, 1257 { 1258 .core_note_type = NT_S390_SYSTEM_CALL, 1259 .n = 1, 1260 .size = sizeof(unsigned int), 1261 .align = sizeof(unsigned int), 1262 .regset_get = s390_system_call_get, 1263 .set = s390_system_call_set, 1264 }, 1265 { 1266 .core_note_type = NT_S390_LAST_BREAK, 1267 .n = 1, 1268 .size = sizeof(long), 1269 .align = sizeof(long), 1270 .regset_get = s390_last_break_get, 1271 .set = s390_last_break_set, 1272 }, 1273 { 1274 .core_note_type = NT_S390_TDB, 1275 .n = 1, 1276 .size = 256, 1277 .align = 1, 1278 .regset_get = s390_tdb_get, 1279 .set = s390_tdb_set, 1280 }, 1281 { 1282 .core_note_type = NT_S390_VXRS_LOW, 1283 .n = __NUM_VXRS_LOW, 1284 .size = sizeof(__u64), 1285 .align = sizeof(__u64), 1286 .regset_get = s390_vxrs_low_get, 1287 .set = s390_vxrs_low_set, 1288 }, 1289 { 1290 .core_note_type = NT_S390_VXRS_HIGH, 1291 .n = __NUM_VXRS_HIGH, 1292 .size = sizeof(__vector128), 1293 .align = sizeof(__vector128), 1294 .regset_get = s390_vxrs_high_get, 1295 .set = s390_vxrs_high_set, 1296 }, 1297 { 1298 .core_note_type = NT_S390_GS_CB, 1299 .n = sizeof(struct gs_cb) / sizeof(__u64), 1300 .size = sizeof(__u64), 1301 .align = sizeof(__u64), 1302 .regset_get = s390_gs_cb_get, 1303 .set = s390_gs_cb_set, 1304 }, 1305 { 1306 .core_note_type = NT_S390_GS_BC, 1307 .n = sizeof(struct gs_cb) / sizeof(__u64), 1308 .size = sizeof(__u64), 1309 .align = sizeof(__u64), 1310 .regset_get = s390_gs_bc_get, 1311 .set = s390_gs_bc_set, 1312 }, 1313 { 1314 .core_note_type = NT_S390_RI_CB, 1315 .n = sizeof(struct runtime_instr_cb) / sizeof(__u64), 1316 .size = sizeof(__u64), 1317 .align = sizeof(__u64), 1318 .regset_get = s390_runtime_instr_get, 1319 .set = s390_runtime_instr_set, 1320 }, 1321 }; 1322 1323 static const struct user_regset_view user_s390_view = { 1324 .name = "s390x", 1325 .e_machine = EM_S390, 1326 .regsets = s390_regsets, 1327 .n = ARRAY_SIZE(s390_regsets) 1328 }; 1329 1330 #ifdef CONFIG_COMPAT 1331 static int s390_compat_regs_get(struct task_struct *target, 1332 const struct user_regset *regset, 1333 struct membuf to) 1334 { 1335 unsigned n; 1336 1337 if (target == current) 1338 save_access_regs(target->thread.acrs); 1339 1340 for (n = 0; n < sizeof(s390_compat_regs); n += sizeof(compat_ulong_t)) 1341 membuf_store(&to, __peek_user_compat(target, n)); 1342 return 0; 1343 } 1344 1345 static int s390_compat_regs_set(struct task_struct *target, 1346 const struct user_regset *regset, 1347 unsigned int pos, unsigned int count, 1348 const void *kbuf, const void __user *ubuf) 1349 { 1350 int rc = 0; 1351 1352 if (target == current) 1353 save_access_regs(target->thread.acrs); 1354 1355 if (kbuf) { 1356 const compat_ulong_t *k = kbuf; 1357 while (count > 0 && !rc) { 1358 rc = __poke_user_compat(target, pos, *k++); 1359 count -= sizeof(*k); 1360 pos += sizeof(*k); 1361 } 1362 } else { 1363 const compat_ulong_t __user *u = ubuf; 1364 while (count > 0 && !rc) { 1365 compat_ulong_t word; 1366 rc = __get_user(word, u++); 1367 if (rc) 1368 break; 1369 rc = __poke_user_compat(target, pos, word); 1370 count -= sizeof(*u); 1371 pos += sizeof(*u); 1372 } 1373 } 1374 1375 if (rc == 0 && target == current) 1376 restore_access_regs(target->thread.acrs); 1377 1378 return rc; 1379 } 1380 1381 static int s390_compat_regs_high_get(struct task_struct *target, 1382 const struct user_regset *regset, 1383 struct membuf to) 1384 { 1385 compat_ulong_t *gprs_high; 1386 int i; 1387 1388 gprs_high = (compat_ulong_t *)task_pt_regs(target)->gprs; 1389 for (i = 0; i < NUM_GPRS; i++, gprs_high += 2) 1390 membuf_store(&to, *gprs_high); 1391 return 0; 1392 } 1393 1394 static int s390_compat_regs_high_set(struct task_struct *target, 1395 const struct user_regset *regset, 1396 unsigned int pos, unsigned int count, 1397 const void *kbuf, const void __user *ubuf) 1398 { 1399 compat_ulong_t *gprs_high; 1400 int rc = 0; 1401 1402 gprs_high = (compat_ulong_t *) 1403 &task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)]; 1404 if (kbuf) { 1405 const compat_ulong_t *k = kbuf; 1406 while (count > 0) { 1407 *gprs_high = *k++; 1408 *gprs_high += 2; 1409 count -= sizeof(*k); 1410 } 1411 } else { 1412 const compat_ulong_t __user *u = ubuf; 1413 while (count > 0 && !rc) { 1414 unsigned long word; 1415 rc = __get_user(word, u++); 1416 if (rc) 1417 break; 1418 *gprs_high = word; 1419 *gprs_high += 2; 1420 count -= sizeof(*u); 1421 } 1422 } 1423 1424 return rc; 1425 } 1426 1427 static int s390_compat_last_break_get(struct task_struct *target, 1428 const struct user_regset *regset, 1429 struct membuf to) 1430 { 1431 compat_ulong_t last_break = target->thread.last_break; 1432 1433 return membuf_store(&to, (unsigned long)last_break); 1434 } 1435 1436 static int s390_compat_last_break_set(struct task_struct *target, 1437 const struct user_regset *regset, 1438 unsigned int pos, unsigned int count, 1439 const void *kbuf, const void __user *ubuf) 1440 { 1441 return 0; 1442 } 1443 1444 static const struct user_regset s390_compat_regsets[] = { 1445 { 1446 .core_note_type = NT_PRSTATUS, 1447 .n = sizeof(s390_compat_regs) / sizeof(compat_long_t), 1448 .size = sizeof(compat_long_t), 1449 .align = sizeof(compat_long_t), 1450 .regset_get = s390_compat_regs_get, 1451 .set = s390_compat_regs_set, 1452 }, 1453 { 1454 .core_note_type = NT_PRFPREG, 1455 .n = sizeof(s390_fp_regs) / sizeof(compat_long_t), 1456 .size = sizeof(compat_long_t), 1457 .align = sizeof(compat_long_t), 1458 .regset_get = s390_fpregs_get, 1459 .set = s390_fpregs_set, 1460 }, 1461 { 1462 .core_note_type = NT_S390_SYSTEM_CALL, 1463 .n = 1, 1464 .size = sizeof(compat_uint_t), 1465 .align = sizeof(compat_uint_t), 1466 .regset_get = s390_system_call_get, 1467 .set = s390_system_call_set, 1468 }, 1469 { 1470 .core_note_type = NT_S390_LAST_BREAK, 1471 .n = 1, 1472 .size = sizeof(long), 1473 .align = sizeof(long), 1474 .regset_get = s390_compat_last_break_get, 1475 .set = s390_compat_last_break_set, 1476 }, 1477 { 1478 .core_note_type = NT_S390_TDB, 1479 .n = 1, 1480 .size = 256, 1481 .align = 1, 1482 .regset_get = s390_tdb_get, 1483 .set = s390_tdb_set, 1484 }, 1485 { 1486 .core_note_type = NT_S390_VXRS_LOW, 1487 .n = __NUM_VXRS_LOW, 1488 .size = sizeof(__u64), 1489 .align = sizeof(__u64), 1490 .regset_get = s390_vxrs_low_get, 1491 .set = s390_vxrs_low_set, 1492 }, 1493 { 1494 .core_note_type = NT_S390_VXRS_HIGH, 1495 .n = __NUM_VXRS_HIGH, 1496 .size = sizeof(__vector128), 1497 .align = sizeof(__vector128), 1498 .regset_get = s390_vxrs_high_get, 1499 .set = s390_vxrs_high_set, 1500 }, 1501 { 1502 .core_note_type = NT_S390_HIGH_GPRS, 1503 .n = sizeof(s390_compat_regs_high) / sizeof(compat_long_t), 1504 .size = sizeof(compat_long_t), 1505 .align = sizeof(compat_long_t), 1506 .regset_get = s390_compat_regs_high_get, 1507 .set = s390_compat_regs_high_set, 1508 }, 1509 { 1510 .core_note_type = NT_S390_GS_CB, 1511 .n = sizeof(struct gs_cb) / sizeof(__u64), 1512 .size = sizeof(__u64), 1513 .align = sizeof(__u64), 1514 .regset_get = s390_gs_cb_get, 1515 .set = s390_gs_cb_set, 1516 }, 1517 { 1518 .core_note_type = NT_S390_GS_BC, 1519 .n = sizeof(struct gs_cb) / sizeof(__u64), 1520 .size = sizeof(__u64), 1521 .align = sizeof(__u64), 1522 .regset_get = s390_gs_bc_get, 1523 .set = s390_gs_bc_set, 1524 }, 1525 { 1526 .core_note_type = NT_S390_RI_CB, 1527 .n = sizeof(struct runtime_instr_cb) / sizeof(__u64), 1528 .size = sizeof(__u64), 1529 .align = sizeof(__u64), 1530 .regset_get = s390_runtime_instr_get, 1531 .set = s390_runtime_instr_set, 1532 }, 1533 }; 1534 1535 static const struct user_regset_view user_s390_compat_view = { 1536 .name = "s390", 1537 .e_machine = EM_S390, 1538 .regsets = s390_compat_regsets, 1539 .n = ARRAY_SIZE(s390_compat_regsets) 1540 }; 1541 #endif 1542 1543 const struct user_regset_view *task_user_regset_view(struct task_struct *task) 1544 { 1545 #ifdef CONFIG_COMPAT 1546 if (test_tsk_thread_flag(task, TIF_31BIT)) 1547 return &user_s390_compat_view; 1548 #endif 1549 return &user_s390_view; 1550 } 1551 1552 static const char *gpr_names[NUM_GPRS] = { 1553 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 1554 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1555 }; 1556 1557 unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset) 1558 { 1559 if (offset >= NUM_GPRS) 1560 return 0; 1561 return regs->gprs[offset]; 1562 } 1563 1564 int regs_query_register_offset(const char *name) 1565 { 1566 unsigned long offset; 1567 1568 if (!name || *name != 'r') 1569 return -EINVAL; 1570 if (kstrtoul(name + 1, 10, &offset)) 1571 return -EINVAL; 1572 if (offset >= NUM_GPRS) 1573 return -EINVAL; 1574 return offset; 1575 } 1576 1577 const char *regs_query_register_name(unsigned int offset) 1578 { 1579 if (offset >= NUM_GPRS) 1580 return NULL; 1581 return gpr_names[offset]; 1582 } 1583 1584 static int regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr) 1585 { 1586 unsigned long ksp = kernel_stack_pointer(regs); 1587 1588 return (addr & ~(THREAD_SIZE - 1)) == (ksp & ~(THREAD_SIZE - 1)); 1589 } 1590 1591 /** 1592 * regs_get_kernel_stack_nth() - get Nth entry of the stack 1593 * @regs:pt_regs which contains kernel stack pointer. 1594 * @n:stack entry number. 1595 * 1596 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which 1597 * is specifined by @regs. If the @n th entry is NOT in the kernel stack, 1598 * this returns 0. 1599 */ 1600 unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n) 1601 { 1602 unsigned long addr; 1603 1604 addr = kernel_stack_pointer(regs) + n * sizeof(long); 1605 if (!regs_within_kernel_stack(regs, addr)) 1606 return 0; 1607 return *(unsigned long *)addr; 1608 } 1609