From: Paul Koning <pkoning@equallogic.com>
To: tzuchien.chiu@gmail.com
Cc: gdb@sourceware.org
Subject: Re: remote software breakpoint technical detail
Date: Wed, 03 May 2006 18:49:00 -0000 [thread overview]
Message-ID: <17496.64324.16580.544559@gargle.gargle.HOWL> (raw)
In-Reply-To: <4d77c5f20605031043t256b1c05o3d9bb27beef8ed33@mail.gmail.com>
>>>>> "Tzu-Chien" == Tzu-Chien Chiu <tzuchien.chiu@gmail.com> writes:
Tzu-Chien> Hi, all. I'm new to gdb. I have a question on the remote
Tzu-Chien> software breakpoint implementation. Either my porting of
Tzu-Chien> gdb or there is a bug in our hardware implementation.
Tzu-Chien> We have an OpenRISC silicon
Tzu-Chien> (http://www.opencores.org). I'm using GDB 5.0.
Tzu-Chien> Suppose the instruction cache has been disabled in the
Tzu-Chien> very beginning.
Tzu-Chien> Here is what I observed: 1) the user set a breakpoint
Tzu-Chien> ('b') at instruction foo 2) the user continue ('c') the
Tzu-Chien> execution 3) gdb replaces instruction foo with a
Tzu-Chien> 'breakpoint instruction", which will stall the processor
Tzu-Chien> 4) gdb unstall the processor 5) the processor fetches the
Tzu-Chien> breakpoint instruction into the execution pipeline, and
Tzu-Chien> point pc to the next instruction 6) the breakpoint
Tzu-Chien> instruction is decoded, recognized, and the processor
Tzu-Chien> stalls 7) gdb restores instruction foo 8) the user issues
Tzu-Chien> the single instruction step ('si'), and he expects
Tzu-Chien> instruction foo be executed next, but...
Tzu-Chien> The question is:
Tzu-Chien> What value of pc should be expected after step 5
Tzu-Chien> completes?
Tzu-Chien> if $pc==foo+4, foo won't be executed but the following
Tzu-Chien> instruction, which is incorrect.
Tzu-Chien> if $pc==foo, the breakpoint instruction _has been_ fetched
Tzu-Chien> into the execution pipeline at step 5, what makes the cpu
Tzu-Chien> to *fetch again* the instruction restored by gdb at step
Tzu-Chien> 7? GDB or the hardware must be designed to do so?
The target dependent code in GDB can deal with either foo+4 or foo.
Look at the documentation (in gdbint) for DECR_PC_AFTER_BREAK.
When GDB tells the target to write to memory (for example, as part of
setting or clearing a breakpoint) the target stub, or the target OS,
is responsible for dealing with caches, pipelines, etc.
For example, most modern machines have separate I and D caches, and
I-fetching doesn't look in the D-cache. So a memory write does
roughly the following:
1. Store the data
2. Flush the D-cache (forcing all pending writes, or perhaps just the
address modified in step 1, to memory)
3. Invalidate the I-cache (forcing I-fetches to go to memory instead).
If your processor has a fetch pipeline, and it doesn't re-fetch the
instruction at "foo" unless told to do so, then you (the target side
code) have to tell it to do that.
paul
prev parent reply other threads:[~2006-05-03 18:49 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-03 17:43 Tzu-Chien Chiu
2006-05-03 18:08 ` Daniel Jacobowitz
2006-05-03 18:49 ` Paul Koning [this message]
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=17496.64324.16580.544559@gargle.gargle.HOWL \
--to=pkoning@equallogic.com \
--cc=gdb@sourceware.org \
--cc=tzuchien.chiu@gmail.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