Thread (106 messages) 106 messages, 10 authors, 2008-06-26

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 tas
	return -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_stru
		CHECK_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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help