1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 4 */ 5 6 #include <linux/init.h> 7 #include <linux/sched/mm.h> 8 #include <linux/sched/task_stack.h> 9 #include <linux/sched/task.h> 10 11 #include <asm/tlbflush.h> 12 13 #include <as-layout.h> 14 #include <kern.h> 15 #include <os.h> 16 #include <skas.h> 17 #include <kern_util.h> 18 19 extern void start_kernel(void); 20 21 static int __init start_kernel_proc(void *unused) 22 { 23 block_signals_trace(); 24 25 start_kernel(); 26 return 0; 27 } 28 29 extern int userspace_pid[]; 30 31 static char cpu0_irqstack[THREAD_SIZE] __aligned(THREAD_SIZE); 32 33 int __init start_uml(void) 34 { 35 stack_protections((unsigned long) &cpu0_irqstack); 36 set_sigstack(cpu0_irqstack, THREAD_SIZE); 37 38 init_new_thread_signals(); 39 40 init_task.thread.request.thread.proc = start_kernel_proc; 41 init_task.thread.request.thread.arg = NULL; 42 return start_idle_thread(task_stack_page(&init_task), 43 &init_task.thread.switch_buf); 44 } 45 46 unsigned long current_stub_stack(void) 47 { 48 if (current->mm == NULL) 49 return 0; 50 51 return current->mm->context.id.stack; 52 } 53 54 struct mm_id *current_mm_id(void) 55 { 56 if (current->mm == NULL) 57 return NULL; 58 59 return ¤t->mm->context.id; 60 } 61 62 void current_mm_sync(void) 63 { 64 if (current->mm == NULL) 65 return; 66 67 um_tlb_sync(current->mm); 68 } 69