modify syscall nr on-the-fly

Yuriy Tsibizov yuriy.tsibizov at gmail.com
Sat Aug 18 03:26:39 PDT 2007


I'm trying to get user-mode Linux to run under FreeBSD Linux emulation (on
i386).

User-mode Linux in it's start-up tests tries to modify syscall number (to be
called by kernel) on-the-fly
(http://fxr.watson.org/fxr/source/arch/um/os-Linux/start_up.c?v=linux-2.6).
It forks a child thread that stops
(using SIGSTOP), calls getpid() (that will be intercepted by parent thread
using PTRACE_SYSCALL)
and return some value based on getpid() results. Main thread waits for
SIGSTOP in child process and
enables PTRACE_SYSCALL (I have some code that implements it. It makes some
incompatible changes
to PT_SYSCALL that will break FreeBSD applications, but works for Linux
apps). When main thread
catches SIGTRAP (generated by ptrace) it tries to modify EAX of child thread
(with PTRACE_PEEKUSR
and PTRACE_POKEUSR) to replace getpid syscall with getppid.

is it possible to get updated EAX (and other registers as well)  in
syscall(...) after ptracestop(...) in PTRACESTOP_SC(...) returns?

Hope for your help,

Yuriy.


More information about the freebsd-hackers mailing list