diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-10-30 10:16:50 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-10-30 10:16:43 -0400 |
commit | b50511e41aa51a89b4176784a670582424bc7db6 (patch) | |
tree | 0ad1553c7f2431878310e590187ee59ccb4d8cab /arch/s390/kernel/ptrace.c | |
parent | b6ef5bb3d93efb95ba855a628740375c2280a59e (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.c | 36 |
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, | |||
285 | static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | 286 | static 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) ®s->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) ®s->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 | /* |