2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
6 #include "linux/sched.h"
7 #include "linux/slab.h"
8 #include "linux/ptrace.h"
9 #include "linux/proc_fs.h"
10 #include "linux/file.h"
11 #include "linux/errno.h"
12 #include "linux/init.h"
13 #include "asm/uaccess.h"
14 #include "asm/atomic.h"
15 #include "kern_util.h"
16 #include "time_user.h"
17 #include "signal_user.h"
20 #include "user_util.h"
25 #include "registers.h"
27 void *switch_to_skas(void *prev
, void *next
)
29 struct task_struct
*from
, *to
;
34 /* XXX need to check runqueues[cpu].idle */
38 to
->thread
.prev_sched
= from
;
41 switch_threads(&from
->thread
.mode
.skas
.switch_buf
,
42 to
->thread
.mode
.skas
.switch_buf
);
47 return(current
->thread
.prev_sched
);
50 extern void schedule_tail(struct task_struct
*prev
);
52 void new_thread_handler(int sig
)
57 fn
= current
->thread
.request
.u
.thread
.proc
;
58 arg
= current
->thread
.request
.u
.thread
.arg
;
59 change_sig(SIGUSR1
, 1);
60 thread_wait(¤t
->thread
.mode
.skas
.switch_buf
,
61 current
->thread
.mode
.skas
.fork_buf
);
63 if(current
->thread
.prev_sched
!= NULL
)
64 schedule_tail(current
->thread
.prev_sched
);
65 current
->thread
.prev_sched
= NULL
;
67 /* The return value is 1 if the kernel thread execs a process,
70 n
= run_kernel_thread(fn
, arg
, ¤t
->thread
.exec_buf
);
72 userspace(¤t
->thread
.regs
.regs
);
76 void new_thread_proc(void *stack
, void (*handler
)(int sig
))
78 init_new_thread_stack(stack
, handler
);
79 os_usr1_process(os_getpid());
82 void release_thread_skas(struct task_struct
*task
)
86 void fork_handler(int sig
)
88 change_sig(SIGUSR1
, 1);
89 thread_wait(¤t
->thread
.mode
.skas
.switch_buf
,
90 current
->thread
.mode
.skas
.fork_buf
);
93 if(current
->thread
.prev_sched
== NULL
)
96 schedule_tail(current
->thread
.prev_sched
);
97 current
->thread
.prev_sched
= NULL
;
99 userspace(¤t
->thread
.regs
.regs
);
102 int copy_thread_skas(int nr
, unsigned long clone_flags
, unsigned long sp
,
103 unsigned long stack_top
, struct task_struct
* p
,
104 struct pt_regs
*regs
)
106 void (*handler
)(int);
108 if(current
->thread
.forking
){
109 memcpy(&p
->thread
.regs
.regs
.skas
,
110 ¤t
->thread
.regs
.regs
.skas
,
111 sizeof(p
->thread
.regs
.regs
.skas
));
112 REGS_SET_SYSCALL_RETURN(p
->thread
.regs
.regs
.skas
.regs
, 0);
113 if(sp
!= 0) REGS_SP(p
->thread
.regs
.regs
.skas
.regs
) = sp
;
115 handler
= fork_handler
;
118 init_thread_registers(&p
->thread
.regs
.regs
);
119 p
->thread
.request
.u
.thread
= current
->thread
.request
.u
.thread
;
120 handler
= new_thread_handler
;
123 new_thread(p
->thread_info
, &p
->thread
.mode
.skas
.switch_buf
,
124 &p
->thread
.mode
.skas
.fork_buf
, handler
);
130 struct proc_mm_op copy
;
133 fd
= os_open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0);
138 copy
= ((struct proc_mm_op
) { .op
= MM_COPY_SEGMENTS
,
140 { .copy_segments
= from
} } );
141 n
= os_write_file(fd
, ©
, sizeof(copy
));
142 if(n
!= sizeof(copy
))
143 printk("new_mm : /proc/mm copy_segments failed, "
150 void init_idle_skas(void)
152 cpu_tasks
[current_thread
->cpu
].pid
= os_getpid();
156 extern void start_kernel(void);
158 static int start_kernel_proc(void *unused
)
165 cpu_tasks
[0].pid
= pid
;
166 cpu_tasks
[0].task
= current
;
168 cpu_online_map
= cpumask_of_cpu(0);
174 int start_uml_skas(void)
178 init_new_thread_signals(1);
181 init_task
.thread
.request
.u
.thread
.proc
= start_kernel_proc
;
182 init_task
.thread
.request
.u
.thread
.arg
= NULL
;
183 return(start_idle_thread(init_task
.thread_info
,
184 &init_task
.thread
.mode
.skas
.switch_buf
,
185 &init_task
.thread
.mode
.skas
.fork_buf
));
188 int external_pid_skas(struct task_struct
*task
)
190 #warning Need to look up userspace_pid by cpu
191 return(userspace_pid
[0]);
194 int thread_pid_skas(struct task_struct
*task
)
196 #warning Need to look up userspace_pid by cpu
197 return(userspace_pid
[0]);
201 * Overrides for Emacs so that we follow Linus's tabbing style.
202 * Emacs will notice this stuff at the end of the file and automatically
203 * adjust the settings for this buffer only. This must remain at the end
205 * ---------------------------------------------------------------------------
207 * c-file-style: "linux"