Subject: Re: SIGTRAP for traced processes and COMPAT_MACH
To: Matthew Orgass <darkstar@city-net.com>
From: Emmanuel Dreyfus <manu@netbsd.org>
List: tech-kern
Date: 11/30/2003 11:01:42
Matthew Orgass <darkstar@city-net.com> wrote:

>   Why would darwin_trapsignal call trapsignal if a mach exception is
> raised?  I thought the point of this is to not do so.

darwin_trapsignal calls trapsignal if no Mach exception was generated,
so that a signal can be sent.
 
>   Since kpsignal2 is static this is better there, but I don't see how it
> would benefit trapsignal.

signals sent by traps for illegal instruction, memory fault and many
others are sent through trapsignal. trapsignal can call do
kpsignal/kpsignal1/kpsignal2 chain, or it can directly call kpsendsig
for an immediate signal delivery. 

If we interecept the signal in kpsignal2, we need to intercept it in
trapsignal too.
 
>   Also, should kevents be sent if a Mach exception is raised?

I see no need for this now... Only compatibility code is interested into
Mach exceptions.
 
>   So: does this really need to apply generally to all signals?  If not,
> the origional idea of just calling e_trapsignal for SIGTRAP would seem to
> make the most sense.

Yes. Darwin has yet another weird feature called softsignal. You request
it using ptrace(PT_SIGEXC, 0, 0, 0);
 
Once you did that, any signal (except non catchable signal such as
SIGKILL or SIGSTOP, of course) is inhibited, and a Mach exception is
sent in place of the signal. 

The Mach exception is sent to the port registered for EXC_SOFTWARE
exceptions. The exception message contains a code array, with code[0] =
SOFT_SIGNAL and code[1] set to the signal number. More code elements may
be used for siginfo information, I have not checked that yet.

Darwin's gdb uses that feature: it gets any signal to the traced process
as a Mach exception. In order to emulate this, any call to [k]psignal in
the kernel should be intercepted by COMPAT_MACH code to eventually
generate a Mach exception and inhibit the signal delivery.

I implemented my yesterday's proposal (an emulation hooked cheksignal
function in kpsignal2 and trapsignal), and this works fine. I'm awaiting
for opinions about this before committing it...

-- 
Emmanuel Dreyfus
Il y a 10 sortes de personnes dans le monde: ceux qui comprennent 
le binaire et ceux qui ne le comprennent pas.
manu@netbsd.org