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