• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/um/kernel/skas/
1/*
2 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL
4 */
5
6#include "linux/init.h"
7#include "linux/sched.h"
8#include "as-layout.h"
9#include "kern.h"
10#include "os.h"
11#include "skas.h"
12
13int new_mm(unsigned long stack)
14{
15	int fd, err;
16
17	fd = os_open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0);
18	if (fd < 0)
19		return fd;
20
21	if (skas_needs_stub) {
22		err = map_stub_pages(fd, STUB_CODE, STUB_DATA, stack);
23		if (err) {
24			os_close_file(fd);
25			return err;
26		}
27	}
28
29	return fd;
30}
31
32extern void start_kernel(void);
33
34static int __init start_kernel_proc(void *unused)
35{
36	int pid;
37
38	block_signals();
39	pid = os_getpid();
40
41	cpu_tasks[0].pid = pid;
42	cpu_tasks[0].task = current;
43#ifdef CONFIG_SMP
44	cpu_online_map = cpumask_of_cpu(0);
45#endif
46	start_kernel();
47	return 0;
48}
49
50extern int userspace_pid[];
51
52extern char cpu0_irqstack[];
53
54int __init start_uml(void)
55{
56	stack_protections((unsigned long) &cpu0_irqstack);
57	set_sigstack(cpu0_irqstack, THREAD_SIZE);
58	if (proc_mm) {
59		userspace_pid[0] = start_userspace(0);
60		if (userspace_pid[0] < 0) {
61			printf("start_uml - start_userspace returned %d\n",
62			       userspace_pid[0]);
63			exit(1);
64		}
65	}
66
67	init_new_thread_signals();
68
69	init_task.thread.request.u.thread.proc = start_kernel_proc;
70	init_task.thread.request.u.thread.arg = NULL;
71	return start_idle_thread(task_stack_page(&init_task),
72				 &init_task.thread.switch_buf);
73}
74
75unsigned long current_stub_stack(void)
76{
77	if (current->mm == NULL)
78		return 0;
79
80	return current->mm->context.id.stack;
81}
82