From patchwork Mon Aug 15 15:49:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emilio Cota X-Patchwork-Id: 659332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sCg485Vpbz9t3R for ; Tue, 16 Aug 2016 01:52:40 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=braap.org header.i=@braap.org header.b=rA25WgM8; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b=MfAADzFe; dkim-atps=neutral Received: from localhost ([::1]:37649 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bZKBq-0006WU-Iz for incoming@patchwork.ozlabs.org; Mon, 15 Aug 2016 11:52:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52094) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bZKAn-0005l3-59 for qemu-devel@nongnu.org; Mon, 15 Aug 2016 11:51:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bZKAh-0007ty-2J for qemu-devel@nongnu.org; Mon, 15 Aug 2016 11:51:32 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:59323) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bZKAf-0007pO-Ps for qemu-devel@nongnu.org; Mon, 15 Aug 2016 11:51:27 -0400 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id BD8C32031C; Mon, 15 Aug 2016 11:49:40 -0400 (EDT) Received: from frontend2 ([10.202.2.161]) by compute1.internal (MEProxy); Mon, 15 Aug 2016 11:49:41 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=braap.org; h=cc :content-type:date:from:in-reply-to:message-id:mime-version :references:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=U4wpX cIqaJ8Ya3Ec09aCIvwdCWY=; b=rA25WgM8f0KGpSIAJSSF7FbHwPmliNafsWlEL aX6lPvq1rZi91KbAiabXz/uWwgtEEMHXs5YfqDOqyJoFMI7BZhGcIinu6ha/Bgwv I9L5+kEkcb5o3gnzeDILx8v6Z92HnikqwDCFr0hYNbhFlxfMb/jF2d6cX0C0D/8p //PfqU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=smtpout; bh=U4wpXcIqaJ8Ya3Ec09aCIvwdCWY=; b=MfAAD zFeFad+RUNzS4gXYHrFPN6txryOZAzbieZV8/LODFffRwJ1HUZJK/Oilviss+OIs 0qqmYedmDioRfGxlXI7ACaqs4moTry4vsDSNB0DH/wvF4oXhEpe26MUFLwLDl7rw IZ+J+l/z9E4BIKY6VK/Td4OT0nub/bnf1MxiEg= X-Sasl-enc: tKI11bjLPUPWYttCMlUq38gKtPVNiJgnnjkVtjVMqVtH 1471276180 Received: from localhost (flamenco.cs.columbia.edu [128.59.20.216]) by mail.messagingengine.com (Postfix) with ESMTPA id 6AF7CCCDA6; Mon, 15 Aug 2016 11:49:40 -0400 (EDT) Date: Mon, 15 Aug 2016 11:49:40 -0400 From: "Emilio G. Cota" To: Alex =?iso-8859-1?Q?Benn=E9e?= Message-ID: <20160815154940.GA11939@flamenco> References: <87mvkeqph3.fsf@linaro.org> <20160815154626.GA8768@flamenco> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20160815154626.GA8768@flamenco> User-Agent: Mutt/1.5.23 (2014-03-12) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 66.111.4.26 Subject: [Qemu-devel] [PATCH] aarch64: use TSX for ldrex/strex X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mttcg@listserver.greensocs.com, peter.maydell@linaro.org, claudio.fontana@huawei.com, nikunj@linux.vnet.ibm.com, Peter Crosthwaite , jan.kiszka@siemens.com, mark.burton@greensocs.com, a.rigo@virtualopensystems.com, qemu-devel@nongnu.org, serge.fdrv@gmail.com, pbonzini@redhat.com, bobby.prani@gmail.com, rth@twiddle.net, "Dr. David Alan Gilbert" , fred.konrad@greensocs.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Configure with --extra-cflags="-mrtm" Signed-off-by: Emilio G. Cota --- linux-user/main.c | 5 +++-- target-arm/helper-a64.c | 42 ++++++++++++++++++++++++++++++++++++++++++ target-arm/helper-a64.h | 4 ++++ target-arm/translate-a64.c | 15 +++++++++------ 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/linux-user/main.c b/linux-user/main.c index 9880505..6922faa 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -192,8 +192,9 @@ static void step_atomic(CPUState *cpu) /* Since we got here, we know that parallel_cpus must be true. */ parallel_cpus = false; - cpu_exec_step(cpu); - parallel_cpus = true; + while (!parallel_cpus) { + cpu_exec_step(cpu); + } end_exclusive(); } diff --git a/target-arm/helper-a64.c b/target-arm/helper-a64.c index 8ce518b..af45694 100644 --- a/target-arm/helper-a64.c +++ b/target-arm/helper-a64.c @@ -33,6 +33,8 @@ #include "tcg.h" #include /* For crc32 */ +#include + /* C2.4.7 Multiply and divide */ /* special cases for 0 and LLONG_MIN are mandated by the standard */ uint64_t HELPER(udiv64)(uint64_t num, uint64_t den) @@ -579,3 +581,43 @@ uint64_t HELPER(paired_cmpxchg64_be)(CPUARMState *env, uint64_t addr, return !success; } + +void HELPER(xbegin)(CPUARMState *env) +{ + uintptr_t ra = GETPC(); + int status; + int retries = 100; + + retry: + status = _xbegin(); + if (status != _XBEGIN_STARTED) { + if (status && retries) { + retries--; + goto retry; + } + if (parallel_cpus) { + cpu_loop_exit_atomic(ENV_GET_CPU(env), ra); + } + } +} + +void HELPER(xend)(void) +{ + if (_xtest()) { + _xend(); + } else { + assert(!parallel_cpus); + parallel_cpus = true; + } +} + +uint64_t HELPER(x_ok)(void) +{ + if (_xtest()) { + return 1; + } + if (!parallel_cpus) { + return 1; + } + return 0; +} diff --git a/target-arm/helper-a64.h b/target-arm/helper-a64.h index dd32000..e7ede43 100644 --- a/target-arm/helper-a64.h +++ b/target-arm/helper-a64.h @@ -48,3 +48,7 @@ DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32) DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32) DEF_HELPER_FLAGS_4(paired_cmpxchg64_le, TCG_CALL_NO_WG, i64, env, i64, i64, i64) DEF_HELPER_FLAGS_4(paired_cmpxchg64_be, TCG_CALL_NO_WG, i64, env, i64, i64, i64) + +DEF_HELPER_1(xbegin, void, env) +DEF_HELPER_0(x_ok, i64) +DEF_HELPER_0(xend, void) diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c index 450c359..cfcf440 100644 --- a/target-arm/translate-a64.c +++ b/target-arm/translate-a64.c @@ -1760,6 +1760,8 @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2, TCGv_i64 tmp = tcg_temp_new_i64(); TCGMemOp be = s->be_data; + gen_helper_xbegin(cpu_env); + g_assert(size <= 3); if (is_pair) { TCGv_i64 hitmp = tcg_temp_new_i64(); @@ -1825,6 +1827,9 @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_exclusive_addr, fail_label); tmp = tcg_temp_new_i64(); + gen_helper_x_ok(tmp); + tcg_gen_brcondi_i64(TCG_COND_EQ, tmp, 0, fail_label); + if (is_pair) { if (size == 2) { TCGv_i64 val = tcg_temp_new_i64(); @@ -1844,16 +1849,14 @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, } } else { TCGv_i64 val = cpu_reg(s, rt); - tcg_gen_atomic_cmpxchg_i64(tmp, addr, cpu_exclusive_val, val, - get_mem_index(s), - size | MO_ALIGN | s->be_data); - tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val); + tcg_gen_qemu_st_i64(val, addr, get_mem_index(s), s->be_data + size); } tcg_temp_free_i64(addr); - - tcg_gen_mov_i64(cpu_reg(s, rd), tmp); tcg_temp_free_i64(tmp); + + tcg_gen_movi_i64(cpu_reg(s, rd), 0); + gen_helper_xend(); tcg_gen_br(done_label); gen_set_label(fail_label);