aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/ptrace.c
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2011-10-30 10:16:50 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2011-10-30 10:16:43 -0400
commitb50511e41aa51a89b4176784a670582424bc7db6 (patch)
tree0ad1553c7f2431878310e590187ee59ccb4d8cab /arch/s390/kernel/ptrace.c
parentb6ef5bb3d93efb95ba855a628740375c2280a59e (diff)
[S390] cleanup psw related bits and pieces
Split out addressing mode bits from PSW_BASE_BITS, rename PSW_BASE_BITS to PSW_MASK_BASE, get rid of psw_user32_bits, remove unused function enabled_wait(), introduce PSW_MASK_USER, and drop PSW_MASK_MERGE macros. Change psw_kernel_bits / psw_user_bits to contain only the bits that are always set in the respective mode. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/ptrace.c')
-rw-r--r--arch/s390/kernel/ptrace.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
index 3519c99ae0c0..41e20763886e 100644
--- a/arch/s390/kernel/ptrace.c
+++ b/arch/s390/kernel/ptrace.c
@@ -169,8 +169,9 @@ static unsigned long __peek_user(struct task_struct *child, addr_t addr)
169 */ 169 */
170 tmp = *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr); 170 tmp = *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr);
171 if (addr == (addr_t) &dummy->regs.psw.mask) 171 if (addr == (addr_t) &dummy->regs.psw.mask)
172 /* Remove per bit from user psw. */ 172 /* Return a clean psw mask. */
173 tmp &= ~PSW_MASK_PER; 173 tmp = psw_user_bits | (tmp & PSW_MASK_USER) |
174 PSW_MASK_EA | PSW_MASK_BA;
174 175
175 } else if (addr < (addr_t) &dummy->regs.orig_gpr2) { 176 } else if (addr < (addr_t) &dummy->regs.orig_gpr2) {
176 /* 177 /*
@@ -285,17 +286,18 @@ static inline void __poke_user_per(struct task_struct *child,
285static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) 286static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
286{ 287{
287 struct user *dummy = NULL; 288 struct user *dummy = NULL;
288 addr_t offset; 289 addr_t offset, tmp;
289 290
290 if (addr < (addr_t) &dummy->regs.acrs) { 291 if (addr < (addr_t) &dummy->regs.acrs) {
291 /* 292 /*
292 * psw and gprs are stored on the stack 293 * psw and gprs are stored on the stack
293 */ 294 */
295 tmp = (data & ~PSW_MASK_USER) ^ psw_user_bits;
294 if (addr == (addr_t) &dummy->regs.psw.mask && 296 if (addr == (addr_t) &dummy->regs.psw.mask &&
295#ifdef CONFIG_COMPAT 297#ifdef CONFIG_COMPAT
296 data != PSW_MASK_MERGE(psw_user32_bits, data) && 298 tmp != PSW_MASK_BA &&
297#endif 299#endif
298 data != PSW_MASK_MERGE(psw_user_bits, data)) 300 tmp != (PSW_MASK_EA | PSW_MASK_BA))
299 /* Invalid psw mask. */ 301 /* Invalid psw mask. */
300 return -EINVAL; 302 return -EINVAL;
301#ifndef CONFIG_64BIT 303#ifndef CONFIG_64BIT
@@ -505,21 +507,20 @@ static u32 __peek_user_compat(struct task_struct *child, addr_t addr)
505 __u32 tmp; 507 __u32 tmp;
506 508
507 if (addr < (addr_t) &dummy32->regs.acrs) { 509 if (addr < (addr_t) &dummy32->regs.acrs) {
510 struct pt_regs *regs = task_pt_regs(child);
508 /* 511 /*
509 * psw and gprs are stored on the stack 512 * psw and gprs are stored on the stack
510 */ 513 */
511 if (addr == (addr_t) &dummy32->regs.psw.mask) { 514 if (addr == (addr_t) &dummy32->regs.psw.mask) {
512 /* Fake a 31 bit psw mask. */ 515 /* Fake a 31 bit psw mask. */
513 tmp = (__u32)(task_pt_regs(child)->psw.mask >> 32); 516 tmp = (__u32)(regs->psw.mask >> 32);
514 tmp = PSW32_MASK_MERGE(psw32_user_bits, tmp); 517 tmp = psw32_user_bits | (tmp & PSW32_MASK_USER);
515 } else if (addr == (addr_t) &dummy32->regs.psw.addr) { 518 } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
516 /* Fake a 31 bit psw address. */ 519 /* Fake a 31 bit psw address. */
517 tmp = (__u32) task_pt_regs(child)->psw.addr | 520 tmp = (__u32) regs->psw.addr | PSW32_ADDR_AMODE;
518 PSW32_ADDR_AMODE31;
519 } else { 521 } else {
520 /* gpr 0-15 */ 522 /* gpr 0-15 */
521 tmp = *(__u32 *)((addr_t) &task_pt_regs(child)->psw + 523 tmp = *(__u32 *)((addr_t) &regs->psw + addr*2 + 4);
522 addr*2 + 4);
523 } 524 }
524 } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) { 525 } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
525 /* 526 /*
@@ -604,20 +605,20 @@ static int __poke_user_compat(struct task_struct *child,
604 addr_t offset; 605 addr_t offset;
605 606
606 if (addr < (addr_t) &dummy32->regs.acrs) { 607 if (addr < (addr_t) &dummy32->regs.acrs) {
608 struct pt_regs *regs = task_pt_regs(child);
607 /* 609 /*
608 * psw, gprs, acrs and orig_gpr2 are stored on the stack 610 * psw, gprs, acrs and orig_gpr2 are stored on the stack
609 */ 611 */
610 if (addr == (addr_t) &dummy32->regs.psw.mask) { 612 if (addr == (addr_t) &dummy32->regs.psw.mask) {
611 /* Build a 64 bit psw mask from 31 bit mask. */ 613 /* Build a 64 bit psw mask from 31 bit mask. */
612 if (tmp != PSW32_MASK_MERGE(psw32_user_bits, tmp)) 614 if ((tmp & ~PSW32_MASK_USER) != psw32_user_bits)
613 /* Invalid psw mask. */ 615 /* Invalid psw mask. */
614 return -EINVAL; 616 return -EINVAL;
615 task_pt_regs(child)->psw.mask = 617 regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
616 PSW_MASK_MERGE(psw_user32_bits, (__u64) tmp << 32); 618 (__u64)(tmp & PSW32_MASK_USER) << 32;
617 } else if (addr == (addr_t) &dummy32->regs.psw.addr) { 619 } else if (addr == (addr_t) &dummy32->regs.psw.addr) {
618 /* Build a 64 bit psw address from 31 bit address. */ 620 /* Build a 64 bit psw address from 31 bit address. */
619 task_pt_regs(child)->psw.addr = 621 regs->psw.addr = (__u64) tmp & PSW32_ADDR_INSN;
620 (__u64) tmp & PSW32_ADDR_INSN;
621 /* 622 /*
622 * The debugger changed the instruction address, 623 * The debugger changed the instruction address,
623 * reset system call restart, see signal.c:do_signal 624 * reset system call restart, see signal.c:do_signal
@@ -625,8 +626,7 @@ static int __poke_user_compat(struct task_struct *child,
625 task_thread_info(child)->system_call = 0; 626 task_thread_info(child)->system_call = 0;
626 } else { 627 } else {
627 /* gpr 0-15 */ 628 /* gpr 0-15 */
628 *(__u32*)((addr_t) &task_pt_regs(child)->psw 629 *(__u32*)((addr_t) &regs->psw + addr*2 + 4) = tmp;
629 + addr*2 + 4) = tmp;
630 } 630 }
631 } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) { 631 } else if (addr < (addr_t) (&dummy32->regs.orig_gpr2)) {
632 /* 632 /*