On 18.09.2015 18:40, Richard Henderson wrote:
> On 09/18/2015 03:32 AM, Peter Maydell wrote:
>>> +        if (unlikely(cpu_breakpoint_test(cs, dc->pc, BP_ANY))) {
>>> +            gen_exception_internal_insn(dc, 0, EXCP_DEBUG);
>>> +            /* Advance PC so that clearing the breakpoint will
>>> +               invalidate this TB.  */
>>> +            dc->pc += 2;
>>> +            goto done_generating;
>>> +        }
>>>          if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) {
>>>              gen_io_start();
>>>          }
>> Do you know why some but not all targets do this "advance PC"
>> thing if there's a breakpoint?
> No.  I don't believe I've seen it before yesterday.
>
> My suspicion is that if we have a TB that would span two pages, and the
> breakpoint is exactly at the page boundary, then we must advance the pc like
> this so that it's clear that the TB utilizes the second page.
>
> If so, it means that there are some targets that are broken based on this 
> (e.g.
> i386), and there are a few for which this situation is impossible, and this
> fixup is cargo culting (e.g. aarch64).
>

I noticed that this fixup is only used combined with thing like "goto
done_generating". Other targets terminate the loop only after translated
the insn, e.g. with "dc->is_jmp = DISAS_JUMP".

Best regards,
Sergey

Reply via email to