From patchwork Fri Jul 10 08:23:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alvise Rigo X-Patchwork-Id: 493687 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 5A0251400A0 for ; Fri, 10 Jul 2015 18:26:38 +1000 (AEST) Received: from localhost ([::1]:43561 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDTdk-0005g5-Fz for incoming@patchwork.ozlabs.org; Fri, 10 Jul 2015 04:26:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45437) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDTZ1-0004jN-F8 for qemu-devel@nongnu.org; Fri, 10 Jul 2015 04:21:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZDTYw-0001P8-GW for qemu-devel@nongnu.org; Fri, 10 Jul 2015 04:21:43 -0400 Received: from mail-wi0-f180.google.com ([209.85.212.180]:36459) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDTYw-0001Os-7s for qemu-devel@nongnu.org; Fri, 10 Jul 2015 04:21:38 -0400 Received: by widjy10 with SMTP id jy10so8811258wid.1 for ; Fri, 10 Jul 2015 01:21:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=jFJuq++hMXkmYeMf3RcvRk6MjaA2noSRbSNbY1im5XQ=; b=Ws9ufjbJ1Fao0UOhxDkzZran6oYPRHwfOmbO4ZcLMsl+tL870nUyoGzqgBBWnS38WE Bamle13v4PimGXhm5JW1Sd3TRKLIL+kZeaVWm/Kxq0ukP6oByQLVi6DUNRbL0t8emmjC sOHhr2A5GBdWn50BTofhjtla8xQnVGFsJUFKanWN4dGUkCgjofFdfXR7/cm+GSbJyLs7 PGh5HDsDyR51Du6d6xytKt3KWeM1ODSAfSoX0jFVc6+oxIfMOf56ldahWFajZoyzTwEV SoKrk33/OsHIqoNzzOqM/UV1jXFYpdlf5nWJifO4E6QK+nhVoS+kUdIfFmiKah5eixzj n9Dw== X-Gm-Message-State: ALoCoQmjM2zDVnq6/dIxevnlBGfUEW3cB/xQkau5q6fswFfGB4irhkzDnSFmoclYV77flgj68Dwm X-Received: by 10.180.211.196 with SMTP id ne4mr3944898wic.23.1436516497766; Fri, 10 Jul 2015 01:21:37 -0700 (PDT) Received: from linarch.home (LPuteaux-656-1-278-113.w80-15.abo.wanadoo.fr. [80.15.154.113]) by smtp.googlemail.com with ESMTPSA id ee1sm1785434wic.8.2015.07.10.01.21.36 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 10 Jul 2015 01:21:37 -0700 (PDT) From: Alvise Rigo To: qemu-devel@nongnu.org, mttcg@listserver.greensocs.com Date: Fri, 10 Jul 2015 10:23:37 +0200 Message-Id: <1436516626-8322-5-git-send-email-a.rigo@virtualopensystems.com> X-Mailer: git-send-email 2.4.5 In-Reply-To: <1436516626-8322-1-git-send-email-a.rigo@virtualopensystems.com> References: <1436516626-8322-1-git-send-email-a.rigo@virtualopensystems.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.212.180 Cc: alex.bennee@linaro.org, jani.kokkonen@huawei.com, tech@virtualopensystems.com, claudio.fontana@huawei.com, pbonzini@redhat.com Subject: [Qemu-devel] [RFC v3 04/13] tcg-op: create new TCG qemu_ldlink and qemu_stcond instructions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Create a new pair of instructions that implement a LoadLink/StoreConditional mechanism. It has not been possible to completely include the two new opcodes in the plain variants, since the StoreConditional will always require one more argument to store the success of the operation. Suggested-by: Jani Kokkonen Suggested-by: Claudio Fontana Signed-off-by: Alvise Rigo --- tcg/tcg-be-ldst.h | 1 + tcg/tcg-op.c | 23 +++++++++++++++++++++++ tcg/tcg-op.h | 3 +++ tcg/tcg-opc.h | 4 ++++ tcg/tcg.c | 2 ++ tcg/tcg.h | 18 ++++++++++-------- 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/tcg/tcg-be-ldst.h b/tcg/tcg-be-ldst.h index 40a2369..b3f9c51 100644 --- a/tcg/tcg-be-ldst.h +++ b/tcg/tcg-be-ldst.h @@ -24,6 +24,7 @@ typedef struct TCGLabelQemuLdst { bool is_ld; /* qemu_ld: true, qemu_st: false */ + TCGReg llsc_success; /* reg index for qemu_stcond outcome */ TCGMemOpIdx oi; TCGType type; /* result type of a load */ TCGReg addrlo_reg; /* reg index for low word of guest virtual addr */ diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 45098c3..a73b522 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -1885,6 +1885,15 @@ static void gen_ldst_i32(TCGOpcode opc, TCGv_i32 val, TCGv addr, #endif } +/* An output operand to return the StoreConditional result */ +static void gen_stcond_i32(TCGOpcode opc, TCGv_i32 is_dirty, TCGv_i32 val, + TCGv addr, TCGMemOp memop, TCGArg idx) +{ + TCGMemOpIdx oi = make_memop_idx(memop, idx); + + tcg_gen_op4i_i32(opc, is_dirty, val, addr, oi); +} + static void gen_ldst_i64(TCGOpcode opc, TCGv_i64 val, TCGv addr, TCGMemOp memop, TCGArg idx) { @@ -1911,12 +1920,26 @@ void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) gen_ldst_i32(INDEX_op_qemu_ld_i32, val, addr, memop, idx); } +void tcg_gen_qemu_ldlink_i32(TCGv_i32 val, TCGv addr, TCGArg idx, + TCGMemOp memop) +{ + memop = tcg_canonicalize_memop(memop, 0, 0); + gen_ldst_i32(INDEX_op_qemu_ldlink_i32, val, addr, memop, idx); +} + void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) { memop = tcg_canonicalize_memop(memop, 0, 1); gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx); } +void tcg_gen_qemu_stcond_i32(TCGv_i32 is_dirty, TCGv_i32 val, TCGv addr, + TCGArg idx, TCGMemOp memop) +{ + memop = tcg_canonicalize_memop(memop, 0, 1); + gen_stcond_i32(INDEX_op_qemu_stcond_i32, is_dirty, val, addr, memop, idx); +} + void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop) { if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) { diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h index d1d763f..f183169 100644 --- a/tcg/tcg-op.h +++ b/tcg/tcg-op.h @@ -754,6 +754,9 @@ void tcg_gen_qemu_st_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp); void tcg_gen_qemu_ld_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp); void tcg_gen_qemu_st_i64(TCGv_i64, TCGv, TCGArg, TCGMemOp); +void tcg_gen_qemu_ldlink_i32(TCGv_i32, TCGv, TCGArg, TCGMemOp); +void tcg_gen_qemu_stcond_i32(TCGv_i32, TCGv_i32, TCGv, TCGArg, TCGMemOp); + static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index) { tcg_gen_qemu_ld_tl(ret, addr, mem_index, MO_UB); diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h index 13ccb60..d6c0454 100644 --- a/tcg/tcg-opc.h +++ b/tcg/tcg-opc.h @@ -183,6 +183,10 @@ DEF(qemu_ld_i32, 1, TLADDR_ARGS, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) DEF(qemu_st_i32, 0, TLADDR_ARGS + 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) +DEF(qemu_ldlink_i32, 1, TLADDR_ARGS, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) +DEF(qemu_stcond_i32, 1, TLADDR_ARGS + 1, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) DEF(qemu_ld_i64, DATA64_ARGS, TLADDR_ARGS, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT) DEF(qemu_st_i64, 0, TLADDR_ARGS + DATA64_ARGS, 1, diff --git a/tcg/tcg.c b/tcg/tcg.c index 7e088b1..8a2265e 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1068,6 +1068,8 @@ void tcg_dump_ops(TCGContext *s) i = 1; break; case INDEX_op_qemu_ld_i32: + case INDEX_op_qemu_ldlink_i32: + case INDEX_op_qemu_stcond_i32: case INDEX_op_qemu_st_i32: case INDEX_op_qemu_ld_i64: case INDEX_op_qemu_st_i64: diff --git a/tcg/tcg.h b/tcg/tcg.h index 8ca85ab..d41a18c 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -282,6 +282,8 @@ typedef enum TCGMemOp { MO_TEQ = MO_TE | MO_Q, MO_SSIZE = MO_SIZE | MO_SIGN, + + MO_EXCL = 32, /* Set for exclusive memory access */ } TCGMemOp; typedef tcg_target_ulong TCGArg; @@ -964,13 +966,13 @@ uint64_t helper_be_ldq_mmu(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi, uintptr_t retaddr); /* Exclusive variants */ tcg_target_ulong helper_ret_ldlinkub_mmu(CPUArchState *env, target_ulong addr, - int mmu_idx, uintptr_t retaddr); + TCGMemOpIdx oi, uintptr_t retaddr); tcg_target_ulong helper_le_ldlinkuw_mmu(CPUArchState *env, target_ulong addr, - int mmu_idx, uintptr_t retaddr); + TCGMemOpIdx oi, uintptr_t retaddr); tcg_target_ulong helper_le_ldlinkul_mmu(CPUArchState *env, target_ulong addr, - int mmu_idx, uintptr_t retaddr); + TCGMemOpIdx oi, uintptr_t retaddr); uint64_t helper_le_ldlinkq_mmu(CPUArchState *env, target_ulong addr, - int mmu_idx, uintptr_t retaddr); + TCGMemOpIdx oi, uintptr_t retaddr); /* Value sign-extended to tcg register size. */ tcg_target_ulong helper_ret_ldsb_mmu(CPUArchState *env, target_ulong addr, @@ -1000,13 +1002,13 @@ void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, TCGMemOpIdx oi, uintptr_t retaddr); /* Exclusive variants */ tcg_target_ulong helper_ret_stcondb_mmu(CPUArchState *env, target_ulong addr, - uint8_t val, int mmu_idx, uintptr_t retaddr); + uint8_t val, TCGMemOpIdx oi, uintptr_t retaddr); tcg_target_ulong helper_le_stcondw_mmu(CPUArchState *env, target_ulong addr, - uint16_t val, int mmu_idx, uintptr_t retaddr); + uint16_t val, TCGMemOpIdx oi, uintptr_t retaddr); tcg_target_ulong helper_le_stcondl_mmu(CPUArchState *env, target_ulong addr, - uint32_t val, int mmu_idx, uintptr_t retaddr); + uint32_t val, TCGMemOpIdx oi, uintptr_t retaddr); uint64_t helper_le_stcondq_mmu(CPUArchState *env, target_ulong addr, - uint64_t val, int mmu_idx, uintptr_t retaddr); + uint64_t val, TCGMemOpIdx oi, uintptr_t retaddr); /* Temporary aliases until backends are converted. */ #ifdef TARGET_WORDS_BIGENDIAN