diff options
author | Matthew Chapman <matthewc@hp.com> | 2005-06-21 19:19:20 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-06-21 19:19:20 -0400 |
commit | 4ea78729b8dbfc400fe165a57b90a394a7275a54 (patch) | |
tree | cc8d7def737ca5a4189481466d1e4164eef98313 /arch/ia64/kernel/ptrace.c | |
parent | 7b404b3459db1326bbdc7085edb1f58b98da5826 (diff) |
[IA64] ptrace and restore_sigcontext() allow ar.rsc.pl==0
This patch fixes handling of accesses to ar.rsc via ptrace & restore_sigcontext
[With Thanks to Chris Wright for noticing the restore_sigcontext path]
Signed-off-by: Matthew Chapman <matthewc@hp.com>
Acked-by: David Mosberger <davidm@hpl.hp.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/ptrace.c')
-rw-r--r-- | arch/ia64/kernel/ptrace.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 575a8f657b31..6d57aebad485 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -945,6 +945,13 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
945 | *data = (pt->cr_ipsr & IPSR_MASK); | 945 | *data = (pt->cr_ipsr & IPSR_MASK); |
946 | return 0; | 946 | return 0; |
947 | 947 | ||
948 | case PT_AR_RSC: | ||
949 | if (write_access) | ||
950 | pt->ar_rsc = *data | (3 << 2); /* force PL3 */ | ||
951 | else | ||
952 | *data = pt->ar_rsc; | ||
953 | return 0; | ||
954 | |||
948 | case PT_AR_RNAT: | 955 | case PT_AR_RNAT: |
949 | urbs_end = ia64_get_user_rbs_end(child, pt, NULL); | 956 | urbs_end = ia64_get_user_rbs_end(child, pt, NULL); |
950 | rnat_addr = (long) ia64_rse_rnat_addr((long *) | 957 | rnat_addr = (long) ia64_rse_rnat_addr((long *) |
@@ -996,9 +1003,6 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
996 | case PT_AR_BSPSTORE: | 1003 | case PT_AR_BSPSTORE: |
997 | ptr = pt_reg_addr(pt, ar_bspstore); | 1004 | ptr = pt_reg_addr(pt, ar_bspstore); |
998 | break; | 1005 | break; |
999 | case PT_AR_RSC: | ||
1000 | ptr = pt_reg_addr(pt, ar_rsc); | ||
1001 | break; | ||
1002 | case PT_AR_UNAT: | 1006 | case PT_AR_UNAT: |
1003 | ptr = pt_reg_addr(pt, ar_unat); | 1007 | ptr = pt_reg_addr(pt, ar_unat); |
1004 | break; | 1008 | break; |
@@ -1234,7 +1238,7 @@ ptrace_getregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) | |||
1234 | static long | 1238 | static long |
1235 | ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) | 1239 | ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) |
1236 | { | 1240 | { |
1237 | unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; | 1241 | unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; |
1238 | struct unw_frame_info info; | 1242 | struct unw_frame_info info; |
1239 | struct switch_stack *sw; | 1243 | struct switch_stack *sw; |
1240 | struct ia64_fpreg fpval; | 1244 | struct ia64_fpreg fpval; |
@@ -1267,7 +1271,7 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) | |||
1267 | /* app regs */ | 1271 | /* app regs */ |
1268 | 1272 | ||
1269 | retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); | 1273 | retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); |
1270 | retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); | 1274 | retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]); |
1271 | retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); | 1275 | retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); |
1272 | retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); | 1276 | retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); |
1273 | retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); | 1277 | retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); |
@@ -1365,6 +1369,7 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) | |||
1365 | retval |= __get_user(nat_bits, &ppr->nat); | 1369 | retval |= __get_user(nat_bits, &ppr->nat); |
1366 | 1370 | ||
1367 | retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); | 1371 | retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); |
1372 | retval |= access_uarea(child, PT_AR_RSC, &rsc, 1); | ||
1368 | retval |= access_uarea(child, PT_AR_EC, &ec, 1); | 1373 | retval |= access_uarea(child, PT_AR_EC, &ec, 1); |
1369 | retval |= access_uarea(child, PT_AR_LC, &lc, 1); | 1374 | retval |= access_uarea(child, PT_AR_LC, &lc, 1); |
1370 | retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); | 1375 | retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); |