From: "Lluís Vilanova" <vilanova@ac.upc.edu>
To: Richard Henderson <rth@twiddle.net>
Cc: qemu-devel@nongnu.org, "Emilio G. Cota" <cota@braap.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Peter Crosthwaite" <crosthwaite.peter@gmail.com>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v12 04/27] target: [tcg] Add generic translation framework
Date: Tue, 11 Jul 2017 19:40:27 +0300 [thread overview]
Message-ID: <87eftnhqpw.fsf@frigg.lan> (raw)
In-Reply-To: <65f59b75-08c3-3872-6906-20060b5b4a28@twiddle.net> (Richard Henderson's message of "Fri, 7 Jul 2017 08:42:41 -1000")
Richard Henderson writes:
> On 07/07/2017 01:56 AM, Lluís Vilanova wrote:
[...]
>> +
>> + /* Instruction counting */
>> + max_insns = db->tb->cflags & CF_COUNT_MASK;
>> + if (max_insns == 0) {
>> + max_insns = CF_COUNT_MASK;
>> + }
>> + if (max_insns > TCG_MAX_INSNS) {
>> + max_insns = TCG_MAX_INSNS;
>> + }
>> + if (db->singlestep_enabled || singlestep) {
>> + max_insns = 1;
>> + }
>> +
>> + /* Start translating */
>> + gen_tb_start(db->tb);
>> + ops->tb_start(db, cpu);
> As I mentioned, we need some way to modify max_insns before the loop start.
> (For the ultimate in max_insns modifying needs, see the sh4 patch set I posted
> this morning, wherein I may *extend* max_insns in order to force it to cover a
> region to be executed atomically within one TB, within the lock held by
> cpu_exec_step_atomic.)
> Based on that, I recommend
> DisasJumpType status;
> status = ops->tb_start(db, cpu, &max_insns);
> Because in my sh4 case, tb_start might itself decide that the only way to handle
> the code is to raise the EXCP_ATOMIC exception and try again within
> cpu_exec_step_atomic. Which means that we would not enter the while loop at
> all. Thus,
>> + while (true) {
> while (status == DISAS_NEXT) {
>> + db->num_insns++;
>> + ops->insn_start(db, cpu);
>> +
>> + /* Early exit before breakpoint checks */
> Better comment maybe? "The insn_start hook may request early exit..."
> And, indeed, perhaps
> status = ops->insn_start(db, cpu);
> if (unlikely(status != DISAS_NEXT)) {
> break;
> }
Since other hooks can set db->is_jmp and return values (breakpoint_check), I'll
stick with db->is_jmp instead. Then tb_start can return max_insns, and generic
code can refine it with checks like single-stepping.
>> + if (unlikely(db->is_jmp != DISAS_NEXT)) {
>> + break;
>> + }
>> +
>> + /* Pass breakpoint hits to target for further processing */
>> + if (unlikely(!QTAILQ_EMPTY(&cpu->breakpoints))) {
>> + CPUBreakpoint *bp;
>> + QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
>> + if (bp->pc == db->pc_next) {
>> + BreakpointCheckType bp_check =
>> + ops->breakpoint_check(db, cpu, bp);
>> + switch (bp_check) {
>> + case BC_MISS:
>> + /* Target ignored this breakpoint, go to next */
>> + break;
>> + case BC_HIT_INSN:
>> + /* Hit, keep translating */
>> + /*
>> + * TODO: if we're never going to have more than one
>> + * BP in a single address, we can simply use a
>> + * bool here.
>> + */
>> + goto done_breakpoints;
>> + case BC_HIT_TB:
>> + /* Hit, end TB */
>> + goto done_generating;
>> + default:
>> + g_assert_not_reached();
>> + }
>> + }
>> + }
>> + }
>> + done_breakpoints:
>> +
>> + /* Accept I/O on last instruction */
>> + if (db->num_insns == max_insns && (db->tb->cflags & CF_LAST_IO)) {
>> + gen_io_start();
>> + }
>> +
>> + /* Disassemble one instruction */
>> + db->pc_next = ops->translate_insn(db, cpu);
> I think it would be better to assign to pc_next within the hook. We don't use
> the value otherwise within the rest of the loop.
> But we do use is_jmp, immediately. So maybe better to follow the changes to
> tb_start and insn_start above.
As before, for consistency I prefer to set is_jmp instead of returning it on
hooks, since breakpoint_check() already has a return value and can set is_jmp.
Then, a future series adding tracing events to this loop uses db->pc_next in the
generic loop, so it is going to be used.
>> + }
>> +
>> + ops->tb_stop(db, cpu);
>> +
>> + if (db->tb->cflags & CF_LAST_IO) {
>> + gen_io_end();
>> + }
> You can't place this after tb_stop, as it'll never be executed. We will have
> for certain emitted the exit_tb for all paths by now.
> Just place it before tb_stop where it usually resides. In the case where some
> is_jmp value implies unreached code, and we're using icount, we'll accept the
> dead code. But in all other cases it will get executed.
Ok!
Thanks,
Lluis
next prev parent reply other threads:[~2017-07-11 16:40 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-07 11:40 [Qemu-devel] [PATCH v12 00/27] translate: [tcg] Generic translation framework Lluís Vilanova
2017-07-07 11:44 ` [PATCH v12 01/27] Pass generic CPUState to gen_intermediate_code() Lluís Vilanova
2017-07-07 11:44 ` [Qemu-devel] " Lluís Vilanova
2017-07-11 19:22 ` Alex Bennée
2017-07-11 19:22 ` [Qemu-devel] " Alex Bennée
2017-07-07 11:48 ` [Qemu-devel] [PATCH v12 02/27] cpu-exec: Avoid global variables in icount-related functions Lluís Vilanova
2017-07-11 19:25 ` Alex Bennée
2017-07-12 8:42 ` Lluís Vilanova
2017-07-12 22:06 ` Emilio G. Cota
2017-07-07 11:52 ` [PATCH v12 03/27] target: [tcg] Use a generic enum for DISAS_ values Lluís Vilanova
2017-07-07 11:52 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:10 ` Alex Bennée
2017-07-12 9:10 ` [Qemu-devel] " Alex Bennée
2017-07-12 10:56 ` Lluís Vilanova
2017-07-12 10:56 ` Lluís Vilanova
2017-07-12 16:53 ` Richard Henderson
2017-07-12 16:53 ` [Qemu-devel] " Richard Henderson
2017-07-07 11:56 ` [Qemu-devel] [PATCH v12 04/27] target: [tcg] Add generic translation framework Lluís Vilanova
2017-07-07 18:42 ` Richard Henderson
2017-07-11 16:40 ` Lluís Vilanova [this message]
2017-07-11 17:21 ` Richard Henderson
2017-07-12 8:50 ` Lluís Vilanova
2017-07-11 18:17 ` Alex Bennée
2017-07-12 8:59 ` Lluís Vilanova
2017-07-12 9:13 ` Alex Bennée
2017-07-07 12:00 ` [Qemu-devel] [PATCH v12 05/27] target/i386: [tcg] Port to DisasContextBase Lluís Vilanova
2017-07-12 9:18 ` Alex Bennée
2017-07-12 11:00 ` Lluís Vilanova
2017-07-07 12:04 ` [Qemu-devel] [PATCH v12 06/27] target/i386: [tcg] Port to init_disas_context Lluís Vilanova
2017-07-12 9:20 ` Alex Bennée
2017-07-07 12:08 ` [Qemu-devel] [PATCH v12 07/27] target/i386: [tcg] Port to insn_start Lluís Vilanova
2017-07-12 9:21 ` Alex Bennée
2017-07-07 12:13 ` [Qemu-devel] [PATCH v12 08/27] target/i386: [tcg] Port to breakpoint_check Lluís Vilanova
2017-07-07 12:17 ` [Qemu-devel] [PATCH v12 09/27] target/i386: [tcg] Port to translate_insn Lluís Vilanova
2017-07-07 12:21 ` [Qemu-devel] [PATCH v12 10/27] target/i386: [tcg] Port to tb_stop Lluís Vilanova
2017-07-07 12:25 ` [Qemu-devel] [PATCH v12 11/27] target/i386: [tcg] Port to disas_log Lluís Vilanova
2017-07-07 12:29 ` [Qemu-devel] [PATCH v12 12/27] target/i386: [tcg] Port to generic translation framework Lluís Vilanova
2017-07-07 12:33 ` [PATCH v12 13/27] target/arm: [tcg] Port to DisasContextBase Lluís Vilanova
2017-07-07 12:33 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:25 ` Alex Bennée
2017-07-12 9:25 ` [Qemu-devel] " Alex Bennée
2017-07-07 12:37 ` [PATCH v12 14/27] target/arm: [tcg] Port to init_disas_context Lluís Vilanova
2017-07-07 12:37 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:27 ` Alex Bennée
2017-07-12 9:27 ` [Qemu-devel] " Alex Bennée
2017-07-07 12:41 ` [PATCH v12 15/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 12:41 ` [Qemu-devel] [PATCH v12 15/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-12 9:30 ` [PATCH v12 15/27] target/arm: [tcg,a64] " Alex Bennée
2017-07-12 9:30 ` [Qemu-devel] [PATCH v12 15/27] target/arm: [tcg, a64] " Alex Bennée
2017-07-07 12:46 ` [PATCH v12 16/27] target/arm: [tcg] Port to tb_start Lluís Vilanova
2017-07-07 12:46 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:31 ` Alex Bennée
2017-07-12 9:31 ` [Qemu-devel] " Alex Bennée
2017-07-07 12:50 ` [PATCH v12 17/27] target/arm: [tcg] Port to insn_start Lluís Vilanova
2017-07-07 12:50 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:32 ` Alex Bennée
2017-07-12 9:32 ` [Qemu-devel] " Alex Bennée
2017-07-07 12:54 ` [PATCH v12 18/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 12:54 ` [Qemu-devel] [PATCH v12 18/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-12 9:32 ` [PATCH v12 18/27] target/arm: [tcg,a64] " Alex Bennée
2017-07-12 9:32 ` [Qemu-devel] [PATCH v12 18/27] target/arm: [tcg, a64] " Alex Bennée
2017-07-07 12:58 ` [PATCH v12 19/27] target/arm: [tcg] Port to breakpoint_check Lluís Vilanova
2017-07-07 12:58 ` [Qemu-devel] " Lluís Vilanova
2017-07-07 13:02 ` [PATCH v12 20/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 13:02 ` [Qemu-devel] [PATCH v12 20/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-07 13:06 ` [PATCH v12 21/27] target/arm: [tcg] Port to translate_insn Lluís Vilanova
2017-07-07 13:06 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:39 ` Alex Bennée
2017-07-12 9:39 ` [Qemu-devel] " Alex Bennée
2017-07-12 11:05 ` Lluís Vilanova
2017-07-12 11:05 ` Lluís Vilanova
2017-07-07 13:10 ` [PATCH v12 22/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 13:10 ` [Qemu-devel] [PATCH v12 22/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-07 13:14 ` [PATCH v12 23/27] target/arm: [tcg] Port to tb_stop Lluís Vilanova
2017-07-07 13:14 ` [Qemu-devel] " Lluís Vilanova
2017-07-07 13:18 ` [PATCH v12 24/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 13:18 ` [Qemu-devel] [PATCH v12 24/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-07 13:23 ` [PATCH v12 25/27] target/arm: [tcg] Port to disas_log Lluís Vilanova
2017-07-07 13:23 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:41 ` Alex Bennée
2017-07-12 9:41 ` [Qemu-devel] " Alex Bennée
2017-07-07 13:27 ` [PATCH v12 26/27] target/arm: [tcg,a64] " Lluís Vilanova
2017-07-07 13:27 ` [Qemu-devel] [PATCH v12 26/27] target/arm: [tcg, a64] " Lluís Vilanova
2017-07-07 13:31 ` [PATCH v12 27/27] target/arm: [tcg] Port to generic translation framework Lluís Vilanova
2017-07-07 13:31 ` [Qemu-devel] " Lluís Vilanova
2017-07-12 9:47 ` [Qemu-devel] [PATCH v12 00/27] translate: [tcg] Generic " Alex Bennée
2017-07-12 11:10 ` Lluís Vilanova
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=87eftnhqpw.fsf@frigg.lan \
--to=vilanova@ac.upc.edu \
--cc=alex.bennee@linaro.org \
--cc=cota@braap.org \
--cc=crosthwaite.peter@gmail.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.