From patchwork Thu Nov 3 13:12:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 9410859 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B335D60585 for ; Thu, 3 Nov 2016 13:13:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A6BE62AB55 for ; Thu, 3 Nov 2016 13:13:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9AFC52AB57; Thu, 3 Nov 2016 13:13:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9EE752AB55 for ; Thu, 3 Nov 2016 13:13:31 +0000 (UTC) Received: from localhost ([::1]:32934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c2Hpi-0004E7-Qf for patchwork-qemu-devel@patchwork.kernel.org; Thu, 03 Nov 2016 09:13:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44100) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c2HpS-0004Dh-Q9 for qemu-devel@nongnu.org; Thu, 03 Nov 2016 09:13:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c2HpN-0002rF-RS for qemu-devel@nongnu.org; Thu, 03 Nov 2016 09:13:14 -0400 Received: from mout.kundenserver.de ([212.227.126.133]:59621) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c2HpN-0002qy-Fv for qemu-devel@nongnu.org; Thu, 03 Nov 2016 09:13:09 -0400 Received: from Quad.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue005) with ESMTPSA (Nemesis) id 0Lv6YQ-1d1VA141Kc-010KOT; Thu, 03 Nov 2016 14:12:52 +0100 From: Laurent Vivier To: Aurelien Jarno Date: Thu, 3 Nov 2016 14:12:43 +0100 Message-Id: <1478178763-12189-1-git-send-email-laurent@vivier.eu> X-Mailer: git-send-email 2.7.4 X-Provags-ID: V03:K0:t1nRSXMLFOd2En3TOAIU97q4xvp2tgY59IEhuMoR/gZaB5C2Pz8 hvXa1roUGcThR+kjS5+j8cmhnTxOuOHd31ghjXpDn4rSWJ76T9GxO25fx1dteGfm+f/gz+8 xHL8LZu2cqLDXcdpAuv34zFjuTcb+FmCSrryJs3ZIKM1cV8vc+DWpi0gIGlmzFY8DZW53uX dMA4qlyZ1GMRpbW+Ns3Ug== X-UI-Out-Filterresults: notjunk:1; V01:K0:RI5mJrgbSio=:TI4nB5TcbdlsVrxl1HnaNo PdrV5S72GipepIU6w50j1G3WpcpNH09gQY8eEQyD3l+660HPiihOYQRR7b5TA4z+J4E9vPt8s N/x7scaaqfVS/ia8PedoMynfa3bkwqUEOONKHbWMjWXSnRAkv33lgWnXAUtfP06G3ptTCExAk ndpOk+gIQ1Egp4ucDho9ZeVB25Wo9MxYvlM1mov7F2QSb8HSJCX/20/r1mo0KNxFEEMTot4O+ zc6Dke+Fs2TTgZPEklEkr43Z3t4JjusFLUKRSsuHgIpH69wXf6GNAIAWTA7XwEvmV3odBPbdx 4ba25lzc1GwfL1l9y1B66Cj6hPlZ60/dmPtZVBeMUzs9BSg27O/7dWE37atNtRThEXLLUDPQq Nm6HZjd9yY3UOHWHm4tnHpc/IYUB2iMrs+AxqStJ9E1rhPzxFy2f7igXB1jIqNQlO18v3e/2J OQMmb2zq1yGpmoUGexwP8hmTrSoYJVAY+ddKKxG7CbwveGfg1Wzn/OABhwEx8SKh6JQPcYEM9 2vjiQAA2Z8O3wEhvsyaPEQmqZC2G3mvwKFFcry2p8xGFE/xTZtWmYKCenLmeZMmym08dCqPjU EsA85mwUEQ93tyXEw2Ws8vIGmD5gQnSwlPJubOWZAJhTg4aLJkQm6y9pCjbTWWWHxiMdKkvC7 T19VTnb4lJ8WOUdjAKflceACpQkBO/Si5TVnc20+EEfHZ44XGxOS9wIl8FVP/XwxSr/8= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.133 Subject: [Qemu-devel] [PATCH] target-sh4: add atomic tas 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: Laurent Vivier , John Paul Adrian Glaubitz , qemu-devel@nongnu.org, Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Implement real atomic tas. As tas is: When (Rn) = 0, 1 -> T Otherwise, 0 -> T In both cases, 1 -> MSB of (Rn) It can't be implemented using cmpxchg(). So we use an helper and "parallel_cpus"+cpu_loop_exit_atomic(). Tested with image from: http://wiki.qemu.org/download/sh-test-0.2.tar.bz2 This image contains a "tas_test" that runs without error with this change. Signed-off-by: Laurent Vivier --- target-sh4/helper.h | 1 + target-sh4/op_helper.c | 24 ++++++++++++++++++++++++ target-sh4/translate.c | 13 +------------ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/target-sh4/helper.h b/target-sh4/helper.h index dce859c..4bfa98c 100644 --- a/target-sh4/helper.h +++ b/target-sh4/helper.h @@ -6,6 +6,7 @@ DEF_HELPER_1(raise_slot_fpu_disable, noreturn, env) DEF_HELPER_1(debug, noreturn, env) DEF_HELPER_1(sleep, noreturn, env) DEF_HELPER_2(trapa, noreturn, env, i32) +DEF_HELPER_2(tas, void, env, i32) DEF_HELPER_3(movcal, void, env, i32, i32) DEF_HELPER_1(discard_movcal_backup, void, env) diff --git a/target-sh4/op_helper.c b/target-sh4/op_helper.c index 684d3f3..17afa92 100644 --- a/target-sh4/op_helper.c +++ b/target-sh4/op_helper.c @@ -105,6 +105,30 @@ void helper_trapa(CPUSH4State *env, uint32_t tra) raise_exception(env, 0x160, 0); } +void helper_tas(CPUSH4State *env, uint32_t addr) +{ + uint8_t l; + uintptr_t ra = GETPC(); + + if (parallel_cpus) { + /* Tell the main loop we need to serialize this insn. */ + cpu_loop_exit_atomic(ENV_GET_CPU(env), ra); + } else { + /* We're executing in a serial context -- no need to be atomic. */ +#ifdef CONFIG_USER_ONLY + uint8_t *haddr = g2h(addr); + l = ldub_p(haddr); + stb_p(haddr, l | 0x80); +#else + int mmu_idx = cpu_mmu_index(env, 0); + TCGMemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); + l = helper_ret_ldub_mmu(env, addr, oi, ra); + helper_ret_stb_mmu(env, addr, l | 0x80, oi, ra); +#endif + env->sr_t = l == 0; + } +} + void helper_movcal(CPUSH4State *env, uint32_t address, uint32_t value) { if (cpu_sh4_is_cached (env, address)) diff --git a/target-sh4/translate.c b/target-sh4/translate.c index c89a147..44238fc 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -1640,18 +1640,7 @@ static void _decode_opc(DisasContext * ctx) tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 16); return; case 0x401b: /* tas.b @Rn */ - { - TCGv addr, val; - addr = tcg_temp_local_new(); - tcg_gen_mov_i32(addr, REG(B11_8)); - val = tcg_temp_local_new(); - tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB); - tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0); - tcg_gen_ori_i32(val, val, 0x80); - tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB); - tcg_temp_free(val); - tcg_temp_free(addr); - } + gen_helper_tas(cpu_env, REG(B11_8)); return; case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */ CHECK_FPU_ENABLED