]> err.no Git - linux-2.6/blob - arch/x86_64/kernel/process.c
Merge master.kernel.org:/home/rmk/linux-2.6-serial
[linux-2.6] / arch / x86_64 / kernel / process.c
1 /*
2  *  linux/arch/x86-64/kernel/process.c
3  *
4  *  Copyright (C) 1995  Linus Torvalds
5  *
6  *  Pentium III FXSR, SSE support
7  *      Gareth Hughes <gareth@valinux.com>, May 2000
8  * 
9  *  X86-64 port
10  *      Andi Kleen.
11  *
12  *      CPU hotplug support - ashok.raj@intel.com
13  *  $Id: process.c,v 1.38 2002/01/15 10:08:03 ak Exp $
14  */
15
16 /*
17  * This file handles the architecture-dependent parts of process handling..
18  */
19
20 #include <stdarg.h>
21
22 #include <linux/cpu.h>
23 #include <linux/errno.h>
24 #include <linux/sched.h>
25 #include <linux/kernel.h>
26 #include <linux/mm.h>
27 #include <linux/elfcore.h>
28 #include <linux/smp.h>
29 #include <linux/slab.h>
30 #include <linux/user.h>
31 #include <linux/module.h>
32 #include <linux/a.out.h>
33 #include <linux/interrupt.h>
34 #include <linux/delay.h>
35 #include <linux/ptrace.h>
36 #include <linux/utsname.h>
37 #include <linux/random.h>
38 #include <linux/kprobes.h>
39 #include <linux/notifier.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/kdebug.h>
51 #include <asm/desc.h>
52 #include <asm/proto.h>
53 #include <asm/ia32.h>
54 #include <asm/idle.h>
55
56 asmlinkage extern void ret_from_fork(void);
57
58 unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
59
60 unsigned long boot_option_idle_override = 0;
61 EXPORT_SYMBOL(boot_option_idle_override);
62
63 /*
64  * Powermanagement idle function, if any..
65  */
66 void (*pm_idle)(void);
67 static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
68
69 static struct notifier_block *idle_notifier;
70 static DEFINE_SPINLOCK(idle_notifier_lock);
71
72 void idle_notifier_register(struct notifier_block *n)
73 {
74         unsigned long flags;
75         spin_lock_irqsave(&idle_notifier_lock, flags);
76         notifier_chain_register(&idle_notifier, n);
77         spin_unlock_irqrestore(&idle_notifier_lock, flags);
78 }
79 EXPORT_SYMBOL_GPL(idle_notifier_register);
80
81 void idle_notifier_unregister(struct notifier_block *n)
82 {
83         unsigned long flags;
84         spin_lock_irqsave(&idle_notifier_lock, flags);
85         notifier_chain_unregister(&idle_notifier, n);
86         spin_unlock_irqrestore(&idle_notifier_lock, flags);
87 }
88 EXPORT_SYMBOL(idle_notifier_unregister);
89
90 enum idle_state { CPU_IDLE, CPU_NOT_IDLE };
91 static DEFINE_PER_CPU(enum idle_state, idle_state) = CPU_NOT_IDLE;
92
93 void enter_idle(void)
94 {
95         __get_cpu_var(idle_state) = CPU_IDLE;
96         notifier_call_chain(&idle_notifier, IDLE_START, NULL);
97 }
98
99 static void __exit_idle(void)
100 {
101         __get_cpu_var(idle_state) = CPU_NOT_IDLE;
102         notifier_call_chain(&idle_notifier, IDLE_END, NULL);
103 }
104
105 /* Called from interrupts to signify idle end */
106 void exit_idle(void)
107 {
108         if (current->pid | read_pda(irqcount))
109                 return;
110         __exit_idle();
111 }
112
113 /*
114  * We use this if we don't have any better
115  * idle routine..
116  */
117 static void default_idle(void)
118 {
119         local_irq_enable();
120
121         clear_thread_flag(TIF_POLLING_NRFLAG);
122         smp_mb__after_clear_bit();
123         while (!need_resched()) {
124                 local_irq_disable();
125                 if (!need_resched())
126                         safe_halt();
127                 else
128                         local_irq_enable();
129         }
130         set_thread_flag(TIF_POLLING_NRFLAG);
131 }
132
133 /*
134  * On SMP it's slightly faster (but much more power-consuming!)
135  * to poll the ->need_resched flag instead of waiting for the
136  * cross-CPU IPI to arrive. Use this option with caution.
137  */
138 static void poll_idle (void)
139 {
140         local_irq_enable();
141
142         asm volatile(
143                 "2:"
144                 "testl %0,%1;"
145                 "rep; nop;"
146                 "je 2b;"
147                 : :
148                 "i" (_TIF_NEED_RESCHED),
149                 "m" (current_thread_info()->flags));
150 }
151
152 void cpu_idle_wait(void)
153 {
154         unsigned int cpu, this_cpu = get_cpu();
155         cpumask_t map;
156
157         set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
158         put_cpu();
159
160         cpus_clear(map);
161         for_each_online_cpu(cpu) {
162                 per_cpu(cpu_idle_state, cpu) = 1;
163                 cpu_set(cpu, map);
164         }
165
166         __get_cpu_var(cpu_idle_state) = 0;
167
168         wmb();
169         do {
170                 ssleep(1);
171                 for_each_online_cpu(cpu) {
172                         if (cpu_isset(cpu, map) &&
173                                         !per_cpu(cpu_idle_state, cpu))
174                                 cpu_clear(cpu, map);
175                 }
176                 cpus_and(map, map, cpu_online_map);
177         } while (!cpus_empty(map));
178 }
179 EXPORT_SYMBOL_GPL(cpu_idle_wait);
180
181 #ifdef CONFIG_HOTPLUG_CPU
182 DECLARE_PER_CPU(int, cpu_state);
183
184 #include <asm/nmi.h>
185 /* We halt the CPU with physical CPU hotplug */
186 static inline void play_dead(void)
187 {
188         idle_task_exit();
189         wbinvd();
190         mb();
191         /* Ack it */
192         __get_cpu_var(cpu_state) = CPU_DEAD;
193
194         local_irq_disable();
195         while (1)
196                 halt();
197 }
198 #else
199 static inline void play_dead(void)
200 {
201         BUG();
202 }
203 #endif /* CONFIG_HOTPLUG_CPU */
204
205 /*
206  * The idle thread. There's no useful work to be
207  * done, so just try to conserve power and have a
208  * low exit latency (ie sit in a loop waiting for
209  * somebody to say that they'd like to reschedule)
210  */
211 void cpu_idle (void)
212 {
213         set_thread_flag(TIF_POLLING_NRFLAG);
214
215         /* endless idle loop with no priority at all */
216         while (1) {
217                 while (!need_resched()) {
218                         void (*idle)(void);
219
220                         if (__get_cpu_var(cpu_idle_state))
221                                 __get_cpu_var(cpu_idle_state) = 0;
222
223                         rmb();
224                         idle = pm_idle;
225                         if (!idle)
226                                 idle = default_idle;
227                         if (cpu_is_offline(smp_processor_id()))
228                                 play_dead();
229                         enter_idle();
230                         idle();
231                         __exit_idle();
232                 }
233
234                 preempt_enable_no_resched();
235                 schedule();
236                 preempt_disable();
237         }
238 }
239
240 /*
241  * This uses new MONITOR/MWAIT instructions on P4 processors with PNI,
242  * which can obviate IPI to trigger checking of need_resched.
243  * We execute MONITOR against need_resched and enter optimized wait state
244  * through MWAIT. Whenever someone changes need_resched, we would be woken
245  * up from MWAIT (without an IPI).
246  */
247 static void mwait_idle(void)
248 {
249         local_irq_enable();
250
251         while (!need_resched()) {
252                 __monitor((void *)&current_thread_info()->flags, 0, 0);
253                 smp_mb();
254                 if (need_resched())
255                         break;
256                 __mwait(0, 0);
257         }
258 }
259
260 void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
261 {
262         static int printed;
263         if (cpu_has(c, X86_FEATURE_MWAIT)) {
264                 /*
265                  * Skip, if setup has overridden idle.
266                  * One CPU supports mwait => All CPUs supports mwait
267                  */
268                 if (!pm_idle) {
269                         if (!printed) {
270                                 printk("using mwait in idle threads.\n");
271                                 printed = 1;
272                         }
273                         pm_idle = mwait_idle;
274                 }
275         }
276 }
277
278 static int __init idle_setup (char *str)
279 {
280         if (!strncmp(str, "poll", 4)) {
281                 printk("using polling idle threads.\n");
282                 pm_idle = poll_idle;
283         }
284
285         boot_option_idle_override = 1;
286         return 1;
287 }
288
289 __setup("idle=", idle_setup);
290
291 /* Prints also some state that isn't saved in the pt_regs */ 
292 void __show_regs(struct pt_regs * regs)
293 {
294         unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
295         unsigned int fsindex,gsindex;
296         unsigned int ds,cs,es; 
297
298         printk("\n");
299         print_modules();
300         printk("Pid: %d, comm: %.20s %s %s %.*s\n",
301                 current->pid, current->comm, print_tainted(),
302                 system_utsname.release,
303                 (int)strcspn(system_utsname.version, " "),
304                 system_utsname.version);
305         printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
306         printk_address(regs->rip); 
307         printk("\nRSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss, regs->rsp,
308                 regs->eflags);
309         printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
310                regs->rax, regs->rbx, regs->rcx);
311         printk("RDX: %016lx RSI: %016lx RDI: %016lx\n",
312                regs->rdx, regs->rsi, regs->rdi); 
313         printk("RBP: %016lx R08: %016lx R09: %016lx\n",
314                regs->rbp, regs->r8, regs->r9); 
315         printk("R10: %016lx R11: %016lx R12: %016lx\n",
316                regs->r10, regs->r11, regs->r12); 
317         printk("R13: %016lx R14: %016lx R15: %016lx\n",
318                regs->r13, regs->r14, regs->r15); 
319
320         asm("movl %%ds,%0" : "=r" (ds)); 
321         asm("movl %%cs,%0" : "=r" (cs)); 
322         asm("movl %%es,%0" : "=r" (es)); 
323         asm("movl %%fs,%0" : "=r" (fsindex));
324         asm("movl %%gs,%0" : "=r" (gsindex));
325
326         rdmsrl(MSR_FS_BASE, fs);
327         rdmsrl(MSR_GS_BASE, gs); 
328         rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); 
329
330         asm("movq %%cr0, %0": "=r" (cr0));
331         asm("movq %%cr2, %0": "=r" (cr2));
332         asm("movq %%cr3, %0": "=r" (cr3));
333         asm("movq %%cr4, %0": "=r" (cr4));
334
335         printk("FS:  %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", 
336                fs,fsindex,gs,gsindex,shadowgs); 
337         printk("CS:  %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0); 
338         printk("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4);
339 }
340
341 void show_regs(struct pt_regs *regs)
342 {
343         printk("CPU %d:", smp_processor_id());
344         __show_regs(regs);
345         show_trace(&regs->rsp);
346 }
347
348 /*
349  * Free current thread data structures etc..
350  */
351 void exit_thread(void)
352 {
353         struct task_struct *me = current;
354         struct thread_struct *t = &me->thread;
355
356         /*
357          * Remove function-return probe instances associated with this task
358          * and put them back on the free list. Do not insert an exit probe for
359          * this function, it will be disabled by kprobe_flush_task if you do.
360          */
361         kprobe_flush_task(me);
362
363         if (me->thread.io_bitmap_ptr) { 
364                 struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
365
366                 kfree(t->io_bitmap_ptr);
367                 t->io_bitmap_ptr = NULL;
368                 /*
369                  * Careful, clear this in the TSS too:
370                  */
371                 memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
372                 t->io_bitmap_max = 0;
373                 put_cpu();
374         }
375 }
376
377 void flush_thread(void)
378 {
379         struct task_struct *tsk = current;
380         struct thread_info *t = current_thread_info();
381
382         if (t->flags & _TIF_ABI_PENDING)
383                 t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
384
385         tsk->thread.debugreg0 = 0;
386         tsk->thread.debugreg1 = 0;
387         tsk->thread.debugreg2 = 0;
388         tsk->thread.debugreg3 = 0;
389         tsk->thread.debugreg6 = 0;
390         tsk->thread.debugreg7 = 0;
391         memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
392         /*
393          * Forget coprocessor state..
394          */
395         clear_fpu(tsk);
396         clear_used_math();
397 }
398
399 void release_thread(struct task_struct *dead_task)
400 {
401         if (dead_task->mm) {
402                 if (dead_task->mm->context.size) {
403                         printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
404                                         dead_task->comm,
405                                         dead_task->mm->context.ldt,
406                                         dead_task->mm->context.size);
407                         BUG();
408                 }
409         }
410 }
411
412 static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
413 {
414         struct user_desc ud = { 
415                 .base_addr = addr,
416                 .limit = 0xfffff,
417                 .seg_32bit = 1,
418                 .limit_in_pages = 1,
419                 .useable = 1,
420         };
421         struct n_desc_struct *desc = (void *)t->thread.tls_array;
422         desc += tls;
423         desc->a = LDT_entry_a(&ud); 
424         desc->b = LDT_entry_b(&ud); 
425 }
426
427 static inline u32 read_32bit_tls(struct task_struct *t, int tls)
428 {
429         struct desc_struct *desc = (void *)t->thread.tls_array;
430         desc += tls;
431         return desc->base0 | 
432                 (((u32)desc->base1) << 16) | 
433                 (((u32)desc->base2) << 24);
434 }
435
436 /*
437  * This gets called before we allocate a new thread and copy
438  * the current task into it.
439  */
440 void prepare_to_copy(struct task_struct *tsk)
441 {
442         unlazy_fpu(tsk);
443 }
444
445 int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp, 
446                 unsigned long unused,
447         struct task_struct * p, struct pt_regs * regs)
448 {
449         int err;
450         struct pt_regs * childregs;
451         struct task_struct *me = current;
452
453         childregs = ((struct pt_regs *)
454                         (THREAD_SIZE + task_stack_page(p))) - 1;
455         *childregs = *regs;
456
457         childregs->rax = 0;
458         childregs->rsp = rsp;
459         if (rsp == ~0UL)
460                 childregs->rsp = (unsigned long)childregs;
461
462         p->thread.rsp = (unsigned long) childregs;
463         p->thread.rsp0 = (unsigned long) (childregs+1);
464         p->thread.userrsp = me->thread.userrsp; 
465
466         set_tsk_thread_flag(p, TIF_FORK);
467
468         p->thread.fs = me->thread.fs;
469         p->thread.gs = me->thread.gs;
470
471         asm("mov %%gs,%0" : "=m" (p->thread.gsindex));
472         asm("mov %%fs,%0" : "=m" (p->thread.fsindex));
473         asm("mov %%es,%0" : "=m" (p->thread.es));
474         asm("mov %%ds,%0" : "=m" (p->thread.ds));
475
476         if (unlikely(me->thread.io_bitmap_ptr != NULL)) { 
477                 p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
478                 if (!p->thread.io_bitmap_ptr) {
479                         p->thread.io_bitmap_max = 0;
480                         return -ENOMEM;
481                 }
482                 memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
483                                 IO_BITMAP_BYTES);
484         } 
485
486         /*
487          * Set a new TLS for the child thread?
488          */
489         if (clone_flags & CLONE_SETTLS) {
490 #ifdef CONFIG_IA32_EMULATION
491                 if (test_thread_flag(TIF_IA32))
492                         err = ia32_child_tls(p, childregs); 
493                 else                    
494 #endif   
495                         err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); 
496                 if (err) 
497                         goto out;
498         }
499         err = 0;
500 out:
501         if (err && p->thread.io_bitmap_ptr) {
502                 kfree(p->thread.io_bitmap_ptr);
503                 p->thread.io_bitmap_max = 0;
504         }
505         return err;
506 }
507
508 /*
509  * This special macro can be used to load a debugging register
510  */
511 #define loaddebug(thread,r) set_debugreg(thread->debugreg ## r, r)
512
513 /*
514  *      switch_to(x,y) should switch tasks from x to y.
515  *
516  * This could still be optimized: 
517  * - fold all the options into a flag word and test it with a single test.
518  * - could test fs/gs bitsliced
519  *
520  * Kprobes not supported here. Set the probe on schedule instead.
521  */
522 __kprobes struct task_struct *
523 __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
524 {
525         struct thread_struct *prev = &prev_p->thread,
526                                  *next = &next_p->thread;
527         int cpu = smp_processor_id();  
528         struct tss_struct *tss = &per_cpu(init_tss, cpu);
529
530         /*
531          * Reload esp0, LDT and the page table pointer:
532          */
533         tss->rsp0 = next->rsp0;
534
535         /* 
536          * Switch DS and ES.
537          * This won't pick up thread selector changes, but I guess that is ok.
538          */
539         asm volatile("mov %%es,%0" : "=m" (prev->es));
540         if (unlikely(next->es | prev->es))
541                 loadsegment(es, next->es); 
542         
543         asm volatile ("mov %%ds,%0" : "=m" (prev->ds));
544         if (unlikely(next->ds | prev->ds))
545                 loadsegment(ds, next->ds);
546
547         load_TLS(next, cpu);
548
549         /* 
550          * Switch FS and GS.
551          */
552         { 
553                 unsigned fsindex;
554                 asm volatile("movl %%fs,%0" : "=r" (fsindex)); 
555                 /* segment register != 0 always requires a reload. 
556                    also reload when it has changed. 
557                    when prev process used 64bit base always reload
558                    to avoid an information leak. */
559                 if (unlikely(fsindex | next->fsindex | prev->fs)) {
560                         loadsegment(fs, next->fsindex);
561                         /* check if the user used a selector != 0
562                          * if yes clear 64bit base, since overloaded base
563                          * is always mapped to the Null selector
564                          */
565                         if (fsindex)
566                         prev->fs = 0;                           
567                 }
568                 /* when next process has a 64bit base use it */
569                 if (next->fs) 
570                         wrmsrl(MSR_FS_BASE, next->fs); 
571                 prev->fsindex = fsindex;
572         }
573         { 
574                 unsigned gsindex;
575                 asm volatile("movl %%gs,%0" : "=r" (gsindex)); 
576                 if (unlikely(gsindex | next->gsindex | prev->gs)) {
577                         load_gs_index(next->gsindex);
578                         if (gsindex)
579                         prev->gs = 0;                           
580                 }
581                 if (next->gs)
582                         wrmsrl(MSR_KERNEL_GS_BASE, next->gs); 
583                 prev->gsindex = gsindex;
584         }
585
586         /* 
587          * Switch the PDA and FPU contexts.
588          */
589         prev->userrsp = read_pda(oldrsp); 
590         write_pda(oldrsp, next->userrsp); 
591         write_pda(pcurrent, next_p); 
592         /* This must be here to ensure both math_state_restore() and
593            kernel_fpu_begin() work consistently. */
594         unlazy_fpu(prev_p);
595         write_pda(kernelstack,
596                   task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET);
597
598         /*
599          * Now maybe reload the debug registers
600          */
601         if (unlikely(next->debugreg7)) {
602                 loaddebug(next, 0);
603                 loaddebug(next, 1);
604                 loaddebug(next, 2);
605                 loaddebug(next, 3);
606                 /* no 4 and 5 */
607                 loaddebug(next, 6);
608                 loaddebug(next, 7);
609         }
610
611
612         /* 
613          * Handle the IO bitmap 
614          */ 
615         if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) {
616                 if (next->io_bitmap_ptr)
617                         /*
618                          * Copy the relevant range of the IO bitmap.
619                          * Normally this is 128 bytes or less:
620                          */
621                         memcpy(tss->io_bitmap, next->io_bitmap_ptr,
622                                 max(prev->io_bitmap_max, next->io_bitmap_max));
623                 else {
624                         /*
625                          * Clear any possible leftover bits:
626                          */
627                         memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
628                 }
629         }
630
631         return prev_p;
632 }
633
634 /*
635  * sys_execve() executes a new program.
636  */
637 asmlinkage 
638 long sys_execve(char __user *name, char __user * __user *argv,
639                 char __user * __user *envp, struct pt_regs regs)
640 {
641         long error;
642         char * filename;
643
644         filename = getname(name);
645         error = PTR_ERR(filename);
646         if (IS_ERR(filename)) 
647                 return error;
648         error = do_execve(filename, argv, envp, &regs); 
649         if (error == 0) {
650                 task_lock(current);
651                 current->ptrace &= ~PT_DTRACE;
652                 task_unlock(current);
653         }
654         putname(filename);
655         return error;
656 }
657
658 void set_personality_64bit(void)
659 {
660         /* inherit personality from parent */
661
662         /* Make sure to be in 64bit mode */
663         clear_thread_flag(TIF_IA32); 
664
665         /* TBD: overwrites user setup. Should have two bits.
666            But 64bit processes have always behaved this way,
667            so it's not too bad. The main problem is just that
668            32bit childs are affected again. */
669         current->personality &= ~READ_IMPLIES_EXEC;
670 }
671
672 asmlinkage long sys_fork(struct pt_regs *regs)
673 {
674         return do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL);
675 }
676
677 asmlinkage long
678 sys_clone(unsigned long clone_flags, unsigned long newsp,
679           void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
680 {
681         if (!newsp)
682                 newsp = regs->rsp;
683         return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
684 }
685
686 /*
687  * This is trivial, and on the face of it looks like it
688  * could equally well be done in user mode.
689  *
690  * Not so, for quite unobvious reasons - register pressure.
691  * In user mode vfork() cannot have a stack frame, and if
692  * done by calling the "clone()" system call directly, you
693  * do not have enough call-clobbered registers to hold all
694  * the information you need.
695  */
696 asmlinkage long sys_vfork(struct pt_regs *regs)
697 {
698         return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->rsp, regs, 0,
699                     NULL, NULL);
700 }
701
702 unsigned long get_wchan(struct task_struct *p)
703 {
704         unsigned long stack;
705         u64 fp,rip;
706         int count = 0;
707
708         if (!p || p == current || p->state==TASK_RUNNING)
709                 return 0; 
710         stack = (unsigned long)task_stack_page(p);
711         if (p->thread.rsp < stack || p->thread.rsp > stack+THREAD_SIZE)
712                 return 0;
713         fp = *(u64 *)(p->thread.rsp);
714         do { 
715                 if (fp < (unsigned long)stack ||
716                     fp > (unsigned long)stack+THREAD_SIZE)
717                         return 0; 
718                 rip = *(u64 *)(fp+8); 
719                 if (!in_sched_functions(rip))
720                         return rip; 
721                 fp = *(u64 *)fp; 
722         } while (count++ < 16); 
723         return 0;
724 }
725
726 long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
727
728         int ret = 0; 
729         int doit = task == current;
730         int cpu;
731
732         switch (code) { 
733         case ARCH_SET_GS:
734                 if (addr >= TASK_SIZE_OF(task))
735                         return -EPERM; 
736                 cpu = get_cpu();
737                 /* handle small bases via the GDT because that's faster to 
738                    switch. */
739                 if (addr <= 0xffffffff) {  
740                         set_32bit_tls(task, GS_TLS, addr); 
741                         if (doit) { 
742                                 load_TLS(&task->thread, cpu);
743                                 load_gs_index(GS_TLS_SEL); 
744                         }
745                         task->thread.gsindex = GS_TLS_SEL; 
746                         task->thread.gs = 0;
747                 } else { 
748                         task->thread.gsindex = 0;
749                         task->thread.gs = addr;
750                         if (doit) {
751                                 load_gs_index(0);
752                                 ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
753                         } 
754                 }
755                 put_cpu();
756                 break;
757         case ARCH_SET_FS:
758                 /* Not strictly needed for fs, but do it for symmetry
759                    with gs */
760                 if (addr >= TASK_SIZE_OF(task))
761                         return -EPERM; 
762                 cpu = get_cpu();
763                 /* handle small bases via the GDT because that's faster to 
764                    switch. */
765                 if (addr <= 0xffffffff) { 
766                         set_32bit_tls(task, FS_TLS, addr);
767                         if (doit) { 
768                                 load_TLS(&task->thread, cpu); 
769                                 asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
770                         }
771                         task->thread.fsindex = FS_TLS_SEL;
772                         task->thread.fs = 0;
773                 } else { 
774                         task->thread.fsindex = 0;
775                         task->thread.fs = addr;
776                         if (doit) {
777                                 /* set the selector to 0 to not confuse
778                                    __switch_to */
779                                 asm volatile("movl %0,%%fs" :: "r" (0));
780                                 ret = checking_wrmsrl(MSR_FS_BASE, addr);
781                         }
782                 }
783                 put_cpu();
784                 break;
785         case ARCH_GET_FS: { 
786                 unsigned long base; 
787                 if (task->thread.fsindex == FS_TLS_SEL)
788                         base = read_32bit_tls(task, FS_TLS);
789                 else if (doit)
790                         rdmsrl(MSR_FS_BASE, base);
791                 else
792                         base = task->thread.fs;
793                 ret = put_user(base, (unsigned long __user *)addr); 
794                 break; 
795         }
796         case ARCH_GET_GS: { 
797                 unsigned long base;
798                 if (task->thread.gsindex == GS_TLS_SEL)
799                         base = read_32bit_tls(task, GS_TLS);
800                 else if (doit)
801                         rdmsrl(MSR_KERNEL_GS_BASE, base);
802                 else
803                         base = task->thread.gs;
804                 ret = put_user(base, (unsigned long __user *)addr); 
805                 break;
806         }
807
808         default:
809                 ret = -EINVAL;
810                 break;
811         } 
812
813         return ret;     
814
815
816 long sys_arch_prctl(int code, unsigned long addr)
817 {
818         return do_arch_prctl(current, code, addr);
819
820
821 /* 
822  * Capture the user space registers if the task is not running (in user space)
823  */
824 int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
825 {
826         struct pt_regs *pp, ptregs;
827
828         pp = task_pt_regs(tsk);
829
830         ptregs = *pp; 
831         ptregs.cs &= 0xffff;
832         ptregs.ss &= 0xffff;
833
834         elf_core_copy_regs(regs, &ptregs);
835  
836         return 1;
837 }
838
839 unsigned long arch_align_stack(unsigned long sp)
840 {
841         if (randomize_va_space)
842                 sp -= get_random_int() % 8192;
843         return sp & ~0xf;
844 }