On 24/03/16 17:58, Alex Bennée wrote:
>> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
>> > index cc3d2ca25917..cd96219a89e7 100644
>> > --- a/include/exec/exec-all.h
>> > +++ b/include/exec/exec-all.h
>> > @@ -275,14 +275,15 @@ struct TranslationBlock {
>> >       * jmp_list_first points to the first TB jumping to this one.
>> >       * jmp_list_next is used to point to the next TB in a list.
>> >       * Since each TB can have two jumps, it can participate in two lists.
>> > -     * The two least significant bits of a pointer are used to choose 
>> > which
>> > -     * data field holds a pointer to the next TB:
>> > +     * jmp_list_first and jmp_list_next are 4-byte aligned pointers to a
>> > +     * TranslationBlock structure, and the two least significant bits of 
>> > them
>> > +     * are used to encode which data field holds a pointer to the next TB:
>> >       * 0 => jmp_list_next[0], 1 => jmp_list_next[1], 2 => jmp_list_first.
>> >       * In other words, 0/1 tells which jump is used in the pointed TB,
>> >       * and 2 means that this is a pointer back to the target TB of this 
>> > list.
>> >       */
> Ahh I see you anticipate my previous confusion. Does this mean each time
> a jump is resolved for a particular chain the next tb could be in a
> different entry in the next TB?

I'm not sure I got your question right... When we patch the n-th jump of
a TB we use it's 'jmp_list_next[n]' to add it to the list of the TBs
jumping to the same target TB. And we use 'jmp_list_first' of the target
TB to track all those TBs jumping to it.

Kind regards,
Sergey

Reply via email to