diff options
Diffstat (limited to 'arch/x86/kernel/ptrace.c')
| -rw-r--r-- | arch/x86/kernel/ptrace.c | 28 | 
1 files changed, 9 insertions, 19 deletions
| diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index e2ee403865eb..d8f49c7384a3 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -39,6 +39,7 @@  #include <asm/hw_breakpoint.h>  #include <asm/traps.h>  #include <asm/syscall.h> +#include <asm/fsgsbase.h>  #include "tls.h" @@ -396,12 +397,11 @@ static int putreg(struct task_struct *child,  		if (value >= TASK_SIZE_MAX)  			return -EIO;  		/* -		 * When changing the segment base, use do_arch_prctl_64 -		 * to set either thread.fs or thread.fsindex and the -		 * corresponding GDT slot. +		 * When changing the FS base, use the same +		 * mechanism as for do_arch_prctl_64().  		 */  		if (child->thread.fsbase != value) -			return do_arch_prctl_64(child, ARCH_SET_FS, value); +			return x86_fsbase_write_task(child, value);  		return 0;  	case offsetof(struct user_regs_struct,gs_base):  		/* @@ -410,7 +410,7 @@ static int putreg(struct task_struct *child,  		if (value >= TASK_SIZE_MAX)  			return -EIO;  		if (child->thread.gsbase != value) -			return do_arch_prctl_64(child, ARCH_SET_GS, value); +			return x86_gsbase_write_task(child, value);  		return 0;  #endif  	} @@ -434,20 +434,10 @@ static unsigned long getreg(struct task_struct *task, unsigned long offset)  		return get_flags(task);  #ifdef CONFIG_X86_64 -	case offsetof(struct user_regs_struct, fs_base): { -		/* -		 * XXX: This will not behave as expected if called on -		 * current or if fsindex != 0. -		 */ -		return task->thread.fsbase; -	} -	case offsetof(struct user_regs_struct, gs_base): { -		/* -		 * XXX: This will not behave as expected if called on -		 * current or if fsindex != 0. -		 */ -		return task->thread.gsbase; -	} +	case offsetof(struct user_regs_struct, fs_base): +		return x86_fsbase_read_task(task); +	case offsetof(struct user_regs_struct, gs_base): +		return x86_gsbase_read_task(task);  #endif  	} |