Messages in this thread | | | From | Eric Lacombe <> | Subject | [x86] do_arch_prctl - bug? | Date | Tue, 18 Nov 2008 15:33:32 +0100 |
| |
Hello,
I would like to know why the ARCH_SET_GS action of sys_arch_prctl, write the MSR MSR_KERNEL_GS_BASE and not the MSR MSR_GS_BASE when the variable "doit" equals 1? Is that a bug?
In other words, why the following code : ... if (doit) { load_gs_index(0); ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr) } ... is not the following one : ... if (doit) { ret = checking_wrmsrl(MSR_GS_BASE, addr) load_gs_index(0); } ...
I copy for clarity the beginning of the function "do_arch_prctl" :
long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) { int ret = 0; int doit = task == current; int cpu;
switch (code) { case ARCH_SET_GS: if (addr >= TASK_SIZE_OF(task)) return -EPERM; cpu = get_cpu(); /* handle small bases via the GDT because that's faster to switch. */ if (addr <= 0xffffffff) { set_32bit_tls(task, GS_TLS, addr); if (doit) { load_TLS(&task->thread, cpu); load_gs_index(GS_TLS_SEL); } task->thread.gsindex = GS_TLS_SEL; task->thread.gs = 0; } else { task->thread.gsindex = 0; task->thread.gs = addr; if (doit) { load_gs_index(0); ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); } } put_cpu(); break; [...]
Regards,
Eric
| |