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"
10 #include "time_user.h"
11 #include "signal_user.h"
14 #include "user_util.h"
19 #include "filehandle.h"
22 int singlestepping_skas(void)
24 int ret = current->ptrace & PT_DTRACE;
26 current->ptrace &= ~PT_DTRACE;
30 void *switch_to_skas(void *prev, void *next)
32 struct task_struct *from, *to;
37 /* XXX need to check runqueues[cpu].idle */
41 to->thread.prev_sched = from;
44 switch_threads(&from->thread.mode.skas.switch_buf,
45 to->thread.mode.skas.switch_buf);
50 return(current->thread.prev_sched);
53 extern void schedule_tail(struct task_struct *prev);
55 void new_thread_handler(int sig)
60 fn = current->thread.request.u.thread.proc;
61 arg = current->thread.request.u.thread.arg;
62 change_sig(SIGUSR1, 1);
63 thread_wait(¤t->thread.mode.skas.switch_buf,
64 current->thread.mode.skas.fork_buf);
66 if(current->thread.prev_sched != NULL)
67 schedule_tail(current->thread.prev_sched);
68 current->thread.prev_sched = NULL;
70 /* The return value is 1 if the kernel thread execs a process,
73 n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf);
75 userspace(¤t->thread.regs.regs);
79 void new_thread_proc(void *stack, void (*handler)(int sig))
81 init_new_thread_stack(stack, handler);
82 os_usr1_process(os_getpid());
85 void release_thread_skas(struct task_struct *task)
89 void exit_thread_skas(void)
93 void fork_handler(int sig)
95 change_sig(SIGUSR1, 1);
96 thread_wait(¤t->thread.mode.skas.switch_buf,
97 current->thread.mode.skas.fork_buf);
100 if(current->thread.prev_sched == NULL)
103 schedule_tail(current->thread.prev_sched);
104 current->thread.prev_sched = NULL;
106 userspace(¤t->thread.regs.regs);
109 int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp,
110 unsigned long stack_top, struct task_struct * p,
111 struct pt_regs *regs)
113 void (*handler)(int);
115 if(current->thread.forking){
116 memcpy(&p->thread.regs.regs.skas,
117 ¤t->thread.regs.regs.skas,
118 sizeof(p->thread.regs.regs.skas));
119 REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0);
120 if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp;
122 handler = fork_handler;
125 memcpy(p->thread.regs.regs.skas.regs, exec_regs,
126 sizeof(p->thread.regs.regs.skas.regs));
127 memcpy(p->thread.regs.regs.skas.fp, exec_fp_regs,
128 sizeof(p->thread.regs.regs.skas.fp));
129 memcpy(p->thread.regs.regs.skas.xfp, exec_fpx_regs,
130 sizeof(p->thread.regs.regs.skas.xfp));
131 p->thread.request.u.thread = current->thread.request.u.thread;
132 handler = new_thread_handler;
135 new_thread(p->thread_info, &p->thread.mode.skas.switch_buf,
136 &p->thread.mode.skas.fork_buf, handler);
142 struct proc_mm_op copy;
145 fd = open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0);
150 copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS,
152 { .copy_segments = from } } );
153 n = os_write_file(fd, ©, sizeof(copy));
154 if(n != sizeof(copy))
155 printk("new_mm : /proc/mm copy_segments failed, "
162 void init_idle_skas(void)
164 cpu_tasks[current_thread->cpu].pid = os_getpid();
168 extern void start_kernel(void);
170 static int start_kernel_proc(void *unused)
177 cpu_tasks[0].pid = pid;
178 cpu_tasks[0].task = current;
180 cpu_online_map = cpumask_of_cpu(0);
186 int start_uml_skas(void)
189 capture_signal_stack();
191 init_new_thread_signals(1);
194 init_task.thread.request.u.thread.proc = start_kernel_proc;
195 init_task.thread.request.u.thread.arg = NULL;
196 return(start_idle_thread(init_task.thread_info,
197 &init_task.thread.mode.skas.switch_buf,
198 &init_task.thread.mode.skas.fork_buf));
201 int external_pid_skas(struct task_struct *task)
203 #warning Need to look up userspace_pid by cpu
204 return(userspace_pid[0]);
207 int thread_pid_skas(struct task_struct *task)
209 #warning Need to look up userspace_pid by cpu
210 return(userspace_pid[0]);
214 * Overrides for Emacs so that we follow Linus's tabbing style.
215 * Emacs will notice this stuff at the end of the file and automatically
216 * adjust the settings for this buffer only. This must remain at the end
218 * ---------------------------------------------------------------------------
220 * c-file-style: "linux"