Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ia64] ptrace_[sg]etregs(): use access_elf_reg() instead of access_uarea()

In case of positions passed by ptrace_[sg]etregs() to access_uarea()
the latter sets the stack unwind up, walks all the way up the stack
and proceeds to pass the resulting info to access_elf_reg(). The thing
is, we'd *already* obtained that info, so we can bloody well call
access_elf_reg() directly.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 77f9c902 3b2d387c

+23 -20
+23 -20
arch/ia64/kernel/ptrace.c
··· 817 817 } 818 818 819 819 static int 820 - access_uarea (struct task_struct *child, unsigned long addr, 821 - unsigned long *data, int write_access); 820 + access_elf_reg(struct task_struct *target, struct unw_frame_info *info, 821 + unsigned long addr, unsigned long *data, int write_access); 822 822 823 823 static long 824 824 ptrace_getregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) ··· 847 847 return -EIO; 848 848 } 849 849 850 - if (access_uarea(child, PT_CR_IPSR, &psr, 0) < 0 851 - || access_uarea(child, PT_AR_EC, &ec, 0) < 0 852 - || access_uarea(child, PT_AR_LC, &lc, 0) < 0 853 - || access_uarea(child, PT_AR_RNAT, &rnat, 0) < 0 854 - || access_uarea(child, PT_AR_BSP, &bsp, 0) < 0 855 - || access_uarea(child, PT_CFM, &cfm, 0) 856 - || access_uarea(child, PT_NAT_BITS, &nat_bits, 0)) 850 + if (access_elf_reg(child, &info, ELF_CR_IPSR_OFFSET, &psr, 0) < 0 || 851 + access_elf_reg(child, &info, ELF_AR_EC_OFFSET, &ec, 0) < 0 || 852 + access_elf_reg(child, &info, ELF_AR_LC_OFFSET, &lc, 0) < 0 || 853 + access_elf_reg(child, &info, ELF_AR_RNAT_OFFSET, &rnat, 0) < 0 || 854 + access_elf_reg(child, &info, ELF_AR_BSP_OFFSET, &bsp, 0) < 0 || 855 + access_elf_reg(child, &info, ELF_CFM_OFFSET, &cfm, 0) < 0 || 856 + access_elf_reg(child, &info, ELF_NAT_OFFSET, &nat_bits, 0) < 0) 857 857 return -EIO; 858 858 859 859 /* control regs */ ··· 972 972 struct switch_stack *sw; 973 973 struct ia64_fpreg fpval; 974 974 struct pt_regs *pt; 975 - long ret, retval = 0; 975 + long retval = 0; 976 976 int i; 977 977 978 978 memset(&fpval, 0, sizeof(fpval)); ··· 1097 1097 1098 1098 retval |= __get_user(nat_bits, &ppr->nat); 1099 1099 1100 - retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); 1101 - retval |= access_uarea(child, PT_AR_RSC, &rsc, 1); 1102 - retval |= access_uarea(child, PT_AR_EC, &ec, 1); 1103 - retval |= access_uarea(child, PT_AR_LC, &lc, 1); 1104 - retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); 1105 - retval |= access_uarea(child, PT_AR_BSP, &bsp, 1); 1106 - retval |= access_uarea(child, PT_CFM, &cfm, 1); 1107 - retval |= access_uarea(child, PT_NAT_BITS, &nat_bits, 1); 1100 + retval |= access_elf_reg(child, &info, ELF_CR_IPSR_OFFSET, &psr, 1); 1101 + retval |= access_elf_reg(child, &info, ELF_AR_RSC_OFFSET, &rsc, 1); 1102 + retval |= access_elf_reg(child, &info, ELF_AR_EC_OFFSET, &ec, 1); 1103 + retval |= access_elf_reg(child, &info, ELF_AR_LC_OFFSET, &lc, 1); 1104 + retval |= access_elf_reg(child, &info, ELF_AR_RNAT_OFFSET, &rnat, 1); 1105 + retval |= access_elf_reg(child, &info, ELF_AR_BSP_OFFSET, &bsp, 1); 1106 + retval |= access_elf_reg(child, &info, ELF_CFM_OFFSET, &cfm, 1); 1107 + retval |= access_elf_reg(child, &info, ELF_NAT_OFFSET, &nat_bits, 1); 1108 1108 1109 - ret = retval ? -EIO : 0; 1110 - return ret; 1109 + return retval ? -EIO : 0; 1111 1110 } 1112 1111 1113 1112 void ··· 1148 1149 { 1149 1150 user_disable_single_step(child); 1150 1151 } 1152 + 1153 + static int 1154 + access_uarea (struct task_struct *child, unsigned long addr, 1155 + unsigned long *data, int write_access); 1151 1156 1152 1157 long 1153 1158 arch_ptrace (struct task_struct *child, long request,