|
@@ -397,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):
|
|
|
/*
|
|
@@ -411,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
|
|
|
}
|
|
@@ -435,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): {
|
|
|
- if (task->thread.fsindex == 0)
|
|
|
- return task->thread.fsbase;
|
|
|
- else
|
|
|
- return x86_fsgsbase_read_task(task,
|
|
|
- task->thread.fsindex);
|
|
|
- }
|
|
|
- case offsetof(struct user_regs_struct, gs_base): {
|
|
|
- if (task->thread.gsindex == 0)
|
|
|
- return task->thread.gsbase;
|
|
|
- else
|
|
|
- return x86_fsgsbase_read_task(task,
|
|
|
- task->thread.gsindex);
|
|
|
- }
|
|
|
+ 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
|
|
|
}
|
|
|
|