From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53196) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ateFB-0000fS-1S for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:47:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ateF9-0008Ol-Pn for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:47:48 -0400 Received: from hall.aurel32.net ([2001:bc8:30d7:100::1]:56203) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ateF9-0008Og-Jv for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:47:47 -0400 Date: Fri, 22 Apr 2016 18:47:43 +0200 From: Aurelien Jarno Message-ID: <20160422164743.GA23711@aurel32.net> References: <1461341333-19646-1-git-send-email-sergey.fedorov@linaro.org> <1461341333-19646-11-git-send-email-sergey.fedorov@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461341333-19646-11-git-send-email-sergey.fedorov@linaro.org> Subject: Re: [Qemu-devel] [PATCH v2 10/11] tcg/mips: Make direct jump patching thread-safe List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sergey Fedorov Cc: qemu-devel@nongnu.org, Alex =?iso-8859-15?Q?Benn=E9e?= , Sergey Fedorov , Paolo Bonzini , Peter Crosthwaite , Richard Henderson On 2016-04-22 19:08, Sergey Fedorov wrote: > From: Sergey Fedorov > > Ensure direct jump patching in MIPS is atomic by using > atomic_read()/atomic_set() for code patching. > > Signed-off-by: Sergey Fedorov > Signed-off-by: Sergey Fedorov > --- > > Changes in v2: > * s/atomic_write/atomic_set/ > > tcg/mips/tcg-target.inc.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/tcg/mips/tcg-target.inc.c b/tcg/mips/tcg-target.inc.c > index 682e19897db0..cefc0398018a 100644 > --- a/tcg/mips/tcg-target.inc.c > +++ b/tcg/mips/tcg-target.inc.c > @@ -1886,6 +1886,7 @@ static void tcg_target_init(TCGContext *s) > void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) > { > uint32_t *ptr = (uint32_t *)jmp_addr; > - *ptr = deposit32(*ptr, 0, 26, addr >> 2); > + uint32_t insn = atomic_read(ptr); > + atomic_set(ptr, deposit32(insn, 0, 26, addr >> 2)); > flush_icache_range(jmp_addr, jmp_addr + 4); Does it really make sense to read and write the value atomically? The resulting operation is still not atomic, something can happen in between. Aurelien -- Aurelien Jarno GPG: 4096R/1DDD8C9B aurelien@aurel32.net http://www.aurel32.net