From: David Daney <ddaney@caviumnetworks.com>
To: "Kevin D. Kissell" <kevink@paralogos.com>
Cc: Brian Foster <brian.foster@innova-card.com>, linux-mips@linux-mips.org
Subject: Re: [PATCH 1/2] MIPS: Preliminary vdso.
Date: Mon, 27 Apr 2009 11:26:07 -0700 [thread overview]
Message-ID: <49F5F8BF.3020501@caviumnetworks.com> (raw)
In-Reply-To: <49F5EB1A.5010407@paralogos.com>
Kevin D. Kissell wrote:
> David Daney wrote:
>> Kevin D. Kissell wrote:
>>
>>
>>> But it *could* be a trap or system call instruction, or a load/store
>>> that would provoke a TLB exception. In the usual cases, however, as
>>> I believe David was alluding, either the exception will ultimately
>>> unwind to return to execute the magic alignment trap, or the thread
>>> will exit, and could free the emulation slot as part of general cleanup.
>>>
>>> But there's a case that isn't handled in this model, and that's the
>>> case of an exception (or interrupt that falls in the 2-instruction
>>> window) resulting in a signal that is caught and dispatched, and
>>> where either the signal handler does a longjmp and restarts FP
>>> computation, or where the signal handler itself contains a FP branch
>>> with yet another delay slot to be emulated. One *could* get alarm
>>> signal before the original delay slot instruction is executed, so
>>> recycling the same vdso cache line would be premature. It's hard to
>>> get away from something distinctly stack-like if one wants to cover
>>> these cases.
>>>
>> System calls we don't have to handle, they will eventually return to
>> the break instruction following the delay slot instruction and be
>> handled by the normal processing.
>>
>> I am thinking that all other exceptions will result in one of three
>> cases:
>>
>> 1) They will work like system calls and return to the 'break'.
>>
>> 2) The thread will exit.
>>
>> 3) They result in a signal being sent to the thread. We can handle it
>> in force_signal(). In this case we would adjust the eip to point at
>> the original location of the instruction and clean things up. If the
>> signal handler tries to restart the instruction, the FP emulator will
>> re-run the emulation.
> That's presumably OK if we *know* that the delay slot instruction has
> *not* executed prior to the signal being taken. But if it has, it may
> have had side-effects, i.e. imagine if it's an "ADD.S f4, f4, f6". We
> can't re-run the emulation without generating erroneous processor
> state. What do we do if, between the ADD.S and the
FP instructions are always emulated, so they don't do this delay slot
processing thing.
> BREAK-that-replaces-my-old-alignment-trap, a timer interrupt comes in,
> causing a SIGALRM which is caught and which executes another FP branch?
> When I first wrote the delay slot handling code, I dreamed of disabling
> interrupts during the delay slot instruction emulation - I think I even
> coded it that way at one point - but it's fundamentally uncool to go off
> into user mode with interrupts off.
Asynchronous signals could be a problem. I would have to think about
that more.
>
> I really think that once the delay slot emulation machinery has been put
> into motion, that fact needs to become a part of the thread state.
> Currently, it's encoded, in a sense, in the stack pointer and the stack
> contents. If we no longer stack it, and use a more static instruction
> buffer as a trampoline, then I think it needs to be tagged as part of
> the kernel's thread state.
>
Exactly. I had planned on augmenting the thread state to handle all of
this.
> That knowledge might be used in various ways. I still think it would
> work to check that state and cause any signals to that thread need to be
> deferred until it has processed the BREAK instruction to restore the
> pre-emulation instruction flow. Once the state has been restored from
> the dsemul record, the signal can be dispatched rather than returning
> directly to the branch target. I don't like putting another check into
> the context restore code, though.
>
> A cruftier, but less inefficient-in-the-expected-case approach would be
> a variant on what you suggest above. Signal dispatch could check the
> EPC, and *if* EPC shows that the delay slot exception hasn't yet
> executed, it could roll back the EPC to re-execute the FP branch after
> the signal. If the delay slot instruction *has* executed, but not the
> following BREAK, the signal dispatch code could preemptively do the
> dsemulret cleanup and restore the pre-emulation stack and post-emulation
> EPC before doing the signal dispatch.
>
> Regards,
>
> Kevin K.
>
next prev parent reply other threads:[~2009-04-27 18:26 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-21 21:30 [PATCH 0/2] MIPS: Move signal return trampolines off the stack David Daney
2009-04-21 21:33 ` [PATCH 1/2] MIPS: Preliminary vdso David Daney
2009-04-22 5:24 ` Shane McDonald
2009-04-22 15:18 ` David Daney
2009-04-22 9:35 ` Kevin D. Kissell
2009-04-22 18:01 ` David Daney
2009-04-24 7:20 ` Brian Foster
2009-04-24 7:50 ` Kevin D. Kissell
2009-04-24 15:30 ` David Daney
2009-04-27 7:19 ` Brian Foster
2009-04-27 12:51 ` Kevin D. Kissell
2009-04-27 15:54 ` David Daney
2009-04-27 17:27 ` Kevin D. Kissell
2009-04-27 18:26 ` David Daney [this message]
2009-04-22 17:50 ` David VomLehn
2009-04-22 18:05 ` David Daney
2009-04-22 18:28 ` David VomLehn
2009-04-21 21:33 ` [PATCH 2/2] MIPS: Move signal trampolines off of the stack David Daney
2009-04-22 17:57 ` David VomLehn
2009-04-22 18:04 ` [PATCH 0/2] MIPS: Move signal return trampolines off " David VomLehn
2009-04-22 18:13 ` David Daney
2009-04-22 18:31 ` David VomLehn
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=49F5F8BF.3020501@caviumnetworks.com \
--to=ddaney@caviumnetworks.com \
--cc=brian.foster@innova-card.com \
--cc=kevink@paralogos.com \
--cc=linux-mips@linux-mips.org \
/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