sched/rt: Use schedule_preempt_disabled()
[deliverable/linux.git] / arch / x86 / kernel / process_64.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 * Copyright (C) 1995 Linus Torvalds
3 *
4 * Pentium III FXSR, SSE support
5 * Gareth Hughes <gareth@valinux.com>, May 2000
6612538c 6 *
1da177e4
LT
7 * X86-64 port
8 * Andi Kleen.
76e4f660
AR
9 *
10 * CPU hotplug support - ashok.raj@intel.com
1da177e4
LT
11 */
12
13/*
14 * This file handles the architecture-dependent parts of process handling..
15 */
16
42059429 17#include <linux/stackprotector.h>
76e4f660 18#include <linux/cpu.h>
1da177e4
LT
19#include <linux/errno.h>
20#include <linux/sched.h>
6612538c 21#include <linux/fs.h>
1da177e4
LT
22#include <linux/kernel.h>
23#include <linux/mm.h>
24#include <linux/elfcore.h>
25#include <linux/smp.h>
26#include <linux/slab.h>
27#include <linux/user.h>
1da177e4
LT
28#include <linux/interrupt.h>
29#include <linux/delay.h>
6612538c 30#include <linux/module.h>
1da177e4 31#include <linux/ptrace.h>
95833c83 32#include <linux/notifier.h>
c6fd91f0 33#include <linux/kprobes.h>
1eeb66a1 34#include <linux/kdebug.h>
02290683 35#include <linux/tick.h>
529e25f6 36#include <linux/prctl.h>
7de08b4e
GP
37#include <linux/uaccess.h>
38#include <linux/io.h>
8b96f011 39#include <linux/ftrace.h>
a0bfa137 40#include <linux/cpuidle.h>
1da177e4 41
1da177e4
LT
42#include <asm/pgtable.h>
43#include <asm/system.h>
1da177e4
LT
44#include <asm/processor.h>
45#include <asm/i387.h>
46#include <asm/mmu_context.h>
1da177e4 47#include <asm/prctl.h>
1da177e4
LT
48#include <asm/desc.h>
49#include <asm/proto.h>
50#include <asm/ia32.h>
95833c83 51#include <asm/idle.h>
bbc1f698 52#include <asm/syscalls.h>
66cb5917 53#include <asm/debugreg.h>
b227e233 54#include <asm/nmi.h>
1da177e4
LT
55
56asmlinkage extern void ret_from_fork(void);
57
3d1e42a7 58DEFINE_PER_CPU(unsigned long, old_rsp);
c2558e0e 59static DEFINE_PER_CPU(unsigned char, is_idle);
3d1e42a7 60
e041c683 61static ATOMIC_NOTIFIER_HEAD(idle_notifier);
95833c83
AK
62
63void idle_notifier_register(struct notifier_block *n)
64{
e041c683 65 atomic_notifier_chain_register(&idle_notifier, n);
95833c83 66}
c7d87d79
VP
67EXPORT_SYMBOL_GPL(idle_notifier_register);
68
69void idle_notifier_unregister(struct notifier_block *n)
70{
71 atomic_notifier_chain_unregister(&idle_notifier, n);
72}
73EXPORT_SYMBOL_GPL(idle_notifier_unregister);
95833c83 74
95833c83
AK
75void enter_idle(void)
76{
c2558e0e 77 percpu_write(is_idle, 1);
e041c683 78 atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
95833c83
AK
79}
80
81static void __exit_idle(void)
82{
c2558e0e 83 if (x86_test_and_clear_bit_percpu(0, is_idle) == 0)
a15da49d 84 return;
e041c683 85 atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
95833c83
AK
86}
87
88/* Called from interrupts to signify idle end */
89void exit_idle(void)
90{
a15da49d
AK
91 /* idle loop has pid 0 */
92 if (current->pid)
95833c83
AK
93 return;
94 __exit_idle();
95}
96
913da64b 97#ifndef CONFIG_SMP
76e4f660
AR
98static inline void play_dead(void)
99{
100 BUG();
101}
913da64b 102#endif
76e4f660 103
1da177e4
LT
104/*
105 * The idle thread. There's no useful work to be
106 * done, so just try to conserve power and have a
107 * low exit latency (ie sit in a loop waiting for
108 * somebody to say that they'd like to reschedule)
109 */
b10db7f0 110void cpu_idle(void)
1da177e4 111{
495ab9c0 112 current_thread_info()->status |= TS_POLLING;
ce22bd92 113
ce22bd92 114 /*
5c79d2a5
TH
115 * If we're the non-boot CPU, nothing set the stack canary up
116 * for us. CPU0 already has it initialized but no harm in
117 * doing it again. This is a good place for updating it, as
118 * we wont ever return from this function (so the invalid
119 * canaries already on the stack wont ever trigger).
ce22bd92 120 */
18aa8bb1
IM
121 boot_init_stack_canary();
122
1da177e4
LT
123 /* endless idle loop with no priority at all */
124 while (1) {
e37e112d 125 tick_nohz_idle_enter();
1da177e4 126 while (!need_resched()) {
1da177e4 127
1da177e4 128 rmb();
6ddd2a27 129
76e4f660
AR
130 if (cpu_is_offline(smp_processor_id()))
131 play_dead();
d331e739
VP
132 /*
133 * Idle routines should keep interrupts disabled
134 * from here on, until they go to idle.
135 * Otherwise, idle callbacks can misfire.
136 */
b227e233 137 local_touch_nmi();
d331e739 138 local_irq_disable();
95833c83 139 enter_idle();
81d68a96
SR
140 /* Don't trace irqs off for idle */
141 stop_critical_timings();
e37e112d
FW
142
143 /* enter_idle() needs rcu for notifiers */
144 rcu_idle_enter();
145
a0bfa137
LB
146 if (cpuidle_idle_call())
147 pm_idle();
e37e112d
FW
148
149 rcu_idle_exit();
81d68a96 150 start_critical_timings();
c882e0fe 151
a15da49d
AK
152 /* In many cases the interrupt that ended idle
153 has already called exit_idle. But some idle
154 loops can be woken up without interrupt. */
95833c83 155 __exit_idle();
1da177e4
LT
156 }
157
e37e112d 158 tick_nohz_idle_exit();
bd2f5536 159 schedule_preempt_disabled();
1da177e4
LT
160 }
161}
162
6612538c 163/* Prints also some state that isn't saved in the pt_regs */
e2ce07c8 164void __show_regs(struct pt_regs *regs, int all)
1da177e4
LT
165{
166 unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
bb1995d5 167 unsigned long d0, d1, d2, d3, d6, d7;
6612538c
HS
168 unsigned int fsindex, gsindex;
169 unsigned int ds, cs, es;
814e2c84
AI
170
171 show_regs_common();
d015a092 172 printk(KERN_DEFAULT "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
aafbd7eb 173 printk_address(regs->ip, 1);
d015a092 174 printk(KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
8092c654 175 regs->sp, regs->flags);
d015a092 176 printk(KERN_DEFAULT "RAX: %016lx RBX: %016lx RCX: %016lx\n",
65ea5b03 177 regs->ax, regs->bx, regs->cx);
d015a092 178 printk(KERN_DEFAULT "RDX: %016lx RSI: %016lx RDI: %016lx\n",
65ea5b03 179 regs->dx, regs->si, regs->di);
d015a092 180 printk(KERN_DEFAULT "RBP: %016lx R08: %016lx R09: %016lx\n",
65ea5b03 181 regs->bp, regs->r8, regs->r9);
d015a092 182 printk(KERN_DEFAULT "R10: %016lx R11: %016lx R12: %016lx\n",
7de08b4e 183 regs->r10, regs->r11, regs->r12);
d015a092 184 printk(KERN_DEFAULT "R13: %016lx R14: %016lx R15: %016lx\n",
7de08b4e 185 regs->r13, regs->r14, regs->r15);
1da177e4 186
7de08b4e
GP
187 asm("movl %%ds,%0" : "=r" (ds));
188 asm("movl %%cs,%0" : "=r" (cs));
189 asm("movl %%es,%0" : "=r" (es));
1da177e4
LT
190 asm("movl %%fs,%0" : "=r" (fsindex));
191 asm("movl %%gs,%0" : "=r" (gsindex));
192
193 rdmsrl(MSR_FS_BASE, fs);
7de08b4e
GP
194 rdmsrl(MSR_GS_BASE, gs);
195 rdmsrl(MSR_KERNEL_GS_BASE, shadowgs);
1da177e4 196
e2ce07c8
PE
197 if (!all)
198 return;
1da177e4 199
f51c9452
GOC
200 cr0 = read_cr0();
201 cr2 = read_cr2();
202 cr3 = read_cr3();
203 cr4 = read_cr4();
1da177e4 204
d015a092 205 printk(KERN_DEFAULT "FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n",
7de08b4e 206 fs, fsindex, gs, gsindex, shadowgs);
d015a092 207 printk(KERN_DEFAULT "CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds,
8092c654 208 es, cr0);
d015a092 209 printk(KERN_DEFAULT "CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3,
8092c654 210 cr4);
bb1995d5
AS
211
212 get_debugreg(d0, 0);
213 get_debugreg(d1, 1);
214 get_debugreg(d2, 2);
d015a092 215 printk(KERN_DEFAULT "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
bb1995d5
AS
216 get_debugreg(d3, 3);
217 get_debugreg(d6, 6);
218 get_debugreg(d7, 7);
d015a092 219 printk(KERN_DEFAULT "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
1da177e4
LT
220}
221
1da177e4
LT
222void release_thread(struct task_struct *dead_task)
223{
224 if (dead_task->mm) {
225 if (dead_task->mm->context.size) {
226 printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
227 dead_task->comm,
228 dead_task->mm->context.ldt,
229 dead_task->mm->context.size);
230 BUG();
231 }
232 }
233}
234
235static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
236{
6612538c 237 struct user_desc ud = {
1da177e4
LT
238 .base_addr = addr,
239 .limit = 0xfffff,
240 .seg_32bit = 1,
241 .limit_in_pages = 1,
242 .useable = 1,
243 };
ade1af77 244 struct desc_struct *desc = t->thread.tls_array;
1da177e4 245 desc += tls;
80fbb69a 246 fill_ldt(desc, &ud);
1da177e4
LT
247}
248
249static inline u32 read_32bit_tls(struct task_struct *t, int tls)
250{
91394eb0 251 return get_desc_base(&t->thread.tls_array[tls]);
1da177e4
LT
252}
253
254/*
255 * This gets called before we allocate a new thread and copy
256 * the current task into it.
257 */
258void prepare_to_copy(struct task_struct *tsk)
259{
260 unlazy_fpu(tsk);
261}
262
6f2c55b8 263int copy_thread(unsigned long clone_flags, unsigned long sp,
1da177e4 264 unsigned long unused,
7de08b4e 265 struct task_struct *p, struct pt_regs *regs)
1da177e4
LT
266{
267 int err;
7de08b4e 268 struct pt_regs *childregs;
1da177e4
LT
269 struct task_struct *me = current;
270
a88cde13 271 childregs = ((struct pt_regs *)
57eafdc2 272 (THREAD_SIZE + task_stack_page(p))) - 1;
1da177e4
LT
273 *childregs = *regs;
274
65ea5b03 275 childregs->ax = 0;
fa4b8f84
BG
276 if (user_mode(regs))
277 childregs->sp = sp;
278 else
65ea5b03 279 childregs->sp = (unsigned long)childregs;
1da177e4 280
faca6227
PA
281 p->thread.sp = (unsigned long) childregs;
282 p->thread.sp0 = (unsigned long) (childregs+1);
283 p->thread.usersp = me->thread.usersp;
1da177e4 284
e4f17c43 285 set_tsk_thread_flag(p, TIF_FORK);
1da177e4 286
cea20ca3 287 p->fpu_counter = 0;
66cb5917 288 p->thread.io_bitmap_ptr = NULL;
1da177e4 289
ada85708 290 savesegment(gs, p->thread.gsindex);
7ce5a2b9 291 p->thread.gs = p->thread.gsindex ? 0 : me->thread.gs;
ada85708 292 savesegment(fs, p->thread.fsindex);
7ce5a2b9 293 p->thread.fs = p->thread.fsindex ? 0 : me->thread.fs;
ada85708
JF
294 savesegment(es, p->thread.es);
295 savesegment(ds, p->thread.ds);
1da177e4 296
66cb5917 297 err = -ENOMEM;
24f1e32c 298 memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
66cb5917 299
d3a4f48d 300 if (unlikely(test_tsk_thread_flag(me, TIF_IO_BITMAP))) {
cced4022
TM
301 p->thread.io_bitmap_ptr = kmemdup(me->thread.io_bitmap_ptr,
302 IO_BITMAP_BYTES, GFP_KERNEL);
1da177e4
LT
303 if (!p->thread.io_bitmap_ptr) {
304 p->thread.io_bitmap_max = 0;
305 return -ENOMEM;
306 }
d3a4f48d 307 set_tsk_thread_flag(p, TIF_IO_BITMAP);
6612538c 308 }
1da177e4
LT
309
310 /*
311 * Set a new TLS for the child thread?
312 */
313 if (clone_flags & CLONE_SETTLS) {
314#ifdef CONFIG_IA32_EMULATION
315 if (test_thread_flag(TIF_IA32))
efd1ca52 316 err = do_set_thread_area(p, -1,
65ea5b03 317 (struct user_desc __user *)childregs->si, 0);
7de08b4e
GP
318 else
319#endif
320 err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8);
321 if (err)
1da177e4
LT
322 goto out;
323 }
324 err = 0;
325out:
326 if (err && p->thread.io_bitmap_ptr) {
327 kfree(p->thread.io_bitmap_ptr);
328 p->thread.io_bitmap_max = 0;
329 }
66cb5917 330
1da177e4
LT
331 return err;
332}
333
e634d8fc
PA
334static void
335start_thread_common(struct pt_regs *regs, unsigned long new_ip,
336 unsigned long new_sp,
337 unsigned int _cs, unsigned int _ss, unsigned int _ds)
513ad84b 338{
ada85708 339 loadsegment(fs, 0);
e634d8fc
PA
340 loadsegment(es, _ds);
341 loadsegment(ds, _ds);
513ad84b
IM
342 load_gs_index(0);
343 regs->ip = new_ip;
344 regs->sp = new_sp;
3d1e42a7 345 percpu_write(old_rsp, new_sp);
e634d8fc
PA
346 regs->cs = _cs;
347 regs->ss = _ss;
a6f05a6a 348 regs->flags = X86_EFLAGS_IF;
aa283f49
SS
349 /*
350 * Free the old FP and other extended state
351 */
352 free_thread_xstate(current);
513ad84b 353}
e634d8fc
PA
354
355void
356start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
357{
358 start_thread_common(regs, new_ip, new_sp,
359 __USER_CS, __USER_DS, 0);
360}
513ad84b 361
a6f05a6a
PA
362#ifdef CONFIG_IA32_EMULATION
363void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)
364{
e634d8fc
PA
365 start_thread_common(regs, new_ip, new_sp,
366 __USER32_CS, __USER32_DS, __USER32_DS);
a6f05a6a
PA
367}
368#endif
513ad84b 369
1da177e4
LT
370/*
371 * switch_to(x,y) should switch tasks from x to y.
372 *
6612538c 373 * This could still be optimized:
1da177e4
LT
374 * - fold all the options into a flag word and test it with a single test.
375 * - could test fs/gs bitsliced
099f318b
AK
376 *
377 * Kprobes not supported here. Set the probe on schedule instead.
8b96f011 378 * Function graph tracer not supported too.
1da177e4 379 */
8b96f011 380__notrace_funcgraph struct task_struct *
a88cde13 381__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
1da177e4 382{
87b935a0
JF
383 struct thread_struct *prev = &prev_p->thread;
384 struct thread_struct *next = &next_p->thread;
6612538c 385 int cpu = smp_processor_id();
1da177e4 386 struct tss_struct *tss = &per_cpu(init_tss, cpu);
478de5a9 387 unsigned fsindex, gsindex;
34ddc81a 388 fpu_switch_t fpu;
e07e23e1 389
7e16838d 390 fpu = switch_fpu_prepare(prev_p, next_p, cpu);
4903062b 391
1da177e4
LT
392 /*
393 * Reload esp0, LDT and the page table pointer:
394 */
7818a1e0 395 load_sp0(tss, next);
1da177e4 396
7de08b4e 397 /*
1da177e4
LT
398 * Switch DS and ES.
399 * This won't pick up thread selector changes, but I guess that is ok.
400 */
ada85708 401 savesegment(es, prev->es);
1da177e4 402 if (unlikely(next->es | prev->es))
7de08b4e 403 loadsegment(es, next->es);
ada85708
JF
404
405 savesegment(ds, prev->ds);
1da177e4
LT
406 if (unlikely(next->ds | prev->ds))
407 loadsegment(ds, next->ds);
408
478de5a9
JF
409
410 /* We must save %fs and %gs before load_TLS() because
411 * %fs and %gs may be cleared by load_TLS().
412 *
413 * (e.g. xen_load_tls())
414 */
415 savesegment(fs, fsindex);
416 savesegment(gs, gsindex);
417
1da177e4
LT
418 load_TLS(next, cpu);
419
3fe0a63e
JF
420 /*
421 * Leave lazy mode, flushing any hypercalls made here.
422 * This must be done before restoring TLS segments so
423 * the GDT and LDT are properly updated, and must be
424 * done before math_state_restore, so the TS bit is up
425 * to date.
426 */
224101ed 427 arch_end_context_switch(next_p);
3fe0a63e 428
7de08b4e 429 /*
1da177e4 430 * Switch FS and GS.
87b935a0
JF
431 *
432 * Segment register != 0 always requires a reload. Also
433 * reload when it has changed. When prev process used 64bit
434 * base always reload to avoid an information leak.
1da177e4 435 */
87b935a0
JF
436 if (unlikely(fsindex | next->fsindex | prev->fs)) {
437 loadsegment(fs, next->fsindex);
7de08b4e 438 /*
87b935a0
JF
439 * Check if the user used a selector != 0; if yes
440 * clear 64bit base, since overloaded base is always
441 * mapped to the Null selector
442 */
443 if (fsindex)
7de08b4e 444 prev->fs = 0;
1da177e4 445 }
87b935a0
JF
446 /* when next process has a 64bit base use it */
447 if (next->fs)
448 wrmsrl(MSR_FS_BASE, next->fs);
449 prev->fsindex = fsindex;
450
451 if (unlikely(gsindex | next->gsindex | prev->gs)) {
452 load_gs_index(next->gsindex);
453 if (gsindex)
7de08b4e 454 prev->gs = 0;
1da177e4 455 }
87b935a0
JF
456 if (next->gs)
457 wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
458 prev->gsindex = gsindex;
1da177e4 459
34ddc81a
LT
460 switch_fpu_finish(next_p, fpu);
461
7de08b4e 462 /*
45948d77 463 * Switch the PDA and FPU contexts.
1da177e4 464 */
3d1e42a7
BG
465 prev->usersp = percpu_read(old_rsp);
466 percpu_write(old_rsp, next->usersp);
c6f5e0ac 467 percpu_write(current_task, next_p);
18bd057b 468
9af45651 469 percpu_write(kernel_stack,
87b935a0 470 (unsigned long)task_stack_page(next_p) +
9af45651 471 THREAD_SIZE - KERNEL_STACK_OFFSET);
1da177e4
LT
472
473 /*
d3a4f48d 474 * Now maybe reload the debug registers and handle I/O bitmaps
1da177e4 475 */
eee3af4a
MM
476 if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT ||
477 task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
d3a4f48d 478 __switch_to_xtra(prev_p, next_p, tss);
1da177e4
LT
479
480 return prev_p;
481}
482
1da177e4
LT
483void set_personality_64bit(void)
484{
485 /* inherit personality from parent */
486
487 /* Make sure to be in 64bit mode */
6612538c 488 clear_thread_flag(TIF_IA32);
1da177e4 489
375906f8
SW
490 /* Ensure the corresponding mm is not marked. */
491 if (current->mm)
492 current->mm->context.ia32_compat = 0;
493
1da177e4
LT
494 /* TBD: overwrites user setup. Should have two bits.
495 But 64bit processes have always behaved this way,
496 so it's not too bad. The main problem is just that
6612538c 497 32bit childs are affected again. */
1da177e4
LT
498 current->personality &= ~READ_IMPLIES_EXEC;
499}
500
05d43ed8
PA
501void set_personality_ia32(void)
502{
503 /* inherit personality from parent */
504
505 /* Make sure to be in 32bit mode */
506 set_thread_flag(TIF_IA32);
1252f238 507 current->personality |= force_personality32;
05d43ed8 508
375906f8
SW
509 /* Mark the associated mm as containing 32-bit tasks. */
510 if (current->mm)
511 current->mm->context.ia32_compat = 1;
512
05d43ed8
PA
513 /* Prepare the first "return" to user space */
514 current_thread_info()->status |= TS_COMPAT;
515}
516
1da177e4
LT
517unsigned long get_wchan(struct task_struct *p)
518{
519 unsigned long stack;
7de08b4e 520 u64 fp, ip;
1da177e4
LT
521 int count = 0;
522
7de08b4e
GP
523 if (!p || p == current || p->state == TASK_RUNNING)
524 return 0;
57eafdc2 525 stack = (unsigned long)task_stack_page(p);
e1e23bb0 526 if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE)
1da177e4 527 return 0;
faca6227 528 fp = *(u64 *)(p->thread.sp);
7de08b4e 529 do {
a88cde13 530 if (fp < (unsigned long)stack ||
e1e23bb0 531 fp >= (unsigned long)stack+THREAD_SIZE)
7de08b4e 532 return 0;
65ea5b03
PA
533 ip = *(u64 *)(fp+8);
534 if (!in_sched_functions(ip))
535 return ip;
7de08b4e
GP
536 fp = *(u64 *)fp;
537 } while (count++ < 16);
1da177e4
LT
538 return 0;
539}
540
541long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
7de08b4e
GP
542{
543 int ret = 0;
1da177e4
LT
544 int doit = task == current;
545 int cpu;
546
7de08b4e 547 switch (code) {
1da177e4 548 case ARCH_SET_GS:
84929801 549 if (addr >= TASK_SIZE_OF(task))
7de08b4e 550 return -EPERM;
1da177e4 551 cpu = get_cpu();
7de08b4e 552 /* handle small bases via the GDT because that's faster to
1da177e4 553 switch. */
7de08b4e
GP
554 if (addr <= 0xffffffff) {
555 set_32bit_tls(task, GS_TLS, addr);
556 if (doit) {
1da177e4 557 load_TLS(&task->thread, cpu);
7de08b4e 558 load_gs_index(GS_TLS_SEL);
1da177e4 559 }
7de08b4e 560 task->thread.gsindex = GS_TLS_SEL;
1da177e4 561 task->thread.gs = 0;
7de08b4e 562 } else {
1da177e4
LT
563 task->thread.gsindex = 0;
564 task->thread.gs = addr;
565 if (doit) {
a88cde13
AK
566 load_gs_index(0);
567 ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
7de08b4e 568 }
1da177e4
LT
569 }
570 put_cpu();
571 break;
572 case ARCH_SET_FS:
573 /* Not strictly needed for fs, but do it for symmetry
574 with gs */
84929801 575 if (addr >= TASK_SIZE_OF(task))
6612538c 576 return -EPERM;
1da177e4 577 cpu = get_cpu();
6612538c 578 /* handle small bases via the GDT because that's faster to
1da177e4 579 switch. */
6612538c 580 if (addr <= 0xffffffff) {
1da177e4 581 set_32bit_tls(task, FS_TLS, addr);
6612538c
HS
582 if (doit) {
583 load_TLS(&task->thread, cpu);
ada85708 584 loadsegment(fs, FS_TLS_SEL);
1da177e4
LT
585 }
586 task->thread.fsindex = FS_TLS_SEL;
587 task->thread.fs = 0;
6612538c 588 } else {
1da177e4
LT
589 task->thread.fsindex = 0;
590 task->thread.fs = addr;
591 if (doit) {
592 /* set the selector to 0 to not confuse
593 __switch_to */
ada85708 594 loadsegment(fs, 0);
a88cde13 595 ret = checking_wrmsrl(MSR_FS_BASE, addr);
1da177e4
LT
596 }
597 }
598 put_cpu();
599 break;
6612538c
HS
600 case ARCH_GET_FS: {
601 unsigned long base;
1da177e4
LT
602 if (task->thread.fsindex == FS_TLS_SEL)
603 base = read_32bit_tls(task, FS_TLS);
a88cde13 604 else if (doit)
1da177e4 605 rdmsrl(MSR_FS_BASE, base);
a88cde13 606 else
1da177e4 607 base = task->thread.fs;
6612538c
HS
608 ret = put_user(base, (unsigned long __user *)addr);
609 break;
1da177e4 610 }
6612538c 611 case ARCH_GET_GS: {
1da177e4 612 unsigned long base;
97c2803c 613 unsigned gsindex;
1da177e4
LT
614 if (task->thread.gsindex == GS_TLS_SEL)
615 base = read_32bit_tls(task, GS_TLS);
97c2803c 616 else if (doit) {
ada85708 617 savesegment(gs, gsindex);
97c2803c
JB
618 if (gsindex)
619 rdmsrl(MSR_KERNEL_GS_BASE, base);
620 else
621 base = task->thread.gs;
7de08b4e 622 } else
1da177e4 623 base = task->thread.gs;
6612538c 624 ret = put_user(base, (unsigned long __user *)addr);
1da177e4
LT
625 break;
626 }
627
628 default:
629 ret = -EINVAL;
630 break;
6612538c 631 }
1da177e4 632
6612538c
HS
633 return ret;
634}
1da177e4
LT
635
636long sys_arch_prctl(int code, unsigned long addr)
637{
638 return do_arch_prctl(current, code, addr);
1da177e4
LT
639}
640
89240ba0
SS
641unsigned long KSTK_ESP(struct task_struct *task)
642{
643 return (test_tsk_thread_flag(task, TIF_IA32)) ?
644 (task_pt_regs(task)->sp) : ((task)->thread.usersp);
645}
This page took 0.688058 seconds and 5 git commands to generate.