process_64.c 20.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 *  Copyright (C) 1995  Linus Torvalds
 *
 *  Pentium III FXSR, SSE support
 *	Gareth Hughes <gareth@valinux.com>, May 2000
6
 *
L
Linus Torvalds 已提交
7 8
 *  X86-64 port
 *	Andi Kleen.
A
Ashok Raj 已提交
9 10
 *
 *	CPU hotplug support - ashok.raj@intel.com
L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18
 */

/*
 * This file handles the architecture-dependent parts of process handling..
 */

#include <stdarg.h>

A
Ashok Raj 已提交
19
#include <linux/cpu.h>
L
Linus Torvalds 已提交
20 21
#include <linux/errno.h>
#include <linux/sched.h>
22
#include <linux/fs.h>
L
Linus Torvalds 已提交
23 24 25 26 27 28 29
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/elfcore.h>
#include <linux/smp.h>
#include <linux/slab.h>
#include <linux/user.h>
#include <linux/interrupt.h>
30
#include <linux/utsname.h>
L
Linus Torvalds 已提交
31
#include <linux/delay.h>
32
#include <linux/module.h>
L
Linus Torvalds 已提交
33 34
#include <linux/ptrace.h>
#include <linux/random.h>
A
Andi Kleen 已提交
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 <linux/uaccess.h>
#include <linux/io.h>
42
#include <linux/ftrace.h>
43
#include <linux/dmi.h>
L
Linus Torvalds 已提交
44 45 46 47 48 49 50 51 52 53 54

#include <asm/pgtable.h>
#include <asm/system.h>
#include <asm/processor.h>
#include <asm/i387.h>
#include <asm/mmu_context.h>
#include <asm/pda.h>
#include <asm/prctl.h>
#include <asm/desc.h>
#include <asm/proto.h>
#include <asm/ia32.h>
A
Andi Kleen 已提交
55
#include <asm/idle.h>
56
#include <asm/syscalls.h>
57
#include <asm/ds.h>
L
Linus Torvalds 已提交
58 59 60 61 62

asmlinkage extern void ret_from_fork(void);

unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;

63
static ATOMIC_NOTIFIER_HEAD(idle_notifier);
A
Andi Kleen 已提交
64 65 66

void idle_notifier_register(struct notifier_block *n)
{
67
	atomic_notifier_chain_register(&idle_notifier, n);
A
Andi Kleen 已提交
68
}
69 70 71 72 73 74 75
EXPORT_SYMBOL_GPL(idle_notifier_register);

void idle_notifier_unregister(struct notifier_block *n)
{
	atomic_notifier_chain_unregister(&idle_notifier, n);
}
EXPORT_SYMBOL_GPL(idle_notifier_unregister);
A
Andi Kleen 已提交
76 77 78

void enter_idle(void)
{
A
Andi Kleen 已提交
79
	write_pda(isidle, 1);
80
	atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
A
Andi Kleen 已提交
81 82 83 84
}

static void __exit_idle(void)
{
A
Andi Kleen 已提交
85
	if (test_and_clear_bit_pda(0, isidle) == 0)
A
Andi Kleen 已提交
86
		return;
87
	atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
A
Andi Kleen 已提交
88 89 90 91 92
}

/* Called from interrupts to signify idle end */
void exit_idle(void)
{
A
Andi Kleen 已提交
93 94
	/* idle loop has pid 0 */
	if (current->pid)
A
Andi Kleen 已提交
95 96 97 98
		return;
	__exit_idle();
}

A
Alex Nixon 已提交
99
#ifndef CONFIG_SMP
A
Ashok Raj 已提交
100 101 102 103
static inline void play_dead(void)
{
	BUG();
}
A
Alex Nixon 已提交
104
#endif
A
Ashok Raj 已提交
105

L
Linus Torvalds 已提交
106 107 108 109 110 111
/*
 * The idle thread. There's no useful work to be
 * done, so just try to conserve power and have a
 * low exit latency (ie sit in a loop waiting for
 * somebody to say that they'd like to reschedule)
 */
P
Pavel Machek 已提交
112
void cpu_idle(void)
L
Linus Torvalds 已提交
113
{
114
	current_thread_info()->status |= TS_POLLING;
L
Linus Torvalds 已提交
115 116
	/* endless idle loop with no priority at all */
	while (1) {
117
		tick_nohz_stop_sched_tick(1);
L
Linus Torvalds 已提交
118 119 120
		while (!need_resched()) {

			rmb();
T
Thomas Gleixner 已提交
121

A
Ashok Raj 已提交
122 123
			if (cpu_is_offline(smp_processor_id()))
				play_dead();
124 125 126 127 128 129
			/*
			 * Idle routines should keep interrupts disabled
			 * from here on, until they go to idle.
			 * Otherwise, idle callbacks can misfire.
			 */
			local_irq_disable();
A
Andi Kleen 已提交
130
			enter_idle();
131 132
			/* Don't trace irqs off for idle */
			stop_critical_timings();
T
Thomas Gleixner 已提交
133
			pm_idle();
134
			start_critical_timings();
A
Andi Kleen 已提交
135 136 137
			/* In many cases the interrupt that ended idle
			   has already called exit_idle. But some idle
			   loops can be woken up without interrupt. */
A
Andi Kleen 已提交
138
			__exit_idle();
L
Linus Torvalds 已提交
139 140
		}

141
		tick_nohz_restart_sched_tick();
142
		preempt_enable_no_resched();
L
Linus Torvalds 已提交
143
		schedule();
144
		preempt_disable();
L
Linus Torvalds 已提交
145 146 147
	}
}

148
/* Prints also some state that isn't saved in the pt_regs */
149
void __show_regs(struct pt_regs *regs, int all)
L
Linus Torvalds 已提交
150 151
{
	unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
152
	unsigned long d0, d1, d2, d3, d6, d7;
153 154
	unsigned int fsindex, gsindex;
	unsigned int ds, cs, es;
155
	const char *board;
L
Linus Torvalds 已提交
156 157 158

	printk("\n");
	print_modules();
159 160 161 162
	board = dmi_get_system_info(DMI_PRODUCT_NAME);
	if (!board)
		board = "";
	printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s %s\n",
163
		current->pid, current->comm, print_tainted(),
164 165
		init_utsname()->release,
		(int)strcspn(init_utsname()->version, " "),
166
		init_utsname()->version, board);
167
	printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
168
	printk_address(regs->ip, 1);
169 170 171
	printk(KERN_INFO "RSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss,
			regs->sp, regs->flags);
	printk(KERN_INFO "RAX: %016lx RBX: %016lx RCX: %016lx\n",
172
	       regs->ax, regs->bx, regs->cx);
173
	printk(KERN_INFO "RDX: %016lx RSI: %016lx RDI: %016lx\n",
174
	       regs->dx, regs->si, regs->di);
175
	printk(KERN_INFO "RBP: %016lx R08: %016lx R09: %016lx\n",
176
	       regs->bp, regs->r8, regs->r9);
177
	printk(KERN_INFO "R10: %016lx R11: %016lx R12: %016lx\n",
178
	       regs->r10, regs->r11, regs->r12);
179
	printk(KERN_INFO "R13: %016lx R14: %016lx R15: %016lx\n",
180
	       regs->r13, regs->r14, regs->r15);
L
Linus Torvalds 已提交
181

182 183 184
	asm("movl %%ds,%0" : "=r" (ds));
	asm("movl %%cs,%0" : "=r" (cs));
	asm("movl %%es,%0" : "=r" (es));
L
Linus Torvalds 已提交
185 186 187 188
	asm("movl %%fs,%0" : "=r" (fsindex));
	asm("movl %%gs,%0" : "=r" (gsindex));

	rdmsrl(MSR_FS_BASE, fs);
189 190
	rdmsrl(MSR_GS_BASE, gs);
	rdmsrl(MSR_KERNEL_GS_BASE, shadowgs);
L
Linus Torvalds 已提交
191

192 193
	if (!all)
		return;
L
Linus Torvalds 已提交
194

195 196 197 198
	cr0 = read_cr0();
	cr2 = read_cr2();
	cr3 = read_cr3();
	cr4 = read_cr4();
L
Linus Torvalds 已提交
199

200
	printk(KERN_INFO "FS:  %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n",
201
	       fs, fsindex, gs, gsindex, shadowgs);
202 203 204 205
	printk(KERN_INFO "CS:  %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds,
			es, cr0);
	printk(KERN_INFO "CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3,
			cr4);
206 207 208 209

	get_debugreg(d0, 0);
	get_debugreg(d1, 1);
	get_debugreg(d2, 2);
210
	printk(KERN_INFO "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
211 212 213
	get_debugreg(d3, 3);
	get_debugreg(d6, 6);
	get_debugreg(d7, 7);
214
	printk(KERN_INFO "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
L
Linus Torvalds 已提交
215 216 217 218
}

void show_regs(struct pt_regs *regs)
{
219
	printk(KERN_INFO "CPU %d:", smp_processor_id());
220
	__show_regs(regs, 1);
221
	show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
L
Linus Torvalds 已提交
222 223 224 225 226 227 228 229 230
}

/*
 * Free current thread data structures etc..
 */
void exit_thread(void)
{
	struct task_struct *me = current;
	struct thread_struct *t = &me->thread;
231

232
	if (me->thread.io_bitmap_ptr) {
L
Linus Torvalds 已提交
233 234 235 236
		struct tss_struct *tss = &per_cpu(init_tss, get_cpu());

		kfree(t->io_bitmap_ptr);
		t->io_bitmap_ptr = NULL;
237
		clear_thread_flag(TIF_IO_BITMAP);
L
Linus Torvalds 已提交
238 239 240 241 242 243 244
		/*
		 * Careful, clear this in the TSS too:
		 */
		memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
		t->io_bitmap_max = 0;
		put_cpu();
	}
245 246

	ds_exit_thread(current);
L
Linus Torvalds 已提交
247 248 249 250 251 252
}

void flush_thread(void)
{
	struct task_struct *tsk = current;

253 254 255 256 257 258
	if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
		clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
		if (test_tsk_thread_flag(tsk, TIF_IA32)) {
			clear_tsk_thread_flag(tsk, TIF_IA32);
		} else {
			set_tsk_thread_flag(tsk, TIF_IA32);
259
			current_thread_info()->status |= TS_COMPAT;
260
		}
261
	}
262
	clear_tsk_thread_flag(tsk, TIF_DEBUG);
L
Linus Torvalds 已提交
263 264 265 266 267 268 269

	tsk->thread.debugreg0 = 0;
	tsk->thread.debugreg1 = 0;
	tsk->thread.debugreg2 = 0;
	tsk->thread.debugreg3 = 0;
	tsk->thread.debugreg6 = 0;
	tsk->thread.debugreg7 = 0;
270
	memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
L
Linus Torvalds 已提交
271 272 273
	/*
	 * Forget coprocessor state..
	 */
274
	tsk->fpu_counter = 0;
L
Linus Torvalds 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
	clear_fpu(tsk);
	clear_used_math();
}

void release_thread(struct task_struct *dead_task)
{
	if (dead_task->mm) {
		if (dead_task->mm->context.size) {
			printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
					dead_task->comm,
					dead_task->mm->context.ldt,
					dead_task->mm->context.size);
			BUG();
		}
	}
}

static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
{
294
	struct user_desc ud = {
L
Linus Torvalds 已提交
295 296 297 298 299 300
		.base_addr = addr,
		.limit = 0xfffff,
		.seg_32bit = 1,
		.limit_in_pages = 1,
		.useable = 1,
	};
J
Jan Engelhardt 已提交
301
	struct desc_struct *desc = t->thread.tls_array;
L
Linus Torvalds 已提交
302
	desc += tls;
303
	fill_ldt(desc, &ud);
L
Linus Torvalds 已提交
304 305 306 307
}

static inline u32 read_32bit_tls(struct task_struct *t, int tls)
{
R
Roland McGrath 已提交
308
	return get_desc_base(&t->thread.tls_array[tls]);
L
Linus Torvalds 已提交
309 310 311 312 313 314 315 316 317 318 319
}

/*
 * This gets called before we allocate a new thread and copy
 * the current task into it.
 */
void prepare_to_copy(struct task_struct *tsk)
{
	unlazy_fpu(tsk);
}

320
int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
L
Linus Torvalds 已提交
321
		unsigned long unused,
322
	struct task_struct *p, struct pt_regs *regs)
L
Linus Torvalds 已提交
323 324
{
	int err;
325
	struct pt_regs *childregs;
L
Linus Torvalds 已提交
326 327
	struct task_struct *me = current;

328
	childregs = ((struct pt_regs *)
A
Al Viro 已提交
329
			(THREAD_SIZE + task_stack_page(p))) - 1;
L
Linus Torvalds 已提交
330 331
	*childregs = *regs;

332 333 334 335
	childregs->ax = 0;
	childregs->sp = sp;
	if (sp == ~0UL)
		childregs->sp = (unsigned long)childregs;
L
Linus Torvalds 已提交
336

337 338 339
	p->thread.sp = (unsigned long) childregs;
	p->thread.sp0 = (unsigned long) (childregs+1);
	p->thread.usersp = me->thread.usersp;
L
Linus Torvalds 已提交
340

A
Al Viro 已提交
341
	set_tsk_thread_flag(p, TIF_FORK);
L
Linus Torvalds 已提交
342 343 344 345

	p->thread.fs = me->thread.fs;
	p->thread.gs = me->thread.gs;

346 347 348 349
	savesegment(gs, p->thread.gsindex);
	savesegment(fs, p->thread.fsindex);
	savesegment(es, p->thread.es);
	savesegment(ds, p->thread.ds);
L
Linus Torvalds 已提交
350

351
	if (unlikely(test_tsk_thread_flag(me, TIF_IO_BITMAP))) {
L
Linus Torvalds 已提交
352 353 354 355 356
		p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
		if (!p->thread.io_bitmap_ptr) {
			p->thread.io_bitmap_max = 0;
			return -ENOMEM;
		}
357 358
		memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
				IO_BITMAP_BYTES);
359
		set_tsk_thread_flag(p, TIF_IO_BITMAP);
360
	}
L
Linus Torvalds 已提交
361 362 363 364 365 366 367

	/*
	 * Set a new TLS for the child thread?
	 */
	if (clone_flags & CLONE_SETTLS) {
#ifdef CONFIG_IA32_EMULATION
		if (test_thread_flag(TIF_IA32))
R
Roland McGrath 已提交
368
			err = do_set_thread_area(p, -1,
369
				(struct user_desc __user *)childregs->si, 0);
370 371 372 373
		else
#endif
			err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8);
		if (err)
L
Linus Torvalds 已提交
374 375
			goto out;
	}
376 377 378 379 380 381

	ds_copy_thread(p, me);

	clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
	p->thread.debugctlmsr = 0;

L
Linus Torvalds 已提交
382 383 384 385 386 387 388 389 390
	err = 0;
out:
	if (err && p->thread.io_bitmap_ptr) {
		kfree(p->thread.io_bitmap_ptr);
		p->thread.io_bitmap_max = 0;
	}
	return err;
}

I
Ingo Molnar 已提交
391 392 393
void
start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
{
394 395 396
	loadsegment(fs, 0);
	loadsegment(es, 0);
	loadsegment(ds, 0);
I
Ingo Molnar 已提交
397 398 399 400 401 402 403 404
	load_gs_index(0);
	regs->ip		= new_ip;
	regs->sp		= new_sp;
	write_pda(oldrsp, new_sp);
	regs->cs		= __USER_CS;
	regs->ss		= __USER_DS;
	regs->flags		= 0x200;
	set_fs(USER_DS);
405 406 407 408
	/*
	 * Free the old FP and other extended state
	 */
	free_thread_xstate(current);
I
Ingo Molnar 已提交
409 410 411
}
EXPORT_SYMBOL_GPL(start_thread);

412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
static void hard_disable_TSC(void)
{
	write_cr4(read_cr4() | X86_CR4_TSD);
}

void disable_TSC(void)
{
	preempt_disable();
	if (!test_and_set_thread_flag(TIF_NOTSC))
		/*
		 * Must flip the CPU state synchronously with
		 * TIF_NOTSC in the current running context.
		 */
		hard_disable_TSC();
	preempt_enable();
}

static void hard_enable_TSC(void)
{
	write_cr4(read_cr4() & ~X86_CR4_TSD);
}

I
Ingo Molnar 已提交
434
static void enable_TSC(void)
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
{
	preempt_disable();
	if (test_and_clear_thread_flag(TIF_NOTSC))
		/*
		 * Must flip the CPU state synchronously with
		 * TIF_NOTSC in the current running context.
		 */
		hard_enable_TSC();
	preempt_enable();
}

int get_tsc_mode(unsigned long adr)
{
	unsigned int val;

	if (test_thread_flag(TIF_NOTSC))
		val = PR_TSC_SIGSEGV;
	else
		val = PR_TSC_ENABLE;

	return put_user(val, (unsigned int __user *)adr);
}

int set_tsc_mode(unsigned int val)
{
	if (val == PR_TSC_SIGSEGV)
		disable_TSC();
	else if (val == PR_TSC_ENABLE)
		enable_TSC();
	else
		return -EINVAL;

	return 0;
}

L
Linus Torvalds 已提交
470 471 472
/*
 * This special macro can be used to load a debugging register
 */
473 474
#define loaddebug(thread, r) set_debugreg(thread->debugreg ## r, r)

475
static inline void __switch_to_xtra(struct task_struct *prev_p,
476 477
				    struct task_struct *next_p,
				    struct tss_struct *tss)
478 479 480 481 482 483
{
	struct thread_struct *prev, *next;

	prev = &prev_p->thread,
	next = &next_p->thread;

484 485 486 487
	if (test_tsk_thread_flag(next_p, TIF_DS_AREA_MSR) ||
	    test_tsk_thread_flag(prev_p, TIF_DS_AREA_MSR))
		ds_switch_to(prev_p, next_p);
	else if (next->debugctlmsr != prev->debugctlmsr)
488
		update_debugctlmsr(next->debugctlmsr);
R
Roland McGrath 已提交
489

490 491 492 493 494 495 496 497 498 499
	if (test_tsk_thread_flag(next_p, TIF_DEBUG)) {
		loaddebug(next, 0);
		loaddebug(next, 1);
		loaddebug(next, 2);
		loaddebug(next, 3);
		/* no 4 and 5 */
		loaddebug(next, 6);
		loaddebug(next, 7);
	}

500 501 502 503 504 505 506 507 508
	if (test_tsk_thread_flag(prev_p, TIF_NOTSC) ^
	    test_tsk_thread_flag(next_p, TIF_NOTSC)) {
		/* prev and next are different */
		if (test_tsk_thread_flag(next_p, TIF_NOTSC))
			hard_disable_TSC();
		else
			hard_enable_TSC();
	}

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
	if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {
		/*
		 * Copy the relevant range of the IO bitmap.
		 * Normally this is 128 bytes or less:
		 */
		memcpy(tss->io_bitmap, next->io_bitmap_ptr,
		       max(prev->io_bitmap_max, next->io_bitmap_max));
	} else if (test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) {
		/*
		 * Clear any possible leftover bits:
		 */
		memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
	}
}

L
Linus Torvalds 已提交
524 525 526
/*
 *	switch_to(x,y) should switch tasks from x to y.
 *
527
 * This could still be optimized:
L
Linus Torvalds 已提交
528 529
 * - fold all the options into a flag word and test it with a single test.
 * - could test fs/gs bitsliced
530 531
 *
 * Kprobes not supported here. Set the probe on schedule instead.
532
 * Function graph tracer not supported too.
L
Linus Torvalds 已提交
533
 */
534
__notrace_funcgraph struct task_struct *
535
__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
L
Linus Torvalds 已提交
536
{
537 538
	struct thread_struct *prev = &prev_p->thread;
	struct thread_struct *next = &next_p->thread;
539
	int cpu = smp_processor_id();
L
Linus Torvalds 已提交
540
	struct tss_struct *tss = &per_cpu(init_tss, cpu);
541
	unsigned fsindex, gsindex;
L
Linus Torvalds 已提交
542

543
	/* we're going to use this soon, after a few expensive things */
544
	if (next_p->fpu_counter > 5)
545
		prefetch(next->xstate);
546

L
Linus Torvalds 已提交
547 548 549
	/*
	 * Reload esp0, LDT and the page table pointer:
	 */
550
	load_sp0(tss, next);
L
Linus Torvalds 已提交
551

552
	/*
L
Linus Torvalds 已提交
553 554 555
	 * Switch DS and ES.
	 * This won't pick up thread selector changes, but I guess that is ok.
	 */
556
	savesegment(es, prev->es);
L
Linus Torvalds 已提交
557
	if (unlikely(next->es | prev->es))
558
		loadsegment(es, next->es);
559 560

	savesegment(ds, prev->ds);
L
Linus Torvalds 已提交
561 562 563
	if (unlikely(next->ds | prev->ds))
		loadsegment(ds, next->ds);

564 565 566 567 568 569 570 571 572

	/* We must save %fs and %gs before load_TLS() because
	 * %fs and %gs may be cleared by load_TLS().
	 *
	 * (e.g. xen_load_tls())
	 */
	savesegment(fs, fsindex);
	savesegment(gs, gsindex);

L
Linus Torvalds 已提交
573 574
	load_TLS(next, cpu);

575 576 577 578 579 580 581 582 583
	/*
	 * Leave lazy mode, flushing any hypercalls made here.
	 * This must be done before restoring TLS segments so
	 * the GDT and LDT are properly updated, and must be
	 * done before math_state_restore, so the TS bit is up
	 * to date.
	 */
	arch_leave_lazy_cpu_mode();

584
	/*
L
Linus Torvalds 已提交
585
	 * Switch FS and GS.
586 587 588 589
	 *
	 * Segment register != 0 always requires a reload.  Also
	 * reload when it has changed.  When prev process used 64bit
	 * base always reload to avoid an information leak.
L
Linus Torvalds 已提交
590
	 */
591 592
	if (unlikely(fsindex | next->fsindex | prev->fs)) {
		loadsegment(fs, next->fsindex);
593
		/*
594 595 596 597 598
		 * Check if the user used a selector != 0; if yes
		 *  clear 64bit base, since overloaded base is always
		 *  mapped to the Null selector
		 */
		if (fsindex)
599
			prev->fs = 0;
600 601 602 603 604 605 606 607 608
	}
	/* when next process has a 64bit base use it */
	if (next->fs)
		wrmsrl(MSR_FS_BASE, next->fs);
	prev->fsindex = fsindex;

	if (unlikely(gsindex | next->gsindex | prev->gs)) {
		load_gs_index(next->gsindex);
		if (gsindex)
609
			prev->gs = 0;
L
Linus Torvalds 已提交
610
	}
611 612 613
	if (next->gs)
		wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
	prev->gsindex = gsindex;
L
Linus Torvalds 已提交
614

A
Andi Kleen 已提交
615 616 617
	/* Must be after DS reload */
	unlazy_fpu(prev_p);

618
	/*
619
	 * Switch the PDA and FPU contexts.
L
Linus Torvalds 已提交
620
	 */
621 622
	prev->usersp = read_pda(oldrsp);
	write_pda(oldrsp, next->usersp);
623
	write_pda(pcurrent, next_p);
624

625
	write_pda(kernelstack,
626 627
		  (unsigned long)task_stack_page(next_p) +
		  THREAD_SIZE - PDA_STACKOFFSET);
628 629 630 631 632 633 634 635
#ifdef CONFIG_CC_STACKPROTECTOR
	write_pda(stack_canary, next_p->stack_canary);
	/*
	 * Build time only check to make sure the stack_canary is at
	 * offset 40 in the pda; this is a gcc ABI requirement
	 */
	BUILD_BUG_ON(offsetof(struct x8664_pda, stack_canary) != 40);
#endif
L
Linus Torvalds 已提交
636 637

	/*
638
	 * Now maybe reload the debug registers and handle I/O bitmaps
L
Linus Torvalds 已提交
639
	 */
640 641
	if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT ||
		     task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
642
		__switch_to_xtra(prev_p, next_p, tss);
L
Linus Torvalds 已提交
643

644 645 646
	/* If the task has used fpu the last 5 timeslices, just do a full
	 * restore of the math state immediately to avoid the trap; the
	 * chances of needing FPU soon are obviously high now
647 648 649
	 *
	 * tsk_used_math() checks prevent calling math_state_restore(),
	 * which can sleep in the case of !tsk_used_math()
650
	 */
651
	if (tsk_used_math(next_p) && next_p->fpu_counter > 5)
652
		math_state_restore();
L
Linus Torvalds 已提交
653 654 655 656 657 658
	return prev_p;
}

/*
 * sys_execve() executes a new program.
 */
659
asmlinkage
L
Linus Torvalds 已提交
660
long sys_execve(char __user *name, char __user * __user *argv,
661
		char __user * __user *envp, struct pt_regs *regs)
L
Linus Torvalds 已提交
662 663
{
	long error;
664
	char *filename;
L
Linus Torvalds 已提交
665 666 667

	filename = getname(name);
	error = PTR_ERR(filename);
668
	if (IS_ERR(filename))
L
Linus Torvalds 已提交
669
		return error;
670
	error = do_execve(filename, argv, envp, regs);
L
Linus Torvalds 已提交
671 672 673 674 675 676 677 678 679
	putname(filename);
	return error;
}

void set_personality_64bit(void)
{
	/* inherit personality from parent */

	/* Make sure to be in 64bit mode */
680
	clear_thread_flag(TIF_IA32);
L
Linus Torvalds 已提交
681 682 683 684

	/* TBD: overwrites user setup. Should have two bits.
	   But 64bit processes have always behaved this way,
	   so it's not too bad. The main problem is just that
685
	   32bit childs are affected again. */
L
Linus Torvalds 已提交
686 687 688 689 690
	current->personality &= ~READ_IMPLIES_EXEC;
}

asmlinkage long sys_fork(struct pt_regs *regs)
{
691
	return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
L
Linus Torvalds 已提交
692 693
}

694 695 696
asmlinkage long
sys_clone(unsigned long clone_flags, unsigned long newsp,
	  void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
L
Linus Torvalds 已提交
697 698
{
	if (!newsp)
699
		newsp = regs->sp;
L
Linus Torvalds 已提交
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
	return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
}

/*
 * This is trivial, and on the face of it looks like it
 * could equally well be done in user mode.
 *
 * Not so, for quite unobvious reasons - register pressure.
 * In user mode vfork() cannot have a stack frame, and if
 * done by calling the "clone()" system call directly, you
 * do not have enough call-clobbered registers to hold all
 * the information you need.
 */
asmlinkage long sys_vfork(struct pt_regs *regs)
{
715
	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0,
L
Linus Torvalds 已提交
716 717 718 719 720 721
		    NULL, NULL);
}

unsigned long get_wchan(struct task_struct *p)
{
	unsigned long stack;
722
	u64 fp, ip;
L
Linus Torvalds 已提交
723 724
	int count = 0;

725 726
	if (!p || p == current || p->state == TASK_RUNNING)
		return 0;
A
Al Viro 已提交
727
	stack = (unsigned long)task_stack_page(p);
728
	if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE)
L
Linus Torvalds 已提交
729
		return 0;
730
	fp = *(u64 *)(p->thread.sp);
731
	do {
732
		if (fp < (unsigned long)stack ||
733
		    fp >= (unsigned long)stack+THREAD_SIZE)
734
			return 0;
735 736 737
		ip = *(u64 *)(fp+8);
		if (!in_sched_functions(ip))
			return ip;
738 739
		fp = *(u64 *)fp;
	} while (count++ < 16);
L
Linus Torvalds 已提交
740 741 742 743
	return 0;
}

long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
744 745
{
	int ret = 0;
L
Linus Torvalds 已提交
746 747 748
	int doit = task == current;
	int cpu;

749
	switch (code) {
L
Linus Torvalds 已提交
750
	case ARCH_SET_GS:
751
		if (addr >= TASK_SIZE_OF(task))
752
			return -EPERM;
L
Linus Torvalds 已提交
753
		cpu = get_cpu();
754
		/* handle small bases via the GDT because that's faster to
L
Linus Torvalds 已提交
755
		   switch. */
756 757 758
		if (addr <= 0xffffffff) {
			set_32bit_tls(task, GS_TLS, addr);
			if (doit) {
L
Linus Torvalds 已提交
759
				load_TLS(&task->thread, cpu);
760
				load_gs_index(GS_TLS_SEL);
L
Linus Torvalds 已提交
761
			}
762
			task->thread.gsindex = GS_TLS_SEL;
L
Linus Torvalds 已提交
763
			task->thread.gs = 0;
764
		} else {
L
Linus Torvalds 已提交
765 766 767
			task->thread.gsindex = 0;
			task->thread.gs = addr;
			if (doit) {
768 769
				load_gs_index(0);
				ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
770
			}
L
Linus Torvalds 已提交
771 772 773 774 775 776
		}
		put_cpu();
		break;
	case ARCH_SET_FS:
		/* Not strictly needed for fs, but do it for symmetry
		   with gs */
777
		if (addr >= TASK_SIZE_OF(task))
778
			return -EPERM;
L
Linus Torvalds 已提交
779
		cpu = get_cpu();
780
		/* handle small bases via the GDT because that's faster to
L
Linus Torvalds 已提交
781
		   switch. */
782
		if (addr <= 0xffffffff) {
L
Linus Torvalds 已提交
783
			set_32bit_tls(task, FS_TLS, addr);
784 785
			if (doit) {
				load_TLS(&task->thread, cpu);
786
				loadsegment(fs, FS_TLS_SEL);
L
Linus Torvalds 已提交
787 788 789
			}
			task->thread.fsindex = FS_TLS_SEL;
			task->thread.fs = 0;
790
		} else {
L
Linus Torvalds 已提交
791 792 793 794 795
			task->thread.fsindex = 0;
			task->thread.fs = addr;
			if (doit) {
				/* set the selector to 0 to not confuse
				   __switch_to */
796
				loadsegment(fs, 0);
797
				ret = checking_wrmsrl(MSR_FS_BASE, addr);
L
Linus Torvalds 已提交
798 799 800 801
			}
		}
		put_cpu();
		break;
802 803
	case ARCH_GET_FS: {
		unsigned long base;
L
Linus Torvalds 已提交
804 805
		if (task->thread.fsindex == FS_TLS_SEL)
			base = read_32bit_tls(task, FS_TLS);
806
		else if (doit)
L
Linus Torvalds 已提交
807
			rdmsrl(MSR_FS_BASE, base);
808
		else
L
Linus Torvalds 已提交
809
			base = task->thread.fs;
810 811
		ret = put_user(base, (unsigned long __user *)addr);
		break;
L
Linus Torvalds 已提交
812
	}
813
	case ARCH_GET_GS: {
L
Linus Torvalds 已提交
814
		unsigned long base;
815
		unsigned gsindex;
L
Linus Torvalds 已提交
816 817
		if (task->thread.gsindex == GS_TLS_SEL)
			base = read_32bit_tls(task, GS_TLS);
818
		else if (doit) {
819
			savesegment(gs, gsindex);
820 821 822 823
			if (gsindex)
				rdmsrl(MSR_KERNEL_GS_BASE, base);
			else
				base = task->thread.gs;
824
		} else
L
Linus Torvalds 已提交
825
			base = task->thread.gs;
826
		ret = put_user(base, (unsigned long __user *)addr);
L
Linus Torvalds 已提交
827 828 829 830 831 832
		break;
	}

	default:
		ret = -EINVAL;
		break;
833
	}
L
Linus Torvalds 已提交
834

835 836
	return ret;
}
L
Linus Torvalds 已提交
837 838 839 840 841 842 843 844

long sys_arch_prctl(int code, unsigned long addr)
{
	return do_arch_prctl(current, code, addr);
}

unsigned long arch_align_stack(unsigned long sp)
{
845
	if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
L
Linus Torvalds 已提交
846 847 848
		sp -= get_random_int() % 8192;
	return sp & ~0xf;
}
J
Jiri Kosina 已提交
849 850 851 852 853 854

unsigned long arch_randomize_brk(struct mm_struct *mm)
{
	unsigned long range_end = mm->brk + 0x02000000;
	return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
}