#include "os.h"
#include "user_util.h"
#include "tlb.h"
-#include "frame.h"
#include "kern.h"
#include "mode.h"
#include "proc_mm.h"
+#include "registers.h"
void *switch_to_skas(void *prev, void *next)
{
* 0 if it just exits
*/
n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf);
- if(n == 1)
+ if(n == 1){
+ /* Handle any immediate reschedules or signals */
+ interrupt_end();
userspace(¤t->thread.regs.regs);
+ }
else do_exit(0);
}
{
}
-void exit_thread_skas(void)
-{
-}
-
void fork_handler(int sig)
{
change_sig(SIGUSR1, 1);
schedule_tail(current->thread.prev_sched);
current->thread.prev_sched = NULL;
+ /* Handle any immediate reschedules or signals */
+ interrupt_end();
userspace(¤t->thread.regs.regs);
}
handler = fork_handler;
}
else {
- memcpy(p->thread.regs.regs.skas.regs, exec_regs,
- sizeof(p->thread.regs.regs.skas.regs));
- memcpy(p->thread.regs.regs.skas.fp, exec_fp_regs,
- sizeof(p->thread.regs.regs.skas.fp));
- memcpy(p->thread.regs.regs.skas.xfp, exec_fpx_regs,
- sizeof(p->thread.regs.regs.skas.xfp));
+ init_thread_registers(&p->thread.regs.regs);
p->thread.request.u.thread = current->thread.request.u.thread;
handler = new_thread_handler;
}
int start_uml_skas(void)
{
start_userspace(0);
- capture_signal_stack();
init_new_thread_signals(1);
uml_idle_timer();