diff options
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 209 | 
1 files changed, 105 insertions, 104 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 9a0d24c390a3..75fb40498b41 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c @@ -362,7 +362,7 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,  		   void *kbuf, void __user *ubuf)  {  #ifdef CONFIG_VSX -	double buf[33]; +	u64 buf[33];  	int i;  #endif  	flush_fp_to_thread(target); @@ -371,15 +371,15 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,  	/* copy to local buffer then write that out */  	for (i = 0; i < 32 ; i++)  		buf[i] = target->thread.TS_FPR(i); -	memcpy(&buf[32], &target->thread.fpscr, sizeof(double)); +	buf[32] = target->thread.fp_state.fpscr;  	return user_regset_copyout(&pos, &count, &kbuf, &ubuf, buf, 0, -1);  #else -	BUILD_BUG_ON(offsetof(struct thread_struct, fpscr) != -		     offsetof(struct thread_struct, TS_FPR(32))); +	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) != +		     offsetof(struct thread_fp_state, fpr[32][0]));  	return user_regset_copyout(&pos, &count, &kbuf, &ubuf, -				   &target->thread.fpr, 0, -1); +				   &target->thread.fp_state, 0, -1);  #endif  } @@ -388,7 +388,7 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,  		   const void *kbuf, const void __user *ubuf)  {  #ifdef CONFIG_VSX -	double buf[33]; +	u64 buf[33];  	int i;  #endif  	flush_fp_to_thread(target); @@ -400,14 +400,14 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,  		return i;  	for (i = 0; i < 32 ; i++)  		target->thread.TS_FPR(i) = buf[i]; -	memcpy(&target->thread.fpscr, &buf[32], sizeof(double)); +	target->thread.fp_state.fpscr = buf[32];  	return 0;  #else -	BUILD_BUG_ON(offsetof(struct thread_struct, fpscr) != -		     offsetof(struct thread_struct, TS_FPR(32))); +	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) != +		     offsetof(struct thread_fp_state, fpr[32][0]));  	return user_regset_copyin(&pos, &count, &kbuf, &ubuf, -				  &target->thread.fpr, 0, -1); +				  &target->thread.fp_state, 0, -1);  #endif  } @@ -440,11 +440,11 @@ static int vr_get(struct task_struct *target, const struct user_regset *regset,  	flush_altivec_to_thread(target); -	BUILD_BUG_ON(offsetof(struct thread_struct, vscr) != -		     offsetof(struct thread_struct, vr[32])); +	BUILD_BUG_ON(offsetof(struct thread_vr_state, vscr) != +		     offsetof(struct thread_vr_state, vr[32]));  	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, -				  &target->thread.vr, 0, +				  &target->thread.vr_state, 0,  				  33 * sizeof(vector128));  	if (!ret) {  		/* @@ -471,11 +471,12 @@ static int vr_set(struct task_struct *target, const struct user_regset *regset,  	flush_altivec_to_thread(target); -	BUILD_BUG_ON(offsetof(struct thread_struct, vscr) != -		     offsetof(struct thread_struct, vr[32])); +	BUILD_BUG_ON(offsetof(struct thread_vr_state, vscr) != +		     offsetof(struct thread_vr_state, vr[32]));  	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, -				 &target->thread.vr, 0, 33 * sizeof(vector128)); +				 &target->thread.vr_state, 0, +				 33 * sizeof(vector128));  	if (!ret && count > 0) {  		/*  		 * We use only the first word of vrsave. @@ -514,13 +515,13 @@ static int vsr_get(struct task_struct *target, const struct user_regset *regset,  		   unsigned int pos, unsigned int count,  		   void *kbuf, void __user *ubuf)  { -	double buf[32]; +	u64 buf[32];  	int ret, i;  	flush_vsx_to_thread(target);  	for (i = 0; i < 32 ; i++) -		buf[i] = target->thread.fpr[i][TS_VSRLOWOFFSET]; +		buf[i] = target->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];  	ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,  				  buf, 0, 32 * sizeof(double)); @@ -531,7 +532,7 @@ static int vsr_set(struct task_struct *target, const struct user_regset *regset,  		   unsigned int pos, unsigned int count,  		   const void *kbuf, const void __user *ubuf)  { -	double buf[32]; +	u64 buf[32];  	int ret,i;  	flush_vsx_to_thread(target); @@ -539,7 +540,7 @@ static int vsr_set(struct task_struct *target, const struct user_regset *regset,  	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,  				 buf, 0, 32 * sizeof(double));  	for (i = 0; i < 32 ; i++) -		target->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i]; +		target->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];  	return ret; @@ -657,7 +658,7 @@ static const struct user_regset native_regsets[] = {  #endif  #ifdef CONFIG_SPE  	[REGSET_SPE] = { -		.n = 35, +		.core_note_type = NT_PPC_SPE, .n = 35,  		.size = sizeof(u32), .align = sizeof(u32),  		.active = evr_active, .get = evr_get, .set = evr_set  	}, @@ -854,8 +855,8 @@ void user_enable_single_step(struct task_struct *task)  	if (regs != NULL) {  #ifdef CONFIG_PPC_ADV_DEBUG_REGS -		task->thread.dbcr0 &= ~DBCR0_BT; -		task->thread.dbcr0 |= DBCR0_IDM | DBCR0_IC; +		task->thread.debug.dbcr0 &= ~DBCR0_BT; +		task->thread.debug.dbcr0 |= DBCR0_IDM | DBCR0_IC;  		regs->msr |= MSR_DE;  #else  		regs->msr &= ~MSR_BE; @@ -871,8 +872,8 @@ void user_enable_block_step(struct task_struct *task)  	if (regs != NULL) {  #ifdef CONFIG_PPC_ADV_DEBUG_REGS -		task->thread.dbcr0 &= ~DBCR0_IC; -		task->thread.dbcr0 = DBCR0_IDM | DBCR0_BT; +		task->thread.debug.dbcr0 &= ~DBCR0_IC; +		task->thread.debug.dbcr0 = DBCR0_IDM | DBCR0_BT;  		regs->msr |= MSR_DE;  #else  		regs->msr &= ~MSR_SE; @@ -894,16 +895,16 @@ void user_disable_single_step(struct task_struct *task)  		 * And, after doing so, if all debug flags are off, turn  		 * off DBCR0(IDM) and MSR(DE) .... Torez  		 */ -		task->thread.dbcr0 &= ~DBCR0_IC; +		task->thread.debug.dbcr0 &= ~(DBCR0_IC|DBCR0_BT);  		/*  		 * Test to see if any of the DBCR_ACTIVE_EVENTS bits are set.  		 */ -		if (!DBCR_ACTIVE_EVENTS(task->thread.dbcr0, -					task->thread.dbcr1)) { +		if (!DBCR_ACTIVE_EVENTS(task->thread.debug.dbcr0, +					task->thread.debug.dbcr1)) {  			/*  			 * All debug events were off.....  			 */ -			task->thread.dbcr0 &= ~DBCR0_IDM; +			task->thread.debug.dbcr0 &= ~DBCR0_IDM;  			regs->msr &= ~MSR_DE;  		}  #else @@ -1022,14 +1023,14 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,  	 */  	/* DAC's hold the whole address without any mode flags */ -	task->thread.dac1 = data & ~0x3UL; +	task->thread.debug.dac1 = data & ~0x3UL; -	if (task->thread.dac1 == 0) { +	if (task->thread.debug.dac1 == 0) {  		dbcr_dac(task) &= ~(DBCR_DAC1R | DBCR_DAC1W); -		if (!DBCR_ACTIVE_EVENTS(task->thread.dbcr0, -					task->thread.dbcr1)) { +		if (!DBCR_ACTIVE_EVENTS(task->thread.debug.dbcr0, +					task->thread.debug.dbcr1)) {  			task->thread.regs->msr &= ~MSR_DE; -			task->thread.dbcr0 &= ~DBCR0_IDM; +			task->thread.debug.dbcr0 &= ~DBCR0_IDM;  		}  		return 0;  	} @@ -1041,7 +1042,7 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,  	/* Set the Internal Debugging flag (IDM bit 1) for the DBCR0  	   register */ -	task->thread.dbcr0 |= DBCR0_IDM; +	task->thread.debug.dbcr0 |= DBCR0_IDM;  	/* Check for write and read flags and set DBCR0  	   accordingly */ @@ -1071,10 +1072,10 @@ static long set_instruction_bp(struct task_struct *child,  			      struct ppc_hw_breakpoint *bp_info)  {  	int slot; -	int slot1_in_use = ((child->thread.dbcr0 & DBCR0_IAC1) != 0); -	int slot2_in_use = ((child->thread.dbcr0 & DBCR0_IAC2) != 0); -	int slot3_in_use = ((child->thread.dbcr0 & DBCR0_IAC3) != 0); -	int slot4_in_use = ((child->thread.dbcr0 & DBCR0_IAC4) != 0); +	int slot1_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC1) != 0); +	int slot2_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC2) != 0); +	int slot3_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC3) != 0); +	int slot4_in_use = ((child->thread.debug.dbcr0 & DBCR0_IAC4) != 0);  	if (dbcr_iac_range(child) & DBCR_IAC12MODE)  		slot2_in_use = 1; @@ -1093,9 +1094,9 @@ static long set_instruction_bp(struct task_struct *child,  		/* We need a pair of IAC regsisters */  		if ((!slot1_in_use) && (!slot2_in_use)) {  			slot = 1; -			child->thread.iac1 = bp_info->addr; -			child->thread.iac2 = bp_info->addr2; -			child->thread.dbcr0 |= DBCR0_IAC1; +			child->thread.debug.iac1 = bp_info->addr; +			child->thread.debug.iac2 = bp_info->addr2; +			child->thread.debug.dbcr0 |= DBCR0_IAC1;  			if (bp_info->addr_mode ==  					PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE)  				dbcr_iac_range(child) |= DBCR_IAC12X; @@ -1104,9 +1105,9 @@ static long set_instruction_bp(struct task_struct *child,  #if CONFIG_PPC_ADV_DEBUG_IACS > 2  		} else if ((!slot3_in_use) && (!slot4_in_use)) {  			slot = 3; -			child->thread.iac3 = bp_info->addr; -			child->thread.iac4 = bp_info->addr2; -			child->thread.dbcr0 |= DBCR0_IAC3; +			child->thread.debug.iac3 = bp_info->addr; +			child->thread.debug.iac4 = bp_info->addr2; +			child->thread.debug.dbcr0 |= DBCR0_IAC3;  			if (bp_info->addr_mode ==  					PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE)  				dbcr_iac_range(child) |= DBCR_IAC34X; @@ -1126,30 +1127,30 @@ static long set_instruction_bp(struct task_struct *child,  			 */  			if (slot2_in_use || (slot3_in_use == slot4_in_use)) {  				slot = 1; -				child->thread.iac1 = bp_info->addr; -				child->thread.dbcr0 |= DBCR0_IAC1; +				child->thread.debug.iac1 = bp_info->addr; +				child->thread.debug.dbcr0 |= DBCR0_IAC1;  				goto out;  			}  		}  		if (!slot2_in_use) {  			slot = 2; -			child->thread.iac2 = bp_info->addr; -			child->thread.dbcr0 |= DBCR0_IAC2; +			child->thread.debug.iac2 = bp_info->addr; +			child->thread.debug.dbcr0 |= DBCR0_IAC2;  #if CONFIG_PPC_ADV_DEBUG_IACS > 2  		} else if (!slot3_in_use) {  			slot = 3; -			child->thread.iac3 = bp_info->addr; -			child->thread.dbcr0 |= DBCR0_IAC3; +			child->thread.debug.iac3 = bp_info->addr; +			child->thread.debug.dbcr0 |= DBCR0_IAC3;  		} else if (!slot4_in_use) {  			slot = 4; -			child->thread.iac4 = bp_info->addr; -			child->thread.dbcr0 |= DBCR0_IAC4; +			child->thread.debug.iac4 = bp_info->addr; +			child->thread.debug.dbcr0 |= DBCR0_IAC4;  #endif  		} else  			return -ENOSPC;  	}  out: -	child->thread.dbcr0 |= DBCR0_IDM; +	child->thread.debug.dbcr0 |= DBCR0_IDM;  	child->thread.regs->msr |= MSR_DE;  	return slot; @@ -1159,49 +1160,49 @@ static int del_instruction_bp(struct task_struct *child, int slot)  {  	switch (slot) {  	case 1: -		if ((child->thread.dbcr0 & DBCR0_IAC1) == 0) +		if ((child->thread.debug.dbcr0 & DBCR0_IAC1) == 0)  			return -ENOENT;  		if (dbcr_iac_range(child) & DBCR_IAC12MODE) {  			/* address range - clear slots 1 & 2 */ -			child->thread.iac2 = 0; +			child->thread.debug.iac2 = 0;  			dbcr_iac_range(child) &= ~DBCR_IAC12MODE;  		} -		child->thread.iac1 = 0; -		child->thread.dbcr0 &= ~DBCR0_IAC1; +		child->thread.debug.iac1 = 0; +		child->thread.debug.dbcr0 &= ~DBCR0_IAC1;  		break;  	case 2: -		if ((child->thread.dbcr0 & DBCR0_IAC2) == 0) +		if ((child->thread.debug.dbcr0 & DBCR0_IAC2) == 0)  			return -ENOENT;  		if (dbcr_iac_range(child) & DBCR_IAC12MODE)  			/* used in a range */  			return -EINVAL; -		child->thread.iac2 = 0; -		child->thread.dbcr0 &= ~DBCR0_IAC2; +		child->thread.debug.iac2 = 0; +		child->thread.debug.dbcr0 &= ~DBCR0_IAC2;  		break;  #if CONFIG_PPC_ADV_DEBUG_IACS > 2  	case 3: -		if ((child->thread.dbcr0 & DBCR0_IAC3) == 0) +		if ((child->thread.debug.dbcr0 & DBCR0_IAC3) == 0)  			return -ENOENT;  		if (dbcr_iac_range(child) & DBCR_IAC34MODE) {  			/* address range - clear slots 3 & 4 */ -			child->thread.iac4 = 0; +			child->thread.debug.iac4 = 0;  			dbcr_iac_range(child) &= ~DBCR_IAC34MODE;  		} -		child->thread.iac3 = 0; -		child->thread.dbcr0 &= ~DBCR0_IAC3; +		child->thread.debug.iac3 = 0; +		child->thread.debug.dbcr0 &= ~DBCR0_IAC3;  		break;  	case 4: -		if ((child->thread.dbcr0 & DBCR0_IAC4) == 0) +		if ((child->thread.debug.dbcr0 & DBCR0_IAC4) == 0)  			return -ENOENT;  		if (dbcr_iac_range(child) & DBCR_IAC34MODE)  			/* Used in a range */  			return -EINVAL; -		child->thread.iac4 = 0; -		child->thread.dbcr0 &= ~DBCR0_IAC4; +		child->thread.debug.iac4 = 0; +		child->thread.debug.dbcr0 &= ~DBCR0_IAC4;  		break;  #endif  	default: @@ -1231,18 +1232,18 @@ static int set_dac(struct task_struct *child, struct ppc_hw_breakpoint *bp_info)  			dbcr_dac(child) |= DBCR_DAC1R;  		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)  			dbcr_dac(child) |= DBCR_DAC1W; -		child->thread.dac1 = (unsigned long)bp_info->addr; +		child->thread.debug.dac1 = (unsigned long)bp_info->addr;  #if CONFIG_PPC_ADV_DEBUG_DVCS > 0  		if (byte_enable) { -			child->thread.dvc1 = +			child->thread.debug.dvc1 =  				(unsigned long)bp_info->condition_value; -			child->thread.dbcr2 |= +			child->thread.debug.dbcr2 |=  				((byte_enable << DBCR2_DVC1BE_SHIFT) |  				 (condition_mode << DBCR2_DVC1M_SHIFT));  		}  #endif  #ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE -	} else if (child->thread.dbcr2 & DBCR2_DAC12MODE) { +	} else if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE) {  		/* Both dac1 and dac2 are part of a range */  		return -ENOSPC;  #endif @@ -1252,19 +1253,19 @@ static int set_dac(struct task_struct *child, struct ppc_hw_breakpoint *bp_info)  			dbcr_dac(child) |= DBCR_DAC2R;  		if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)  			dbcr_dac(child) |= DBCR_DAC2W; -		child->thread.dac2 = (unsigned long)bp_info->addr; +		child->thread.debug.dac2 = (unsigned long)bp_info->addr;  #if CONFIG_PPC_ADV_DEBUG_DVCS > 0  		if (byte_enable) { -			child->thread.dvc2 = +			child->thread.debug.dvc2 =  				(unsigned long)bp_info->condition_value; -			child->thread.dbcr2 |= +			child->thread.debug.dbcr2 |=  				((byte_enable << DBCR2_DVC2BE_SHIFT) |  				 (condition_mode << DBCR2_DVC2M_SHIFT));  		}  #endif  	} else  		return -ENOSPC; -	child->thread.dbcr0 |= DBCR0_IDM; +	child->thread.debug.dbcr0 |= DBCR0_IDM;  	child->thread.regs->msr |= MSR_DE;  	return slot + 4; @@ -1276,32 +1277,32 @@ static int del_dac(struct task_struct *child, int slot)  		if ((dbcr_dac(child) & (DBCR_DAC1R | DBCR_DAC1W)) == 0)  			return -ENOENT; -		child->thread.dac1 = 0; +		child->thread.debug.dac1 = 0;  		dbcr_dac(child) &= ~(DBCR_DAC1R | DBCR_DAC1W);  #ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE -		if (child->thread.dbcr2 & DBCR2_DAC12MODE) { -			child->thread.dac2 = 0; -			child->thread.dbcr2 &= ~DBCR2_DAC12MODE; +		if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE) { +			child->thread.debug.dac2 = 0; +			child->thread.debug.dbcr2 &= ~DBCR2_DAC12MODE;  		} -		child->thread.dbcr2 &= ~(DBCR2_DVC1M | DBCR2_DVC1BE); +		child->thread.debug.dbcr2 &= ~(DBCR2_DVC1M | DBCR2_DVC1BE);  #endif  #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 -		child->thread.dvc1 = 0; +		child->thread.debug.dvc1 = 0;  #endif  	} else if (slot == 2) {  		if ((dbcr_dac(child) & (DBCR_DAC2R | DBCR_DAC2W)) == 0)  			return -ENOENT;  #ifdef CONFIG_PPC_ADV_DEBUG_DAC_RANGE -		if (child->thread.dbcr2 & DBCR2_DAC12MODE) +		if (child->thread.debug.dbcr2 & DBCR2_DAC12MODE)  			/* Part of a range */  			return -EINVAL; -		child->thread.dbcr2 &= ~(DBCR2_DVC2M | DBCR2_DVC2BE); +		child->thread.debug.dbcr2 &= ~(DBCR2_DVC2M | DBCR2_DVC2BE);  #endif  #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 -		child->thread.dvc2 = 0; +		child->thread.debug.dvc2 = 0;  #endif -		child->thread.dac2 = 0; +		child->thread.debug.dac2 = 0;  		dbcr_dac(child) &= ~(DBCR_DAC2R | DBCR_DAC2W);  	} else  		return -EINVAL; @@ -1343,22 +1344,22 @@ static int set_dac_range(struct task_struct *child,  			return -EIO;  	} -	if (child->thread.dbcr0 & +	if (child->thread.debug.dbcr0 &  	    (DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W))  		return -ENOSPC;  	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ) -		child->thread.dbcr0 |= (DBCR0_DAC1R | DBCR0_IDM); +		child->thread.debug.dbcr0 |= (DBCR0_DAC1R | DBCR0_IDM);  	if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE) -		child->thread.dbcr0 |= (DBCR0_DAC1W | DBCR0_IDM); -	child->thread.dac1 = bp_info->addr; -	child->thread.dac2 = bp_info->addr2; +		child->thread.debug.dbcr0 |= (DBCR0_DAC1W | DBCR0_IDM); +	child->thread.debug.dac1 = bp_info->addr; +	child->thread.debug.dac2 = bp_info->addr2;  	if (mode == PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE) -		child->thread.dbcr2  |= DBCR2_DAC12M; +		child->thread.debug.dbcr2  |= DBCR2_DAC12M;  	else if (mode == PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE) -		child->thread.dbcr2  |= DBCR2_DAC12MX; +		child->thread.debug.dbcr2  |= DBCR2_DAC12MX;  	else	/* PPC_BREAKPOINT_MODE_MASK */ -		child->thread.dbcr2  |= DBCR2_DAC12MM; +		child->thread.debug.dbcr2  |= DBCR2_DAC12MM;  	child->thread.regs->msr |= MSR_DE;  	return 5; @@ -1489,9 +1490,9 @@ static long ppc_del_hwdebug(struct task_struct *child, long data)  		rc = del_dac(child, (int)data - 4);  	if (!rc) { -		if (!DBCR_ACTIVE_EVENTS(child->thread.dbcr0, -					child->thread.dbcr1)) { -			child->thread.dbcr0 &= ~DBCR0_IDM; +		if (!DBCR_ACTIVE_EVENTS(child->thread.debug.dbcr0, +					child->thread.debug.dbcr1)) { +			child->thread.debug.dbcr0 &= ~DBCR0_IDM;  			child->thread.regs->msr &= ~MSR_DE;  		}  	} @@ -1554,10 +1555,10 @@ long arch_ptrace(struct task_struct *child, long request,  			flush_fp_to_thread(child);  			if (fpidx < (PT_FPSCR - PT_FPR0)) -				tmp = ((unsigned long *)child->thread.fpr) -					[fpidx * TS_FPRWIDTH]; +				memcpy(&tmp, &child->thread.fp_state.fpr, +				       sizeof(long));  			else -				tmp = child->thread.fpscr.val; +				tmp = child->thread.fp_state.fpscr;  		}  		ret = put_user(tmp, datalp);  		break; @@ -1587,10 +1588,10 @@ long arch_ptrace(struct task_struct *child, long request,  			flush_fp_to_thread(child);  			if (fpidx < (PT_FPSCR - PT_FPR0)) -				((unsigned long *)child->thread.fpr) -					[fpidx * TS_FPRWIDTH] = data; +				memcpy(&child->thread.fp_state.fpr, &data, +				       sizeof(long));  			else -				child->thread.fpscr.val = data; +				child->thread.fp_state.fpscr = data;  			ret = 0;  		}  		break; @@ -1669,7 +1670,7 @@ long arch_ptrace(struct task_struct *child, long request,  		if (addr > 0)  			break;  #ifdef CONFIG_PPC_ADV_DEBUG_REGS -		ret = put_user(child->thread.dac1, datalp); +		ret = put_user(child->thread.debug.dac1, datalp);  #else  		dabr_fake = ((child->thread.hw_brk.address & (~HW_BRK_TYPE_DABR)) |  			     (child->thread.hw_brk.type & HW_BRK_TYPE_DABR));  | 
