From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46423) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1asTJx-0005yK-2Z for qemu-devel@nongnu.org; Tue, 19 Apr 2016 06:55:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1asTJt-00071H-Nu for qemu-devel@nongnu.org; Tue, 19 Apr 2016 06:55:53 -0400 Received: from mail-wm0-x236.google.com ([2a00:1450:400c:c09::236]:37849) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1asTJt-000717-5g for qemu-devel@nongnu.org; Tue, 19 Apr 2016 06:55:49 -0400 Received: by mail-wm0-x236.google.com with SMTP id n3so22841630wmn.0 for ; Tue, 19 Apr 2016 03:55:48 -0700 (PDT) References: <1460324732-30330-1-git-send-email-sergey.fedorov@linaro.org> <1460324732-30330-5-git-send-email-sergey.fedorov@linaro.org> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1460324732-30330-5-git-send-email-sergey.fedorov@linaro.org> Date: Tue, 19 Apr 2016 11:55:46 +0100 Message-ID: <87bn55x3yl.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v3 04/10] tcg: Init TB's direct jumps before making it visible List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sergey Fedorov Cc: qemu-devel@nongnu.org, Sergey Fedorov , Paolo Bonzini , Peter Crosthwaite , Richard Henderson Sergey Fedorov writes: > From: Sergey Fedorov > > Initialize TB's direct jump list data fields and reset the jumps before > tb_link_page() puts it into the physical hash table and the physical > page list. So TB is completely initialized before it becomes visible. > > Signed-off-by: Sergey Fedorov > Signed-off-by: Sergey Fedorov > --- > > Changes in v2: > * Tweaked a comment > > translate-all.c | 27 ++++++++++++++------------- > 1 file changed, 14 insertions(+), 13 deletions(-) > > diff --git a/translate-all.c b/translate-all.c > index 7ac7916f2792..dfa7f0d64e76 100644 > --- a/translate-all.c > +++ b/translate-all.c > @@ -1133,19 +1133,6 @@ static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, > tb->page_addr[1] = -1; > } > > - assert(((uintptr_t)tb & 3) == 0); > - tb->jmp_list_first = (uintptr_t)tb | 2; > - tb->jmp_list_next[0] = (uintptr_t)NULL; > - tb->jmp_list_next[1] = (uintptr_t)NULL; > - > - /* init original jump addresses */ > - if (tb->jmp_reset_offset[0] != TB_JMP_RESET_OFFSET_INVALID) { > - tb_reset_jump(tb, 0); > - } > - if (tb->jmp_reset_offset[1] != TB_JMP_RESET_OFFSET_INVALID) { > - tb_reset_jump(tb, 1); > - } > - > #ifdef DEBUG_TB_CHECK > tb_page_check(); > #endif > @@ -1254,6 +1241,20 @@ TranslationBlock *tb_gen_code(CPUState *cpu, > ROUND_UP((uintptr_t)gen_code_buf + gen_code_size + search_size, > CODE_GEN_ALIGN); > > + /* init jump list */ > + assert(((uintptr_t)tb & 3) == 0); > + tb->jmp_list_first = (uintptr_t)tb | 2; > + tb->jmp_list_next[0] = (uintptr_t)NULL; > + tb->jmp_list_next[1] = (uintptr_t)NULL; > + > + /* init original jump addresses wich has been set during tcg_gen_code() */ > + if (tb->jmp_reset_offset[0] != TB_JMP_RESET_OFFSET_INVALID) { > + tb_reset_jump(tb, 0); > + } > + if (tb->jmp_reset_offset[1] != TB_JMP_RESET_OFFSET_INVALID) { > + tb_reset_jump(tb, 1); > + } > + If we are really concerned about ensuring everything is set before we insert the TB into the list should we not have an explicit write barrier before we call to link the page? > /* check next page if needed */ > virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK; > phys_page2 = -1; -- Alex Bennée