From: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
To: Ulrich Weigand <uweigand@de.ibm.com>
Cc: schwidefsky@de.ibm.com, linux-kernel@vger.kernel.org
Subject: Re: Again: UML on s390 (31Bit)
Date: Fri, 06 May 2005 15:04:45 +0200 [thread overview]
Message-ID: <427B6B6D.5080609@fujitsu-siemens.com> (raw)
In-Reply-To: <200505042133.j44LX8Xk010820@53v30g15.boeblingen.de.ibm.com>
Ulrich Weigand wrote:
> Bodo Stroesser wrote:
>
>
>>Unfortunately, I guess this will not help. But maybe I'm missing
>>something, as I don't even understand, what the effect of the
>>attached patch should be.
>
> Have you tried it?
>
>
>>AFAICS, after each call to do_signal(),
>>entry.S will return to user without regs->trap being checked again.
>>do_signal() is the only place, where regs->trap is checked, and
>>it will be called on return to user exactly once.
>
> It will be called multiple times if *multiple* signals are pending,
> and this is exactly the situation in your problem case (some other
> signal is pending after the ptrace intercept SIGTRAP was delievered).
No, that's not the situation, we talk about.
UML runs its child with ptrace(PTRACE_SYSCALL).
The syscall-interceptions do not use *real* signals. Instead, before
and after it calls the syscall-handler, entry.S calls syscall_trace(),
which again uses ptrace_notify() to inform the father.
The father will see an event similar to the child receiving SIGTRAP or
(SIGTRAP|0x80), but there will be no signal queued and do_signal() will
not be called.
UML does all changes to its child on these two interceptions. It reads
syscall-number and register contents from the first syscall-interception,
writes a dummy number to the syscall-number, restarts the child with
ptrace(PTRACE_SYSCALL) and waits until the second interception for the
syscall happens. Next it internally executes its syscall-handler for the
original syscall-number and writes the resulting register contents to
the child. Now syscall-handling in UML is finished and the child is
resumed with ptrace(PTRACE_SYSCALL). Host's do_signal() is not called
while doing all this.
UML does not know, whether a signal is pending or not. It would not
even help, if there would be a way to retrieve this information. A
signal still could come in between retrieving the info and the child
being scheduled after ptrace(PTRACE_SYSCALL).
If there is a signal pending for the child, entry.S now jumps to
sysc_return, which again jumps to sysc_work, which calls do_signal()
exactly once. As trap still indicates a syscall, do_signal() possibly
modifies psw and gpr2, which makes UML fail.
The signal is not related to the syscall. UML does not know, if it is
delivered while returning from syscall, with do_signal() changing
registers, or later, without changes from do_signal(). So UML can't
undo the changes done by do_signal().
To UML the signal is an interrupt, and normally when returning from
interrupt it doesn't want to modify child's psw or gprs. So UML
normally does not modify psw or gprs on signal interceptions.
Having said all this, unfortunately I don't see a way to satisfy UML's
need with the current host implementation.
Regards,
Bodo
>
>
>>So a practical solution should allow to reset regs->trap while the
>>child is on the first or second syscall interception.
>
> This is exactly what this patch is supposed to do: whenever during
> a ptrace intercept the PSW is changed (as it presumably is by your
> sigreturn implementation), regs->trap is automatically reset.
>
> Bye,
> Ulrich
>
next prev parent reply other threads:[~2005-05-06 13:04 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-04 21:33 Again: UML on s390 (31Bit) Ulrich Weigand
2005-05-06 13:04 ` Bodo Stroesser [this message]
2005-05-13 15:07 ` Bodo Stroesser
2005-05-13 15:26 ` Martin Schwidefsky
2005-05-13 15:37 ` Bodo Stroesser
2005-05-13 15:40 ` Martin Schwidefsky
2005-05-13 15:45 ` Bodo Stroesser
2005-05-13 15:50 ` Martin Schwidefsky
2005-05-13 16:06 ` Bodo Stroesser
2005-05-20 10:09 ` Bodo Stroesser
2005-05-31 16:57 ` Martin Schwidefsky
2005-06-01 10:50 ` Bodo Stroesser
-- strict thread matches above, loose matches on Subject: below --
2005-05-04 16:04 Martin Schwidefsky
2005-05-04 19:02 ` Bodo Stroesser
2005-04-27 20:21 Bodo Stroesser
2005-04-28 8:36 ` Martin Schwidefsky
2005-04-28 9:54 ` Bodo Stroesser
2005-04-28 13:03 ` Martin Schwidefsky
2005-04-28 13:41 ` Bodo Stroesser
2005-04-28 15:27 ` Martin Schwidefsky
2005-04-28 18:50 ` Bodo Stroesser
2005-04-29 11:47 ` Martin Schwidefsky
2005-04-29 12:47 ` Bodo Stroesser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=427B6B6D.5080609@fujitsu-siemens.com \
--to=bstroesser@fujitsu-siemens.com \
--cc=linux-kernel@vger.kernel.org \
--cc=schwidefsky@de.ibm.com \
--cc=uweigand@de.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox