]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - arch/x86/kernel/process_64.c
Merge branch 'core/types' into x86/x32
[mirror_ubuntu-bionic-kernel.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();
5bfb5d69 159 preempt_enable_no_resched();
1da177e4 160 schedule();
5bfb5d69 161 preempt_disable();
1da177e4
LT
162 }
163}
164
6612538c 165/* Prints also some state that isn't saved in the pt_regs */
e2ce07c8 166void __show_regs(struct pt_regs *regs, int all)
1da177e4
LT
167{
168 unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
bb1995d5 169 unsigned long d0, d1, d2, d3, d6, d7;
6612538c
HS
170 unsigned int fsindex, gsindex;
171 unsigned int ds, cs, es;
814e2c84
AI
172
173 show_regs_common();
d015a092 174 printk(KERN_DEFAULT "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
aafbd7eb 175 printk_address(regs->ip, 1);
d015a092 176 printk(KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
8092c654 177 regs->sp, regs->flags);
d015a092 178 printk(KERN_DEFAULT "RAX: %016lx RBX: %016lx RCX: %016lx\n",
65ea5b03 179 regs->ax, regs->bx, regs->cx);
d015a092 180 printk(KERN_DEFAULT "RDX: %016lx RSI: %016lx RDI: %016lx\n",
65ea5b03 181 regs->dx, regs->si, regs->di);
d015a092 182 printk(KERN_DEFAULT "RBP: %016lx R08: %016lx R09: %016lx\n",
65ea5b03 183 regs->bp, regs->r8, regs->r9);
d015a092 184 printk(KERN_DEFAULT "R10: %016lx R11: %016lx R12: %016lx\n",
7de08b4e 185 regs->r10, regs->r11, regs->r12);
d015a092 186 printk(KERN_DEFAULT "R13: %016lx R14: %016lx R15: %016lx\n",
7de08b4e 187 regs->r13, regs->r14, regs->r15);
1da177e4 188
7de08b4e
GP
189 asm("movl %%ds,%0" : "=r" (ds));
190 asm("movl %%cs,%0" : "=r" (cs));
191 asm("movl %%es,%0" : "=r" (es));
1da177e4
LT
192 asm("movl %%fs,%0" : "=r" (fsindex));
193 asm("movl %%gs,%0" : "=r" (gsindex));
194
195 rdmsrl(MSR_FS_BASE, fs);
7de08b4e
GP
196 rdmsrl(MSR_GS_BASE, gs);
197 rdmsrl(MSR_KERNEL_GS_BASE, shadowgs);
1da177e4 198
e2ce07c8
PE
199 if (!all)
200 return;
1da177e4 201
f51c9452
GOC
202 cr0 = read_cr0();
203 cr2 = read_cr2();
204 cr3 = read_cr3();
205 cr4 = read_cr4();
1da177e4 206
d015a092 207 printk(KERN_DEFAULT "FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n",
7de08b4e 208 fs, fsindex, gs, gsindex, shadowgs);
d015a092 209 printk(KERN_DEFAULT "CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds,
8092c654 210 es, cr0);
d015a092 211 printk(KERN_DEFAULT "CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3,
8092c654 212 cr4);
bb1995d5
AS
213
214 get_debugreg(d0, 0);
215 get_debugreg(d1, 1);
216 get_debugreg(d2, 2);
d015a092 217 printk(KERN_DEFAULT "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
bb1995d5
AS
218 get_debugreg(d3, 3);
219 get_debugreg(d6, 6);
220 get_debugreg(d7, 7);
d015a092 221 printk(KERN_DEFAULT "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
1da177e4
LT
222}
223
1da177e4
LT
224void release_thread(struct task_struct *dead_task)
225{
226 if (dead_task->mm) {
227 if (dead_task->mm->context.size) {
228 printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
229 dead_task->comm,
230 dead_task->mm->context.ldt,
231 dead_task->mm->context.size);
232 BUG();
233 }
234 }
235}
236
237static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
238{
6612538c 239 struct user_desc ud = {
1da177e4
LT
240 .base_addr = addr,
241 .limit = 0xfffff,
242 .seg_32bit = 1,
243 .limit_in_pages = 1,
244 .useable = 1,
245 };
ade1af77 246 struct desc_struct *desc = t->thread.tls_array;
1da177e4 247 desc += tls;
80fbb69a 248 fill_ldt(desc, &ud);
1da177e4
LT
249}
250
251static inline u32 read_32bit_tls(struct task_struct *t, int tls)
252{
91394eb0 253 return get_desc_base(&t->thread.tls_array[tls]);
1da177e4
LT
254}
255
256/*
257 * This gets called before we allocate a new thread and copy
258 * the current task into it.
259 */
260void prepare_to_copy(struct task_struct *tsk)
261{
262 unlazy_fpu(tsk);
263}
264
6f2c55b8 265int copy_thread(unsigned long clone_flags, unsigned long sp,
1da177e4 266 unsigned long unused,
7de08b4e 267 struct task_struct *p, struct pt_regs *regs)
1da177e4
LT
268{
269 int err;
7de08b4e 270 struct pt_regs *childregs;
1da177e4
LT
271 struct task_struct *me = current;
272
a88cde13 273 childregs = ((struct pt_regs *)
57eafdc2 274 (THREAD_SIZE + task_stack_page(p))) - 1;
1da177e4
LT
275 *childregs = *regs;
276
65ea5b03 277 childregs->ax = 0;
fa4b8f84
BG
278 if (user_mode(regs))
279 childregs->sp = sp;
280 else
65ea5b03 281 childregs->sp = (unsigned long)childregs;
1da177e4 282
faca6227
PA
283 p->thread.sp = (unsigned long) childregs;
284 p->thread.sp0 = (unsigned long) (childregs+1);
285 p->thread.usersp = me->thread.usersp;
1da177e4 286
e4f17c43 287 set_tsk_thread_flag(p, TIF_FORK);
1da177e4 288
66cb5917 289 p->thread.io_bitmap_ptr = NULL;
1da177e4 290
ada85708 291 savesegment(gs, p->thread.gsindex);
7ce5a2b9 292 p->thread.gs = p->thread.gsindex ? 0 : me->thread.gs;
ada85708 293 savesegment(fs, p->thread.fsindex);
7ce5a2b9 294 p->thread.fs = p->thread.fsindex ? 0 : me->thread.fs;
ada85708
JF
295 savesegment(es, p->thread.es);
296 savesegment(ds, p->thread.ds);
1da177e4 297
66cb5917 298 err = -ENOMEM;
24f1e32c 299 memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
66cb5917 300
d3a4f48d 301 if (unlikely(test_tsk_thread_flag(me, TIF_IO_BITMAP))) {
cced4022
TM
302 p->thread.io_bitmap_ptr = kmemdup(me->thread.io_bitmap_ptr,
303 IO_BITMAP_BYTES, GFP_KERNEL);
1da177e4
LT
304 if (!p->thread.io_bitmap_ptr) {
305 p->thread.io_bitmap_max = 0;
306 return -ENOMEM;
307 }
d3a4f48d 308 set_tsk_thread_flag(p, TIF_IO_BITMAP);
6612538c 309 }
1da177e4
LT
310
311 /*
312 * Set a new TLS for the child thread?
313 */
314 if (clone_flags & CLONE_SETTLS) {
315#ifdef CONFIG_IA32_EMULATION
316 if (test_thread_flag(TIF_IA32))
efd1ca52 317 err = do_set_thread_area(p, -1,
65ea5b03 318 (struct user_desc __user *)childregs->si, 0);
7de08b4e
GP
319 else
320#endif
321 err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8);
322 if (err)
1da177e4
LT
323 goto out;
324 }
325 err = 0;
326out:
327 if (err && p->thread.io_bitmap_ptr) {
328 kfree(p->thread.io_bitmap_ptr);
329 p->thread.io_bitmap_max = 0;
330 }
66cb5917 331
1da177e4
LT
332 return err;
333}
334
e634d8fc
PA
335static void
336start_thread_common(struct pt_regs *regs, unsigned long new_ip,
337 unsigned long new_sp,
338 unsigned int _cs, unsigned int _ss, unsigned int _ds)
513ad84b 339{
ada85708 340 loadsegment(fs, 0);
e634d8fc
PA
341 loadsegment(es, _ds);
342 loadsegment(ds, _ds);
513ad84b
IM
343 load_gs_index(0);
344 regs->ip = new_ip;
345 regs->sp = new_sp;
3d1e42a7 346 percpu_write(old_rsp, new_sp);
e634d8fc
PA
347 regs->cs = _cs;
348 regs->ss = _ss;
a6f05a6a 349 regs->flags = X86_EFLAGS_IF;
aa283f49
SS
350 /*
351 * Free the old FP and other extended state
352 */
353 free_thread_xstate(current);
513ad84b 354}
e634d8fc
PA
355
356void
357start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
358{
359 start_thread_common(regs, new_ip, new_sp,
360 __USER_CS, __USER_DS, 0);
361}
513ad84b 362
a6f05a6a
PA
363#ifdef CONFIG_IA32_EMULATION
364void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)
365{
e634d8fc 366 start_thread_common(regs, new_ip, new_sp,
d1a797f3
PA
367 test_thread_flag(TIF_X32)
368 ? __USER_CS : __USER32_CS,
369 __USER_DS, __USER_DS);
a6f05a6a
PA
370}
371#endif
513ad84b 372
1da177e4
LT
373/*
374 * switch_to(x,y) should switch tasks from x to y.
375 *
6612538c 376 * This could still be optimized:
1da177e4
LT
377 * - fold all the options into a flag word and test it with a single test.
378 * - could test fs/gs bitsliced
099f318b
AK
379 *
380 * Kprobes not supported here. Set the probe on schedule instead.
8b96f011 381 * Function graph tracer not supported too.
1da177e4 382 */
8b96f011 383__notrace_funcgraph struct task_struct *
a88cde13 384__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
1da177e4 385{
87b935a0
JF
386 struct thread_struct *prev = &prev_p->thread;
387 struct thread_struct *next = &next_p->thread;
6612538c 388 int cpu = smp_processor_id();
1da177e4 389 struct tss_struct *tss = &per_cpu(init_tss, cpu);
478de5a9 390 unsigned fsindex, gsindex;
17950c5b
JF
391 bool preload_fpu;
392
393 /*
394 * If the task has used fpu the last 5 timeslices, just do a full
395 * restore of the math state immediately to avoid the trap; the
396 * chances of needing FPU soon are obviously high now
397 */
398 preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5;
1da177e4 399
e07e23e1 400 /* we're going to use this soon, after a few expensive things */
17950c5b 401 if (preload_fpu)
86603283 402 prefetch(next->fpu.state);
e07e23e1 403
1da177e4
LT
404 /*
405 * Reload esp0, LDT and the page table pointer:
406 */
7818a1e0 407 load_sp0(tss, next);
1da177e4 408
7de08b4e 409 /*
1da177e4
LT
410 * Switch DS and ES.
411 * This won't pick up thread selector changes, but I guess that is ok.
412 */
ada85708 413 savesegment(es, prev->es);
1da177e4 414 if (unlikely(next->es | prev->es))
7de08b4e 415 loadsegment(es, next->es);
ada85708
JF
416
417 savesegment(ds, prev->ds);
1da177e4
LT
418 if (unlikely(next->ds | prev->ds))
419 loadsegment(ds, next->ds);
420
478de5a9
JF
421
422 /* We must save %fs and %gs before load_TLS() because
423 * %fs and %gs may be cleared by load_TLS().
424 *
425 * (e.g. xen_load_tls())
426 */
427 savesegment(fs, fsindex);
428 savesegment(gs, gsindex);
429
1da177e4
LT
430 load_TLS(next, cpu);
431
16d9dbf0 432 /* Must be after DS reload */
a4d4fbc7 433 __unlazy_fpu(prev_p);
16d9dbf0 434
17950c5b
JF
435 /* Make sure cpu is ready for new context */
436 if (preload_fpu)
437 clts();
438
3fe0a63e
JF
439 /*
440 * Leave lazy mode, flushing any hypercalls made here.
441 * This must be done before restoring TLS segments so
442 * the GDT and LDT are properly updated, and must be
443 * done before math_state_restore, so the TS bit is up
444 * to date.
445 */
224101ed 446 arch_end_context_switch(next_p);
3fe0a63e 447
7de08b4e 448 /*
1da177e4 449 * Switch FS and GS.
87b935a0
JF
450 *
451 * Segment register != 0 always requires a reload. Also
452 * reload when it has changed. When prev process used 64bit
453 * base always reload to avoid an information leak.
1da177e4 454 */
87b935a0
JF
455 if (unlikely(fsindex | next->fsindex | prev->fs)) {
456 loadsegment(fs, next->fsindex);
7de08b4e 457 /*
87b935a0
JF
458 * Check if the user used a selector != 0; if yes
459 * clear 64bit base, since overloaded base is always
460 * mapped to the Null selector
461 */
462 if (fsindex)
7de08b4e 463 prev->fs = 0;
1da177e4 464 }
87b935a0
JF
465 /* when next process has a 64bit base use it */
466 if (next->fs)
467 wrmsrl(MSR_FS_BASE, next->fs);
468 prev->fsindex = fsindex;
469
470 if (unlikely(gsindex | next->gsindex | prev->gs)) {
471 load_gs_index(next->gsindex);
472 if (gsindex)
7de08b4e 473 prev->gs = 0;
1da177e4 474 }
87b935a0
JF
475 if (next->gs)
476 wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
477 prev->gsindex = gsindex;
1da177e4 478
7de08b4e 479 /*
45948d77 480 * Switch the PDA and FPU contexts.
1da177e4 481 */
3d1e42a7
BG
482 prev->usersp = percpu_read(old_rsp);
483 percpu_write(old_rsp, next->usersp);
c6f5e0ac 484 percpu_write(current_task, next_p);
18bd057b 485
9af45651 486 percpu_write(kernel_stack,
87b935a0 487 (unsigned long)task_stack_page(next_p) +
9af45651 488 THREAD_SIZE - KERNEL_STACK_OFFSET);
1da177e4
LT
489
490 /*
d3a4f48d 491 * Now maybe reload the debug registers and handle I/O bitmaps
1da177e4 492 */
eee3af4a
MM
493 if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT ||
494 task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
d3a4f48d 495 __switch_to_xtra(prev_p, next_p, tss);
1da177e4 496
17950c5b
JF
497 /*
498 * Preload the FPU context, now that we've determined that the
499 * task is likely to be using it.
e07e23e1 500 */
17950c5b
JF
501 if (preload_fpu)
502 __math_state_restore();
66cb5917 503
1da177e4
LT
504 return prev_p;
505}
506
1da177e4
LT
507void set_personality_64bit(void)
508{
509 /* inherit personality from parent */
510
511 /* Make sure to be in 64bit mode */
6612538c 512 clear_thread_flag(TIF_IA32);
d1a797f3 513 clear_thread_flag(TIF_X32);
6bd33008 514 clear_thread_flag(TIF_ADDR32);
bb212724 515 clear_thread_flag(TIF_X32);
1da177e4 516
375906f8
SW
517 /* Ensure the corresponding mm is not marked. */
518 if (current->mm)
519 current->mm->context.ia32_compat = 0;
520
1da177e4
LT
521 /* TBD: overwrites user setup. Should have two bits.
522 But 64bit processes have always behaved this way,
523 so it's not too bad. The main problem is just that
6612538c 524 32bit childs are affected again. */
1da177e4
LT
525 current->personality &= ~READ_IMPLIES_EXEC;
526}
527
d1a797f3 528void set_personality_ia32(bool x32)
05d43ed8
PA
529{
530 /* inherit personality from parent */
531
532 /* Make sure to be in 32bit mode */
6bd33008 533 set_thread_flag(TIF_ADDR32);
05d43ed8 534
375906f8
SW
535 /* Mark the associated mm as containing 32-bit tasks. */
536 if (current->mm)
537 current->mm->context.ia32_compat = 1;
538
d1a797f3
PA
539 if (x32) {
540 clear_thread_flag(TIF_IA32);
541 set_thread_flag(TIF_X32);
542 current->personality &= ~READ_IMPLIES_EXEC;
543 } else {
544 set_thread_flag(TIF_IA32);
545 clear_thread_flag(TIF_X32);
546 current->personality |= force_personality32;
547 /* Prepare the first "return" to user space */
548 current_thread_info()->status |= TS_COMPAT;
549 }
05d43ed8
PA
550}
551
1da177e4
LT
552unsigned long get_wchan(struct task_struct *p)
553{
554 unsigned long stack;
7de08b4e 555 u64 fp, ip;
1da177e4
LT
556 int count = 0;
557
7de08b4e
GP
558 if (!p || p == current || p->state == TASK_RUNNING)
559 return 0;
57eafdc2 560 stack = (unsigned long)task_stack_page(p);
e1e23bb0 561 if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE)
1da177e4 562 return 0;
faca6227 563 fp = *(u64 *)(p->thread.sp);
7de08b4e 564 do {
a88cde13 565 if (fp < (unsigned long)stack ||
e1e23bb0 566 fp >= (unsigned long)stack+THREAD_SIZE)
7de08b4e 567 return 0;
65ea5b03
PA
568 ip = *(u64 *)(fp+8);
569 if (!in_sched_functions(ip))
570 return ip;
7de08b4e
GP
571 fp = *(u64 *)fp;
572 } while (count++ < 16);
1da177e4
LT
573 return 0;
574}
575
576long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
7de08b4e
GP
577{
578 int ret = 0;
1da177e4
LT
579 int doit = task == current;
580 int cpu;
581
7de08b4e 582 switch (code) {
1da177e4 583 case ARCH_SET_GS:
84929801 584 if (addr >= TASK_SIZE_OF(task))
7de08b4e 585 return -EPERM;
1da177e4 586 cpu = get_cpu();
7de08b4e 587 /* handle small bases via the GDT because that's faster to
1da177e4 588 switch. */
7de08b4e
GP
589 if (addr <= 0xffffffff) {
590 set_32bit_tls(task, GS_TLS, addr);
591 if (doit) {
1da177e4 592 load_TLS(&task->thread, cpu);
7de08b4e 593 load_gs_index(GS_TLS_SEL);
1da177e4 594 }
7de08b4e 595 task->thread.gsindex = GS_TLS_SEL;
1da177e4 596 task->thread.gs = 0;
7de08b4e 597 } else {
1da177e4
LT
598 task->thread.gsindex = 0;
599 task->thread.gs = addr;
600 if (doit) {
a88cde13
AK
601 load_gs_index(0);
602 ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
7de08b4e 603 }
1da177e4
LT
604 }
605 put_cpu();
606 break;
607 case ARCH_SET_FS:
608 /* Not strictly needed for fs, but do it for symmetry
609 with gs */
84929801 610 if (addr >= TASK_SIZE_OF(task))
6612538c 611 return -EPERM;
1da177e4 612 cpu = get_cpu();
6612538c 613 /* handle small bases via the GDT because that's faster to
1da177e4 614 switch. */
6612538c 615 if (addr <= 0xffffffff) {
1da177e4 616 set_32bit_tls(task, FS_TLS, addr);
6612538c
HS
617 if (doit) {
618 load_TLS(&task->thread, cpu);
ada85708 619 loadsegment(fs, FS_TLS_SEL);
1da177e4
LT
620 }
621 task->thread.fsindex = FS_TLS_SEL;
622 task->thread.fs = 0;
6612538c 623 } else {
1da177e4
LT
624 task->thread.fsindex = 0;
625 task->thread.fs = addr;
626 if (doit) {
627 /* set the selector to 0 to not confuse
628 __switch_to */
ada85708 629 loadsegment(fs, 0);
a88cde13 630 ret = checking_wrmsrl(MSR_FS_BASE, addr);
1da177e4
LT
631 }
632 }
633 put_cpu();
634 break;
6612538c
HS
635 case ARCH_GET_FS: {
636 unsigned long base;
1da177e4
LT
637 if (task->thread.fsindex == FS_TLS_SEL)
638 base = read_32bit_tls(task, FS_TLS);
a88cde13 639 else if (doit)
1da177e4 640 rdmsrl(MSR_FS_BASE, base);
a88cde13 641 else
1da177e4 642 base = task->thread.fs;
6612538c
HS
643 ret = put_user(base, (unsigned long __user *)addr);
644 break;
1da177e4 645 }
6612538c 646 case ARCH_GET_GS: {
1da177e4 647 unsigned long base;
97c2803c 648 unsigned gsindex;
1da177e4
LT
649 if (task->thread.gsindex == GS_TLS_SEL)
650 base = read_32bit_tls(task, GS_TLS);
97c2803c 651 else if (doit) {
ada85708 652 savesegment(gs, gsindex);
97c2803c
JB
653 if (gsindex)
654 rdmsrl(MSR_KERNEL_GS_BASE, base);
655 else
656 base = task->thread.gs;
7de08b4e 657 } else
1da177e4 658 base = task->thread.gs;
6612538c 659 ret = put_user(base, (unsigned long __user *)addr);
1da177e4
LT
660 break;
661 }
662
663 default:
664 ret = -EINVAL;
665 break;
6612538c 666 }
1da177e4 667
6612538c
HS
668 return ret;
669}
1da177e4
LT
670
671long sys_arch_prctl(int code, unsigned long addr)
672{
673 return do_arch_prctl(current, code, addr);
1da177e4
LT
674}
675
89240ba0
SS
676unsigned long KSTK_ESP(struct task_struct *task)
677{
678 return (test_tsk_thread_flag(task, TIF_IA32)) ?
679 (task_pt_regs(task)->sp) : ((task)->thread.usersp);
680}