290183e9731a2c45e25d0855533d8a7bea69e74c
[deliverable/linux.git] / arch / x86 / kernel / process_64.c
1 /*
2 * Copyright (C) 1995 Linus Torvalds
3 *
4 * Pentium III FXSR, SSE support
5 * Gareth Hughes <gareth@valinux.com>, May 2000
6 *
7 * X86-64 port
8 * Andi Kleen.
9 *
10 * CPU hotplug support - ashok.raj@intel.com
11 */
12
13 /*
14 * This file handles the architecture-dependent parts of process handling..
15 */
16
17 #include <stdarg.h>
18
19 #include <linux/cpu.h>
20 #include <linux/errno.h>
21 #include <linux/sched.h>
22 #include <linux/fs.h>
23 #include <linux/kernel.h>
24 #include <linux/mm.h>
25 #include <linux/elfcore.h>
26 #include <linux/smp.h>
27 #include <linux/slab.h>
28 #include <linux/user.h>
29 #include <linux/interrupt.h>
30 #include <linux/utsname.h>
31 #include <linux/delay.h>
32 #include <linux/module.h>
33 #include <linux/ptrace.h>
34 #include <linux/random.h>
35 #include <linux/notifier.h>
36 #include <linux/kprobes.h>
37 #include <linux/kdebug.h>
38 #include <linux/tick.h>
39 #include <linux/prctl.h>
40
41 #include <asm/uaccess.h>
42 #include <asm/pgtable.h>
43 #include <asm/system.h>
44 #include <asm/io.h>
45 #include <asm/processor.h>
46 #include <asm/i387.h>
47 #include <asm/mmu_context.h>
48 #include <asm/pda.h>
49 #include <asm/prctl.h>
50 #include <asm/desc.h>
51 #include <asm/proto.h>
52 #include <asm/ia32.h>
53 #include <asm/idle.h>
54
55 asmlinkage extern void ret_from_fork(void);
56
57 unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
58
59 static ATOMIC_NOTIFIER_HEAD(idle_notifier);
60
61 void idle_notifier_register(struct notifier_block *n)
62 {
63 atomic_notifier_chain_register(&idle_notifier, n);
64 }
65
66 void enter_idle(void)
67 {
68 write_pda(isidle, 1);
69 atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
70 }
71
72 static void __exit_idle(void)
73 {
74 if (test_and_clear_bit_pda(0, isidle) == 0)
75 return;
76 atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
77 }
78
79 /* Called from interrupts to signify idle end */
80 void exit_idle(void)
81 {
82 /* idle loop has pid 0 */
83 if (current->pid)
84 return;
85 __exit_idle();
86 }
87
88 #ifdef CONFIG_HOTPLUG_CPU
89 DECLARE_PER_CPU(int, cpu_state);
90
91 #include <asm/nmi.h>
92 /* We halt the CPU with physical CPU hotplug */
93 static inline void play_dead(void)
94 {
95 idle_task_exit();
96 wbinvd();
97 mb();
98 /* Ack it */
99 __get_cpu_var(cpu_state) = CPU_DEAD;
100
101 local_irq_disable();
102 while (1)
103 halt();
104 }
105 #else
106 static inline void play_dead(void)
107 {
108 BUG();
109 }
110 #endif /* CONFIG_HOTPLUG_CPU */
111
112 /*
113 * The idle thread. There's no useful work to be
114 * done, so just try to conserve power and have a
115 * low exit latency (ie sit in a loop waiting for
116 * somebody to say that they'd like to reschedule)
117 */
118 void cpu_idle(void)
119 {
120 current_thread_info()->status |= TS_POLLING;
121 /* endless idle loop with no priority at all */
122 while (1) {
123 tick_nohz_stop_sched_tick();
124 while (!need_resched()) {
125
126 rmb();
127
128 if (cpu_is_offline(smp_processor_id()))
129 play_dead();
130 /*
131 * Idle routines should keep interrupts disabled
132 * from here on, until they go to idle.
133 * Otherwise, idle callbacks can misfire.
134 */
135 local_irq_disable();
136 enter_idle();
137 pm_idle();
138 /* In many cases the interrupt that ended idle
139 has already called exit_idle. But some idle
140 loops can be woken up without interrupt. */
141 __exit_idle();
142 }
143
144 tick_nohz_restart_sched_tick();
145 preempt_enable_no_resched();
146 schedule();
147 preempt_disable();
148 }
149 }
150
151 /* Prints also some state that isn't saved in the pt_regs */
152 void __show_regs(struct pt_regs * regs)
153 {
154 unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
155 unsigned long d0, d1, d2, d3, d6, d7;
156 unsigned int fsindex, gsindex;
157 unsigned int ds, cs, es;
158
159 printk("\n");
160 print_modules();
161 printk("Pid: %d, comm: %.20s %s %s %.*s\n",
162 current->pid, current->comm, print_tainted(),
163 init_utsname()->release,
164 (int)strcspn(init_utsname()->version, " "),
165 init_utsname()->version);
166 printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
167 printk_address(regs->ip, 1);
168 printk("RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->sp,
169 regs->flags);
170 printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
171 regs->ax, regs->bx, regs->cx);
172 printk("RDX: %016lx RSI: %016lx RDI: %016lx\n",
173 regs->dx, regs->si, regs->di);
174 printk("RBP: %016lx R08: %016lx R09: %016lx\n",
175 regs->bp, regs->r8, regs->r9);
176 printk("R10: %016lx R11: %016lx R12: %016lx\n",
177 regs->r10, regs->r11, regs->r12);
178 printk("R13: %016lx R14: %016lx R15: %016lx\n",
179 regs->r13, regs->r14, regs->r15);
180
181 asm("movl %%ds,%0" : "=r" (ds));
182 asm("movl %%cs,%0" : "=r" (cs));
183 asm("movl %%es,%0" : "=r" (es));
184 asm("movl %%fs,%0" : "=r" (fsindex));
185 asm("movl %%gs,%0" : "=r" (gsindex));
186
187 rdmsrl(MSR_FS_BASE, fs);
188 rdmsrl(MSR_GS_BASE, gs);
189 rdmsrl(MSR_KERNEL_GS_BASE, shadowgs);
190
191 cr0 = read_cr0();
192 cr2 = read_cr2();
193 cr3 = read_cr3();
194 cr4 = read_cr4();
195
196 printk("FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n",
197 fs,fsindex,gs,gsindex,shadowgs);
198 printk("CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0);
199 printk("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4);
200
201 get_debugreg(d0, 0);
202 get_debugreg(d1, 1);
203 get_debugreg(d2, 2);
204 printk("DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
205 get_debugreg(d3, 3);
206 get_debugreg(d6, 6);
207 get_debugreg(d7, 7);
208 printk("DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
209 }
210
211 void show_regs(struct pt_regs *regs)
212 {
213 printk("CPU %d:", smp_processor_id());
214 __show_regs(regs);
215 show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
216 }
217
218 /*
219 * Free current thread data structures etc..
220 */
221 void exit_thread(void)
222 {
223 struct task_struct *me = current;
224 struct thread_struct *t = &me->thread;
225
226 if (me->thread.io_bitmap_ptr) {
227 struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
228
229 kfree(t->io_bitmap_ptr);
230 t->io_bitmap_ptr = NULL;
231 clear_thread_flag(TIF_IO_BITMAP);
232 /*
233 * Careful, clear this in the TSS too:
234 */
235 memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
236 t->io_bitmap_max = 0;
237 put_cpu();
238 }
239 }
240
241 void flush_thread(void)
242 {
243 struct task_struct *tsk = current;
244
245 if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
246 clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
247 if (test_tsk_thread_flag(tsk, TIF_IA32)) {
248 clear_tsk_thread_flag(tsk, TIF_IA32);
249 } else {
250 set_tsk_thread_flag(tsk, TIF_IA32);
251 current_thread_info()->status |= TS_COMPAT;
252 }
253 }
254 clear_tsk_thread_flag(tsk, TIF_DEBUG);
255
256 tsk->thread.debugreg0 = 0;
257 tsk->thread.debugreg1 = 0;
258 tsk->thread.debugreg2 = 0;
259 tsk->thread.debugreg3 = 0;
260 tsk->thread.debugreg6 = 0;
261 tsk->thread.debugreg7 = 0;
262 memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
263 /*
264 * Forget coprocessor state..
265 */
266 tsk->fpu_counter = 0;
267 clear_fpu(tsk);
268 clear_used_math();
269 }
270
271 void release_thread(struct task_struct *dead_task)
272 {
273 if (dead_task->mm) {
274 if (dead_task->mm->context.size) {
275 printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
276 dead_task->comm,
277 dead_task->mm->context.ldt,
278 dead_task->mm->context.size);
279 BUG();
280 }
281 }
282 }
283
284 static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
285 {
286 struct user_desc ud = {
287 .base_addr = addr,
288 .limit = 0xfffff,
289 .seg_32bit = 1,
290 .limit_in_pages = 1,
291 .useable = 1,
292 };
293 struct desc_struct *desc = t->thread.tls_array;
294 desc += tls;
295 fill_ldt(desc, &ud);
296 }
297
298 static inline u32 read_32bit_tls(struct task_struct *t, int tls)
299 {
300 return get_desc_base(&t->thread.tls_array[tls]);
301 }
302
303 /*
304 * This gets called before we allocate a new thread and copy
305 * the current task into it.
306 */
307 void prepare_to_copy(struct task_struct *tsk)
308 {
309 unlazy_fpu(tsk);
310 }
311
312 int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
313 unsigned long unused,
314 struct task_struct * p, struct pt_regs * regs)
315 {
316 int err;
317 struct pt_regs * childregs;
318 struct task_struct *me = current;
319
320 childregs = ((struct pt_regs *)
321 (THREAD_SIZE + task_stack_page(p))) - 1;
322 *childregs = *regs;
323
324 childregs->ax = 0;
325 childregs->sp = sp;
326 if (sp == ~0UL)
327 childregs->sp = (unsigned long)childregs;
328
329 p->thread.sp = (unsigned long) childregs;
330 p->thread.sp0 = (unsigned long) (childregs+1);
331 p->thread.usersp = me->thread.usersp;
332
333 set_tsk_thread_flag(p, TIF_FORK);
334
335 p->thread.fs = me->thread.fs;
336 p->thread.gs = me->thread.gs;
337
338 asm("mov %%gs,%0" : "=m" (p->thread.gsindex));
339 asm("mov %%fs,%0" : "=m" (p->thread.fsindex));
340 asm("mov %%es,%0" : "=m" (p->thread.es));
341 asm("mov %%ds,%0" : "=m" (p->thread.ds));
342
343 if (unlikely(test_tsk_thread_flag(me, TIF_IO_BITMAP))) {
344 p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
345 if (!p->thread.io_bitmap_ptr) {
346 p->thread.io_bitmap_max = 0;
347 return -ENOMEM;
348 }
349 memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
350 IO_BITMAP_BYTES);
351 set_tsk_thread_flag(p, TIF_IO_BITMAP);
352 }
353
354 /*
355 * Set a new TLS for the child thread?
356 */
357 if (clone_flags & CLONE_SETTLS) {
358 #ifdef CONFIG_IA32_EMULATION
359 if (test_thread_flag(TIF_IA32))
360 err = do_set_thread_area(p, -1,
361 (struct user_desc __user *)childregs->si, 0);
362 else
363 #endif
364 err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8);
365 if (err)
366 goto out;
367 }
368 err = 0;
369 out:
370 if (err && p->thread.io_bitmap_ptr) {
371 kfree(p->thread.io_bitmap_ptr);
372 p->thread.io_bitmap_max = 0;
373 }
374 return err;
375 }
376
377 void
378 start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
379 {
380 asm volatile("movl %0, %%fs; movl %0, %%es; movl %0, %%ds" :: "r"(0));
381 load_gs_index(0);
382 regs->ip = new_ip;
383 regs->sp = new_sp;
384 write_pda(oldrsp, new_sp);
385 regs->cs = __USER_CS;
386 regs->ss = __USER_DS;
387 regs->flags = 0x200;
388 set_fs(USER_DS);
389 /*
390 * Free the old FP and other extended state
391 */
392 free_thread_xstate(current);
393 }
394 EXPORT_SYMBOL_GPL(start_thread);
395
396 static void hard_disable_TSC(void)
397 {
398 write_cr4(read_cr4() | X86_CR4_TSD);
399 }
400
401 void disable_TSC(void)
402 {
403 preempt_disable();
404 if (!test_and_set_thread_flag(TIF_NOTSC))
405 /*
406 * Must flip the CPU state synchronously with
407 * TIF_NOTSC in the current running context.
408 */
409 hard_disable_TSC();
410 preempt_enable();
411 }
412
413 static void hard_enable_TSC(void)
414 {
415 write_cr4(read_cr4() & ~X86_CR4_TSD);
416 }
417
418 static void enable_TSC(void)
419 {
420 preempt_disable();
421 if (test_and_clear_thread_flag(TIF_NOTSC))
422 /*
423 * Must flip the CPU state synchronously with
424 * TIF_NOTSC in the current running context.
425 */
426 hard_enable_TSC();
427 preempt_enable();
428 }
429
430 int get_tsc_mode(unsigned long adr)
431 {
432 unsigned int val;
433
434 if (test_thread_flag(TIF_NOTSC))
435 val = PR_TSC_SIGSEGV;
436 else
437 val = PR_TSC_ENABLE;
438
439 return put_user(val, (unsigned int __user *)adr);
440 }
441
442 int set_tsc_mode(unsigned int val)
443 {
444 if (val == PR_TSC_SIGSEGV)
445 disable_TSC();
446 else if (val == PR_TSC_ENABLE)
447 enable_TSC();
448 else
449 return -EINVAL;
450
451 return 0;
452 }
453
454 /*
455 * This special macro can be used to load a debugging register
456 */
457 #define loaddebug(thread, r) set_debugreg(thread->debugreg ## r, r)
458
459 static inline void __switch_to_xtra(struct task_struct *prev_p,
460 struct task_struct *next_p,
461 struct tss_struct *tss)
462 {
463 struct thread_struct *prev, *next;
464 unsigned long debugctl;
465
466 prev = &prev_p->thread,
467 next = &next_p->thread;
468
469 debugctl = prev->debugctlmsr;
470 if (next->ds_area_msr != prev->ds_area_msr) {
471 /* we clear debugctl to make sure DS
472 * is not in use when we change it */
473 debugctl = 0;
474 update_debugctlmsr(0);
475 wrmsrl(MSR_IA32_DS_AREA, next->ds_area_msr);
476 }
477
478 if (next->debugctlmsr != debugctl)
479 update_debugctlmsr(next->debugctlmsr);
480
481 if (test_tsk_thread_flag(next_p, TIF_DEBUG)) {
482 loaddebug(next, 0);
483 loaddebug(next, 1);
484 loaddebug(next, 2);
485 loaddebug(next, 3);
486 /* no 4 and 5 */
487 loaddebug(next, 6);
488 loaddebug(next, 7);
489 }
490
491 if (test_tsk_thread_flag(prev_p, TIF_NOTSC) ^
492 test_tsk_thread_flag(next_p, TIF_NOTSC)) {
493 /* prev and next are different */
494 if (test_tsk_thread_flag(next_p, TIF_NOTSC))
495 hard_disable_TSC();
496 else
497 hard_enable_TSC();
498 }
499
500 if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {
501 /*
502 * Copy the relevant range of the IO bitmap.
503 * Normally this is 128 bytes or less:
504 */
505 memcpy(tss->io_bitmap, next->io_bitmap_ptr,
506 max(prev->io_bitmap_max, next->io_bitmap_max));
507 } else if (test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) {
508 /*
509 * Clear any possible leftover bits:
510 */
511 memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
512 }
513
514 #ifdef X86_BTS
515 if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS))
516 ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS);
517
518 if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS))
519 ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES);
520 #endif
521 }
522
523 /*
524 * switch_to(x,y) should switch tasks from x to y.
525 *
526 * This could still be optimized:
527 * - fold all the options into a flag word and test it with a single test.
528 * - could test fs/gs bitsliced
529 *
530 * Kprobes not supported here. Set the probe on schedule instead.
531 */
532 struct task_struct *
533 __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
534 {
535 struct thread_struct *prev = &prev_p->thread,
536 *next = &next_p->thread;
537 int cpu = smp_processor_id();
538 struct tss_struct *tss = &per_cpu(init_tss, cpu);
539
540 /* we're going to use this soon, after a few expensive things */
541 if (next_p->fpu_counter>5)
542 prefetch(next->xstate);
543
544 /*
545 * Reload esp0, LDT and the page table pointer:
546 */
547 load_sp0(tss, next);
548
549 /*
550 * Switch DS and ES.
551 * This won't pick up thread selector changes, but I guess that is ok.
552 */
553 asm volatile("mov %%es,%0" : "=m" (prev->es));
554 if (unlikely(next->es | prev->es))
555 loadsegment(es, next->es);
556
557 asm volatile ("mov %%ds,%0" : "=m" (prev->ds));
558 if (unlikely(next->ds | prev->ds))
559 loadsegment(ds, next->ds);
560
561 load_TLS(next, cpu);
562
563 /*
564 * Switch FS and GS.
565 */
566 {
567 unsigned fsindex;
568 asm volatile("movl %%fs,%0" : "=r" (fsindex));
569 /* segment register != 0 always requires a reload.
570 also reload when it has changed.
571 when prev process used 64bit base always reload
572 to avoid an information leak. */
573 if (unlikely(fsindex | next->fsindex | prev->fs)) {
574 loadsegment(fs, next->fsindex);
575 /* check if the user used a selector != 0
576 * if yes clear 64bit base, since overloaded base
577 * is always mapped to the Null selector
578 */
579 if (fsindex)
580 prev->fs = 0;
581 }
582 /* when next process has a 64bit base use it */
583 if (next->fs)
584 wrmsrl(MSR_FS_BASE, next->fs);
585 prev->fsindex = fsindex;
586 }
587 {
588 unsigned gsindex;
589 asm volatile("movl %%gs,%0" : "=r" (gsindex));
590 if (unlikely(gsindex | next->gsindex | prev->gs)) {
591 load_gs_index(next->gsindex);
592 if (gsindex)
593 prev->gs = 0;
594 }
595 if (next->gs)
596 wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
597 prev->gsindex = gsindex;
598 }
599
600 /* Must be after DS reload */
601 unlazy_fpu(prev_p);
602
603 /*
604 * Switch the PDA and FPU contexts.
605 */
606 prev->usersp = read_pda(oldrsp);
607 write_pda(oldrsp, next->usersp);
608 write_pda(pcurrent, next_p);
609
610 write_pda(kernelstack,
611 (unsigned long)task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET);
612 #ifdef CONFIG_CC_STACKPROTECTOR
613 write_pda(stack_canary, next_p->stack_canary);
614 /*
615 * Build time only check to make sure the stack_canary is at
616 * offset 40 in the pda; this is a gcc ABI requirement
617 */
618 BUILD_BUG_ON(offsetof(struct x8664_pda, stack_canary) != 40);
619 #endif
620
621 /*
622 * Now maybe reload the debug registers and handle I/O bitmaps
623 */
624 if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT ||
625 task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
626 __switch_to_xtra(prev_p, next_p, tss);
627
628 /* If the task has used fpu the last 5 timeslices, just do a full
629 * restore of the math state immediately to avoid the trap; the
630 * chances of needing FPU soon are obviously high now
631 *
632 * tsk_used_math() checks prevent calling math_state_restore(),
633 * which can sleep in the case of !tsk_used_math()
634 */
635 if (tsk_used_math(next_p) && next_p->fpu_counter > 5)
636 math_state_restore();
637 return prev_p;
638 }
639
640 /*
641 * sys_execve() executes a new program.
642 */
643 asmlinkage
644 long sys_execve(char __user *name, char __user * __user *argv,
645 char __user * __user *envp, struct pt_regs *regs)
646 {
647 long error;
648 char * filename;
649
650 filename = getname(name);
651 error = PTR_ERR(filename);
652 if (IS_ERR(filename))
653 return error;
654 error = do_execve(filename, argv, envp, regs);
655 putname(filename);
656 return error;
657 }
658
659 void set_personality_64bit(void)
660 {
661 /* inherit personality from parent */
662
663 /* Make sure to be in 64bit mode */
664 clear_thread_flag(TIF_IA32);
665
666 /* TBD: overwrites user setup. Should have two bits.
667 But 64bit processes have always behaved this way,
668 so it's not too bad. The main problem is just that
669 32bit childs are affected again. */
670 current->personality &= ~READ_IMPLIES_EXEC;
671 }
672
673 asmlinkage long sys_fork(struct pt_regs *regs)
674 {
675 return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
676 }
677
678 asmlinkage long
679 sys_clone(unsigned long clone_flags, unsigned long newsp,
680 void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
681 {
682 if (!newsp)
683 newsp = regs->sp;
684 return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
685 }
686
687 /*
688 * This is trivial, and on the face of it looks like it
689 * could equally well be done in user mode.
690 *
691 * Not so, for quite unobvious reasons - register pressure.
692 * In user mode vfork() cannot have a stack frame, and if
693 * done by calling the "clone()" system call directly, you
694 * do not have enough call-clobbered registers to hold all
695 * the information you need.
696 */
697 asmlinkage long sys_vfork(struct pt_regs *regs)
698 {
699 return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0,
700 NULL, NULL);
701 }
702
703 unsigned long get_wchan(struct task_struct *p)
704 {
705 unsigned long stack;
706 u64 fp,ip;
707 int count = 0;
708
709 if (!p || p == current || p->state==TASK_RUNNING)
710 return 0;
711 stack = (unsigned long)task_stack_page(p);
712 if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE)
713 return 0;
714 fp = *(u64 *)(p->thread.sp);
715 do {
716 if (fp < (unsigned long)stack ||
717 fp > (unsigned long)stack+THREAD_SIZE)
718 return 0;
719 ip = *(u64 *)(fp+8);
720 if (!in_sched_functions(ip))
721 return ip;
722 fp = *(u64 *)fp;
723 } while (count++ < 16);
724 return 0;
725 }
726
727 long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
728 {
729 int ret = 0;
730 int doit = task == current;
731 int cpu;
732
733 switch (code) {
734 case ARCH_SET_GS:
735 if (addr >= TASK_SIZE_OF(task))
736 return -EPERM;
737 cpu = get_cpu();
738 /* handle small bases via the GDT because that's faster to
739 switch. */
740 if (addr <= 0xffffffff) {
741 set_32bit_tls(task, GS_TLS, addr);
742 if (doit) {
743 load_TLS(&task->thread, cpu);
744 load_gs_index(GS_TLS_SEL);
745 }
746 task->thread.gsindex = GS_TLS_SEL;
747 task->thread.gs = 0;
748 } else {
749 task->thread.gsindex = 0;
750 task->thread.gs = addr;
751 if (doit) {
752 load_gs_index(0);
753 ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
754 }
755 }
756 put_cpu();
757 break;
758 case ARCH_SET_FS:
759 /* Not strictly needed for fs, but do it for symmetry
760 with gs */
761 if (addr >= TASK_SIZE_OF(task))
762 return -EPERM;
763 cpu = get_cpu();
764 /* handle small bases via the GDT because that's faster to
765 switch. */
766 if (addr <= 0xffffffff) {
767 set_32bit_tls(task, FS_TLS, addr);
768 if (doit) {
769 load_TLS(&task->thread, cpu);
770 asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
771 }
772 task->thread.fsindex = FS_TLS_SEL;
773 task->thread.fs = 0;
774 } else {
775 task->thread.fsindex = 0;
776 task->thread.fs = addr;
777 if (doit) {
778 /* set the selector to 0 to not confuse
779 __switch_to */
780 asm volatile("movl %0,%%fs" :: "r" (0));
781 ret = checking_wrmsrl(MSR_FS_BASE, addr);
782 }
783 }
784 put_cpu();
785 break;
786 case ARCH_GET_FS: {
787 unsigned long base;
788 if (task->thread.fsindex == FS_TLS_SEL)
789 base = read_32bit_tls(task, FS_TLS);
790 else if (doit)
791 rdmsrl(MSR_FS_BASE, base);
792 else
793 base = task->thread.fs;
794 ret = put_user(base, (unsigned long __user *)addr);
795 break;
796 }
797 case ARCH_GET_GS: {
798 unsigned long base;
799 unsigned gsindex;
800 if (task->thread.gsindex == GS_TLS_SEL)
801 base = read_32bit_tls(task, GS_TLS);
802 else if (doit) {
803 asm("movl %%gs,%0" : "=r" (gsindex));
804 if (gsindex)
805 rdmsrl(MSR_KERNEL_GS_BASE, base);
806 else
807 base = task->thread.gs;
808 }
809 else
810 base = task->thread.gs;
811 ret = put_user(base, (unsigned long __user *)addr);
812 break;
813 }
814
815 default:
816 ret = -EINVAL;
817 break;
818 }
819
820 return ret;
821 }
822
823 long sys_arch_prctl(int code, unsigned long addr)
824 {
825 return do_arch_prctl(current, code, addr);
826 }
827
828 unsigned long arch_align_stack(unsigned long sp)
829 {
830 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
831 sp -= get_random_int() % 8192;
832 return sp & ~0xf;
833 }
834
835 unsigned long arch_randomize_brk(struct mm_struct *mm)
836 {
837 unsigned long range_end = mm->brk + 0x02000000;
838 return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
839 }
This page took 0.077952 seconds and 4 git commands to generate.