Re: [PATCH 2/9] powerpc: Add macros to access floating point registers in thread_struct.
From: Kumar Gala <hidden>
Date: 2008-06-25 14:08:44
quoted hunk ↗ jump to hunk
Index: linux-2.6-ozlabs/arch/powerpc/kernel/ptrace32.c ===================================================================--- linux-2.6-ozlabs.orig/arch/powerpc/kernel/ptrace32.c +++ linux-2.6-ozlabs/arch/powerpc/kernel/ptrace32.c@@ -64,6 +64,11 @@ static long compat_ptrace_old(struct tasreturn -EPERM; } +/* Macros to workout the correct index for the FPR in the thread struct */ +#define FPRNUMBER(i) (((i) - PT_FPR0) >> 1) +#define FPRHALF(i) (((i) - PT_FPR0) % 2)
Have you looked at what the compiler spits out here to make sure we aren't getting a divide? Seems like we could use '& 0x1'.
+#define FPRINDEX(i) TS_FPRWIDTH * FPRNUMBER(i) + FPRHALF(i)
quoted hunk ↗ jump to hunk
+ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, compat_ulong_t caddr, compat_ulong_t cdata) {@@ -122,7 +127,8 @@ long compat_arch_ptrace(struct task_stru* to be an array of unsigned int (32 bits) - the * index passed in is based on this assumption. */ - tmp = ((unsigned int *)child->thread.fpr)[index - PT_FPR0]; + tmp = ((unsigned int *)child->thread.fpr) + [FPRINDEX(index)]; } ret = put_user((unsigned int)tmp, (u32 __user *)data); break;@@ -162,7 +168,8 @@ long compat_arch_ptrace(struct task_struCHECK_FULL_REGS(child->thread.regs); if (numReg >= PT_FPR0) { flush_fp_to_thread(child); - tmp = ((unsigned long int *)child->thread.fpr)[numReg - PT_FPR0]; + tmp = ((unsigned long int *)child->thread.fpr) + [FPRINDEX(numReg)]; } else { /* register within PT_REGS struct */ tmp = ptrace_get_reg(child, numReg); }@@ -217,7 +224,8 @@ long compat_arch_ptrace(struct task_stru* to be an array of unsigned int (32 bits) - the * index passed in is based on this assumption. */ - ((unsigned int *)child->thread.fpr)[index - PT_FPR0] = data; + ((unsigned int *)child->thread.fpr) + [FPRINDEX(index)] = data; ret = 0; } break;
- k