diff options
| author | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
|---|---|---|
| committer | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
| commit | 5c34202b8bf942da411b6599668a76b07449bbfd (patch) | |
| tree | 5719c361321eaddc8e4f1b0c8a7994f0e9a6fdd3 /arch/um/sys-i386/signal.c | |
| parent | 0d4804b31f91cfbcff6d62af0bc09a893a1c8ae0 (diff) | |
| parent | 1f8a6b658a943b4f04a1fc7b3a420360202c86cd (diff) | |
Merge /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'arch/um/sys-i386/signal.c')
| -rw-r--r-- | arch/um/sys-i386/signal.c | 84 | 
1 files changed, 40 insertions, 44 deletions
diff --git a/arch/um/sys-i386/signal.c b/arch/um/sys-i386/signal.c index 3f6acd66771..1cbf95f6858 100644 --- a/arch/um/sys-i386/signal.c +++ b/arch/um/sys-i386/signal.c @@ -18,6 +18,28 @@  #include "skas.h" +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 __user *from)  { @@ -28,33 +50,18 @@ static int copy_sc_from_user_skas(struct pt_regs *regs,  	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; +		return err; + +	copy_sc(®s->regs, &sc);  	err = restore_fp_registers(userspace_pid[0], fpregs); -	if(err < 0){ +	if(err < 0) {  	  	printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, " -		       "errno = %d\n", err); -		return(1); +		       "errno = %d\n", -err); +		return err;  	} -	return(0); +	return 0;  }  int copy_sc_to_user_skas(struct sigcontext __user *to, struct _fpstate __user *to_fp, @@ -90,16 +97,16 @@ int copy_sc_to_user_skas(struct sigcontext __user *to, struct _fpstate __user *t  	if(err < 0){  	  	printk("copy_sc_to_user_skas - PTRACE_GETFPREGS failed, "  		       "errno = %d\n", err); -		return(1); +		return 1;  	}  	to_fp = (to_fp ? to_fp : (struct _fpstate __user *) (to + 1));  	sc.fpstate = to_fp;  	if(err) -	  	return(err); +	  	return err; -	return(copy_to_user(to, &sc, sizeof(sc)) || -	       copy_to_user(to_fp, fpregs, sizeof(fpregs))); +	return copy_to_user(to, &sc, sizeof(sc)) || +	       copy_to_user(to_fp, fpregs, sizeof(fpregs));  }  #endif @@ -129,7 +136,7 @@ int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext __user *from,  	to->fpstate = to_fp;  	if(to_fp != NULL)  		err |= copy_from_user(to_fp, from_fp, fpsize); -	return(err); +	return err;  }  int copy_sc_to_user_tt(struct sigcontext __user *to, struct _fpstate __user *fp, @@ -164,15 +171,15 @@ static int copy_sc_from_user(struct pt_regs *to, void __user *from)  	ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from,  					       sizeof(struct _fpstate)),  			  copy_sc_from_user_skas(to, from)); -	return(ret); +	return ret;  }  static int copy_sc_to_user(struct sigcontext __user *to, struct _fpstate __user *fp,  			   struct pt_regs *from, unsigned long sp)  { -	return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), +	return CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs),  					      sizeof(*fp), sp), -                           copy_sc_to_user_skas(to, fp, from, sp))); +                           copy_sc_to_user_skas(to, fp, from, sp));  }  static int copy_ucontext_to_user(struct ucontext __user *uc, struct _fpstate __user *fp, @@ -185,7 +192,7 @@ static int copy_ucontext_to_user(struct ucontext __user *uc, struct _fpstate __u  	err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size);  	err |= copy_sc_to_user(&uc->uc_mcontext, fp, ¤t->thread.regs, sp);  	err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); -	return(err); +	return err;  }  struct sigframe @@ -359,7 +366,7 @@ long sys_sigreturn(struct pt_regs regs)  	/* Avoid ERESTART handling */  	PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; -	return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); +	return PT_REGS_SYSCALL_RET(¤t->thread.regs);   segfault:  	force_sig(SIGSEGV, current); @@ -389,20 +396,9 @@ long sys_rt_sigreturn(struct pt_regs regs)  	/* Avoid ERESTART handling */  	PT_REGS_SYSCALL_NR(¤t->thread.regs) = -1; -	return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); +	return PT_REGS_SYSCALL_RET(¤t->thread.regs);   segfault:  	force_sig(SIGSEGV, current);  	return 0;  } - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only.  This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-file-style: "linux" - * End: - */  | 
