diff options
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/kernel/ptrace.c | 90 |
1 files changed, 31 insertions, 59 deletions
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index f10c8b40dd3f..7e0d7dcac1a9 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -1491,88 +1491,60 @@ user_disable_single_step (struct task_struct *child) | |||
1491 | void | 1491 | void |
1492 | ptrace_disable (struct task_struct *child) | 1492 | ptrace_disable (struct task_struct *child) |
1493 | { | 1493 | { |
1494 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); | 1494 | user_disable_single_step(child); |
1495 | |||
1496 | /* make sure the single step/taken-branch trap bits are not set: */ | ||
1497 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1498 | child_psr->ss = 0; | ||
1499 | child_psr->tb = 0; | ||
1500 | } | 1495 | } |
1501 | 1496 | ||
1502 | long | 1497 | long |
1503 | arch_ptrace (struct task_struct *child, long request, long addr, long data) | 1498 | arch_ptrace (struct task_struct *child, long request, long addr, long data) |
1504 | { | 1499 | { |
1505 | struct pt_regs *pt; | ||
1506 | struct switch_stack *sw; | ||
1507 | long ret; | ||
1508 | |||
1509 | pt = task_pt_regs(child); | ||
1510 | sw = (struct switch_stack *) (child->thread.ksp + 16); | ||
1511 | |||
1512 | switch (request) { | 1500 | switch (request) { |
1513 | case PTRACE_PEEKTEXT: | 1501 | case PTRACE_PEEKTEXT: |
1514 | case PTRACE_PEEKDATA: | 1502 | case PTRACE_PEEKDATA: |
1515 | /* read word at location addr */ | 1503 | /* read word at location addr */ |
1516 | if (access_process_vm(child, addr, &data, sizeof(data), 0) | 1504 | if (access_process_vm(child, addr, &data, sizeof(data), 0) |
1517 | != sizeof(data)) { | 1505 | != sizeof(data)) |
1518 | ret = -EIO; | 1506 | return -EIO; |
1519 | goto out_tsk; | 1507 | /* ensure return value is not mistaken for error code */ |
1520 | } | ||
1521 | ret = data; | ||
1522 | /* ensure "ret" is not mistaken as an error code */ | ||
1523 | force_successful_syscall_return(); | 1508 | force_successful_syscall_return(); |
1524 | goto out_tsk; | 1509 | return data; |
1525 | 1510 | ||
1526 | /* PTRACE_POKETEXT and PTRACE_POKEDATA is handled | 1511 | /* PTRACE_POKETEXT and PTRACE_POKEDATA is handled |
1527 | * by the generic ptrace_request(). | 1512 | * by the generic ptrace_request(). |
1528 | */ | 1513 | */ |
1529 | 1514 | ||
1530 | case PTRACE_PEEKUSR: | 1515 | case PTRACE_PEEKUSR: |
1531 | /* read the word at addr in the USER area */ | 1516 | /* read the word at addr in the USER area */ |
1532 | if (access_uarea(child, addr, &data, 0) < 0) { | 1517 | if (access_uarea(child, addr, &data, 0) < 0) |
1533 | ret = -EIO; | 1518 | return -EIO; |
1534 | goto out_tsk; | 1519 | /* ensure return value is not mistaken for error code */ |
1535 | } | ||
1536 | ret = data; | ||
1537 | /* ensure "ret" is not mistaken as an error code */ | ||
1538 | force_successful_syscall_return(); | 1520 | force_successful_syscall_return(); |
1539 | goto out_tsk; | 1521 | return data; |
1540 | 1522 | ||
1541 | case PTRACE_POKEUSR: | 1523 | case PTRACE_POKEUSR: |
1542 | /* write the word at addr in the USER area */ | 1524 | /* write the word at addr in the USER area */ |
1543 | if (access_uarea(child, addr, &data, 1) < 0) { | 1525 | if (access_uarea(child, addr, &data, 1) < 0) |
1544 | ret = -EIO; | 1526 | return -EIO; |
1545 | goto out_tsk; | 1527 | return 0; |
1546 | } | ||
1547 | ret = 0; | ||
1548 | goto out_tsk; | ||
1549 | 1528 | ||
1550 | case PTRACE_OLD_GETSIGINFO: | 1529 | case PTRACE_OLD_GETSIGINFO: |
1551 | /* for backwards-compatibility */ | 1530 | /* for backwards-compatibility */ |
1552 | ret = ptrace_request(child, PTRACE_GETSIGINFO, addr, data); | 1531 | return ptrace_request(child, PTRACE_GETSIGINFO, addr, data); |
1553 | goto out_tsk; | ||
1554 | 1532 | ||
1555 | case PTRACE_OLD_SETSIGINFO: | 1533 | case PTRACE_OLD_SETSIGINFO: |
1556 | /* for backwards-compatibility */ | 1534 | /* for backwards-compatibility */ |
1557 | ret = ptrace_request(child, PTRACE_SETSIGINFO, addr, data); | 1535 | return ptrace_request(child, PTRACE_SETSIGINFO, addr, data); |
1558 | goto out_tsk; | 1536 | |
1559 | 1537 | case PTRACE_GETREGS: | |
1560 | case PTRACE_GETREGS: | 1538 | return ptrace_getregs(child, |
1561 | ret = ptrace_getregs(child, | 1539 | (struct pt_all_user_regs __user *) data); |
1562 | (struct pt_all_user_regs __user *) data); | 1540 | |
1563 | goto out_tsk; | 1541 | case PTRACE_SETREGS: |
1564 | 1542 | return ptrace_setregs(child, | |
1565 | case PTRACE_SETREGS: | 1543 | (struct pt_all_user_regs __user *) data); |
1566 | ret = ptrace_setregs(child, | 1544 | |
1567 | (struct pt_all_user_regs __user *) data); | 1545 | default: |
1568 | goto out_tsk; | 1546 | return ptrace_request(child, request, addr, data); |
1569 | |||
1570 | default: | ||
1571 | ret = ptrace_request(child, request, addr, data); | ||
1572 | goto out_tsk; | ||
1573 | } | 1547 | } |
1574 | out_tsk: | ||
1575 | return ret; | ||
1576 | } | 1548 | } |
1577 | 1549 | ||
1578 | 1550 | ||