/* * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) * Licensed under the GPL */ #include "linux/sched.h" #include "linux/slab.h" #include "linux/ptrace.h" #include "linux/proc_fs.h" #include "linux/file.h" #include "linux/errno.h" #include "linux/init.h" #include "asm/uaccess.h" #include "asm/atomic.h" #include "kern_util.h" #include "as-layout.h" #include "skas.h" #include "os.h" #include "tlb.h" #include "kern.h" #include "registers.h" extern void schedule_tail(struct task_struct *prev); int new_mm(unsigned long stack) { int fd; fd = os_open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0); if(fd < 0) return fd; if(skas_needs_stub) map_stub_pages(fd, CONFIG_STUB_CODE, CONFIG_STUB_DATA, stack); return fd; } extern void start_kernel(void); static int __init start_kernel_proc(void *unused) { int pid; block_signals(); pid = os_getpid(); cpu_tasks[0].pid = pid; cpu_tasks[0].task = current; #ifdef CONFIG_SMP cpu_online_map = cpumask_of_cpu(0); #endif start_kernel(); return 0; } extern int userspace_pid[]; extern char cpu0_irqstack[]; int __init start_uml(void) { stack_protections((unsigned long) &cpu0_irqstack); set_sigstack(cpu0_irqstack, THREAD_SIZE); if(proc_mm) userspace_pid[0] = start_userspace(0); init_new_thread_signals(); init_task.thread.request.u.thread.proc = start_kernel_proc; init_task.thread.request.u.thread.arg = NULL; return start_idle_thread(task_stack_page(&init_task), &init_task.thread.switch_buf); } unsigned long current_stub_stack(void) { if(current->mm == NULL) return 0; return current->mm->context.skas.id.stack; }