Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Aug 2007 14:01:26 +0400
From:      "Yuriy Tsibizov" <yuriy.tsibizov@gmail.com>
To:        hackers@freebsd.org
Subject:   modify syscall nr on-the-fly
Message-ID:  <c019b3090708180301r1e4153av72c27bcc9aaceb2e@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c019b3090708180301r1e4153av72c27bcc9aaceb2e>