X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fkernel%2Ftt%2Fsyscall_user.c;h=1cabbd86690118636dc0f37bcf2f334f25268859;hb=6f71f83334a552167ccbbd42fe5dd979428c89e4;hp=b06217d022997c48b9321aaea58deaa6387be429;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/arch/um/kernel/tt/syscall_user.c b/arch/um/kernel/tt/syscall_user.c index b06217d02..1cabbd866 100644 --- a/arch/um/kernel/tt/syscall_user.c +++ b/arch/um/kernel/tt/syscall_user.c @@ -17,6 +17,10 @@ #include "syscall_user.h" #include "tt.h" +/* XXX Bogus */ +#define ERESTARTSYS 512 +#define ERESTARTNOINTR 513 +#define ERESTARTNOHAND 514 void syscall_handler_tt(int sig, union uml_pt_regs *regs) { @@ -29,7 +33,7 @@ void syscall_handler_tt(int sig, union uml_pt_regs *regs) SC_START_SYSCALL(sc); index = record_syscall_start(syscall); - syscall_trace(regs, 0); + syscall_trace(regs, 1); result = execute_syscall(regs); /* regs->sc may have changed while the system call ran (there may @@ -38,12 +42,15 @@ void syscall_handler_tt(int sig, union uml_pt_regs *regs) UPT_SC(regs) = sc; SC_SET_SYSCALL_RETURN(sc, result); + if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || + (result == -ERESTARTNOINTR)) + do_signal(result); - syscall_trace(regs, 1); + syscall_trace(regs, 0); record_syscall_end(index, result); } -int do_syscall(void *task, int pid, int local_using_sysemu) +int do_syscall(void *task, int pid) { unsigned long proc_regs[FRAME_SIZE]; union uml_pt_regs *regs; @@ -56,17 +63,13 @@ int do_syscall(void *task, int pid, int local_using_sysemu) regs = TASK_REGS(task); UPT_SYSCALL_NR(regs) = syscall; - if(syscall < 0) - return(0); + if(syscall < 1) return(0); if((syscall != __NR_sigreturn) && ((unsigned long *) PT_IP(proc_regs) >= &_stext) && ((unsigned long *) PT_IP(proc_regs) <= &_etext)) tracer_panic("I'm tracing myself and I can't get out"); - if(local_using_sysemu) - return(1); - if(ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid) < 0) tracer_panic("do_syscall : Nullifying syscall failed, "