diff -Nrc skas3-linux-2.4.22/Makefile skas4-linux-2.4.22/Makefile *** skas3-linux-2.4.22/Makefile Tue Dec 2 21:24:14 2003 --- skas4-linux-2.4.22/Makefile Tue Dec 2 20:32:41 2003 *************** *** 1,7 **** VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 22 ! EXTRAVERSION = -skas3 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) --- 1,7 ---- VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 22 ! EXTRAVERSION = -sysemu KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) diff -Nrc skas3-linux-2.4.22/arch/i386/kernel/entry.S skas4-linux-2.4.22/arch/i386/kernel/entry.S *** skas3-linux-2.4.22/arch/i386/kernel/entry.S Fri Jun 13 16:51:29 2003 --- skas4-linux-2.4.22/arch/i386/kernel/entry.S Tue Dec 2 20:27:41 2003 *************** *** 203,208 **** --- 203,210 ---- pushl %eax # save orig_eax SAVE_ALL GET_CURRENT(%ebx) + testb $0x20,tsk_ptrace(%ebx) # PT_SCEMU + jne emulatesys testb $0x02,tsk_ptrace(%ebx) # PT_TRACESYS jne tracesys cmpl $(NR_syscalls),%eax *************** *** 237,242 **** --- 239,248 ---- jmp restore_all ALIGN + emulatesys: + call SYMBOL_NAME(syscall_emulate) + jmp ret_from_sys_call + ALIGN tracesys: movl $-ENOSYS,EAX(%esp) call SYMBOL_NAME(syscall_trace) diff -Nrc skas3-linux-2.4.22/arch/i386/kernel/ptrace.c skas4-linux-2.4.22/arch/i386/kernel/ptrace.c *** skas3-linux-2.4.22/arch/i386/kernel/ptrace.c Tue Dec 2 21:24:01 2003 --- skas4-linux-2.4.22/arch/i386/kernel/ptrace.c Tue Dec 2 18:52:10 2003 *************** *** 275,280 **** --- 275,281 ---- } break; + case PTRACE_SCEMU: /* continue and replace next syscall */ case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ case PTRACE_CONT: { /* restart after signal. */ long tmp; *************** *** 282,287 **** --- 283,292 ---- ret = -EIO; if ((unsigned long) data > _NSIG) break; + if (request == PTRACE_SCEMU) + child->ptrace |= PT_SCEMU; + else + child->ptrace &= ~PT_SCEMU; if (request == PTRACE_SYSCALL) child->ptrace |= PT_TRACESYS; else *************** *** 320,326 **** ret = -EIO; if ((unsigned long) data > _NSIG) break; ! child->ptrace &= ~PT_TRACESYS; if ((child->ptrace & PT_DTRACE) == 0) { /* Spurious delayed TF traps may occur */ child->ptrace |= PT_DTRACE; --- 325,331 ---- ret = -EIO; if ((unsigned long) data > _NSIG) break; ! child->ptrace &= ~(PT_TRACESYS|PT_SCEMU); if ((child->ptrace & PT_DTRACE) == 0) { /* Spurious delayed TF traps may occur */ child->ptrace |= PT_DTRACE; *************** *** 482,487 **** --- 487,515 ---- return ret; } + asmlinkage void syscall_emulate(void) + { + if ((current->ptrace & (PT_PTRACED|PT_SCEMU)) != + (PT_PTRACED|PT_SCEMU)) + return; + /* the 0x80 provides a way for the tracing parent to distinguish + between a syscall stop and SIGTRAP delivery */ + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); + current->state = TASK_STOPPED; + notify_parent(current, SIGCHLD); + schedule(); + /* + * this isn't the same as continuing with a signal, but it will do + * for normal use. strace only continues with a signal if the + * stopping signal is not SIGTRAP. -brl + */ + if (current->exit_code) { + send_sig(current->exit_code, current, 1); + current->exit_code = 0; + } + } + asmlinkage void syscall_trace(void) { if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) != diff -Nrc skas3-linux-2.4.22/include/linux/ptrace.h skas4-linux-2.4.22/include/linux/ptrace.h *** skas3-linux-2.4.22/include/linux/ptrace.h Sat Sep 15 00:55:17 2001 --- skas4-linux-2.4.22/include/linux/ptrace.h Tue Dec 2 18:42:55 2003 *************** *** 20,25 **** --- 20,26 ---- #define PTRACE_DETACH 0x11 #define PTRACE_SYSCALL 24 + #define PTRACE_SCEMU 25 #include diff -Nrc skas3-linux-2.4.22/include/linux/sched.h skas4-linux-2.4.22/include/linux/sched.h *** skas3-linux-2.4.22/include/linux/sched.h Fri Jun 13 16:51:39 2003 --- skas4-linux-2.4.22/include/linux/sched.h Tue Dec 2 20:28:19 2003 *************** *** 444,449 **** --- 444,450 ---- #define PT_DTRACE 0x00000004 /* delayed trace (used on m68k, i386) */ #define PT_TRACESYSGOOD 0x00000008 #define PT_PTRACE_CAP 0x00000010 /* ptracer can follow suid-exec */ + #define PT_SCEMU 0x00000020 /* syscall emulation for UML */ #define is_dumpable(tsk) ((tsk)->task_dumpable && (tsk)->mm && (tsk)->mm->dumpable)