1 #include <lwk/kernel.h>
3 #include <arch/prctl.h>
4 #include <arch/uaccess.h>
8 do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
11 int doit = task == current;
15 if (addr >= task->arch.addr_limit)
18 task->arch.thread.gsindex = 0;
19 task->arch.thread.gs = addr;
21 /* The kernel's %gs is currently loaded, so this
22 call is needed to set the user version. */
24 ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
29 /* Not strictly needed for fs, but do it for symmetry
31 if (addr >= task->arch.addr_limit)
34 task->arch.thread.fsindex = 0;
35 task->arch.thread.fs = addr;
37 /* The kernel doesn't use %fs so we can set it
38 directly. set the selector to 0 to not confuse
40 asm volatile("movl %0,%%fs" :: "r" (0));
41 ret = checking_wrmsrl(MSR_FS_BASE, addr);
48 rdmsrl(MSR_FS_BASE, base);
50 base = task->arch.thread.fs;
51 ret = put_user(base, (unsigned long __user *)addr);
58 asm("movl %%gs,%0" : "=r" (gsindex));
60 rdmsrl(MSR_KERNEL_GS_BASE, base);
62 base = task->arch.thread.gs;
65 base = task->arch.thread.gs;
66 ret = put_user(base, (unsigned long __user *)addr);
80 sys_arch_prctl(int code, unsigned long addr)
82 return do_arch_prctl(current, code, addr);