From patchwork Mon Jun 15 11:51:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alvise Rigo X-Patchwork-Id: 484231 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 0256A140273 for ; Mon, 15 Jun 2015 21:54:02 +1000 (AEST) Received: from localhost ([::1]:33587 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4Sxk-0002s7-8u for incoming@patchwork.ozlabs.org; Mon, 15 Jun 2015 07:54:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37197) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4Stv-0004nq-PM for qemu-devel@nongnu.org; Mon, 15 Jun 2015 07:50:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z4Str-00042i-Gc for qemu-devel@nongnu.org; Mon, 15 Jun 2015 07:50:03 -0400 Received: from mail-wi0-f172.google.com ([209.85.212.172]:33480) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4Str-00042S-8Q for qemu-devel@nongnu.org; Mon, 15 Jun 2015 07:49:59 -0400 Received: by wiwd19 with SMTP id d19so72410964wiw.0 for ; Mon, 15 Jun 2015 04:49:58 -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=gvJDIxACjk6IRvoEH4oZr0FOH5EOS2U9cxzxyVbs9k8=; b=D1TWCWq2JAxSi1O5RUJ3mUKfp8czZ2lwO1Ndwg4lQHh1pj4N9hGi+qXXylGnTl/4pd eTO5JC+WkLieoCoUE3Q8OTrPCfTjoFcoXxsK0Db7eQ18r1+Fv9JHRaK0Z9J2bZxulFLv hmC5cUIV+GfR89gv7s8rP6LTPAh4cjVEMZVloMisoAO+PA0z1foNNxsyonvip6hs6vqd yCASJ6BggcQzEgeA0WZSn0I8qJvDonYpK1zv/9bb4U49jUfIQ90PAXDs9/J5lM9CXmf9 SRUV4GAhAhNlhmcBfNGUh9HEfUgYWQAw30TbHyqk9RSx1LyHsmjBqQ0M8RuhY1q7+8nO DWaA== X-Gm-Message-State: ALoCoQlyL1AP4r7F8DRoS8S1u1NHzWaP6XOBtyy6hylMd3kZNBacJKPebI/rD4134vZNyEHYp5V8 X-Received: by 10.180.211.77 with SMTP id na13mr9426612wic.76.1434368998680; Mon, 15 Jun 2015 04:49:58 -0700 (PDT) Received: from linarch.home (LPuteaux-656-1-278-113.w80-15.abo.wanadoo.fr. [80.15.154.113]) by mx.google.com with ESMTPSA id tl3sm18570524wjc.20.2015.06.15.04.49.57 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Jun 2015 04:49:57 -0700 (PDT) From: Alvise Rigo To: qemu-devel@nongnu.org Date: Mon, 15 Jun 2015 13:51:26 +0200 Message-Id: <1434369088-15076-6-git-send-email-a.rigo@virtualopensystems.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1434369088-15076-1-git-send-email-a.rigo@virtualopensystems.com> References: <1434369088-15076-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.172 Cc: mttcg@listserver.greensocs.com, claudio.fontana@huawei.com, cota@braap.org, jani.kokkonen@huawei.com, tech@virtualopensystems.com, alex.bennee@linaro.org, rth@twiddle.net Subject: [Qemu-devel] [RFC v2 5/7] 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 d0180fe..7acc1fa 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; @@ -957,13 +959,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, @@ -993,13 +995,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