This is the mail archive of the frysk@sourceware.org mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: TaskState handleTrappedEvent


Hi Phil,

On Tue, 2007-10-30 at 15:47 +0000, Phil Muldoon wrote:
> Mark Wielaard wrote:
> > Yes, this comes from ptrace/wait translating all events into trap
> > signals. I tried to split things a little by having a separate stepping
> > state, but it is better to split up the trapped events into separate
> > (synthetic) events (see below) and then cross-checking with Chris and
> > Roland to make sure a future utrace layer gives us similar, but truly
> > separate events, with the same semantics.
> >   
> What's a synthetic event?

A 'frysk core' generated event, unlike a ptrace generated event.
See for example LinuxWaitBuilder.stopped() and
saveFsckedOrderedKernelStoppedEvent() where we either transform the
original event into a different one or reschedule the events a little
before delivering to the next layer.

> > Ideally we get an different event for different things. Since we
> > currently don't we have some (arbitrary) order. 
> 
> So to be clear several events can occur, that will only result in one 
> sigtrap operation? So it becomes a pass-along affair; each little 
> sub-system lints their respective status areas and if not for them, 
> "passes" the trap along.

Yes, in handleTrappedEvent() we currently do this by checking some extra
state (if isa.isTaskStepped() returns true or the pc is right at a
software breakpoint instruction which we inserted ourselves and we are
currently stepping that instruction, we assume it is a real step and
call task.notifyInstruction(), else we assume it is a breakpoint event
and call task.notifyCodeObserver() if that return -1 (no breakpoint
inserted here by us) then we assume it is a trap signal event and call
handleSignaledEvent(). As you said, it would be better to abstract this
logic out a bit instead of having this if-then-else chain.

> I suppose what worries me is precedence and preservation. Say two events 
> occurs but one sigtrap is generated. The first consumers see that it is 
> for them, does it then continue to pass that along? Does this existing 
> code do this now? All all sigtraps always passed along to the task at 
> the end? Should they?

On x86/x86_64 you should be able to detect the right variant through the
debug status register, that then gives you the precedence order to
check. But till now we have only dealt with one case (the step flag) and
assumed it isn't set if any other reason for the trap event triggers. So
you are entering new territory.

If in doubt I am afraid you need to write some testcases simulating
different events that all generate a trap event at the same time and
look at which get through (and what debug flags are set).

Cheers,

Mark


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]