int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp, unsigned long stack_top, struct task_struct * p, struct pt_regs *regs) { void (*handler)(int); if(current->thread.forking){ memcpy(&p->thread.regs.regs.skas, ®s->regs.skas, sizeof(p->thread.regs.regs.skas)); REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0); if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp; handler = fork_handler; arch_copy_thread(¤t->thread.arch, &p->thread.arch); } else { init_thread_registers(&p->thread.regs.regs); p->thread.request.u.thread = current->thread.request.u.thread; handler = new_thread_handler; } new_thread(task_stack_page(p), &p->thread.mode.skas.switch_buf, &p->thread.mode.skas.fork_buf, handler); return(0); }
int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp, unsigned long stack_top, struct task_struct * p, struct pt_regs *regs) { void (*handler)(int); if(current->thread.forking){ memcpy(&p->thread.regs.regs.skas, ¤t->thread.regs.regs.skas, sizeof(p->thread.regs.regs.skas)); REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0); if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp; 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)); p->thread.request.u.thread = current->thread.request.u.thread; handler = new_thread_handler; } new_thread(p->thread_info, &p->thread.mode.skas.switch_buf, &p->thread.mode.skas.fork_buf, handler); return(0); }
int copy_sc_to_user_skas(struct sigcontext *to, struct _fpstate *to_fp, struct pt_regs *regs) { struct sigcontext sc; unsigned long fpregs[HOST_FP_SIZE]; struct faultinfo * fi = ¤t->thread.arch.faultinfo; int err; sc.gs = REGS_GS(regs->regs.skas.regs); sc.fs = REGS_FS(regs->regs.skas.regs); sc.es = REGS_ES(regs->regs.skas.regs); sc.ds = REGS_DS(regs->regs.skas.regs); sc.edi = REGS_EDI(regs->regs.skas.regs); sc.esi = REGS_ESI(regs->regs.skas.regs); sc.ebp = REGS_EBP(regs->regs.skas.regs); sc.esp = REGS_SP(regs->regs.skas.regs); sc.ebx = REGS_EBX(regs->regs.skas.regs); sc.edx = REGS_EDX(regs->regs.skas.regs); sc.ecx = REGS_ECX(regs->regs.skas.regs); sc.eax = REGS_EAX(regs->regs.skas.regs); sc.eip = REGS_IP(regs->regs.skas.regs); sc.cs = REGS_CS(regs->regs.skas.regs); sc.eflags = REGS_EFLAGS(regs->regs.skas.regs); sc.esp_at_signal = regs->regs.skas.regs[UESP]; sc.ss = regs->regs.skas.regs[SS]; sc.cr2 = fi->cr2; sc.err = fi->error_code; sc.trapno = fi->trap_no; err = save_fp_registers(userspace_pid[0], fpregs); if(err < 0){ printk("copy_sc_to_user_skas - PTRACE_GETFPREGS failed, " "errno = %d\n", err); return(1); } to_fp = (to_fp ? to_fp : (struct _fpstate *) (to + 1)); sc.fpstate = to_fp; if(err) return(err); return(copy_to_user(to, &sc, sizeof(sc)) || copy_to_user(to_fp, fpregs, sizeof(fpregs))); }
void copy_sc(union uml_pt_regs *regs, void *from) { struct sigcontext *sc = from; REGS_GS(regs->skas.regs) = sc->gs; REGS_FS(regs->skas.regs) = sc->fs; REGS_ES(regs->skas.regs) = sc->es; REGS_DS(regs->skas.regs) = sc->ds; REGS_EDI(regs->skas.regs) = sc->edi; REGS_ESI(regs->skas.regs) = sc->esi; REGS_EBP(regs->skas.regs) = sc->ebp; REGS_SP(regs->skas.regs) = sc->esp; REGS_EBX(regs->skas.regs) = sc->ebx; REGS_EDX(regs->skas.regs) = sc->edx; REGS_ECX(regs->skas.regs) = sc->ecx; REGS_EAX(regs->skas.regs) = sc->eax; REGS_IP(regs->skas.regs) = sc->eip; REGS_CS(regs->skas.regs) = sc->cs; REGS_EFLAGS(regs->skas.regs) = sc->eflags; REGS_SS(regs->skas.regs) = sc->ss; }
static int copy_sc_from_user_skas(struct pt_regs *regs, struct sigcontext *from) { struct sigcontext sc; unsigned long fpregs[HOST_FP_SIZE]; int err; err = copy_from_user(&sc, from, sizeof(sc)); err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs)); if(err) return(err); REGS_GS(regs->regs.skas.regs) = sc.gs; REGS_FS(regs->regs.skas.regs) = sc.fs; REGS_ES(regs->regs.skas.regs) = sc.es; REGS_DS(regs->regs.skas.regs) = sc.ds; REGS_EDI(regs->regs.skas.regs) = sc.edi; REGS_ESI(regs->regs.skas.regs) = sc.esi; REGS_EBP(regs->regs.skas.regs) = sc.ebp; REGS_SP(regs->regs.skas.regs) = sc.esp; REGS_EBX(regs->regs.skas.regs) = sc.ebx; REGS_EDX(regs->regs.skas.regs) = sc.edx; REGS_ECX(regs->regs.skas.regs) = sc.ecx; REGS_EAX(regs->regs.skas.regs) = sc.eax; REGS_IP(regs->regs.skas.regs) = sc.eip; REGS_CS(regs->regs.skas.regs) = sc.cs; REGS_EFLAGS(regs->regs.skas.regs) = sc.eflags; REGS_SS(regs->regs.skas.regs) = sc.ss; err = restore_fp_registers(userspace_pid[0], fpregs); if(err < 0){ printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, " "errno = %d\n", err); return(1); } return(0); }