From patchwork Mon Feb 11 23:52:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040248 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="HwwJx1d3"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2gM35Ffz9s3x for ; Tue, 12 Feb 2019 10:53:51 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58118 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOX-00050H-2R for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:53:49 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37676) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLNp-000500-9x for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLNo-0004FW-8W for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:05 -0500 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:40691) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLNo-0004EF-0o for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:04 -0500 Received: by mail-pl1-x643.google.com with SMTP id bj4so327742plb.7 for ; Mon, 11 Feb 2019 15:53:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=t1Ac8wdCYYJyzUaPePYMhujZZB6jvuYyMH+INQ2PV8M=; b=HwwJx1d3vmxrCDnIg8oMe4dN+LC+cxuIYMkEuOoCfce0dxzK6igk2RrKtmHMRvzPx6 Dv2k+SKB7igThqeu39CN9O4KBBLDnLxke+tqqAh8UYdlGcgSkv3LqHjjV1Fmj26s1H+N yxRKVj6Un5cJHJd8CYUF14kM8loxfaAOTtAwgkf8V42CsuBHbW4Z98I8ttL/q9JeSVmn RLUmnVAB+DTggkQIRadlHrsMS/w/iZ1Ikh6GUVrqYTwbz5JEe9mkABNKTAcS3yDqF8gz PxCC5pP6o5JLTKGiyxXtOBYCaQESTSOSApfnoR3hbMNhcMPQSfI0WW5DX8jyQVAeA3EZ wQKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=t1Ac8wdCYYJyzUaPePYMhujZZB6jvuYyMH+INQ2PV8M=; b=g95NGFfMgxhXXGmZGh2T6wxIEsN3rq5pntQE2dxIZN7fH9bAOHUSmrB5bKl5u7r+fc EMFLKh2OLYolmqrXrRF+2Ef2xg/m3XJKSPEKLhZxfmHMhlSobFa7xhdVnCpI3wEOy+Kg 90WMpLBqHZ8F1Z1sLBspsqZsZWUctdpD7VljaV6l123OI5TiIdCH0J7K4TNwH2z5d5CI 1yJtOMyE3YHmpc0rYtXk8CQPJLrlHgWrI5f3qNVHWJPwn2HQEhJrvQxX50hy563b4LPI Xc7/aP/i6SSVUgwhNiqXVpi8sMoxAj3G3VEfihaUaKUggZoWrlDPPhuC8/fQ05A0IWL/ yyBQ== X-Gm-Message-State: AHQUAuYTqJKBbTMCqejLEU9FWif+l3pm4iXEEziavuj+CMOEV7UC44QF Ev7vfNtyxTVzDQH4uvyza69jiksQcqk= X-Google-Smtp-Source: AHgI3IbpZKD9Kq3JzBMGOEW+ISV2du0EgEeGuSE+U74+j3++lT4CxemoOHswzd6heOGwoHUIaK7+dA== X-Received: by 2002:a17:902:a58c:: with SMTP id az12mr860401plb.299.1549929182714; Mon, 11 Feb 2019 15:53:02 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:01 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:31 -0800 Message-Id: <20190211235258.542-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 Subject: [Qemu-devel] [PATCH v3 01/28] target/arm: Split out arm_sctlr 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Minimize the number of places that will need updating when the virtual host extensions are added. Signed-off-by: Richard Henderson --- target/arm/cpu.h | 26 ++++++++++++++++---------- target/arm/helper.c | 8 ++------ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 29663a264d..20be9fb53a 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -2987,11 +2987,20 @@ static inline bool arm_sctlr_b(CPUARMState *env) (env->cp15.sctlr_el[1] & SCTLR_B) != 0; } +static inline uint64_t arm_sctlr(CPUARMState *env, int el) +{ + if (el == 0) { + /* FIXME: ARMv8.1-VHE S2 translation regime. */ + return env->cp15.sctlr_el[1]; + } else { + return env->cp15.sctlr_el[el]; + } +} + + /* Return true if the processor is in big-endian mode. */ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env) { - int cur_el; - /* In 32bit endianness is determined by looking at CPSR's E bit */ if (!is_a64(env)) { return @@ -3010,15 +3019,12 @@ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env) arm_sctlr_b(env) || #endif ((env->uncached_cpsr & CPSR_E) ? 1 : 0); + } else { + int cur_el = arm_current_el(env); + uint64_t sctlr = arm_sctlr(env, cur_el); + + return (sctlr & (cur_el ? SCTLR_EE : SCTLR_E0E)) != 0; } - - cur_el = arm_current_el(env); - - if (cur_el == 0) { - return (env->cp15.sctlr_el[1] & SCTLR_E0E) != 0; - } - - return (env->cp15.sctlr_el[cur_el] & SCTLR_EE) != 0; } #include "exec/cpu-all.h" diff --git a/target/arm/helper.c b/target/arm/helper.c index 520ceea7a4..d4abbb5076 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -13796,12 +13796,8 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, flags = FIELD_DP32(flags, TBFLAG_A64, ZCR_LEN, zcr_len); } - if (current_el == 0) { - /* FIXME: ARMv8.1-VHE S2 translation regime. */ - sctlr = env->cp15.sctlr_el[1]; - } else { - sctlr = env->cp15.sctlr_el[current_el]; - } + sctlr = arm_sctlr(env, current_el); + if (cpu_isar_feature(aa64_pauth, cpu)) { /* * In order to save space in flags, we record only whether From patchwork Mon Feb 11 23:52:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040250 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="rq2DDaSh"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2h162jgz9s3x for ; Tue, 12 Feb 2019 10:54:21 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58126 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOw-0005FU-7M for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:54:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37791) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLNr-00051I-NT for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLNq-0004Io-5J for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:07 -0500 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:33735) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLNp-0004H3-RI for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:06 -0500 Received: by mail-pg1-x543.google.com with SMTP id z11so335240pgu.0 for ; Mon, 11 Feb 2019 15:53:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=hbKS6AD3am/sY2oZ+gJOc5vr5/ws9wlGISFwMC+r3mY=; b=rq2DDaShtc6LY6HTelUqvdzvJ2ZQje4EzLF7TPfPeMpQScMj+726YSL8pCmPZmAOrm KfVNcZ4njaaciZP8ObFCVO2w2jZXONsMg2rOWxs6rVA7DxgW0gtG5zqfDevD/PS1OWv5 BYP49/av/7XUsSvsU21AMYXx2rNPR7e8FynRPDAae6B0R7c5moDoab0t56k6o+nk7fz1 tEwjYNOmCHgtKq8sapNxdlO6ubC3geN/2G5u1gEC3CG+P7FrVG61TQ6VsvoG2tWnRoRp L6KmNeLSOw4nhnypFfdaFI8b8zdXzpStqtRVzXyGAQ05766BiRIgpQpmyGmiUD8oUo51 eqIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=hbKS6AD3am/sY2oZ+gJOc5vr5/ws9wlGISFwMC+r3mY=; b=Pt+GF2wJKH1TVGSF8osfKGUYjnnIu6mzXTgpIn5fyFCL68mKSISqYbvw4Hw6czWGOA aRyfsJcwWvyUsxZQ80PJ6924eNoxCuHWyYzV60XQd5srEVI1LU+UPfLRNiic6rJoVKtk p+ZlGyaGfbq8FSGSoTlJbBZNaM+vlYikU0qdZKZvtL3PEHKpBNXdZRGKTo0f1uyez3OO Lt6dC45m4sQh0nwDF33GZJEdUcQkWKcKxqfzvjYXuYyP3ddtj56WW88hBIpNysWj+NUu dPaLw+vyr3wrSW996uKEnkPygYkpmXjmw01KrylFHup6cIXmmXBrahh5TmMnxV3CW08F WOFQ== X-Gm-Message-State: AHQUAuZmpHORcRdvFWZ+WetlhxXwt2rSwr2zmR5xsg7PNM57r3TW/HfB fdKT24nKo0ch+ILKrv6/Vj5h7YWy8Xk= X-Google-Smtp-Source: AHgI3IYmkvjlQETOwA2wuBs6xBdgf+WCZ+NqcIqJqr7kltzFm0VbWVwyaDNl4iCPq43fo5PnQEDtRw== X-Received: by 2002:a63:ce0e:: with SMTP id y14mr825477pgf.145.1549929184202; Mon, 11 Feb 2019 15:53:04 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.02 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:03 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:32 -0800 Message-Id: <20190211235258.542-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v3 02/28] target/arm: Split helper_msr_i_pstate into 3 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The EL0+UMA check is unique to DAIF. While SPSel had avoided the check by nature of already checking EL >= 1, the other post v8.0 extensions to MSR (imm) allow EL0 and do not require UMA. Avoid the unconditional write to pc and use raise_exception_ra to unwind. Signed-off-by: Richard Henderson --- target/arm/helper-a64.h | 3 +++ target/arm/helper.h | 1 - target/arm/internals.h | 15 ++++++++++++++ target/arm/helper-a64.c | 30 +++++++++++++++++++++++++++ target/arm/op_helper.c | 42 -------------------------------------- target/arm/translate-a64.c | 41 ++++++++++++++++++++++--------------- 6 files changed, 73 insertions(+), 59 deletions(-) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index aff8d6c9f3..a915c1247f 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -19,6 +19,9 @@ DEF_HELPER_FLAGS_2(udiv64, TCG_CALL_NO_RWG_SE, i64, i64, i64) DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64) DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_2(msr_i_spsel, void, env, i32) +DEF_HELPER_2(msr_i_daifset, void, env, i32) +DEF_HELPER_2(msr_i_daifclear, void, env, i32) DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, ptr) DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, ptr) DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr) diff --git a/target/arm/helper.h b/target/arm/helper.h index 53a38188c6..28b1dd6252 100644 --- a/target/arm/helper.h +++ b/target/arm/helper.h @@ -77,7 +77,6 @@ DEF_HELPER_2(get_cp_reg, i32, env, ptr) DEF_HELPER_3(set_cp_reg64, void, env, ptr, i64) DEF_HELPER_2(get_cp_reg64, i64, env, ptr) -DEF_HELPER_3(msr_i_pstate, void, env, i32, i32) DEF_HELPER_1(clear_pstate_ss, void, env) DEF_HELPER_2(get_r13_banked, i32, env, i32) diff --git a/target/arm/internals.h b/target/arm/internals.h index a4bd1becb7..587a1ddf58 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -968,4 +968,19 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va, ARMMMUIdx mmu_idx, bool data); +static inline int exception_target_el(CPUARMState *env) +{ + int target_el = MAX(1, arm_current_el(env)); + + /* + * No such thing as secure EL1 if EL3 is aarch32, + * so update the target EL to EL3 in this case. + */ + if (arm_is_secure(env) && !arm_el_is_aa64(env, 3) && target_el == 1) { + target_el = 3; + } + + return target_el; +} + #endif diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c index 101fa6d3ea..87b8f36122 100644 --- a/target/arm/helper-a64.c +++ b/target/arm/helper-a64.c @@ -61,6 +61,36 @@ uint64_t HELPER(rbit64)(uint64_t x) return revbit64(x); } +void HELPER(msr_i_spsel)(CPUARMState *env, uint32_t imm) +{ + update_spsel(env, imm); +} + +static void daif_check(CPUARMState *env, uint32_t op, + uint32_t imm, uintptr_t ra) +{ + /* DAIF update to PSTATE. This is OK from EL0 only if UMA is set. */ + if (arm_current_el(env) == 0 && !(env->cp15.sctlr_el[1] & SCTLR_UMA)) { + raise_exception_ra(env, EXCP_UDEF, + syn_aa64_sysregtrap(0, extract32(op, 0, 3), + extract32(op, 3, 3), 4, + imm, 0x1f, 0), + exception_target_el(env), ra); + } +} + +void HELPER(msr_i_daifset)(CPUARMState *env, uint32_t imm) +{ + daif_check(env, 0x1e, imm, GETPC()); + env->daif |= (imm << 6) & PSTATE_DAIF; +} + +void HELPER(msr_i_daifclear)(CPUARMState *env, uint32_t imm) +{ + daif_check(env, 0x1f, imm, GETPC()); + env->daif &= ~((imm << 6) & PSTATE_DAIF); +} + /* Convert a softfloat float_relation_ (as returned by * the float*_compare functions) to the correct ARM * NZCV flag state. diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c index c998eadfaa..c5721a866d 100644 --- a/target/arm/op_helper.c +++ b/target/arm/op_helper.c @@ -68,20 +68,6 @@ void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome, cpu_loop_exit_restore(cs, ra); } -static int exception_target_el(CPUARMState *env) -{ - int target_el = MAX(1, arm_current_el(env)); - - /* No such thing as secure EL1 if EL3 is aarch32, so update the target EL - * to EL3 in this case. - */ - if (arm_is_secure(env) && !arm_el_is_aa64(env, 3) && target_el == 1) { - target_el = 3; - } - - return target_el; -} - uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn, uint32_t maxindex) { @@ -875,34 +861,6 @@ uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip) return res; } -void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) -{ - /* MSR_i to update PSTATE. This is OK from EL0 only if UMA is set. - * Note that SPSel is never OK from EL0; we rely on handle_msr_i() - * to catch that case at translate time. - */ - if (arm_current_el(env) == 0 && !(env->cp15.sctlr_el[1] & SCTLR_UMA)) { - uint32_t syndrome = syn_aa64_sysregtrap(0, extract32(op, 0, 3), - extract32(op, 3, 3), 4, - imm, 0x1f, 0); - raise_exception(env, EXCP_UDEF, syndrome, exception_target_el(env)); - } - - switch (op) { - case 0x05: /* SPSel */ - update_spsel(env, imm); - break; - case 0x1e: /* DAIFSet */ - env->daif |= (imm << 6) & PSTATE_DAIF; - break; - case 0x1f: /* DAIFClear */ - env->daif &= ~((imm << 6) & PSTATE_DAIF); - break; - default: - g_assert_not_reached(); - } -} - void HELPER(clear_pstate_ss)(CPUARMState *env) { env->pstate &= ~PSTATE_SS; diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 27b90d5778..13e010d27b 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -1647,29 +1647,38 @@ static void handle_sync(DisasContext *s, uint32_t insn, static void handle_msr_i(DisasContext *s, uint32_t insn, unsigned int op1, unsigned int op2, unsigned int crm) { + TCGv_i32 t1; int op = op1 << 3 | op2; + + /* End the TB by default, chaining is ok. */ + s->base.is_jmp = DISAS_TOO_MANY; + switch (op) { case 0x05: /* SPSel */ if (s->current_el == 0) { - unallocated_encoding(s); - return; + goto do_unallocated; } - /* fall through */ - case 0x1e: /* DAIFSet */ - case 0x1f: /* DAIFClear */ - { - TCGv_i32 tcg_imm = tcg_const_i32(crm); - TCGv_i32 tcg_op = tcg_const_i32(op); - gen_a64_set_pc_im(s->pc - 4); - gen_helper_msr_i_pstate(cpu_env, tcg_op, tcg_imm); - tcg_temp_free_i32(tcg_imm); - tcg_temp_free_i32(tcg_op); - /* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */ - gen_a64_set_pc_im(s->pc); - s->base.is_jmp = (op == 0x1f ? DISAS_EXIT : DISAS_JUMP); + t1 = tcg_const_i32(crm & PSTATE_SP); + gen_helper_msr_i_spsel(cpu_env, t1); + tcg_temp_free_i32(t1); break; - } + + case 0x1e: /* DAIFSet */ + t1 = tcg_const_i32(crm); + gen_helper_msr_i_daifset(cpu_env, t1); + tcg_temp_free_i32(t1); + break; + + case 0x1f: /* DAIFClear */ + t1 = tcg_const_i32(crm); + gen_helper_msr_i_daifclear(cpu_env, t1); + tcg_temp_free_i32(t1); + /* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */ + s->base.is_jmp = DISAS_UPDATE; + break; + default: + do_unallocated: unallocated_encoding(s); return; } From patchwork Mon Feb 11 23:52:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040249 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Z2y4ykkr"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2gV3R4Pz9s3x for ; Tue, 12 Feb 2019 10:53:58 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58124 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOe-00054b-DL for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:53:56 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37832) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLNs-00052I-FG for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLNr-0004Kl-7I for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:08 -0500 Received: from mail-pl1-x644.google.com ([2607:f8b0:4864:20::644]:44284) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLNq-0004JB-VT for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:07 -0500 Received: by mail-pl1-x644.google.com with SMTP id p4so320722plq.11 for ; Mon, 11 Feb 2019 15:53:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ItNJF+IPQ2RCWNqC/N6zjDNVc+cTfSXBzvGik2fXPgw=; b=Z2y4ykkrljePgNBLExGtmw3QoRHl37rAz83DrD775OWmcLJ7SOhADwY59/8oQWfqD4 BZRh6M6YSbhKql56U5+Nw1iVhUGsYVxnj6DhIqnmr57YhIQK0T/ZEL9kUEMo9WczKtHs AsgD+MMakO6QgJ5OZ3dmtKNYNYoBMig88Y8Pqyqefb94f8H3MOdR0bzM03H7pgAHer20 fZxJJAy2D2UFaO9n5DEfekF/JedSUtVXziN114g67yIaBdOLb3acN3/j9Y+GRn5QEbNf YHF2AGb1re+Ncd+5SPOKDz7iqjvCEfgXJY4XDZK9ZUL7q9iDZFmi8chcFk9yMnl35eI+ oCVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ItNJF+IPQ2RCWNqC/N6zjDNVc+cTfSXBzvGik2fXPgw=; b=htHRHYVkg3mGDeqJw/MoWqpS0gvESB7HWy6lst6FM/9obAeqsJB2AeqDdHYJd3RjCR J9WTKJF+0cfdyOTOVjU1O/oan4UeTBmmUSvwcrx1ldvIjye4ECbtCh9Hx4eL0m8Kou1C D4Lct1fF/HX+eAEuXcAMtcs2KXK6oY4pPBvUukGF+ywJOuX5/PprFv4x6h6AULwFe6J4 FvlJjOvdrzswvqhs9hmpnlhOfLcxqzJTcszcNHPeXytk4vn4wvzhdm2YJZPooUqLz0bx pmBcfsGufs24PmkCMxjWP4EU/A+sGhc0YfqJ9sXn5PimLvycOM13Itg92qnDFuR38JLG hENA== X-Gm-Message-State: AHQUAuaVk5ycHSBL7yeDidDQBMCf/Tj3m1/W0amAfuhOueDCuC5gNIos PvjnnKgdYRw3pm7ldVlP+lbToAiNm2s= X-Google-Smtp-Source: AHgI3IaGEuL4Q1cy0iHpwLSd4lvuRHbq3fo0IJCdFlMit/Tqg4Kb3Uoz2ChxrpxmLpmnOs+/IE/TAQ== X-Received: by 2002:a17:902:7e4c:: with SMTP id a12mr916414pln.340.1549929185578; Mon, 11 Feb 2019 15:53:05 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:04 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:33 -0800 Message-Id: <20190211235258.542-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::644 Subject: [Qemu-devel] [PATCH v3 03/28] target/arm: Add clear_pstate_bits, share gen_ss_advance 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" We do not need an out-of-line helper for clearing bits in pstate. While changing things, share the implementation of gen_ss_advance. Signed-off-by: Richard Henderson --- target/arm/helper.h | 2 -- target/arm/translate.h | 19 +++++++++++++++++++ target/arm/op_helper.c | 5 ----- target/arm/translate-a64.c | 11 ----------- target/arm/translate.c | 11 ----------- 5 files changed, 19 insertions(+), 29 deletions(-) diff --git a/target/arm/helper.h b/target/arm/helper.h index 28b1dd6252..c21fa2edfe 100644 --- a/target/arm/helper.h +++ b/target/arm/helper.h @@ -77,8 +77,6 @@ DEF_HELPER_2(get_cp_reg, i32, env, ptr) DEF_HELPER_3(set_cp_reg64, void, env, ptr, i64) DEF_HELPER_2(get_cp_reg64, i64, env, ptr) -DEF_HELPER_1(clear_pstate_ss, void, env) - DEF_HELPER_2(get_r13_banked, i32, env, i32) DEF_HELPER_3(set_r13_banked, void, env, i32, i32) diff --git a/target/arm/translate.h b/target/arm/translate.h index 17748ddfb9..33af50a13f 100644 --- a/target/arm/translate.h +++ b/target/arm/translate.h @@ -202,6 +202,25 @@ static inline TCGv_i32 get_ahp_flag(void) return ret; } +/* Clear bits within PSTATE. */ +static inline void clear_pstate_bits(uint32_t bits) +{ + TCGv_i32 p = tcg_temp_new_i32(); + + tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); + tcg_gen_andi_i32(p, p, ~bits); + tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); + tcg_temp_free_i32(p); +} + +/* If the singlestep state is Active-not-pending, advance to Active-pending. */ +static inline void gen_ss_advance(DisasContext *s) +{ + if (s->ss_active) { + s->pstate_ss = 0; + clear_pstate_bits(PSTATE_SS); + } +} /* Vector operations shared between ARM and AArch64. */ extern const GVecGen3 bsl_op; diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c index c5721a866d..8698b4dc83 100644 --- a/target/arm/op_helper.c +++ b/target/arm/op_helper.c @@ -861,11 +861,6 @@ uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip) return res; } -void HELPER(clear_pstate_ss)(CPUARMState *env) -{ - env->pstate &= ~PSTATE_SS; -} - void HELPER(pre_hvc)(CPUARMState *env) { ARMCPU *cpu = arm_env_get_cpu(env); diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 13e010d27b..ba139bba26 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -421,17 +421,6 @@ static void gen_exception_bkpt_insn(DisasContext *s, int offset, s->base.is_jmp = DISAS_NORETURN; } -static void gen_ss_advance(DisasContext *s) -{ - /* If the singlestep state is Active-not-pending, advance to - * Active-pending. - */ - if (s->ss_active) { - s->pstate_ss = 0; - gen_helper_clear_pstate_ss(cpu_env); - } -} - static void gen_step_complete_exception(DisasContext *s) { /* We just completed step of an insn. Move from Active-not-pending diff --git a/target/arm/translate.c b/target/arm/translate.c index 66cf28c8cb..baf6068ec1 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -298,17 +298,6 @@ static void gen_exception(int excp, uint32_t syndrome, uint32_t target_el) tcg_temp_free_i32(tcg_excp); } -static void gen_ss_advance(DisasContext *s) -{ - /* If the singlestep state is Active-not-pending, advance to - * Active-pending. - */ - if (s->ss_active) { - s->pstate_ss = 0; - gen_helper_clear_pstate_ss(cpu_env); - } -} - static void gen_step_complete_exception(DisasContext *s) { /* We just completed step of an insn. Move from Active-not-pending From patchwork Mon Feb 11 23:52:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040256 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ahycaRHg"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2pS4JZcz9s4Z for ; Tue, 12 Feb 2019 11:00:00 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58223 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLUU-0001g2-Hj for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:59:58 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37945) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLO7-0005Fn-0n for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLNt-0004NY-8h for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:10 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:37588) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLNs-0004M1-EX for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:08 -0500 Received: by mail-pg1-x542.google.com with SMTP id q206so324354pgq.4 for ; Mon, 11 Feb 2019 15:53:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jgJ81jFo+57U4jyJfgDBV2LiNCuhVeUeG3KxMuDrGGw=; b=ahycaRHgNxdWoP+wdfzDaphNLCsZq3mrvMxJ/GqKiTseLTIbTIeJ6ZOoEc/kcPpNvG Tvdgqur7SYU1OMfu41TWmbIs4I7t/+TyOPHdukyfXv86AxtC743LbVZn6ZaTN17XlW06 WFgh4czxuF/emNUczJtboIXs66vYNaYV8s6rA1zM4BagrBF8Ofdv17UiZ19IFNjSJq2g mrmho3UaUx3xtWHgniKV1s8JXhqeHmSPoSZ3qbDKaS4WHxZBk/63pjzI0EzH+J4kCVyH yImIdk1Em+EOyejrkXT38ru+zQqwn483pzFKPZnUoHdXXbrWj5pTz6RHgisv04FxFLh2 3L7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=jgJ81jFo+57U4jyJfgDBV2LiNCuhVeUeG3KxMuDrGGw=; b=oJEI12yOZNN3BJeRaB4iHBTPFeaBILq0qMYTprUY+0Rz/rRFIInUwV6E4OoINBKdf6 T623uwpl2BqCNvFFQzIquUU0Q79iDd/wGO1kgVY/d1u6PE9yF/z3V6++grPjV5ITfA/q hRiW9maxE1AMiOA1I+OAKMv8M8DQz+wR8+soqxsVc+AjJl8W7DFYEvEpY778apCZY3Rg Z6zjg7hebxKJ2beOPMftWM2YzUxQgnQYIB8bGonPToOB/B2b7T86yd3wyMbSgJ8kuk51 LOK3Q1B827oj+iPWhPcYtYZicV9aif00DWfG/xJDEybXHRIk7yPG5E134v46lqgbPJqi UFTw== X-Gm-Message-State: AHQUAuaEjYu+4gKT/61ffEIwx5/aIORkfBXx1h5skRtZpcSYc6/A6wC9 qlbIdYaJUep5ApGeWCOdEsvPf1Sy0mA= X-Google-Smtp-Source: AHgI3Ib24VGs1GMeAx3nU5pKBX0+fEmxDd+JL3N0Xa9JzA/uvQjn6kMhe2r0wNegml+Z0rWCuBq/2w== X-Received: by 2002:a63:2501:: with SMTP id l1mr843637pgl.144.1549929186841; Mon, 11 Feb 2019 15:53:06 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.05 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:06 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:34 -0800 Message-Id: <20190211235258.542-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v3 04/28] target/arm: Add MTE_ACTIVE to tb_flags 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When MTE is fully enabled, i.e. access to tags are enabled and tag checks affect the PE, then arrange to perform the check while stripping the TBI. The check is not yet implemented, just the plumbing to that point. Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- v2: Clean TBI bits exactly. Fix license to lgpl 2.1. v3: Remove stub helper_mte_check; moved to a later patch. --- target/arm/cpu.h | 12 +++++++++ target/arm/internals.h | 18 ++++++++++++++ target/arm/translate.h | 2 ++ target/arm/helper.c | 51 ++++++++++++++++++++++++++++++-------- target/arm/translate-a64.c | 1 + 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 20be9fb53a..2776df6981 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -1215,6 +1215,7 @@ void pmu_init(ARMCPU *cpu); #define PSTATE_BTYPE (3U << 10) #define PSTATE_IL (1U << 20) #define PSTATE_SS (1U << 21) +#define PSTATE_TCO (1U << 25) #define PSTATE_V (1U << 28) #define PSTATE_C (1U << 29) #define PSTATE_Z (1U << 30) @@ -3071,6 +3072,7 @@ FIELD(TBFLAG_A64, PAUTH_ACTIVE, 8, 1) FIELD(TBFLAG_A64, BT, 9, 1) FIELD(TBFLAG_A64, BTYPE, 10, 2) FIELD(TBFLAG_A64, TBID, 12, 2) +FIELD(TBFLAG_A64, MTE_ACTIVE, 14, 1) static inline bool bswap_code(bool sctlr_b) { @@ -3361,6 +3363,16 @@ static inline bool isar_feature_aa64_bti(const ARMISARegisters *id) return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0; } +static inline bool isar_feature_aa64_mte_insn_reg(const ARMISARegisters *id) +{ + return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) != 0; +} + +static inline bool isar_feature_aa64_mte(const ARMISARegisters *id) +{ + return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) >= 2; +} + /* * Forward to the above feature tests given an ARMCPU pointer. */ diff --git a/target/arm/internals.h b/target/arm/internals.h index 587a1ddf58..6c018e773c 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -983,4 +983,22 @@ static inline int exception_target_el(CPUARMState *env) return target_el; } +/* Determine if allocation tags are available. */ +static inline bool allocation_tag_access_enabled(CPUARMState *env, int el, + uint64_t sctlr) +{ + if (el < 3 + && arm_feature(env, ARM_FEATURE_EL3) + && !(env->cp15.scr_el3 & SCR_ATA)) { + return false; + } + if (el < 2 + && arm_feature(env, ARM_FEATURE_EL2) + && !(arm_hcr_el2_eff(env) & HCR_ATA)) { + return false; + } + sctlr &= (el == 0 ? SCTLR_ATA0 : SCTLR_ATA); + return sctlr != 0; +} + #endif diff --git a/target/arm/translate.h b/target/arm/translate.h index 33af50a13f..5a101e1c6d 100644 --- a/target/arm/translate.h +++ b/target/arm/translate.h @@ -70,6 +70,8 @@ typedef struct DisasContext { bool ss_same_el; /* True if v8.3-PAuth is active. */ bool pauth_active; + /* True if v8.5-MTE tag checks affect the PE. */ + bool mte_active; /* True with v8.5-BTI and SCTLR_ELx.BT* set. */ bool bt; /* diff --git a/target/arm/helper.c b/target/arm/helper.c index d4abbb5076..e73bdbf041 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -1862,6 +1862,9 @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) if (cpu_isar_feature(aa64_pauth, cpu)) { valid_mask |= SCR_API | SCR_APK; } + if (cpu_isar_feature(aa64_mte, cpu)) { + valid_mask |= SCR_ATA; + } /* Clear all-context RES0 bits. */ value &= valid_mask; @@ -4056,22 +4059,31 @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri, { ARMCPU *cpu = arm_env_get_cpu(env); - if (raw_read(env, ri) == value) { - /* Skip the TLB flush if nothing actually changed; Linux likes - * to do a lot of pointless SCTLR writes. - */ - return; - } - if (arm_feature(env, ARM_FEATURE_PMSA) && !cpu->has_mpu) { /* M bit is RAZ/WI for PMSA with no MPU implemented */ value &= ~SCTLR_M; } - raw_write(env, ri, value); + if (!cpu_isar_feature(aa64_mte, cpu)) { + if (ri->opc1 == 6) { /* SCTLR_EL3 */ + value &= ~(SCTLR_ITFSB | SCTLR_TCF | SCTLR_ATA); + } else { + value &= ~(SCTLR_ITFSB | SCTLR_TCF0 | SCTLR_TCF | + SCTLR_ATA0 | SCTLR_ATA); + } + } + /* ??? Lots of these bits are not implemented. */ - /* This may enable/disable the MMU, so do a TLB flush. */ - tlb_flush(CPU(cpu)); + + if (raw_read(env, ri) != value) { + /* + * This may enable/disable the MMU, so do a TLB flush. + * Skip the TLB flush if nothing actually changed; + * Linux likes to do a lot of pointless SCTLR writes. + */ + raw_write(env, ri, value); + tlb_flush(CPU(cpu)); + } } static CPAccessResult fpexc32_access(CPUARMState *env, const ARMCPRegInfo *ri, @@ -4564,6 +4576,9 @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) if (cpu_isar_feature(aa64_pauth, cpu)) { valid_mask |= HCR_API | HCR_APK; } + if (cpu_isar_feature(aa64_mte, cpu)) { + valid_mask |= HCR_ATA; + } /* Clear RES0 bits. */ value &= valid_mask; @@ -13756,6 +13771,7 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, if (is_a64(env)) { ARMCPU *cpu = arm_env_get_cpu(env); uint64_t sctlr; + int tbid; *pc = env->pc; flags = FIELD_DP32(flags, TBFLAG_ANY, AARCH64_STATE, 1); @@ -13764,7 +13780,7 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, { ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx); ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1); - int tbii, tbid; + int tbii; /* FIXME: ARMv8.1-VHE S2 translation regime. */ if (regime_el(env, stage1) < 2) { @@ -13817,6 +13833,19 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, } flags = FIELD_DP32(flags, TBFLAG_A64, BTYPE, env->btype); } + + /* + * If MTE is enabled, and tag checks affect the PE, + * then we check the tag as we strip the TBI field. + * Note that if TBI is disabled, all accesses are unchecked. + */ + if (tbid + && cpu_isar_feature(aa64_mte, cpu) + && allocation_tag_access_enabled(env, current_el, sctlr) + && !(env->pstate & PSTATE_TCO) + && (sctlr & (current_el == 0 ? SCTLR_TCF0 : SCTLR_TCF))) { + flags = FIELD_DP32(flags, TBFLAG_A64, MTE_ACTIVE, 1); + } } else { *pc = env->regs[15]; flags = FIELD_DP32(flags, TBFLAG_A32, THUMB, env->thumb); diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index ba139bba26..3950067b79 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -14041,6 +14041,7 @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase, dc->pauth_active = FIELD_EX32(tb_flags, TBFLAG_A64, PAUTH_ACTIVE); dc->bt = FIELD_EX32(tb_flags, TBFLAG_A64, BT); dc->btype = FIELD_EX32(tb_flags, TBFLAG_A64, BTYPE); + dc->mte_active = FIELD_EX32(tb_flags, TBFLAG_A64, MTE_ACTIVE); dc->vec_len = 0; dc->vec_stride = 0; dc->cp_regs = arm_cpu->cp_regs; From patchwork Mon Feb 11 23:52:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040262 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ou0+mTUM"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2t53x6qz9s4Z for ; Tue, 12 Feb 2019 11:03:09 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58289 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLXX-00047e-Dc for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:03:07 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37959) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLO9-0005IQ-Rr for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLNu-0004Os-Dm for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:12 -0500 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:45667) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLNt-0004NH-OJ for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:09 -0500 Received: by mail-pl1-x642.google.com with SMTP id r14so316309pls.12 for ; Mon, 11 Feb 2019 15:53:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sSJPTVVkjcWARcwigg6wJDNen7ofl5R1qSbWzhReSSs=; b=ou0+mTUM08GaHP5EZOVxGaNcsMe3aqJOEp4TUAeHzgdrBYQGm4hh1Ry7dJemCe9Tsb StNuX+8Kz+SfQG4v939gJ3Cdrz8PxoJyjxOhLP+fUUqcWLWk17wNPpvGwHJASBxCIaL3 3DdVYDoOX3zBvMLTaCaSjnyYIcY03lZ3C3nHifXI4aNaqILHsYfrAGR0d12/lrGmM8WZ JQX7DMbkTam4axLwezkFIVoAZbRtPQhLfv2utzBTKqYvVCl7TMBt1y/i8onT6uIrrBJF 2p9ulNQKaBQ7hn4HPWhoQWk94yJDYe1p08MW/u0bXcUdRLeotoITNtoywD0UeyRPyjxr A7Zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sSJPTVVkjcWARcwigg6wJDNen7ofl5R1qSbWzhReSSs=; b=sQKKiD/66n1Tgb3jShde7h1Lq8QdkLB2Mkn5mi5Y9KZkGdLbk/Gil/7CPdTCodaAAQ kIYRsGbrTNZB7aOaWz6VeS8fd8oxJZgtdzZPihoNp6dymqXP0rnUou9Z5GB2O2IhfO8d v6S8dZwHpvb0h0Ps/1t9JJSqAg6noBpLaAOvYDBJxE1yq+M9Sq1QkwR8sKk3OLLj1gaA u+8JrylV+aI+vyyfUavzErQbfCJSjzvED30WAO+6eMhVv9cudWjoFPJUYRbUw+qyGjcq 1MRxQyl/Tk8a609QzRGOmMSj8Myk2x/Oa/o43Houg6MCwESLeJ7/1t1X1/WKSMdCZojN iFFg== X-Gm-Message-State: AHQUAubEn5umWPJT609so/ZqjnmofEhGS/qSrqqSA8K0W54qHsI1ZZEz MLSlclf5wTPxP08iVS0OCL5z0YVHkaE= X-Google-Smtp-Source: AHgI3Ib0ByPPV6jmdhXty3yn3A1BAYruQtck7bDxEk2rpBx7X8Ebq/YbjkL5+ybDj1WKNIAoLtdpzA== X-Received: by 2002:a17:902:f091:: with SMTP id go17mr910510plb.235.1549929188245; Mon, 11 Feb 2019 15:53:08 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:07 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:35 -0800 Message-Id: <20190211235258.542-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v3 05/28] target/arm: Extract TCMA with ARMVAParameters 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target/arm/internals.h | 1 + target/arm/helper.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/target/arm/internals.h b/target/arm/internals.h index 6c018e773c..2922324f63 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -959,6 +959,7 @@ typedef struct ARMVAParameters { bool tbid : 1; bool epd : 1; bool hpd : 1; + bool tcma : 1; bool using16k : 1; bool using64k : 1; } ARMVAParameters; diff --git a/target/arm/helper.c b/target/arm/helper.c index e73bdbf041..cbe3500f78 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -10447,7 +10447,7 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, { uint64_t tcr = regime_tcr(env, mmu_idx)->raw_tcr; uint32_t el = regime_el(env, mmu_idx); - bool tbi, tbid, epd, hpd, using16k, using64k; + bool tbi, tbid, epd, hpd, tcma, using16k, using64k; int select, tsz; /* @@ -10462,11 +10462,12 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, using16k = extract32(tcr, 15, 1); if (mmu_idx == ARMMMUIdx_S2NS) { /* VTCR_EL2 */ - tbi = tbid = hpd = false; + tbi = tbid = hpd = tcma = false; } else { tbi = extract32(tcr, 20, 1); hpd = extract32(tcr, 24, 1); tbid = extract32(tcr, 29, 1); + tcma = extract32(tcr, 30, 1); } epd = false; } else if (!select) { @@ -10477,6 +10478,7 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, tbi = extract64(tcr, 37, 1); hpd = extract64(tcr, 41, 1); tbid = extract64(tcr, 51, 1); + tcma = extract64(tcr, 57, 1); } else { int tg = extract32(tcr, 30, 2); using16k = tg == 1; @@ -10486,6 +10488,7 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, tbi = extract64(tcr, 38, 1); hpd = extract64(tcr, 42, 1); tbid = extract64(tcr, 52, 1); + tcma = extract64(tcr, 58, 1); } tsz = MIN(tsz, 39); /* TODO: ARMv8.4-TTST */ tsz = MAX(tsz, 16); /* TODO: ARMv8.2-LVA */ @@ -10497,6 +10500,7 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va, .tbid = tbid, .epd = epd, .hpd = hpd, + .tcma = tcma, .using16k = using16k, .using64k = using64k, }; From patchwork Mon Feb 11 23:52:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040271 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Nmx489sU"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z31p39DHz9s7h for ; Tue, 12 Feb 2019 11:09:50 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58381 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLe0-0000i0-8f for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:09:48 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38167) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOH-0005R5-0l for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOE-0004bQ-QE for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:37021) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOE-0004Oo-9H for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: by mail-pl1-x641.google.com with SMTP id b5so335702plr.4 for ; Mon, 11 Feb 2019 15:53:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZiSulLpDJWuscSL8L2vnGag9UcUin0Tqpz1gsAL73nE=; b=Nmx489sUIZ/tOt9CFWnQHrRnttkrwSMaTPPip1jmlhaGIm+hZfobkzNfj6uz/e0i/n zrS8gpbElcjozzmG8458uUa45IR+Tu/cd2Rsb0qZK993A6zMRfitQqCapFXNLE9ippoB G94k/5hReX37JQZG3ac+KsQfL0cSJ47d/E/MTiZNxDAhyYt20jfTpjU3/4cvG79YSfng 0hdC6cfSrkmAUIboxDlyglV7QPWPGXuHtqvcv1QnE0Hkcqo29S1ySMJB4iKhFWaJytRp tOAAK4psMumBTMPRlf9uMoZeludlBAj/0nSezHWNRcueKu+yW42SKjP3FWdFQEtQ4usZ Qd6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZiSulLpDJWuscSL8L2vnGag9UcUin0Tqpz1gsAL73nE=; b=TjYa9k9DeXSdr7+yXRs9E93YLpTe/bcLMFBzyDtPhtAj0xmJp5V9F86ctDPW6DTfMw 64DED28+qIR+ALiQ45l09W5RAeB1VmTpPmgNjcSRg4ZtflxFs6kaCEtOSKpaAJNgPoQU akx9/0jHdvKLtPlQE3qfJGA1PCF58IGy7z7sMInE/8DWGLrlJMYAMfP8qxwHw71Ymo5Q YL6u4akswe2Fo+5pgBe/kiXlDLJFtGqz4m/ib0t5FXvByTATOzqc3aJ3hqSEOyMbDJ+2 lIIkRW1visbJ6v6Vte6rS/GRgPkFyAgKnFJv1jUyssjWAHPvQNWx9JaX1rqY5viWnV93 mezQ== X-Gm-Message-State: AHQUAuZNXVo7WKjdPcQqE8jADwaENrh3T89GOuLzEPUfx53hDR8/i0kS ROA4Mo8VKK/q0X0GdVFHFrTBCSXFnlQ= X-Google-Smtp-Source: AHgI3IayZW+YiEvDYwHt+5kQiYH5j531UTPcSYG31VtDVn6Dce1Y9H2pf/3GEZNaVY04BMJAeTK6rg== X-Received: by 2002:a17:902:b681:: with SMTP id c1mr916873pls.103.1549929189649; Mon, 11 Feb 2019 15:53:09 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:08 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:36 -0800 Message-Id: <20190211235258.542-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v3 06/28] target/arm: Add MTE system registers 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This is TFSRE0_EL1, TFSR_EL1, TFSR_EL2, TFSR_EL3, RGSR_EL1, GCR_EL1, GMID_EL1, and PSTATE.TCO. Signed-off-by: Richard Henderson --- v3: Add GMID; add access_mte. --- target/arm/cpu.h | 5 +++ target/arm/internals.h | 6 ++++ target/arm/translate.h | 11 +++++++ target/arm/helper.c | 66 ++++++++++++++++++++++++++++++++++++++ target/arm/translate-a64.c | 11 +++++++ 5 files changed, 99 insertions(+) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 2776df6981..74633a7a78 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -495,6 +495,11 @@ typedef struct CPUARMState { uint64_t pmccfiltr_el0; /* Performance Monitor Filter Register */ uint64_t vpidr_el2; /* Virtualization Processor ID Register */ uint64_t vmpidr_el2; /* Virtualization Multiprocessor ID Register */ +#ifdef TARGET_AARCH64 + uint64_t tfsr_el[4]; /* tfsrel0_el1 is index 0. */ + uint64_t gcr_el1; + uint64_t rgsr_el1; +#endif } cp15; struct { diff --git a/target/arm/internals.h b/target/arm/internals.h index 2922324f63..fbfa770c23 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -1002,4 +1002,10 @@ static inline bool allocation_tag_access_enabled(CPUARMState *env, int el, return sctlr != 0; } +/* + * The log2 of the words in the tag block, for GMID_EL1.BS. + * The is the maximum, 256 bytes, which manipulates 64-bits of tags. + */ +#define GMID_EL1_BS 6 + #endif diff --git a/target/arm/translate.h b/target/arm/translate.h index 5a101e1c6d..a24757d3d7 100644 --- a/target/arm/translate.h +++ b/target/arm/translate.h @@ -204,6 +204,17 @@ static inline TCGv_i32 get_ahp_flag(void) return ret; } +/* Set bits within PSTATE. */ +static inline void set_pstate_bits(uint32_t bits) +{ + TCGv_i32 p = tcg_temp_new_i32(); + + tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); + tcg_gen_ori_i32(p, p, bits); + tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); + tcg_temp_free_i32(p); +} + /* Clear bits within PSTATE. */ static inline void clear_pstate_bits(uint32_t bits) { diff --git a/target/arm/helper.c b/target/arm/helper.c index cbe3500f78..f8e4e6f8ae 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -5732,6 +5732,69 @@ static const ARMCPRegInfo pauth_reginfo[] = { .fieldoffset = offsetof(CPUARMState, apib_key.hi) }, REGINFO_SENTINEL }; + +static CPAccessResult access_mte(CPUARMState *env, const ARMCPRegInfo *ri, + bool isread) +{ + int el = arm_current_el(env); + + if (el < 2 && + arm_feature(env, ARM_FEATURE_EL2) && + !(arm_hcr_el2_eff(env) & HCR_ATA)) { + return CP_ACCESS_TRAP_EL2; + } + if (el < 3 && + arm_feature(env, ARM_FEATURE_EL3) && + !(env->cp15.scr_el3 & SCR_ATA)) { + return CP_ACCESS_TRAP_EL3; + } + return CP_ACCESS_OK; +} + +static uint64_t tco_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return env->pstate & PSTATE_TCO; +} + +static void tco_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t val) +{ + env->pstate = (env->pstate & ~PSTATE_TCO) | (val & PSTATE_TCO); +} + +static const ARMCPRegInfo mte_reginfo[] = { + { .name = "TFSRE0_EL1", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 0, .crn = 6, .crm = 6, .opc2 = 1, + .access = PL1_RW, .accessfn = access_mte, + .fieldoffset = offsetof(CPUARMState, cp15.tfsr_el[0]) }, + { .name = "TFSR_EL1", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 0, .crn = 6, .crm = 5, .opc2 = 0, + .access = PL1_RW, .accessfn = access_mte, + .fieldoffset = offsetof(CPUARMState, cp15.tfsr_el[1]) }, + { .name = "TFSR_EL2", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 4, .crn = 6, .crm = 5, .opc2 = 0, + .access = PL2_RW, .accessfn = access_mte, + .fieldoffset = offsetof(CPUARMState, cp15.tfsr_el[2]) }, + { .name = "TFSR_EL3", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 6, .crn = 6, .crm = 6, .opc2 = 0, + .access = PL3_RW, + .fieldoffset = offsetof(CPUARMState, cp15.tfsr_el[3]) }, + { .name = "RGSR_EL1", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 5, + .access = PL1_RW, .accessfn = access_mte, + .fieldoffset = offsetof(CPUARMState, cp15.rgsr_el1) }, + { .name = "GCR_EL1", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 6, + .access = PL1_RW, .accessfn = access_mte, + .fieldoffset = offsetof(CPUARMState, cp15.gcr_el1) }, + { .name = "TCO", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 3, .crn = 4, .crm = 2, .opc2 = 7, + .type = ARM_CP_NO_RAW, + .access = PL0_RW, .readfn = tco_read, .writefn = tco_write }, + { .name = "GMID_EL1", .state = ARM_CP_STATE_AA64, + .opc0 = 3, .opc1 = 1, .crn = 0, .crm = 0, .opc2 = 4, + .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = GMID_EL1_BS }, + REGINFO_SENTINEL +}; #endif void register_cp_regs_for_features(ARMCPU *cpu) @@ -6577,6 +6640,9 @@ void register_cp_regs_for_features(ARMCPU *cpu) if (cpu_isar_feature(aa64_pauth, cpu)) { define_arm_cp_regs(cpu, pauth_reginfo); } + if (cpu_isar_feature(aa64_mte_insn_reg, cpu)) { + define_arm_cp_regs(cpu, mte_reginfo); + } #endif } diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 3950067b79..f397603688 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -1666,6 +1666,17 @@ static void handle_msr_i(DisasContext *s, uint32_t insn, s->base.is_jmp = DISAS_UPDATE; break; + case 0x1c: /* TCO */ + if (!dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } + if (crm & 1) { + set_pstate_bits(PSTATE_TCO); + } else { + clear_pstate_bits(PSTATE_TCO); + } + break; + default: do_unallocated: unallocated_encoding(s); From patchwork Mon Feb 11 23:52:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040253 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="TrSgiAL/"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2lw3mgvz9s3x for ; Tue, 12 Feb 2019 10:57:48 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58198 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLSM-0008ND-Fh for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:57:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38063) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOE-0005Mj-H3 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOC-0004Xm-0t for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]:47054) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOB-0004Ph-Pl for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:27 -0500 Received: by mail-pl1-x62c.google.com with SMTP id o6so314943pls.13 for ; Mon, 11 Feb 2019 15:53:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MeANllhl1EJDV5sKJLIW0fjvttmmw3UOBcxKU9DzMxw=; b=TrSgiAL/MtIe9pzq+6kN0cRmyLVfcXswfXw6qGRgRQwtqtbTBMQCBAwEsmK9LOqJvD /aKUO9PrtqOOeZ2SDE8luouQaVSKfFjMvJzNhbONSWAooymwey1WlIrhdrQORQdhekvG tFhwV+hAOVmJ2GXWVEHfCIH/p7M8EOsKgyYONPw2kuM4Srwqm4KVlm7L62z9F1RmMA0G 1W3ak63PQQEsE5bqWrbGDEXyOhTzY3A1gWZZMntmy5eRpY6cxs8EeBGrEayD91eRnrsK j2aBlB1B/3gpsVuUpEo4vtoXCcWtlYKrPh3eWxce8pGtBrwN4OGU8P96TBtPhbdzl/7G wkXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MeANllhl1EJDV5sKJLIW0fjvttmmw3UOBcxKU9DzMxw=; b=J8U9Erse/AdNRXcL/NzG0j1IG3kDQe0zvoW+1PtOH1+1nZXnHCnGwZ36mjnnj6zOtR x5PbOr3clJvAKpxzKfPUJuTqADrAqMwQAo8Zh2IGD/jKTMCgJ+UDkpaSFZg1MmeTvtfG CRdPjnuC1U/UQlN6s0xsbEqs4yWI6SOpHCiY4D903BPN3alQ1R4CjRWO4G3r5heg2JdF w5nM9iTNuQSxkiJFqFa209PgkZWnXRAumSWULzC0zaGkUeChUTsQ4hKPbwIK9IPDCm3f qz5F5T4D7I1ERL/TEXFGvvVb+y9Q/xHFOdR9yE6MIsuTz4WlNAYAVJESg42RKBDJ7/Vj O4LQ== X-Gm-Message-State: AHQUAuYt6f0SO5crEi645+B6ET8xI4+hQyhkV6Lf4DsRrd70n+BOrqDu +CFqWKFasVmZ4iP+01QyVtaI3/hpgZc= X-Google-Smtp-Source: AHgI3IZEFczU7agDdFCjA++pfNbjlP1xPALu7nL+qQxHTIPfbFyT1dChaca1yZUJRjqg/wkHwciwpQ== X-Received: by 2002:a17:902:c5:: with SMTP id a63mr899856pla.267.1549929190749; Mon, 11 Feb 2019 15:53:10 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:10 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:37 -0800 Message-Id: <20190211235258.542-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::62c Subject: [Qemu-devel] [PATCH v3 07/28] target/arm: Assert no manual change to CACHED_PSTATE_BITS 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" These bits are stored elsewhere; changing env->pstate has no effect. Suggested-by: Peter Maydell Signed-off-by: Richard Henderson --- target/arm/translate.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/target/arm/translate.h b/target/arm/translate.h index a24757d3d7..296d1ac72c 100644 --- a/target/arm/translate.h +++ b/target/arm/translate.h @@ -209,6 +209,8 @@ static inline void set_pstate_bits(uint32_t bits) { TCGv_i32 p = tcg_temp_new_i32(); + tcg_debug_assert(!(bits & CACHED_PSTATE_BITS)); + tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); tcg_gen_ori_i32(p, p, bits); tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); @@ -220,6 +222,8 @@ static inline void clear_pstate_bits(uint32_t bits) { TCGv_i32 p = tcg_temp_new_i32(); + tcg_debug_assert(!(bits & CACHED_PSTATE_BITS)); + tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); tcg_gen_andi_i32(p, p, ~bits); tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); From patchwork Mon Feb 11 23:52:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040261 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="SllnUeWO"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2rf0XQZz9sDr for ; Tue, 12 Feb 2019 11:01:54 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58281 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLWJ-00039u-W3 for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:01:52 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38402) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOc-0005lI-2n for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOJ-0004i9-Li for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:43 -0500 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]:33852) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOG-0004Q9-SG for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: by mail-pl1-x62b.google.com with SMTP id w4so344016plz.1 for ; Mon, 11 Feb 2019 15:53:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2OQxyPmxfrr4UMT/ZUzdlEYMHFpvU0QnUKFRrfWrKM0=; b=SllnUeWOgs4ErlzAnI06C1Py7si6kTzKzUuVbuxV4BwYlUtFsSZ+bb0SJ/+s92b+dy peh4X0dvnuLW74kjBHUQo8eljmgwEPQPHp0MCeDyxRVOENM6swxXTub2S3V7OGPAvJgk P7/tAfGmCF/LnfXLEuxXbB1f7adKOAZ5rkmys/wld468tU43uTHNyqX0U6W7O+GNPSsu ZVxpNiyXwnbUdHyZk3fBIdsz7Bd+acpq1SBC+MLF7Lw0vyLRWp5tjZWBH/Ul0vGf608n eJ7YRxhhT06QmkM0yqSo+xgfn/pHI3QjfB6Rpb6PiESvVvg3AiIzEJ3mQkggLm3QvBMq vinQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2OQxyPmxfrr4UMT/ZUzdlEYMHFpvU0QnUKFRrfWrKM0=; b=HPYvwoi7UwnUI6VOpfx9iqgqmP1DYUs7WFXJSYzEAct4W7h2cqJgoBNcR/oCdizaGx Ud0mzqiNgZ06odU6+eY1BTi54BemNXj1LcADm70Qs6i5Uh4e5RlFiE4nskhyU66qXz2w LSxakr6P5vmONMGfT6BZhIKXLVO8qh3C5c5UzRyvGOwtwUQeO9VWL+VbUVIl3q0U4q/w lN3O1CQjvlF2DzO6+denEnR+/YPyaVaemu3vOrROnuR/8qAxFLEextqOyfcU4zVjf7La cCgoTIr/GjUayQl3Mk6tg2dF1hDoOx1FwoFdsupiXgudB5QR7sC3CTypXTC7Dn28gQFf pAwA== X-Gm-Message-State: AHQUAub9eSx1MpGpOAVK+bnfPoQ34KvQcdqi5C9BXD+GIDkIk12nsHP6 rwEnj8zo0BsCOsTRBo8jtWIkywk/zPo= X-Google-Smtp-Source: AHgI3IZHvQC3XhdUH53mNyZU9GuDFxHXbSvIj780yWFdCKoednwljErdKoX8+0GxTGdfqBog+XRkpQ== X-Received: by 2002:a17:902:b10c:: with SMTP id q12mr939990plr.210.1549929191807; Mon, 11 Feb 2019 15:53:11 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:11 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:38 -0800 Message-Id: <20190211235258.542-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::62b Subject: [Qemu-devel] [PATCH v3 08/28] target/arm: Add helper_mte_check{1, 2} 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Implements the rules of "PE generation of Checked and Unchecked accesses" which aren't already implied by TB_FLAGS_MTE_ACTIVE. Implements the rules of "PE handling of Tag Check Failure". Does not implement tag physical address space, so all operations reduce to unchecked so far. Signed-off-by: Richard Henderson --- v2: Fix TFSR update. v3: Split helper_mte_check per {1,2} IAs; take tbi data from translate. --- target/arm/helper-a64.h | 3 + target/arm/mte_helper.c | 133 +++++++++++++++++++++++++++++++++++++ target/arm/translate-a64.c | 14 +++- target/arm/Makefile.objs | 2 +- 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 target/arm/mte_helper.c diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index a915c1247f..c88797a922 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -102,3 +102,6 @@ DEF_HELPER_FLAGS_3(autda, TCG_CALL_NO_WG, i64, env, i64, i64) DEF_HELPER_FLAGS_3(autdb, TCG_CALL_NO_WG, i64, env, i64, i64) DEF_HELPER_FLAGS_2(xpaci, TCG_CALL_NO_RWG_SE, i64, env, i64) DEF_HELPER_FLAGS_2(xpacd, TCG_CALL_NO_RWG_SE, i64, env, i64) + +DEF_HELPER_FLAGS_2(mte_check1, TCG_CALL_NO_WG, i64, env, i64) +DEF_HELPER_FLAGS_3(mte_check2, TCG_CALL_NO_WG, i64, env, i64, i32) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c new file mode 100644 index 0000000000..bcd82a9be0 --- /dev/null +++ b/target/arm/mte_helper.c @@ -0,0 +1,133 @@ +/* + * ARM v8.5-MemTag Operations + * + * Copyright (c) 2019 Linaro, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "internals.h" +#include "exec/exec-all.h" +#include "exec/cpu_ldst.h" +#include "exec/helper-proto.h" + + +static int get_allocation_tag(CPUARMState *env, uint64_t ptr, uintptr_t ra) +{ + /* Tag storage not implemented. */ + return -1; +} + +static int allocation_tag_from_addr(uint64_t ptr) +{ + ptr += 1ULL << 55; /* carry ptr[55] into ptr[59:56]. */ + return extract64(ptr, 56, 4); +} + +/* + * Perform a checked access for MTE. + * On arrival, TBI is known to enabled, as is allocation_tag_access_enabled. + */ +static uint64_t do_mte_check(CPUARMState *env, uint64_t dirty_ptr, + uint64_t clean_ptr, uint32_t select, + uintptr_t ra) +{ + int ptr_tag, mem_tag; + + /* + * If TCMA is enabled, then physical tag 0 is unchecked. + * Note the rules R0076 & R0077 are written with logical tags, + * and we need the physical tag below anyway. + */ + ptr_tag = allocation_tag_from_addr(dirty_ptr); + if (ptr_tag == 0) { + ARMMMUIdx stage1 = arm_stage1_mmu_idx(env); + ARMVAParameters p = aa64_va_parameters(env, dirty_ptr, stage1, true); + if (p.tcma) { + return clean_ptr; + } + } + + /* + * If an access is made to an address that does not provide tag storage, + * the result is implementation defined (R0006). We choose to treat the + * access as unchecked. + * This is similar to MemAttr != Tagged, which are also unchecked. + */ + mem_tag = get_allocation_tag(env, clean_ptr, ra); + if (mem_tag < 0) { + return clean_ptr; + } + + /* If the tags do not match, the tag check operation fails. */ + if (unlikely(ptr_tag != mem_tag)) { + int tcf, el = arm_current_el(env); + + if (el == 0) { + /* FIXME: ARMv8.1-VHE S2 translation regime. */ + tcf = extract64(env->cp15.sctlr_el[1], 38, 2); + } else { + tcf = extract64(env->cp15.sctlr_el[el], 40, 2); + } + if (tcf == 1) { + /* + * Tag check fail causes a synchronous exception. + * + * In restore_state_to_opc, we set the exception syndrome + * for the load or store operation. Do that first so we + * may overwrite that with the syndrome for the tag check. + */ + cpu_restore_state(ENV_GET_CPU(env), ra, true); + env->exception.vaddress = dirty_ptr; + raise_exception(env, EXCP_DATA_ABORT, + syn_data_abort_no_iss(el != 0, 0, 0, 0, 0, 0x11), + exception_target_el(env)); + } else if (tcf == 2) { + /* Tag check fail causes asynchronous flag set. */ + env->cp15.tfsr_el[el] |= 1 << select; + } + } + + return clean_ptr; +} + +/* + * Perform check in translation regime w/single IA range. + * It is known that TBI is enabled on entry. + */ +uint64_t HELPER(mte_check1)(CPUARMState *env, uint64_t dirty_ptr) +{ + uint64_t clean_ptr = extract64(dirty_ptr, 0, 56); + return do_mte_check(env, dirty_ptr, clean_ptr, 0, GETPC()); +} + +/* + * Perform check in translation regime w/two IA ranges. + * The TBI argument is the concatenation of TBI1:TBI0. We have filtered + * TBI==0, but still need to check the IA range being referenced. + */ +uint64_t HELPER(mte_check2)(CPUARMState *env, uint64_t dirty_ptr, uint32_t tbi) +{ + uint32_t select = extract64(dirty_ptr, 55, 1); + + if ((tbi >> select) & 1) { + uint64_t clean_ptr = sextract64(dirty_ptr, 0, 56); + return do_mte_check(env, dirty_ptr, clean_ptr, select, GETPC()); + } else { + /* TBI is disabled; the access is unchecked. */ + return dirty_ptr; + } +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index f397603688..1465c52a05 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -343,7 +343,19 @@ static void gen_a64_set_pc(DisasContext *s, TCGv_i64 src) static TCGv_i64 clean_data_tbi(DisasContext *s, TCGv_i64 addr) { TCGv_i64 clean = new_tmp_a64(s); - gen_top_byte_ignore(s, clean, addr, s->tbid); + + if (s->mte_active) { + if (s->current_el >= 2) { + /* FIXME: ARMv8.1-VHE S2 translation regime. */ + gen_helper_mte_check1(clean, cpu_env, addr); + } else { + TCGv_i32 tbi = tcg_const_i32(s->tbid); + gen_helper_mte_check2(clean, cpu_env, addr, tbi); + tcg_temp_free_i32(tbi); + } + } else { + gen_top_byte_ignore(s, clean, addr, s->tbid); + } return clean; } diff --git a/target/arm/Makefile.objs b/target/arm/Makefile.objs index 1a4fc06448..c86cb1af5c 100644 --- a/target/arm/Makefile.objs +++ b/target/arm/Makefile.objs @@ -8,7 +8,7 @@ obj-y += translate.o op_helper.o helper.o cpu.o obj-y += neon_helper.o iwmmxt_helper.o vec_helper.o obj-y += gdbstub.o obj-$(TARGET_AARCH64) += cpu64.o translate-a64.o helper-a64.o gdbstub64.o -obj-$(TARGET_AARCH64) += pauth_helper.o +obj-$(TARGET_AARCH64) += pauth_helper.o mte_helper.o obj-y += crypto_helper.o obj-$(CONFIG_SOFTMMU) += arm-powerctl.o From patchwork Mon Feb 11 23:52:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040260 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="CZ1yIOy0"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2qp3LTqz9s4Z for ; Tue, 12 Feb 2019 11:01:10 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58258 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLVc-0002XQ-D5 for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:01:08 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38264) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOJ-0005Ue-TH for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOH-0004fO-0R for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]:44742) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOE-0004Qm-M2 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: by mail-pl1-x631.google.com with SMTP id p4so320872plq.11 for ; Mon, 11 Feb 2019 15:53:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IyxP/jQzqtmvSIHHr3lmN5MXpU1gzFjdHYAoOgzE02E=; b=CZ1yIOy0TLoozmoYc1wIxw9Vfo/UlGl7zXerapINLJYDjLh0Yd69J5fX4yGxBwSLdE qmRKCtMdhyQfHHq2JLseX0z9HC7+t4kalrcmZtrw0dkdO0RlNeSMozFMETBOAxMt0zCv /Nq2otM7jhgewXwpKRyPs9005UBipQVVsQMw3+ksBz0NN2CaCgsI6nCAg1BbXjVSvgID Tt/DKPL6tiEa9FNIjNDkaWJWZtouOX1rEhPjH771XLbzZJKRjPJVbXY69+SzV1zTMS8W 4yqUZiH12bq4wkJ7SxEtHsjkuNzQyOMUq5l80Ot/aATnyRZHnWSrjKYnbWipB0izoC4e Wt3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IyxP/jQzqtmvSIHHr3lmN5MXpU1gzFjdHYAoOgzE02E=; b=F7sdqpd7Wy4karVwH8X1X/NfaasFoDPvvahqZKCiA7m0vs9ScL+a7b3Bqnn1U3Afl2 aobv5eFLWZlxbzRQhtqG+lPqhvLrk0MZT/Lcoei+fKLwohyFwr4Wi1DgcViUdGO7zKl4 VDwz5vTJ0paaGnLQTNemSnRZTrtxaVc8Ti60C5QIpWH9G5O57P0lzC00fhcc8dSPdhgg 6gNOiojEdtXW3expeA7GonPhDkQYmDY4KL9w14ITaSXf4hVtLbs+xyraruic833hDUyh wGtNa7GAH1Yj0PsxGK8TKl7VfzgnCbz4Jvlcckm+V6jqxwyKMYKPuK//HF++toQtm4yh 8QaA== X-Gm-Message-State: AHQUAuZmDr5sVdpgQVhu161VFS0TSrRo/f1GOA0rAH1DQ3GtnMXGFtQ7 1e540oOOOoWl8tezkysGeFmmeQ1MKKY= X-Google-Smtp-Source: AHgI3IZyRxWMlj2buQp0bkBsoRkDkzs9ezCfRGkQbnTj0LcsetavO7eHFEyRhFPmX2BbqxACng5gzA== X-Received: by 2002:a17:902:d708:: with SMTP id w8mr942415ply.294.1549929193185; Mon, 11 Feb 2019 15:53:13 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.11 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:12 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:39 -0800 Message-Id: <20190211235258.542-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::631 Subject: [Qemu-devel] [PATCH v3 09/28] target/arm: Suppress tag check for sp+offset 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" R0078 specifies that base register, or base register plus immediate offset, is unchecked when the base register is SP. Signed-off-by: Richard Henderson --- v2: Include writeback addresses as checked. --- target/arm/translate-a64.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 1465c52a05..27ceea66d1 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -340,11 +340,11 @@ static void gen_a64_set_pc(DisasContext *s, TCGv_i64 src) * This is always a fresh temporary, as we need to be able to * increment this independently of a dirty write-back address. */ -static TCGv_i64 clean_data_tbi(DisasContext *s, TCGv_i64 addr) +static TCGv_i64 clean_data_tbi(DisasContext *s, TCGv_i64 addr, bool check) { TCGv_i64 clean = new_tmp_a64(s); - if (s->mte_active) { + if (check && s->mte_active) { if (s->current_el >= 2) { /* FIXME: ARMv8.1-VHE S2 translation regime. */ gen_helper_mte_check1(clean, cpu_env, addr); @@ -2385,7 +2385,7 @@ static void gen_compare_and_swap(DisasContext *s, int rs, int rt, if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); tcg_gen_atomic_cmpxchg_i64(tcg_rs, clean_addr, tcg_rs, tcg_rt, memidx, size | MO_ALIGN | s->be_data); } @@ -2403,7 +2403,7 @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt, if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); if (size == 2) { TCGv_i64 cmp = tcg_temp_new_i64(); @@ -2528,7 +2528,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) if (is_lasr) { tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); gen_store_exclusive(s, rs, rt, rt2, clean_addr, size, false); return; @@ -2537,7 +2537,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); s->is_ldex = true; gen_load_exclusive(s, rt, rt2, clean_addr, size, false); if (is_lasr) { @@ -2557,7 +2557,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) gen_check_sp_alignment(s); } tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); do_gpr_st(s, cpu_reg(s, rt), clean_addr, size, true, rt, disas_ldst_compute_iss_sf(size, false, 0), is_lasr); return; @@ -2573,7 +2573,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); do_gpr_ld(s, cpu_reg(s, rt), clean_addr, size, false, false, true, rt, disas_ldst_compute_iss_sf(size, false, 0), is_lasr); tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ); @@ -2587,7 +2587,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) if (is_lasr) { tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); gen_store_exclusive(s, rs, rt, rt2, clean_addr, size, true); return; } @@ -2605,7 +2605,7 @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn) if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); s->is_ldex = true; gen_load_exclusive(s, rt, rt2, clean_addr, size, true); if (is_lasr) { @@ -2795,7 +2795,7 @@ static void disas_ldst_pair(DisasContext *s, uint32_t insn) if (!postindex) { tcg_gen_addi_i64(dirty_addr, dirty_addr, offset); } - clean_addr = clean_data_tbi(s, dirty_addr); + clean_addr = clean_data_tbi(s, dirty_addr, wback || rn != 31); if (is_vector) { if (is_load) { @@ -2933,7 +2933,7 @@ static void disas_ldst_reg_imm9(DisasContext *s, uint32_t insn, if (!post_index) { tcg_gen_addi_i64(dirty_addr, dirty_addr, imm9); } - clean_addr = clean_data_tbi(s, dirty_addr); + clean_addr = clean_data_tbi(s, dirty_addr, writeback || rn != 31); if (is_vector) { if (is_store) { @@ -3040,7 +3040,7 @@ static void disas_ldst_reg_roffset(DisasContext *s, uint32_t insn, ext_and_shift_reg(tcg_rm, tcg_rm, opt, shift ? size : 0); tcg_gen_add_i64(dirty_addr, dirty_addr, tcg_rm); - clean_addr = clean_data_tbi(s, dirty_addr); + clean_addr = clean_data_tbi(s, dirty_addr, true); if (is_vector) { if (is_store) { @@ -3125,7 +3125,7 @@ static void disas_ldst_reg_unsigned_imm(DisasContext *s, uint32_t insn, dirty_addr = read_cpu_reg_sp(s, rn, 1); offset = imm12 << size; tcg_gen_addi_i64(dirty_addr, dirty_addr, offset); - clean_addr = clean_data_tbi(s, dirty_addr); + clean_addr = clean_data_tbi(s, dirty_addr, rn != 31); if (is_vector) { if (is_store) { @@ -3209,7 +3209,7 @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn, if (rn == 31) { gen_check_sp_alignment(s); } - clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn)); + clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn), rn != 31); tcg_rs = read_cpu_reg(s, rs, true); if (o3_opc == 1) { /* LDCLR */ @@ -3271,7 +3271,7 @@ static void disas_ldst_pac(DisasContext *s, uint32_t insn, tcg_gen_addi_i64(dirty_addr, dirty_addr, offset); /* Note that "clean" and "dirty" here refer to TBI not PAC. */ - clean_addr = clean_data_tbi(s, dirty_addr); + clean_addr = clean_data_tbi(s, dirty_addr, is_wback || rn != 31); tcg_rt = cpu_reg(s, rt); do_gpr_ld(s, tcg_rt, clean_addr, size, /* is_signed */ false, @@ -3431,7 +3431,7 @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn) elements = (is_q ? 16 : 8) / ebytes; tcg_rn = cpu_reg_sp(s, rn); - clean_addr = clean_data_tbi(s, tcg_rn); + clean_addr = clean_data_tbi(s, tcg_rn, is_postidx || rn != 31); tcg_ebytes = tcg_const_i64(ebytes); for (r = 0; r < rpt; r++) { @@ -3574,7 +3574,7 @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn) } tcg_rn = cpu_reg_sp(s, rn); - clean_addr = clean_data_tbi(s, tcg_rn); + clean_addr = clean_data_tbi(s, tcg_rn, is_postidx || rn != 31); tcg_ebytes = tcg_const_i64(ebytes); for (xs = 0; xs < selem; xs++) { From patchwork Mon Feb 11 23:52:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040276 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="MIJ5oHxz"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z36k44cxz9s4Z for ; Tue, 12 Feb 2019 11:14:06 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58463 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLi8-0004Mz-ER for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:14:04 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38405) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOc-0005lK-2o for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOK-0004je-MB for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:43 -0500 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:46320) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOJ-0004RN-KC for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:36 -0500 Received: by mail-pg1-x543.google.com with SMTP id w7so301261pgp.13 for ; Mon, 11 Feb 2019 15:53:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=yBCUhDhUUX/BVeMsTLdHvYEBPRtZXUGYZEktbYJveAI=; b=MIJ5oHxz8xZS64wqJuv3lWSDpZqfRHLUxHLxRNso7oB77nR9CoMhUYyGmzvExch5Ox hPc65MKayM6CsBUwjMs+8hew8eCy7371scGnmUptRIbN1p+joA4CkiK+JTF90cmdXO6p tR8y4fC2Wgj2dQKZ80k3PGr1A3d4q1Ir8OCoNa/7MSctR1NELu1xc0QFxUNIdKugUstl AHYs84z9lK6V9KP0uH5Jhi5E0xhGhluvDnGd10fk9P6voIqabwc+t1T7z6zWrFRGg0aq J+iPz5jH+CG1VRvoqNSXD/Zf/MRlBMfP0SBUN0RMtoiOpQyS7nUwr1qmRlzNqtoPHtX1 VdMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=yBCUhDhUUX/BVeMsTLdHvYEBPRtZXUGYZEktbYJveAI=; b=V+4QTjf4zjOXpANNWq0PTXBWaEK1CZGS06U2EtceD24CyAmo9lVfQlrv14iA886L6D o5f+MPCqQSB0mzB9OBmeOvOiA/jOH6tQf7AhqBmyipA4W0riM/NgKbS7Kl6vIRnusq5E K3o/3vQ2SL7aUBp5wDAWK2j3zhnuvgwLDTHig8p4b7Jvt1kf0MM4+zAAjgTixcEk14W0 mKzl/fQ9iCtr0DqDDxKqX2CDHvfDTrw+76oCTypE/4bHzjq0o16alWrK9TwLJFwsnCw6 TdkxHULmCw9r8Dm+cQgvSOlx17ZcOCOHnJqUdSCpAM4zX1Xo8RuKaqnFJjKX/IsMQ8Ru zB2w== X-Gm-Message-State: AHQUAuaxsYL1m80EOJRxXwQM3kTu22pEFYG0A8Wf9OUIMFqH3ihSw/YC 6oU+M70Hv+cDH5nFFgzn18tu2OB5sFc= X-Google-Smtp-Source: AHgI3IaBiQQQJ/zlFZ4osuNvv6NBFUx3kYxWKPb+rDVUzx6qj6LpT1HInYhb62nBW7WNmGnFxi5pJQ== X-Received: by 2002:aa7:84c7:: with SMTP id x7mr906356pfn.180.1549929194697; Mon, 11 Feb 2019 15:53:14 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:14 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:40 -0800 Message-Id: <20190211235258.542-11-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v3 10/28] target/arm: Implement the IRG instruction 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- v2: Update to 00eac5. Merge choose_random_nonexcluded_tag into helper_irg since that pseudo function no longer exists separately. --- target/arm/helper-a64.h | 1 + target/arm/mte_helper.c | 57 ++++++++++++++++++++++++++++++++++++++ target/arm/translate-a64.c | 7 +++++ 3 files changed, 65 insertions(+) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index c88797a922..0f6e78c77e 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -105,3 +105,4 @@ DEF_HELPER_FLAGS_2(xpacd, TCG_CALL_NO_RWG_SE, i64, env, i64) DEF_HELPER_FLAGS_2(mte_check1, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_3(mte_check2, TCG_CALL_NO_WG, i64, env, i64, i32) +DEF_HELPER_FLAGS_3(irg, TCG_CALL_NO_RWG, i64, env, i64, i64) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index bcd82a9be0..cd04e4954b 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -37,6 +37,31 @@ static int allocation_tag_from_addr(uint64_t ptr) return extract64(ptr, 56, 4); } +static int choose_nonexcluded_tag(int tag, int offset, uint16_t exclude) +{ + if (exclude == 0xffff) { + return 0; + } + if (offset == 0) { + while (exclude & (1 << tag)) { + tag = (tag + 1) & 15; + } + } else { + do { + do { + tag = (tag + 1) & 15; + } while (exclude & (1 << tag)); + } while (--offset > 0); + } + return tag; +} + +static uint64_t address_with_allocation_tag(uint64_t ptr, int rtag) +{ + rtag -= extract64(ptr, 55, 1); + return deposit64(ptr, 56, 4, rtag); +} + /* * Perform a checked access for MTE. * On arrival, TBI is known to enabled, as is allocation_tag_access_enabled. @@ -131,3 +156,35 @@ uint64_t HELPER(mte_check2)(CPUARMState *env, uint64_t dirty_ptr, uint32_t tbi) return dirty_ptr; } } + +uint64_t HELPER(irg)(CPUARMState *env, uint64_t rn, uint64_t rm) +{ + int el = arm_current_el(env); + uint64_t sctlr = arm_sctlr(env, el); + int rtag = 0; + + if (allocation_tag_access_enabled(env, el, sctlr)) { + /* + * Our IMPDEF choice for GCR_EL1.RRND==1 is to behave as if + * GCR_EL1.RRND==0, always producing deterministic results. + */ + uint16_t exclude = extract32(rm | env->cp15.gcr_el1, 0, 16); + int start = extract32(env->cp15.rgsr_el1, 0, 4); + int seed = extract32(env->cp15.rgsr_el1, 8, 16); + int offset, i; + + /* RandomTag */ + for (i = offset = 0; i < 4; ++i) { + /* NextRandomTagBit */ + int top = (extract32(seed, 5, 1) ^ extract32(seed, 3, 1) ^ + extract32(seed, 2, 1) ^ extract32(seed, 0, 1)); + seed = (top << 15) | (seed >> 1); + offset |= top << i; + } + rtag = choose_nonexcluded_tag(start, offset, exclude); + + env->cp15.rgsr_el1 = rtag | (seed << 8); + } + + return address_with_allocation_tag(rn, rtag); +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 27ceea66d1..141a03a88f 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -5133,6 +5133,13 @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn) case 3: /* SDIV */ handle_div(s, true, sf, rm, rn, rd); break; + case 4: /* IRG */ + if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } + gen_helper_irg(cpu_reg_sp(s, rd), cpu_env, + cpu_reg_sp(s, rn), cpu_reg(s, rm)); + break; case 8: /* LSLV */ handle_shift_reg(s, A64_SHIFT_TYPE_LSL, sf, rm, rn, rd); break; From patchwork Mon Feb 11 23:52:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040270 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="LZourBT/"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z3182p7tz9s4Z for ; Tue, 12 Feb 2019 11:09:16 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58374 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLdS-0000Em-6B for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:09:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOh-0005s5-Ih for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOf-0004zw-0G for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:59 -0500 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:37775) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOe-0004Rn-Ju for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:56 -0500 Received: by mail-pf1-x443.google.com with SMTP id y126so337556pfb.4 for ; Mon, 11 Feb 2019 15:53:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=GFj0m2pqBwYhUNoAsjQMSgz6zB0/Trk1Z4b3L8tgOKM=; b=LZourBT/lW/TOntHWoLTxskhFtFMwzLnxrT7C3tVNxI2XDf/XQ7W2746S9xe8tj6QZ zEgSLsVgqUs1efrqc2NRmUhaQILHTJhj63tVMqQvAZCVs3druPI2FYnxGxpQorSUICSi 0MHObMqHoL//mFX4lzqiVvjLwcYK1jqs0i4Pk1ThI+RaYpGXURdX+uen/bKYaMWBl34f OJPfVveMX3sERHwqVDZ0TqWs5hqcQS8N5D2XI3xu6ujn18fE+OiM/JXopEm12q8DGs7X TodJjd3vsb9JuEMBGOE9nhAGqiBmMQqaPL9upsDs/mpOACm69jCaXR8Ee4CU805pi4+E atmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GFj0m2pqBwYhUNoAsjQMSgz6zB0/Trk1Z4b3L8tgOKM=; b=sZKjOQmkF3+uaYKOZN4tyeDuBkZwnA3Gg0YtTxtiH+TihkFEKso4JKPUUT/Q+fDqG/ D9XVDbAoOQmiugQ0fW0JvrUNZxJhcNV2u8DrNMMifAyeYWKofpFVLI/8AjkUG7iheuNE GHRxgAqqL81xn2717oq4d96KU7tGneSTo4TLiJn7QGQPjcSTvQ6F5j/kLDCuVFOBPwdy RsOh2/MMddY9vnP72WOfnPdKo0nZjUaisRQZDfohq4gUaul3HUvpSdqjya96SBeMrxfg A391IQDNSewXIshFl8Gl6d2zqv9GWMq0rLWIRqM/4lO4fFdbIKJBZdhjYwkjg3y14hF6 Ccdg== X-Gm-Message-State: AHQUAuZtR6ZB3QxQ77WHjK9MnG3dNQbtb/x6meDW+Ioly+bx86pE8bzs tR0+ZwDLLUKYeRm55cwBz9fjUCNavK4= X-Google-Smtp-Source: AHgI3IZDw8WS0rapXwoFLj9ZxACcUiHfoNNl8a7uZTdIXaiw3u8wstgyLFSJAc6KVpyz3IDSZe+UIQ== X-Received: by 2002:a62:f5d7:: with SMTP id b84mr949245pfm.36.1549929195835; Mon, 11 Feb 2019 15:53:15 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:15 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:41 -0800 Message-Id: <20190211235258.542-12-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v3 11/28] target/arm: Implement ADDG, SUBG instructions 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- v2: Shift offset in translate; use extract32. --- target/arm/helper-a64.h | 2 ++ target/arm/internals.h | 4 +++ target/arm/mte_helper.c | 32 +++++++++++++++++ target/arm/translate-a64.c | 71 ++++++++++++++++++++++++++------------ 4 files changed, 86 insertions(+), 23 deletions(-) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index 0f6e78c77e..6ad23bf9ee 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -106,3 +106,5 @@ DEF_HELPER_FLAGS_2(xpacd, TCG_CALL_NO_RWG_SE, i64, env, i64) DEF_HELPER_FLAGS_2(mte_check1, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_3(mte_check2, TCG_CALL_NO_WG, i64, env, i64, i32) DEF_HELPER_FLAGS_3(irg, TCG_CALL_NO_RWG, i64, env, i64, i64) +DEF_HELPER_FLAGS_4(addg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) +DEF_HELPER_FLAGS_4(subg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) diff --git a/target/arm/internals.h b/target/arm/internals.h index fbfa770c23..8d1a81df8c 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -1008,4 +1008,8 @@ static inline bool allocation_tag_access_enabled(CPUARMState *env, int el, */ #define GMID_EL1_BS 6 +/* We associate one allocation tag per 16 bytes, the minimum. */ +#define LOG2_TAG_GRANULE 4 +#define TAG_GRANULE (1 << LOG2_TAG_GRANULE) + #endif diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index cd04e4954b..7aca5b074f 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -188,3 +188,35 @@ uint64_t HELPER(irg)(CPUARMState *env, uint64_t rn, uint64_t rm) return address_with_allocation_tag(rn, rtag); } + +uint64_t HELPER(addg)(CPUARMState *env, uint64_t ptr, + uint32_t offset, uint32_t tag_offset) +{ + int el = arm_current_el(env); + uint64_t sctlr = arm_sctlr(env, el); + int rtag = 0; + + if (allocation_tag_access_enabled(env, el, sctlr)) { + int start_tag = allocation_tag_from_addr(ptr); + uint16_t exclude = extract32(env->cp15.gcr_el1, 0, 16); + rtag = choose_nonexcluded_tag(start_tag, tag_offset, exclude); + } + + return address_with_allocation_tag(ptr + offset, rtag); +} + +uint64_t HELPER(subg)(CPUARMState *env, uint64_t ptr, + uint32_t offset, uint32_t tag_offset) +{ + int el = arm_current_el(env); + uint64_t sctlr = arm_sctlr(env, el); + int rtag = 0; + + if (allocation_tag_access_enabled(env, el, sctlr)) { + int start_tag = allocation_tag_from_addr(ptr); + uint16_t exclude = extract32(env->cp15.gcr_el1, 0, 16); + rtag = choose_nonexcluded_tag(start_tag, tag_offset, exclude); + } + + return address_with_allocation_tag(ptr - offset, rtag); +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 141a03a88f..8e322bd6a0 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -3679,7 +3679,9 @@ static void disas_pc_rel_adr(DisasContext *s, uint32_t insn) * sf: 0 -> 32bit, 1 -> 64bit * op: 0 -> add , 1 -> sub * S: 1 -> set flags - * shift: 00 -> LSL imm by 0, 01 -> LSL imm by 12 + * shift: 00 -> LSL imm by 0, + * 01 -> LSL imm by 12 + * 10 -> ADDG, SUBG */ static void disas_add_sub_imm(DisasContext *s, uint32_t insn) { @@ -3690,10 +3692,10 @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn) bool setflags = extract32(insn, 29, 1); bool sub_op = extract32(insn, 30, 1); bool is_64bit = extract32(insn, 31, 1); + bool is_tag = false; TCGv_i64 tcg_rn = cpu_reg_sp(s, rn); TCGv_i64 tcg_rd = setflags ? cpu_reg(s, rd) : cpu_reg_sp(s, rd); - TCGv_i64 tcg_result; switch (shift) { case 0x0: @@ -3701,35 +3703,58 @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn) case 0x1: imm <<= 12; break; + case 0x2: + /* ADDG, SUBG */ + if (!is_64bit || setflags || (imm & 0x30) || + !dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } + is_tag = true; + break; default: + do_unallocated: unallocated_encoding(s); return; } - tcg_result = tcg_temp_new_i64(); - if (!setflags) { - if (sub_op) { - tcg_gen_subi_i64(tcg_result, tcg_rn, imm); - } else { - tcg_gen_addi_i64(tcg_result, tcg_rn, imm); - } - } else { - TCGv_i64 tcg_imm = tcg_const_i64(imm); - if (sub_op) { - gen_sub_CC(is_64bit, tcg_result, tcg_rn, tcg_imm); - } else { - gen_add_CC(is_64bit, tcg_result, tcg_rn, tcg_imm); - } - tcg_temp_free_i64(tcg_imm); - } + if (is_tag) { + TCGv_i32 tag_offset = tcg_const_i32(imm & 15); + TCGv_i32 offset = tcg_const_i32((imm >> 6) << LOG2_TAG_GRANULE); - if (is_64bit) { - tcg_gen_mov_i64(tcg_rd, tcg_result); + if (sub_op) { + gen_helper_subg(tcg_rd, cpu_env, tcg_rn, offset, tag_offset); + } else { + gen_helper_addg(tcg_rd, cpu_env, tcg_rn, offset, tag_offset); + } + tcg_temp_free_i32(tag_offset); + tcg_temp_free_i32(offset); } else { - tcg_gen_ext32u_i64(tcg_rd, tcg_result); - } + TCGv_i64 tcg_result; - tcg_temp_free_i64(tcg_result); + if (!setflags) { + tcg_result = tcg_rd; + if (sub_op) { + tcg_gen_subi_i64(tcg_result, tcg_rn, imm); + } else { + tcg_gen_addi_i64(tcg_result, tcg_rn, imm); + } + } else { + TCGv_i64 tcg_imm = tcg_const_i64(imm); + tcg_result = new_tmp_a64(s); + if (sub_op) { + gen_sub_CC(is_64bit, tcg_result, tcg_rn, tcg_imm); + } else { + gen_add_CC(is_64bit, tcg_result, tcg_rn, tcg_imm); + } + tcg_temp_free_i64(tcg_imm); + } + + if (is_64bit) { + tcg_gen_mov_i64(tcg_rd, tcg_result); + } else { + tcg_gen_ext32u_i64(tcg_rd, tcg_result); + } + } } /* The input should be a value in the bottom e bits (with higher From patchwork Mon Feb 11 23:52:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040259 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ZidENpA9"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2qk1kKDz9s4Z for ; Tue, 12 Feb 2019 11:01:06 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58248 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLVY-0002UV-3A for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:01:04 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38157) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOG-0005R2-Vv for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOE-0004aE-HN for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:42473) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOC-0004Rt-BZ for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: by mail-pf1-x442.google.com with SMTP id n74so324893pfi.9 for ; Mon, 11 Feb 2019 15:53:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Kmm2As5QErToKnAZtTaLla6p1MaYpNIuxtZbUjkLWnk=; b=ZidENpA9kruZ1RJGavkWK31F/Eg5o76ygIgs2GCuthV9RcMZzRHvvudtoQH2lH3k8H /NQmssmo1tQiGNZN8wjRuwmgAjuSKE7ZiUCabC8sS570yynDdhEtYYea4wA+Zr9Q8Dqm BR6EDxMTgaOk/blh+pMzB+g0VOBj69U0mrSVGzGASDnaRktbi/Ng1GIIHGqqnQFJtvRL DSvqaB9QPHsjFuEerBpfAOOX74Opmge+55vortcJ6Tql1zOtN9ImnczvfbyYr3+S0wkX 6P74WCXumzqxn3hpzFGIvSGHxeFdDqmrJHC3bV+HgBCPJa0gkyiiG3nwTSZiGpINtHUb Wygw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Kmm2As5QErToKnAZtTaLla6p1MaYpNIuxtZbUjkLWnk=; b=KaqNgiM+yTztifDt11ye543bqVYKiA7K76+PtDy16KY988w7IKohfCDLkDBEt7JDCp Wey9c6Hbc3Ysg+puAvXamvJ0SNDHBMU3h8AREaa6ob45bXlC8aTn6AFFN4GNDqTpmibr cDGLtxrI/0XBtBWM4prQVMGZ5IRDZqLpUB71iXXqHAsnF4uuiLSsZJxiRxYnc55Q+zeo H70DRKBRdpSazGM7VO3zSAoo2xTb53lfBmrVnueFd0StcCTbNDEjWv5ipM9TgPlb71+G NVQufVwlhOJ0l5j29Cq8wv89iua+yXJMz2+rPZbdiKwtsR5aEGTScx5LQjL7kp6JAOVu DK2Q== X-Gm-Message-State: AHQUAuZYt8YMxFwHIFvFBQ1kiKf2nWeIf5xHmrJ125M4roju9gY2ntHU HuRAQDsza8tqJ5DjjRfz17HcWPcb/40= X-Google-Smtp-Source: AHgI3IYn0MAUmbStNuWGEVFo0NRw2/yuXB9rjKJ57/NRWr98NzBb85zDXMol4ZopRrWsOplM08Epjg== X-Received: by 2002:a62:47d9:: with SMTP id p86mr881857pfi.95.1549929197217; Mon, 11 Feb 2019 15:53:17 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:16 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:42 -0800 Message-Id: <20190211235258.542-13-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v3 12/28] target/arm: Implement the GMI instruction 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target/arm/helper-a64.h | 1 + target/arm/mte_helper.c | 6 ++++++ target/arm/translate-a64.c | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index 6ad23bf9ee..3b78e19279 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -108,3 +108,4 @@ DEF_HELPER_FLAGS_3(mte_check2, TCG_CALL_NO_WG, i64, env, i64, i32) DEF_HELPER_FLAGS_3(irg, TCG_CALL_NO_RWG, i64, env, i64, i64) DEF_HELPER_FLAGS_4(addg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) DEF_HELPER_FLAGS_4(subg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) +DEF_HELPER_FLAGS_2(gmi, TCG_CALL_NO_RWG_SE, i64, i64, i64) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index 7aca5b074f..e60c6f48eb 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -220,3 +220,9 @@ uint64_t HELPER(subg)(CPUARMState *env, uint64_t ptr, return address_with_allocation_tag(ptr - offset, rtag); } + +uint64_t HELPER(gmi)(uint64_t ptr, uint64_t mask) +{ + int tag = allocation_tag_from_addr(ptr); + return mask | (1ULL << tag); +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 8e322bd6a0..791bcc3b66 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -5165,6 +5165,12 @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn) gen_helper_irg(cpu_reg_sp(s, rd), cpu_env, cpu_reg_sp(s, rn), cpu_reg(s, rm)); break; + case 5: /* GMI */ + if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } + gen_helper_gmi(cpu_reg(s, rd), cpu_reg_sp(s, rn), cpu_reg(s, rm)); + break; case 8: /* LSLV */ handle_shift_reg(s, A64_SHIFT_TYPE_LSL, sf, rm, rn, rd); break; From patchwork Mon Feb 11 23:52:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040265 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="NJr08u+t"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2wH5stmz9s7h for ; Tue, 12 Feb 2019 11:05:03 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58305 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLZN-0005YL-Ig for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:05:01 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38521) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOf-0005or-9X for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOe-0004xQ-6A for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]:33569) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOb-0004SF-5T for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:54 -0500 Received: by mail-pl1-x631.google.com with SMTP id y10so347039plp.0 for ; Mon, 11 Feb 2019 15:53:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DNVFOwsoNzgnKbR7Mnu9AKsd+9PuR6uwgzj4ngGGq+U=; b=NJr08u+toyNHXxsde+rUj/T7JyiZ9z5OYzle+qHhclO/uQiMJ9gBKI5cDgjQppwbab Zj0kH2BZE6H8ALg9AwxOpd67XK9HgCFlar5ZCAi9HKFJtggmHQ6WrbsBjPWo1r5xROwC O+t2Hjhe+CgYT9U5Jdplj20lRzUj6eQ+Z7gzYA/GB2PstfbO4fW4vRnwqwc5nqPO6TAj cXV7JjF5iG91I+l8920yrk9tzJFDc9hn5IkDP8/HXfK0q5TxkuPKJTeE4OnPMYnm99B8 pf3CjaFua+8VBTVlDhQ3L70Us+1MaSHmReizKyufJTDeZEpyWvL5E0cP8jbNwveRHbtC JLwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DNVFOwsoNzgnKbR7Mnu9AKsd+9PuR6uwgzj4ngGGq+U=; b=V1RscCzl2UysXyPTEsevsOseJIqCo+zJmIhNtcwzRby3OzVj2oTsnPgSpC5ukcO7QK Db9tBRRa+uTz50n42Hhv2vXMJdp3NLjLWQ3EWM5FHZNr/wDWO3DtdQNTZDvwDVZBLZok azEGymFCSvP5Cq1oXdWaS5LMvgLQNlmixl3A+fJ3sFhJ1cvZTsQ7dvFk76V+Dy62e6fs dUV30LV4fzrJGy1eDvT1OAqiw3/O79Opii5D26Wk3pIEea9cetL2D8ia19usVbcR0j2d ZXaYCvAmKxVIt5SvUVeeNMrZnaAxeqsv05o0VPUKSinMEoDcwF5AqCjtHHKkvbI3grop 88iA== X-Gm-Message-State: AHQUAuZ9l67utDeHbPwsuB6rmIXAPVKXsZyJVuZMvu4yah3IqyLuJ5qQ /M5BNBXae6Pr2ufQshmLxBNwDPA6TI0= X-Google-Smtp-Source: AHgI3IZzYJquD6w6ZiC/P3t1u2es73okL3Zzdzs6FUbrwp+BZonAdl+YRccdl7Y6c+rRun6y6RwMCg== X-Received: by 2002:a17:902:8d8d:: with SMTP id v13mr893143plo.121.1549929198356; Mon, 11 Feb 2019 15:53:18 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.17 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:17 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:43 -0800 Message-Id: <20190211235258.542-14-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::631 Subject: [Qemu-devel] [PATCH v3 13/28] target/arm: Implement the SUBP instruction 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- v2: Fix extraction length. --- target/arm/translate-a64.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 791bcc3b66..2339556320 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -5139,19 +5139,39 @@ static void handle_crc32(DisasContext *s, */ static void disas_data_proc_2src(DisasContext *s, uint32_t insn) { - unsigned int sf, rm, opcode, rn, rd; + unsigned int sf, rm, opcode, rn, rd, setflag; sf = extract32(insn, 31, 1); + setflag = extract32(insn, 29, 1); rm = extract32(insn, 16, 5); opcode = extract32(insn, 10, 6); rn = extract32(insn, 5, 5); rd = extract32(insn, 0, 5); - if (extract32(insn, 29, 1)) { + if (setflag && opcode != 0) { unallocated_encoding(s); return; } switch (opcode) { + case 0: /* SUBP(S) */ + if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } else { + TCGv_i64 tcg_n, tcg_m, tcg_d; + + tcg_n = read_cpu_reg_sp(s, rn, true); + tcg_m = read_cpu_reg_sp(s, rm, true); + tcg_gen_sextract_i64(tcg_n, tcg_n, 0, 56); + tcg_gen_sextract_i64(tcg_m, tcg_m, 0, 56); + tcg_d = cpu_reg(s, rd); + + if (setflag) { + gen_sub_CC(true, tcg_d, tcg_n, tcg_m); + } else { + tcg_gen_sub_i64(tcg_d, tcg_n, tcg_m); + } + } + break; case 2: /* UDIV */ handle_div(s, false, sf, rm, rn, rd); break; From patchwork Mon Feb 11 23:52:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040272 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="kpTRBcPR"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z32m0f5Zz9s4Z for ; Tue, 12 Feb 2019 11:10:40 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58385 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLen-0001MP-TN for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:10:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38692) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOi-0005tB-K2 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOg-000533-4I for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:00 -0500 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:35021) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004T5-Ct for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: by mail-pf1-x441.google.com with SMTP id z9so344620pfi.2 for ; Mon, 11 Feb 2019 15:53:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AmqIDdbNf59JA1t3/NmXQ2mwEInbv+gIdpyKJXCMyoQ=; b=kpTRBcPR1pjIbmKTUySdMX6vGJ3l+DDfNo6AvjTf2B8+LdoW9GwQHU4Ib4GiaFa966 KDuBHGbhVRJqYaGcZcUUVveZzeLBYuHA1JtlYCOlJDsMJ4HhVlXjVxQa/9kp9jM02fz1 G4uzk8PUcHCNW/Vy/jZEaWj8c7uxy4I7YzHZ4u0Mo+ye6HyZVZuykvi+sSpjDxiEonl+ b+Y04tfOq0+fwa+Yqa/nrlFa6Uon6TFspiH0j6GFTlQc675xUbfj0TVrz5KKOrpedJ+Z UuZAD30J/j1dNKTE5pMsB/UVmJ0DM5+RWr8cEOB3MlFocFYHM3rFd1K1qlqFR20+cmMZ BPLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AmqIDdbNf59JA1t3/NmXQ2mwEInbv+gIdpyKJXCMyoQ=; b=Ml28+Vq8tL/Og4PvJevNTHZQhFa6LOPT4trcTn0vmPQhrWDtAxzguwt+db+WSnpMs1 qWEBX+zLqPvY1bemh7PBx1zFa1Gl0S8MYUXrtNKgvTNXHSkXqxFVBKFS395g37EDBHxL MKYutozIvMmVcbwQF2f7q8qQDtW0SXlgiRm+VZh5U5oS4LjCIMzjbMqEXa9BCh5eK9lY AByChMPodhW7pWixs15QQfxwzekkW9U9blchote/08gsUEa2frTKRpc3XK4NZ0ZS7Smi GZ+lfmXt7aMVzMgzdVvoEK5awOnJciTLwpGPxyNeOcMHsNDekaMZgm4nKQ5sFy5wmqNb Y2RA== X-Gm-Message-State: AHQUAuaEcsKQ2WEem7u3iiWR9d5z6bPaT3a+5hA/OQyMTM1SFqhI6j/P +B6HNv3FrxbWCCiC2hDWHF+AxHHiwIU= X-Google-Smtp-Source: AHgI3IazqqF5PMIMLz42mdhzsqEdYAFAx9aivwGSmqb7g19uaXOifgW+ZDE/EGc6zVEd+L2H4GUupg== X-Received: by 2002:a62:4e83:: with SMTP id c125mr907167pfb.101.1549929199620; Mon, 11 Feb 2019 15:53:19 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:18 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:44 -0800 Message-Id: <20190211235258.542-15-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v3 14/28] target/arm: Define arm_cpu_do_unaligned_access for CONFIG_USER_ONLY 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" We will need this to raise unaligned exceptions from user mode. Signed-off-by: Richard Henderson --- target/arm/op_helper.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c index 8698b4dc83..d3cf362e4b 100644 --- a/target/arm/op_helper.c +++ b/target/arm/op_helper.c @@ -87,8 +87,6 @@ uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn, return val; } -#if !defined(CONFIG_USER_ONLY) - static inline uint32_t merge_syn_data_abort(uint32_t template_syn, unsigned int target_el, bool same_el, bool ea, @@ -179,6 +177,22 @@ static void deliver_fault(ARMCPU *cpu, vaddr addr, MMUAccessType access_type, raise_exception(env, exc, syn, target_el); } +/* Raise a data fault alignment exception for the specified virtual address */ +void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, + MMUAccessType access_type, + int mmu_idx, uintptr_t retaddr) +{ + ARMCPU *cpu = ARM_CPU(cs); + ARMMMUFaultInfo fi = {}; + + /* now we have a real cpu fault */ + cpu_restore_state(cs, retaddr, true); + + fi.type = ARMFault_Alignment; + deliver_fault(cpu, vaddr, access_type, mmu_idx, &fi); +} + +#ifndef CONFIG_USER_ONLY /* try to fill the TLB and return an exception if error. If retaddr is * NULL, it means that the function was called in C code (i.e. not * from generated code or from helper.c) @@ -200,21 +214,6 @@ void tlb_fill(CPUState *cs, target_ulong addr, int size, } } -/* Raise a data fault alignment exception for the specified virtual address */ -void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, - MMUAccessType access_type, - int mmu_idx, uintptr_t retaddr) -{ - ARMCPU *cpu = ARM_CPU(cs); - ARMMMUFaultInfo fi = {}; - - /* now we have a real cpu fault */ - cpu_restore_state(cs, retaddr, true); - - fi.type = ARMFault_Alignment; - deliver_fault(cpu, vaddr, access_type, mmu_idx, &fi); -} - /* arm_cpu_do_transaction_failed: handle a memory system error response * (eg "no device/memory present at address") by raising an external abort * exception From patchwork Mon Feb 11 23:52:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040255 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="jFCDe0as"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2mv5QJKz9s4Z for ; Tue, 12 Feb 2019 10:58:39 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58208 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLTB-0000ZH-Nq for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:58:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38154) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOG-0005R0-Ui for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOE-0004ar-Ka for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:35146) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOC-0004Ta-Ai for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: by mail-pg1-x541.google.com with SMTP id s198so330360pgs.2 for ; Mon, 11 Feb 2019 15:53:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fXIMbZNutQ7uXFr8eeZrKD7Mbf0VwPe0oJf0QZj17Fg=; b=jFCDe0asLQIUmjkaqhmUIq6fN6QC71T15/L8MwVg8M2ki4ZLcRmLSz2zIda2XCL8Om ohkPqKDb1G/BsWCb54MrbCqIAmWy2CxO/Qsdq4OTMFd4PT7hf2jcSf5E6v1RZrfcVMH5 IYwxjhE9jCTonX2f/sYqsQimNcYIzxFm2O6syh3FQOWaJr10D9+FKt6zCGlsBYW48zvg mUopNcYbhksRgL+sZVXoRgGyMisaJ5haqHtiMOVqgkdW1/21Crpjj1NhKriZA0DxJofz aK5QXJtrjGxTy0W1/8I07y3CDL4jGV7glBmZzHWj+COyLAuqHzZ6LYCOquxKQ6ue5fjI vnOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fXIMbZNutQ7uXFr8eeZrKD7Mbf0VwPe0oJf0QZj17Fg=; b=gbkuUjRDTuBbxzFPPtvjL6pY82n3Ha/GhTIAvHf82KqxHXU605IYIYsdkBNbsqapL2 ZZZI5onG03hIAlYh8SrKT9lH34xGaDkuYuzmkCNyfqUXPqwDRl10wkIysKiBtr2+iYmU 5EWxJsmIXB0amKwY/es2hFzn+0H7wNmFlq/fcdCopI42xCQ0ixRDNCqRpM7MpQVjUUas 7aahUHdCWgZvkSLqB4NBTJL1mCYwVcKqH4i4DUPFIX76fP30veN8E3ZchhwRFh4ZB305 YZTgW/La3Ol8nQbaX0kubhanlZ+XZiqJlx48Jc67XWwiw6FDwROfkW7ZECqJ3JJOw8aS +prQ== X-Gm-Message-State: AHQUAua3BJIaDYJwcElXZZknf+ETcwfZlqq4jz2wuiNxon9AHdCfWs0h UD1V3JZNi05BDBytBXprzostOJ3rX4k= X-Google-Smtp-Source: AHgI3IaBLlGwul2bNktHBHPH0DXA7Csp6+VS1RQfXCV9y+AX4Hso2J/edWmI2WTHmGMFCl0NuTfJyQ== X-Received: by 2002:a63:200e:: with SMTP id g14mr818158pgg.235.1549929200808; Mon, 11 Feb 2019 15:53:20 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:20 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:45 -0800 Message-Id: <20190211235258.542-16-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v3 15/28] target/arm: Implement LDG, STG, ST2G instructions 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- v2: Split out allocation_tag_mem. Handle atomicity of stores. v3: Add X[t] input to these insns; require pre-cleaned addresses. --- target/arm/helper-a64.h | 5 ++ target/arm/mte_helper.c | 151 +++++++++++++++++++++++++++++++++++++ target/arm/translate-a64.c | 115 ++++++++++++++++++++++++++++ 3 files changed, 271 insertions(+) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index 3b78e19279..91e6a6ea94 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -109,3 +109,8 @@ DEF_HELPER_FLAGS_3(irg, TCG_CALL_NO_RWG, i64, env, i64, i64) DEF_HELPER_FLAGS_4(addg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) DEF_HELPER_FLAGS_4(subg, TCG_CALL_NO_RWG_SE, i64, env, i64, i32, i32) DEF_HELPER_FLAGS_2(gmi, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_3(ldg, TCG_CALL_NO_WG, i64, env, i64, i64) +DEF_HELPER_FLAGS_3(stg, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_3(st2g, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_3(stg_parallel, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_3(st2g_parallel, TCG_CALL_NO_WG, void, env, i64, i64) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index e60c6f48eb..e8873f1e75 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -25,8 +25,21 @@ #include "exec/helper-proto.h" +static uint8_t *allocation_tag_mem(CPUARMState *env, uint64_t ptr, + bool write, uintptr_t ra) +{ + /* Tag storage not implemented. */ + return NULL; +} + static int get_allocation_tag(CPUARMState *env, uint64_t ptr, uintptr_t ra) { + uint8_t *mem = allocation_tag_mem(env, ptr, false, ra); + + if (mem) { + int ofs = extract32(ptr, LOG2_TAG_GRANULE, 1) * 4; + return extract32(atomic_read(mem), ofs, 4); + } /* Tag storage not implemented. */ return -1; } @@ -226,3 +239,141 @@ uint64_t HELPER(gmi)(uint64_t ptr, uint64_t mask) int tag = allocation_tag_from_addr(ptr); return mask | (1ULL << tag); } + +uint64_t HELPER(ldg)(CPUARMState *env, uint64_t ptr, uint64_t xt) +{ + int el; + uint64_t sctlr; + int rtag; + + /* Trap if accessing an invalid page. */ + rtag = get_allocation_tag(env, ptr, GETPC()); + + /* + * The tag is squashed to zero if the page does not support tags, + * or if the OS is denying access to the tags. + */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if (rtag < 0 || !allocation_tag_access_enabled(env, el, sctlr)) { + rtag = 0; + } + + return address_with_allocation_tag(xt, rtag); +} + +static void check_tag_aligned(CPUARMState *env, uint64_t ptr, uintptr_t ra) +{ + if (unlikely(!QEMU_IS_ALIGNED(ptr, TAG_GRANULE))) { + arm_cpu_do_unaligned_access(ENV_GET_CPU(env), ptr, MMU_DATA_STORE, + cpu_mmu_index(env, false), ra); + g_assert_not_reached(); + } +} + +/* For use in a non-parallel context, store to the given nibble. */ +static void store_tag1(uint64_t ptr, uint8_t *mem, int tag) +{ + int ofs = extract32(ptr, LOG2_TAG_GRANULE, 1) * 4; + uint8_t old = atomic_read(mem); + uint8_t new = deposit32(old, ofs, 4, tag); + + atomic_set(mem, new); +} + +/* For use in a parallel context, atomically store to the given nibble. */ +static void store_tag1_parallel(uint64_t ptr, uint8_t *mem, int tag) +{ + int ofs = extract32(ptr, LOG2_TAG_GRANULE, 1) * 4; + uint8_t old = atomic_read(mem); + + while (1) { + uint8_t new = deposit32(old, ofs, 4, tag); + uint8_t cmp = atomic_cmpxchg(mem, old, new); + if (likely(cmp == old)) { + return; + } + old = cmp; + } +} + +typedef void stg_store1(uint64_t, uint8_t *, int); + +static void do_stg(CPUARMState *env, uint64_t ptr, uint64_t xt, + uintptr_t ra, stg_store1 store1) +{ + int el; + uint64_t sctlr; + uint8_t *mem; + + check_tag_aligned(env, ptr, ra); + + /* Trap if accessing an invalid page. */ + mem = allocation_tag_mem(env, ptr, true, ra); + + /* Store if page supports tags and access is enabled. */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if (mem && allocation_tag_access_enabled(env, el, sctlr)) { + store1(ptr, mem, allocation_tag_from_addr(xt)); + } +} + +void HELPER(stg)(CPUARMState *env, uint64_t ptr, uint64_t xt) +{ + do_stg(env, ptr, xt, GETPC(), store_tag1); +} + +void HELPER(stg_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt) +{ + do_stg(env, ptr, xt, GETPC(), store_tag1_parallel); +} + +static void do_st2g(CPUARMState *env, uint64_t ptr1, uint64_t xt, + uintptr_t ra, stg_store1 store1) +{ + int el; + uint64_t ptr2, sctlr; + uint8_t *mem1, *mem2; + + check_tag_aligned(env, ptr1, ra); + ptr2 = ptr1 + TAG_GRANULE; + + /* Trap if accessing an invalid page(s). */ + mem1 = mem2 = allocation_tag_mem(env, ptr1, true, ra); + if (unlikely((ptr1 ^ ptr2) & TARGET_PAGE_MASK)) { + /* The two stores are across two pages. */ + mem2 = allocation_tag_mem(env, ptr2, true, ra); + } + + /* Store if page supports tags and access is enabled. */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if ((mem1 || mem2) && allocation_tag_access_enabled(env, el, sctlr)) { + int tag = allocation_tag_from_addr(xt); + + if (likely(mem1 == mem2)) { + /* The two stores are aligned 32, and modify one byte. */ + tag |= tag << 4; + atomic_set(mem1, tag); + } else { + /* The two stores are unaligned and modify two bytes. */ + if (mem1) { + store1(ptr1, mem1, tag); + } + if (mem2) { + store1(ptr2, mem2, tag); + } + } + } +} + +void HELPER(st2g)(CPUARMState *env, uint64_t ptr, uint64_t xt) +{ + do_st2g(env, ptr, xt, GETPC(), store_tag1); +} + +void HELPER(st2g_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt) +{ + do_st2g(env, ptr, xt, GETPC(), store_tag1_parallel); +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 2339556320..feed325083 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -3610,6 +3610,118 @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn) } } +/* + * Load/Store memory tags + * + * 31 30 29 24 22 21 12 10 5 0 + * +-----+-------------+-----+---+------+-----+------+------+ + * | 1 1 | 0 1 1 0 0 1 | op1 | 1 | imm9 | op2 | Rn | Rt | + * +-----+-------------+-----+---+------+-----+------+------+ + */ +static void disas_ldst_tag(DisasContext *s, uint32_t insn) +{ + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + uint64_t offset = sextract64(insn, 12, 9) << LOG2_TAG_GRANULE; + int op2 = extract32(insn, 10, 3); + int op1 = extract32(insn, 22, 2); + bool is_load = false, is_pair = false, is_zero = false; + int index = 0; + TCGv_i64 dirty_addr, clean_addr, tcg_rt; + + if ((insn & 0xff200000) != 0xd9200000 + || !dc_isar_feature(aa64_mte_insn_reg, s)) { + goto do_unallocated; + } + + switch (op1) { + case 0: /* STG */ + if (op2 != 0) { + /* STG */ + index = op2 - 2; + break; + } + goto do_unallocated; + case 1: + if (op2 != 0) { + /* STZG */ + is_zero = true; + index = op2 - 2; + } else { + /* LDG */ + is_load = true; + } + break; + case 2: + if (op2 != 0) { + /* ST2G */ + is_pair = true; + index = op2 - 2; + break; + } + goto do_unallocated; + case 3: + if (op2 != 0) { + /* STZ2G */ + is_pair = is_zero = true; + index = op2 - 2; + break; + } + goto do_unallocated; + + default: + do_unallocated: + unallocated_encoding(s); + return; + } + + dirty_addr = read_cpu_reg_sp(s, rn, true); + if (index <= 0) { + /* pre-index or signed offset */ + tcg_gen_addi_i64(dirty_addr, dirty_addr, offset); + } + + clean_addr = clean_data_tbi(s, dirty_addr, false); + tcg_rt = cpu_reg(s, rt); + + if (is_load) { + gen_helper_ldg(tcg_rt, cpu_env, clean_addr, tcg_rt); + } else if (tb_cflags(s->base.tb) & CF_PARALLEL) { + if (is_pair) { + gen_helper_st2g_parallel(cpu_env, clean_addr, tcg_rt); + } else { + gen_helper_stg_parallel(cpu_env, clean_addr, tcg_rt); + } + } else { + if (is_pair) { + gen_helper_st2g(cpu_env, clean_addr, tcg_rt); + } else { + gen_helper_stg(cpu_env, clean_addr, tcg_rt); + } + } + + if (is_zero) { + TCGv_i64 tcg_zero = tcg_const_i64(0); + int mem_index = get_mem_index(s); + int i, n = (1 + is_pair) << LOG2_TAG_GRANULE; + + for (i = 0; i < n; i += 8) { + tcg_gen_qemu_st_i64(tcg_zero, clean_addr, mem_index, MO_Q); + tcg_gen_addi_i64(clean_addr, clean_addr, 8); + } + tcg_temp_free_i64(tcg_zero); + } + + if (index != 0) { + /* pre-index or post-index */ + if (index > 0) { + /* post-index */ + tcg_gen_addi_i64(dirty_addr, dirty_addr, offset); + } + tcg_gen_mov_i64(cpu_reg_sp(s, rn), dirty_addr); + } +} + /* Loads and stores */ static void disas_ldst(DisasContext *s, uint32_t insn) { @@ -3634,6 +3746,9 @@ static void disas_ldst(DisasContext *s, uint32_t insn) case 0x0d: /* AdvSIMD load/store single structure */ disas_ldst_single_struct(s, insn); break; + case 0x19: /* Load/store tag */ + disas_ldst_tag(s, insn); + break; default: unallocated_encoding(s); break; From patchwork Mon Feb 11 23:52:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040254 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="FCVo6cWZ"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2mN5Jj7z9s4Z for ; Tue, 12 Feb 2019 10:58:12 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58206 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLSk-0000D0-KV for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:58:10 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38249) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOJ-0005UG-L4 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOH-0004f8-1L for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:39050) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOE-0004U1-BM for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: by mail-pg1-x543.google.com with SMTP id r11so318906pgp.6 for ; Mon, 11 Feb 2019 15:53:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wnM/Ux+FJ1QNzphLa721yF5UFojAxLFZH8jvCJ6dar0=; b=FCVo6cWZzgjCIeZgsip7p6+r1b9YIuTtIIE0vpr4ICQp5tPcip6ipLVlpFpx+CMRcr h0Tuo9azsqe56vYAXBWdps+m2Ria9jnIVaZ/2OtPyn8Hd9WT9fzwW2xgalEAB7B8YrwE b9NMbQ+zq740dot2Icu2Puxh/N/q5QblmB0YhUbtswc91Z0MLG7wAcyrf2TKZ2JKuiWE 8TmeEUtW1mxU1+yOHL48gtpVIz4b4ioevtdeGVObBlWdHqtwTQseXkeziY2NTcz00BCR slzH9sIEtvwWEQ0c537bK9O09EYpdJ2ExaPUBupiGMFbKfR6OInhHcHqgwR+D/avC1+k cM7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wnM/Ux+FJ1QNzphLa721yF5UFojAxLFZH8jvCJ6dar0=; b=TGgP3i9XcPxFLt8yw+dgxH+ZCVa6c0h/+CFh6z5MeOeI7G010zfaZD+HXbq65DmNlE HtPfMBLxXCqj/OWxnk+aAUELFSTKBTAVXj4J2c6CJAR15QQYXvwdhISLnyDh/I6RQFul m+SVp6Xh/XrtZVzfXrsU8MfmlzQdj/gEqt+M/G1QSv57kMqHVjfujVvbGDu+TecSJ+ST x7zHr1Doxo3usMHMhwS0i+HjxUKl42ss/TtSH4nLvOm7VCN6QL8miSmRpHkPwFelAbix uGezG6QyniaBirZM9myZul97iV7ZctxNdxP/B/70DJ7p4x7a+4LZke1OsJu2q/FGx0WC ZTPQ== X-Gm-Message-State: AHQUAuY+fp1PngDviFIehKjmCtKblSXckb54wQC31vMcwi1YeWv/73bN UK7suIjdCSJ8IzfkpRd5Ee8oy55fuf8= X-Google-Smtp-Source: AHgI3IbQ1mCN8J3R3tKZaoJx6KJxt4Wqa59m8Dq/EFqKktUr+cJFnaSLVP5vxmSHpW2aBQkb4Zi7gA== X-Received: by 2002:a62:345:: with SMTP id 66mr872084pfd.189.1549929202199; Mon, 11 Feb 2019 15:53:22 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:21 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:46 -0800 Message-Id: <20190211235258.542-17-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v3 16/28] target/arm: Implement the STGP instruction 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- v3: Handle atomicity, require pre-cleaned address. --- target/arm/translate-a64.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index feed325083..ef3fc3a397 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -2708,7 +2708,7 @@ static void disas_ld_lit(DisasContext *s, uint32_t insn) * +-----+-------+---+---+-------+---+-------+-------+------+------+ * * opc: LDP/STP/LDNP/STNP 00 -> 32 bit, 10 -> 64 bit - * LDPSW 01 + * LDPSW/STGP 01 * LDP/STP/LDNP/STNP (SIMD) 00 -> 32 bit, 01 -> 64 bit, 10 -> 128 bit * V: 0 -> GPR, 1 -> Vector * idx: 00 -> signed offset with non-temporal hint, 01 -> post-index, @@ -2733,6 +2733,7 @@ static void disas_ldst_pair(DisasContext *s, uint32_t insn) bool is_signed = false; bool postindex = false; bool wback = false; + bool set_tag = false; TCGv_i64 clean_addr, dirty_addr; @@ -2745,6 +2746,14 @@ static void disas_ldst_pair(DisasContext *s, uint32_t insn) if (is_vector) { size = 2 + opc; + } else if (opc == 1 && !is_load) { + /* STGP */ + if (!dc_isar_feature(aa64_mte_insn_reg, s) || index == 0) { + unallocated_encoding(s); + return; + } + size = 3; + set_tag = true; } else { size = 2 + extract32(opc, 1, 1); is_signed = extract32(opc, 0, 1); @@ -2797,6 +2806,15 @@ static void disas_ldst_pair(DisasContext *s, uint32_t insn) } clean_addr = clean_data_tbi(s, dirty_addr, wback || rn != 31); + if (set_tag) { + TCGv_i64 tcg_rn = cpu_reg_sp(s, rn); + if (tb_cflags(s->base.tb) & CF_PARALLEL) { + gen_helper_stg_parallel(cpu_env, clean_addr, tcg_rn); + } else { + gen_helper_stg(cpu_env, clean_addr, tcg_rn); + } + } + if (is_vector) { if (is_load) { do_fp_ld(s, rt, clean_addr, size); From patchwork Mon Feb 11 23:52:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040263 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="TeDWiBmg"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2vM5SXfz9s4Z for ; Tue, 12 Feb 2019 11:04:15 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58295 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLYb-0004tz-GN for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:04:13 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38259) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOJ-0005Uc-TF for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOH-0004g1-3v for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:41096) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOG-0004Uo-F6 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: by mail-pf1-x443.google.com with SMTP id b7so327892pfi.8 for ; Mon, 11 Feb 2019 15:53:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uWHLuK9tuxKWuI11A7yFd0AHF+W16hGm0E91RHeIwSc=; b=TeDWiBmgs42SOwYZkvlhu2ZMKmNt2Mti+48SjvY5neZ9v1Td56lWMUVr3UJ/oe1H+F 7DiCS0YRF1JqbgqAXxttDJI9Uf5Hk7F2EOj3TWKsfYKEYyFudo16RXxmKTbS1kZM1X3S FHBM59frlY5mFlSLWsX6olkM9YrWr1r6x3LJa4gRIxTFaSYmAErWuZB/BcGz/rOALrSB jhgU/bZxzXVlNG7szr7IYQ3qA62bwJtHaVvd/oUluCgPgouRUFsWJ54CWIVYl7FBPPNM kNMl7QxRjvalHPysvFMmX71v/pWDg4Rv1NPWSOkpln1Q86pGZLoAQBOMFBqHRk1MEMNc F83w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=uWHLuK9tuxKWuI11A7yFd0AHF+W16hGm0E91RHeIwSc=; b=nM3iEn/crst7tTZB8UM91i5HSlG4hzuITx5sZGHsd/bT7WjgHYqzyOf2+MOKQaw3IF 9zfoQIsFewYodhcHy7R4i0ELkXkHbaV/W85bfKprlU3o7hNoTNMTKwnFMTxeXJPwq5Q0 s3i04VTyd6OrGeaokDoklq145WWjCAfeJZNVbJ8X/6K8mt8gkEK0eRf/pONDZh+uix0l /f9qnCWxIQczoimEil+BsnTDhlgjU9oSA/CG8DWQqsDrYADGfN0L6cP3VYRtqhAizHm7 QWJr6NEnU1Ow/jy1uAuwbo5YSZfgo7Dm6SNXi48wQyEsatLRN5K8D6nTVk/CpF8zuiE9 WURA== X-Gm-Message-State: AHQUAuZmwjbPF4+SAO3MSLUEiv0+Zy6qVSmo0lsJE03aYgtPLqd2zgx5 R3Yxh3vkb+DLdBL/lD3STn8gwZMoRwQ= X-Google-Smtp-Source: AHgI3IbDPcs5lH9CCiCiREUey5MoD2GmDgA00HO8n41Y0dWk8ua4UYJagKKnAw1kYxc8ZeBDr7JsaA== X-Received: by 2002:a62:b511:: with SMTP id y17mr884206pfe.199.1549929203823; Mon, 11 Feb 2019 15:53:23 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.22 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:23 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:47 -0800 Message-Id: <20190211235258.542-18-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v3 17/28] target/arm: Implement the LDGM and STGM instructions 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- v3: Require pre-cleaned addresses. --- target/arm/helper-a64.h | 3 ++ target/arm/mte_helper.c | 96 ++++++++++++++++++++++++++++++++++++++ target/arm/translate-a64.c | 42 +++++++++++++---- 3 files changed, 132 insertions(+), 9 deletions(-) diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index 91e6a6ea94..5bcdfcf81b 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -114,3 +114,6 @@ DEF_HELPER_FLAGS_3(stg, TCG_CALL_NO_WG, void, env, i64, i64) DEF_HELPER_FLAGS_3(st2g, TCG_CALL_NO_WG, void, env, i64, i64) DEF_HELPER_FLAGS_3(stg_parallel, TCG_CALL_NO_WG, void, env, i64, i64) DEF_HELPER_FLAGS_3(st2g_parallel, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_2(ldgm, TCG_CALL_NO_WG, i64, env, i64) +DEF_HELPER_FLAGS_3(stgm, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_3(stzgm, TCG_CALL_NO_WG, void, env, i64, i64) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index e8873f1e75..afa4c26535 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -377,3 +377,99 @@ void HELPER(st2g_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt) { do_st2g(env, ptr, xt, GETPC(), store_tag1_parallel); } + +uint64_t HELPER(ldgm)(CPUARMState *env, uint64_t ptr) +{ + const int size = 4 << GMID_EL1_BS; + int el; + uint64_t sctlr; + void *mem; + + ptr = QEMU_ALIGN_DOWN(ptr, size); + + /* Trap if accessing an invalid page(s). */ + mem = allocation_tag_mem(env, ptr, false, GETPC()); + + /* + * The tag is squashed to zero if the page does not support tags, + * or if the OS is denying access to the tags. + */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if (!mem || !allocation_tag_access_enabled(env, el, sctlr)) { + return 0; + } + +#if GMID_EL1_BS != 6 +# error "Fill in the blanks for other sizes" +#endif + /* + * We are loading 64-bits worth of tags. The ordering of elements + * within the word corresponds to a 64-bit little-endian operation. + */ + return ldq_le_p(mem); +} + +static uint64_t do_stgm(CPUARMState *env, uint64_t ptr, + uint64_t val, uintptr_t ra) +{ + const int size = 4 << GMID_EL1_BS; + int el; + uint64_t sctlr; + void *mem; + + ptr = QEMU_ALIGN_DOWN(ptr, size); + + /* Trap if accessing an invalid page(s). */ + mem = allocation_tag_mem(env, ptr, true, ra); + + /* + * No action if the page does not support tags, + * or if the OS is denying access to the tags. + */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if (!mem || !allocation_tag_access_enabled(env, el, sctlr)) { + return ptr; + } + +#if GMID_EL1_BS != 6 +# error "Fill in the blanks for other sizes" +#endif + /* + * We are storing 64-bits worth of tags. The ordering of elements + * within the word corresponds to a 64-bit little-endian operation. + */ + stq_le_p(mem, val); + + return ptr; +} + +void HELPER(stgm)(CPUARMState *env, uint64_t ptr, uint64_t val) +{ + do_stgm(env, ptr, val, GETPC()); +} + +void HELPER(stzgm)(CPUARMState *env, uint64_t ptr, uint64_t val) +{ + int i, mmu_idx, size = 4 << GMID_EL1_BS; + uintptr_t ra = GETPC(); + void *mem; + + ptr = do_stgm(env, ptr, val, ra); + + /* + * We will have just probed this virtual address in do_stgm. + * If the tlb_vaddr_to_host fails, then the memory is not ram, + * or is monitored in some other way. Fall back to stores. + */ + mmu_idx = cpu_mmu_index(env, false); + mem = tlb_vaddr_to_host(env, ptr, MMU_DATA_STORE, mmu_idx); + if (mem) { + memset(mem, 0, size); + } else { + for (i = 0; i < size; i += 8) { + cpu_stq_data_ra(env, ptr + i, 0, ra); + } + } +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index ef3fc3a397..b97af372f0 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -3643,7 +3643,7 @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn) uint64_t offset = sextract64(insn, 12, 9) << LOG2_TAG_GRANULE; int op2 = extract32(insn, 10, 3); int op1 = extract32(insn, 22, 2); - bool is_load = false, is_pair = false, is_zero = false; + bool is_load = false, is_pair = false, is_zero = false, is_mult = false; int index = 0; TCGv_i64 dirty_addr, clean_addr, tcg_rt; @@ -3653,13 +3653,18 @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn) } switch (op1) { - case 0: /* STG */ + case 0: if (op2 != 0) { /* STG */ index = op2 - 2; - break; + } else { + /* STZGM */ + if (s->current_el == 0 || offset != 0) { + goto do_unallocated; + } + is_mult = is_zero = true; } - goto do_unallocated; + break; case 1: if (op2 != 0) { /* STZG */ @@ -3675,17 +3680,27 @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn) /* ST2G */ is_pair = true; index = op2 - 2; - break; + } else { + /* STGM */ + if (s->current_el == 0 || offset != 0) { + goto do_unallocated; + } + is_mult = true; } - goto do_unallocated; + break; case 3: if (op2 != 0) { /* STZ2G */ is_pair = is_zero = true; index = op2 - 2; - break; + } else { + /* LDGM */ + if (s->current_el == 0 || offset != 0) { + goto do_unallocated; + } + is_mult = is_load = true; } - goto do_unallocated; + break; default: do_unallocated: @@ -3702,7 +3717,16 @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn) clean_addr = clean_data_tbi(s, dirty_addr, false); tcg_rt = cpu_reg(s, rt); - if (is_load) { + if (is_mult) { + if (is_load) { + gen_helper_ldgm(tcg_rt, cpu_env, clean_addr); + } else if (is_zero) { + gen_helper_stzgm(cpu_env, clean_addr, tcg_rt); + } else { + gen_helper_stgm(cpu_env, clean_addr, tcg_rt); + } + return; + } else if (is_load) { gen_helper_ldg(tcg_rt, cpu_env, clean_addr, tcg_rt); } else if (tb_cflags(s->base.tb) & CF_PARALLEL) { if (is_pair) { From patchwork Mon Feb 11 23:52:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040266 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="yXtHJj9A"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2yG2Cdvz9s4Z for ; Tue, 12 Feb 2019 11:06:46 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58348 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLb2-0006rT-6F for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:06:44 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38054) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOE-0005Md-Ez for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOC-0004YE-9E for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:36785) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOC-0004VO-0g for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:28 -0500 Received: by mail-pf1-x443.google.com with SMTP id n22so341587pfa.3 for ; Mon, 11 Feb 2019 15:53:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=U/D4l6oEbeVfp8+t8gRAbmKwAQMWeg+He9HLmsCdEd8=; b=yXtHJj9A0xh1tU/MvUGbr9MqdbBUSpW+sWIsLaEfg3MuyeNmkK7cFvsj7OjFmbrwWu RG/dfxG8/16hQkHiCNinPoguazaJVALwo2AVfm9dCCy29c8ri7ttgIyxwleETawQmuZU UCYtZVetEhlM1X/i48O1kKjy8RpnyKqvoPLULYW+6gHrU0yUhe4VZoGcyDPlEW/jghYo aEI8rDfC8yKnWiDXgRQtX7Y9+XibMrxzRGncH+RCbEALrwAQSbs7c2Las9p+8OP/78v4 dOrglZyEdnw6m4t83c5xRqKu22fJud/khYYfNa6gHMJKByKzCBP2q4SUkO3xw8KWAT8U 6hIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=U/D4l6oEbeVfp8+t8gRAbmKwAQMWeg+He9HLmsCdEd8=; b=JszbqK3Sa79/pO/PZffurn6pO0cN7tMLzv5jHxHCKvepeJfHq4Qf4PhKuJhSwGNXgX gwlyvX3Tqbck8TgE/jC7RssYLnEH1UMA2imuWG1wHH23rwnBKwWC4n+uKmlDC/VVl799 d4u6schj3MEooXiZUgifTHjEQB1ubJ5wLPCHF//fiVLRj22Mi7SUM7/qhTUsRWWGkH3I j9qRAEzSUJi7Qp/RkR5E+f82zgjh5YMIY9xkg0ojVGg3+/WxDBAP86zgagxn3i5PjmVP wJ8dHSHOEEtwRBk0G7aeqbU1V3W4I/GbUrrhtkQpKcrYytXJWXWMsEttQ/R/U97iVhKb SM/g== X-Gm-Message-State: AHQUAubeAzUlQkeDFRbKi1j2D5uYMKcZjtuIcRVsVoSuBShBrnRoe/rN jNejdCXHqP2CF1nmjyaB4ryLN141Lu8= X-Google-Smtp-Source: AHgI3IafaBhw+zWrGVdmcc4HpDl+0p+RTg/97NcAuH1Im1BnYHq7P/t+lJbs/965wujBxJ/6QhK9ZA== X-Received: by 2002:a63:5922:: with SMTP id n34mr789964pgb.435.1549929205011; Mon, 11 Feb 2019 15:53:25 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.24 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:24 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:48 -0800 Message-Id: <20190211235258.542-19-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v3 18/28] target/arm: Implement the access tag cache flushes 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Like the regular data cache flushes, these are nops within qemu. Signed-off-by: Richard Henderson --- target/arm/helper.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/target/arm/helper.c b/target/arm/helper.c index f8e4e6f8ae..ed1b258497 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -5793,6 +5793,54 @@ static const ARMCPRegInfo mte_reginfo[] = { { .name = "GMID_EL1", .state = ARM_CP_STATE_AA64, .opc0 = 3, .opc1 = 1, .crn = 0, .crm = 0, .opc2 = 4, .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = GMID_EL1_BS }, + { .name = "IGVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 3, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "IGSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 4, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 4, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CIGSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 4, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 10, .opc2 = 3, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGVAP", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 12, .opc2 = 3, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGVADP", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 13, .opc2 = 3, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CIGVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 3, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "IGDVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 5, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "IGDSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 6, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGDSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 6, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CIGDSW", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 6, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGDVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 10, .opc2 = 5, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGDVAP", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 12, .opc2 = 5, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CGDVADP", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 13, .opc2 = 5, + .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "CIGDVAC", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 5, + .type = ARM_CP_NOP, .access = PL1_W }, REGINFO_SENTINEL }; #endif From patchwork Mon Feb 11 23:52:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040251 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="RwX2IXIE"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2hl6T1jz9s3x for ; Tue, 12 Feb 2019 10:55:03 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58132 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLPh-00063y-Os for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 18:55:01 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38152) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOG-0005Qz-UW for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOE-0004b8-OL for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:32 -0500 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:45171) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOD-0004Ws-3v for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:30 -0500 Received: by mail-pg1-x544.google.com with SMTP id y4so303154pgc.12 for ; Mon, 11 Feb 2019 15:53:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CY+4xvY3XNlng3h4IyHhGPUmeyAfX1LC7tzqEoCASgM=; b=RwX2IXIE9pP7AR32yyLnvo4a7nXLJ6sT8TpjpJUkGzgZMFVfPXeQUTdkWdl8k6G5HV O0jSPVQ3Lnwd4Ude4PhfGRFJ7ZU7HhV5C/TUEoSNYavFnugJsg4VEffIpjHvo4bMujqp v0IBg8qLJQXFjFIn3t+QjzORcecStCEuujY5YNqGwdRnhfsPAWSX1dWQBuHfDpxM2SOv /uk+GwJ7k+Mg3VcIVfg0Qn0J8sCxrJ5xofQoN6HKijUYAnaMFuRckK4zAC/TnNILFyPX XMyjuK9h33VwTY1jH+q2kBy4lVjHu2pevwEJGkH2aJGvad9uxhDRNDUnjhl3HH6xC4V8 wzUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=CY+4xvY3XNlng3h4IyHhGPUmeyAfX1LC7tzqEoCASgM=; b=kPDCnelleEYjaHPmjPLpjCRtTpRQ1RNvVCtnmtiXf0frAhVm3jj0HH/Uc+ynRKuBH5 +9juU7rnX0kyzs/J95D+oP1pcHOTnP2bHTnXGwZE7rVpxRyJH1svZk26YSQLAYp7KIVa +9ur3veGO5xQvJDAxRRm8nTWxjs8SadQKj88y9VdSMlgH2in+a5IooTHEXSAkrhBkdM0 5Xm1FTJc5kV/0RfZh8JYgPRG4Um2erH3gmqyoaXRYxWmspZxqvn6yahTmB36zfoz+7+R v0TUV3ycxcDOqRNdct0D972a9sZhRxY7f8P4TRS4ajUpzsQr5g3w1mh3ELZsBZclosEA 2loQ== X-Gm-Message-State: AHQUAuYplxn6R/MTCxvtMXPygRq0J5oaE4U6l8fL0HHNpu8LFT4kPIAS PO6jrvXouvhs1WuNTtmgNmIYjrqOBtc= X-Google-Smtp-Source: AHgI3IaT5YI5ERB6b3sqE5G0PcCWO0lfJlQFY2DmMJIBIFJssEeTS3sygGUyhujwtC+jVZnhw/OK5g== X-Received: by 2002:a63:2a86:: with SMTP id q128mr844907pgq.424.1549929206183; Mon, 11 Feb 2019 15:53:26 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:25 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:49 -0800 Message-Id: <20190211235258.542-20-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v3 19/28] target/arm: Clean address for DC ZVA 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This data access was forgotten in the previous patch. Fixes: 3a471103ac1823ba Signed-off-by: Richard Henderson --- target/arm/translate-a64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index b97af372f0..9e7afa571d 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -1815,7 +1815,7 @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, return; case ARM_CP_DC_ZVA: /* Writes clear the aligned block of memory which rt points into. */ - tcg_rt = cpu_reg(s, rt); + tcg_rt = clean_data_tbi(s, cpu_reg(s, rt), false); gen_helper_dc_zva(cpu_env, tcg_rt); return; default: From patchwork Mon Feb 11 23:52:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040269 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ljZlRPnZ"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2zc3R20z9s4Z for ; Tue, 12 Feb 2019 11:07:56 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58360 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLcA-0007ha-AY for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:07:54 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38406) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOc-0005lL-2t for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOK-0004jO-JV for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:43 -0500 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:45169) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOJ-0004Y1-BB for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: by mail-pg1-x541.google.com with SMTP id y4so303176pgc.12 for ; Mon, 11 Feb 2019 15:53:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=u1cP8m0OoSVsqCjKblIhCfU4wnhzJWGLVFK+17Qjpco=; b=ljZlRPnZc5Xgga4f/oPdQ6fhBQ0dMP0lxj4VVVKhm12mdJCPwVmg3RWl5ny5GFhvSG 262eKQRoIcwwx7Y/qQWzpZvpCktIh6faDX5jRettMV0MY+8smzJH/RvqlwyeJ/8OdsHj ZYGKMXA6G0swuF38J+NlXS8UixfzfQjyMB5rz0pBGv6HLplEURn09tjNJgVfBo3l2U7v uPBQ8Ssbje1FjD7uoZBsdIXf3hESSulH0dxQlLB45UrjJi8Yhc744o6cok6k/JbMUA5j bmoZ0nGtNFsjyqUQcogqiypMWHAiU7uuBaiM1e+GDuE5/iz/2piNP2HvTADx7o+EH0Uc ogcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=u1cP8m0OoSVsqCjKblIhCfU4wnhzJWGLVFK+17Qjpco=; b=IZC/qyo9DLkAX7PAJsixakIFOuQmcL0aZkUGKIOpcN/8Ne/ItilFl8wP0ALFbVAvYW XZWU75V8V1zD6uMab8qWhNTrv8pizfe1RSW4HcW2AHKHuqwf2tNjw2oDUIZaE0I8DEby Hm9Sp1HhwJYHfUwRRx9iJnCZSJRx1JYOVjby2OWphUc4omS6tIL+GSGZbvYLe6ZQEZyA fkpCGPlYwRQf1q5HrgeN7VOKzNRE5w/hoC8ayWzRCt9QR9vv6uaPYdDz9NRNlLMkj/2v nD9ozsSJ4fDRLveM+ixziMjbgDKb6gU1CSSVtpwwTCKanPO7QYrLhFYHtzXanOhLCzN1 S19w== X-Gm-Message-State: AHQUAub5QkhvvkBSm2BCJo8BbzXZ47C8Ao8pXd2tIxpDj2+DV7QUjf6e wm+T8WYlE4/h7RiB51/J0oifcMiMCVI= X-Google-Smtp-Source: AHgI3IZeThX205XtnPoyjMdpbobf2kIqyALcdZFL7QoA5ASvIgzN/Q2KIhnvVapAmzUcwUJgGVn5aA== X-Received: by 2002:a63:f412:: with SMTP id g18mr852785pgi.262.1549929207334; Mon, 11 Feb 2019 15:53:27 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:26 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:50 -0800 Message-Id: <20190211235258.542-21-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v3 20/28] target/arm: Implement data cache set allocation tags 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This is DC GVA and DC GZVA. Signed-off-by: Richard Henderson --- v2: Use allocation_tag_mem + memset. v3: Require pre-cleaned addresses. --- target/arm/cpu.h | 4 +++- target/arm/helper-a64.h | 1 + target/arm/helper.c | 16 ++++++++++++++++ target/arm/mte_helper.c | 28 ++++++++++++++++++++++++++++ target/arm/translate-a64.c | 9 +++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 74633a7a78..ca32939483 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -2160,7 +2160,9 @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid) #define ARM_CP_NZCV (ARM_CP_SPECIAL | 0x0300) #define ARM_CP_CURRENTEL (ARM_CP_SPECIAL | 0x0400) #define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | 0x0500) -#define ARM_LAST_SPECIAL ARM_CP_DC_ZVA +#define ARM_CP_DC_GVA (ARM_CP_SPECIAL | 0x0600) +#define ARM_CP_DC_GZVA (ARM_CP_SPECIAL | 0x0700) +#define ARM_LAST_SPECIAL ARM_CP_DC_GZVA #define ARM_CP_FPU 0x1000 #define ARM_CP_SVE 0x2000 #define ARM_CP_NO_GDB 0x4000 diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h index 5bcdfcf81b..ec4e7f7cf5 100644 --- a/target/arm/helper-a64.h +++ b/target/arm/helper-a64.h @@ -117,3 +117,4 @@ DEF_HELPER_FLAGS_3(st2g_parallel, TCG_CALL_NO_WG, void, env, i64, i64) DEF_HELPER_FLAGS_2(ldgm, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_3(stgm, TCG_CALL_NO_WG, void, env, i64, i64) DEF_HELPER_FLAGS_3(stzgm, TCG_CALL_NO_WG, void, env, i64, i64) +DEF_HELPER_FLAGS_2(dc_gva, TCG_CALL_NO_RWG, void, env, i64) diff --git a/target/arm/helper.c b/target/arm/helper.c index ed1b258497..f17e045706 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -5841,6 +5841,22 @@ static const ARMCPRegInfo mte_reginfo[] = { { .name = "CIGDVAC", .state = ARM_CP_STATE_AA64, .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 5, .type = ARM_CP_NOP, .access = PL1_W }, + { .name = "GVA", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 4, .opc2 = 3, + .access = PL0_W, .type = ARM_CP_DC_GVA, +#ifndef CONFIG_USER_ONLY + /* Avoid overhead of an access check that always passes in user-mode */ + .accessfn = aa64_zva_access, +#endif + }, + { .name = "GZVA", .state = ARM_CP_STATE_AA64, + .opc0 = 1, .opc1 = 3, .crn = 7, .crm = 4, .opc2 = 4, + .access = PL0_W, .type = ARM_CP_DC_GZVA, +#ifndef CONFIG_USER_ONLY + /* Avoid overhead of an access check that always passes in user-mode */ + .accessfn = aa64_zva_access, +#endif + }, REGINFO_SENTINEL }; #endif diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index afa4c26535..6d0f82eb99 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -473,3 +473,31 @@ void HELPER(stzgm)(CPUARMState *env, uint64_t ptr, uint64_t val) } } } + +void HELPER(dc_gva)(CPUARMState *env, uint64_t ptr) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + size_t blocklen = 4 << cpu->dcz_blocksize; + int el; + uint64_t sctlr; + uint8_t *mem; + int rtag; + + ptr = QEMU_ALIGN_DOWN(ptr, blocklen); + + /* Trap if accessing an invalid page. */ + mem = allocation_tag_mem(env, ptr, true, GETPC()); + + /* No action if page does not support tags, or if access is disabled. */ + el = arm_current_el(env); + sctlr = arm_sctlr(env, el); + if (!mem || !allocation_tag_access_enabled(env, el, sctlr)) { + return; + } + + rtag = allocation_tag_from_addr(ptr); + rtag |= rtag << 4; + + assert(QEMU_IS_ALIGNED(blocklen, 2 * TAG_GRANULE)); + memset(mem, rtag, blocklen / (2 * TAG_GRANULE)); +} diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index 9e7afa571d..1bab7ea211 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -1818,6 +1818,15 @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, tcg_rt = clean_data_tbi(s, cpu_reg(s, rt), false); gen_helper_dc_zva(cpu_env, tcg_rt); return; + case ARM_CP_DC_GVA: + tcg_rt = clean_data_tbi(s, cpu_reg(s, rt), false); + gen_helper_dc_gva(cpu_env, tcg_rt); + return; + case ARM_CP_DC_GZVA: + tcg_rt = clean_data_tbi(s, cpu_reg(s, rt), false); + gen_helper_dc_zva(cpu_env, tcg_rt); + gen_helper_dc_gva(cpu_env, tcg_rt); + return; default: break; } From patchwork Mon Feb 11 23:52:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040267 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ogABBZcs"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2zF3MFRz9s7h for ; Tue, 12 Feb 2019 11:07:37 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58356 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLbr-0007TJ-Bj for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:07:35 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38670) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOi-0005ss-8Z for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOg-00053O-6W for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:00 -0500 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]:33354) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004Z9-Dw for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: by mail-pf1-x42a.google.com with SMTP id c123so349260pfb.0 for ; Mon, 11 Feb 2019 15:53:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LWxa4SdRrRFSzqAYYwVZGn5VC6YR+GvJScUZbustbPM=; b=ogABBZcs8PZBJH1JB9jQX5ncpGPvZ4br995Vp4ZgqWf7yMP+7qwwjljC5qlt5D79rA bfIx18seQ2YUOW6kUniFjzVF92TkVKg/3RJ/i8VkUuGMwsN0bIUvmsvz+UkHneuUn0pA 4+jSffFZkD3bdh4wrGrgX1Vz85NoeWmHYrrVW8GgLt7ImM//zOzs7QzMJJ66jj8wwsJk ITyGjcBQN2EBOmLpxxAZlywSIIsyOVjUFeoeBsMh3YWDWHOXOOxWTXIM4FaO6kpOwVgV m0iNSpXk6NvfLBN+WDkzGnBrMywu9fmdC/TI3aMQhjH/BLBko3ueLL8eBQQ0VoeLkw0l RhuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LWxa4SdRrRFSzqAYYwVZGn5VC6YR+GvJScUZbustbPM=; b=qOCIFpmReg0slAMljHspwyd0YwEc0X9MumNgaZ2+bABil4lj/VQNmqKYSgUFdoYPUX eM0lzPKj5ca3m8U0DvLN2JImBMIjNzRnEQZG0L+zk9hY0qwuoM5TV4YW4GdXVoQUQCEE nEVC+mp7tZWa06ErT5aeUd9sGXWfFQhGevGxpKUIIwAWvTlTDqqns1M5y7H31X+KyRn5 AHmU/l/HiRkiIX5sBFRiPNnD9BSYkGVP9S5z70seyyg+03QZuZM264BZ0Kq7rid6Ookm C3cjW3vNV/LipEmzjfYRwguRPFimv1JWpLmFQUhZ9yJbVqtPt8jIzhkSgfduDFxWaGxp eOyQ== X-Gm-Message-State: AHQUAuYbhIG3DElF3HMOwt5xt/aEzDtsash0IQ20YC7dEFhfUetvbNfZ 7LHG2jVu0MZPYpfAue88ThKG1erwmnc= X-Google-Smtp-Source: AHgI3IYNaOID/uxMljxaGyi9uEXMmjZxYVPetgRoeRk1Gv6su2jUvpWtNq44rm5Ge17j3IWAh8T4bQ== X-Received: by 2002:a63:fa48:: with SMTP id g8mr816363pgk.203.1549929208576; Mon, 11 Feb 2019 15:53:28 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.27 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:27 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:51 -0800 Message-Id: <20190211235258.542-22-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::42a Subject: [Qemu-devel] [PATCH v3 21/28] target/arm: Set PSTATE.TCO on exception entry 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" R0085 specifies that exception handlers begin with tag checks overridden. Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- v2: Only set if MTE feature present. --- target/arm/helper.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/target/arm/helper.c b/target/arm/helper.c index f17e045706..b979ca0255 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -9476,6 +9476,7 @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs) target_ulong addr = env->cp15.vbar_el[new_el]; unsigned int new_mode = aarch64_pstate_mode(new_el, true); unsigned int cur_el = arm_current_el(env); + unsigned int new_pstate; /* * Note that new_el can never be 0. If cur_el is 0, then @@ -9569,7 +9570,11 @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs) qemu_log_mask(CPU_LOG_INT, "...with ELR 0x%" PRIx64 "\n", env->elr_el[new_el]); - pstate_write(env, PSTATE_DAIF | new_mode); + new_pstate = new_mode | PSTATE_DAIF; + if (cpu_isar_feature(aa64_mte, cpu)) { + new_pstate |= PSTATE_TCO; + } + pstate_write(env, new_pstate); env->aarch64 = 1; aarch64_restore_sp(env, new_el); From patchwork Mon Feb 11 23:52:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040275 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="jiVgBVN1"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z36123bhz9sMr for ; Tue, 12 Feb 2019 11:13:29 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58453 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLhX-0003pK-5h for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:13:27 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38730) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOj-0005u9-D6 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOf-00050M-7D for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:01 -0500 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:32788) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOe-0004bZ-PO for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:56 -0500 Received: by mail-pf1-x444.google.com with SMTP id c123so349286pfb.0 for ; Mon, 11 Feb 2019 15:53:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IYfDmawl379GZgWCUsgON1GHK8BY9wa/LpINsjn/HBc=; b=jiVgBVN1y8bC0J5OWywT2GyChDE/IAULnoZSTLGcvMrOys69hu5mtcW+NU51ta6xRg DAGE06PANEztOJOAWWF9ZsUaUNNBRVmlB000lut4BXeIJ7X2Om81zFP2MR0XoCFkr4az hGZcWtLhQ6OjpxAeDuCASVHDYaABYSTb61zYxOyZvuw5QhcC0TXzL0zc52poLc6/E6NR OOSaQ8AX4yKLqJ9fzaWBKxPvI6d6sU9Og+kZOIggB2dloIAx2P1nvV23CiM37Ha9lRA5 3yXd75x5/zo7FXXDRaqcd9rmkKNOGccaY7y7NasoGh/adwiT96+S+sdfdNfXnCi0PpiM GHCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IYfDmawl379GZgWCUsgON1GHK8BY9wa/LpINsjn/HBc=; b=J6rKZ3s0vqkEWULL+7+982CBqPz7Shiqc5IFMU+KjW3/26UdkzCB0CAiMYK8TQLsvy z3tJ1epovZQeYuNou652nt0cqveufXwXp5MVl2dxlLE6XnKFu9AWp+x05kr/qikBQMWz JEvh+tWazrQcBQHIrH+oI2W085lxJISQnGY+JaJHsLyAmwDF2MEqry+lpjCiNxy66e6Z s9h5eVIVguz5wtUCceaRB5Gtpmr6qU3wxmQ9h6K6pkjNkBMODNqQ+wGNieZnBprIemux b9JIzMAmGPmUpMKM/jyIjocgzXP5ZtpgzG9B2VSETMlh/CEB03zGQRKAeN6OzMRIrvp2 WSAQ== X-Gm-Message-State: AHQUAuaycI7LBB570FBRpxyTvefg9x5XGeZ7qaQaLI+FNzsL56gqW5/H QEP63qUysV+W84eu//ObpkD787mQGC0= X-Google-Smtp-Source: AHgI3IZA9a1jljfH4QQ7KONpYsjbg3IxQoXdW4cHW8zisJb9AqFA5Gc7dSuaHi6nAVlJ/wz5bCbROA== X-Received: by 2002:a63:4858:: with SMTP id x24mr824207pgk.420.1549929209767; Mon, 11 Feb 2019 15:53:29 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.28 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:29 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:52 -0800 Message-Id: <20190211235258.542-23-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v3 22/28] tcg: Introduce target-specific page data for user-only 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" At the same time, remember MAP_SHARED as PAGE_SHARED. When mapping new pages, make sure that old target-specific page data is removed. Signed-off-by: Richard Henderson --- include/exec/cpu-all.h | 10 ++++++++-- accel/tcg/translate-all.c | 28 ++++++++++++++++++++++++++++ linux-user/mmap.c | 10 ++++++++-- linux-user/syscall.c | 4 ++-- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index b16c9ec513..e88ecad0b3 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -244,10 +244,14 @@ extern intptr_t qemu_host_page_mask; #define PAGE_WRITE_ORG 0x0010 /* Invalidate the TLB entry immediately, helpful for s390x * Low-Address-Protection. Used with PAGE_WRITE in tlb_set_page_with_attrs() */ -#define PAGE_WRITE_INV 0x0040 +#define PAGE_WRITE_INV 0x0020 +/* Page is mapped shared. */ +#define PAGE_SHARED 0x0040 +/* For use with page_set_flags: page is being replaced; target_data cleared. */ +#define PAGE_RESET 0x0080 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) /* FIXME: Code that sets/uses this is broken and needs to go away. */ -#define PAGE_RESERVED 0x0020 +#define PAGE_RESERVED 0x0100 #endif #if defined(CONFIG_USER_ONLY) @@ -260,6 +264,8 @@ int walk_memory_regions(void *, walk_memory_regions_fn); int page_get_flags(target_ulong address); void page_set_flags(target_ulong start, target_ulong end, int flags); int page_check_range(target_ulong start, target_ulong len, int flags); +void *page_get_target_data(target_ulong address); +void *page_alloc_target_data(target_ulong address, size_t size); #endif CPUArchState *cpu_copy(CPUArchState *env); diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 8f593b926f..6cc266428d 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -107,6 +107,7 @@ typedef struct PageDesc { unsigned int code_write_count; #else unsigned long flags; + void *target_data; #endif #ifndef CONFIG_USER_ONLY QemuSpin lock; @@ -2476,6 +2477,7 @@ int page_get_flags(target_ulong address) void page_set_flags(target_ulong start, target_ulong end, int flags) { target_ulong addr, len; + bool reset_target_data; /* This function should never be called with addresses outside the guest address space. If this assert fires, it probably indicates @@ -2492,6 +2494,8 @@ void page_set_flags(target_ulong start, target_ulong end, int flags) if (flags & PAGE_WRITE) { flags |= PAGE_WRITE_ORG; } + reset_target_data = !(flags & PAGE_VALID) || (flags & PAGE_RESET); + flags &= ~PAGE_RESET; for (addr = start, len = end - start; len != 0; @@ -2505,10 +2509,34 @@ void page_set_flags(target_ulong start, target_ulong end, int flags) p->first_tb) { tb_invalidate_phys_page(addr, 0); } + if (reset_target_data && p->target_data) { + g_free(p->target_data); + p->target_data = NULL; + } p->flags = flags; } } +void *page_get_target_data(target_ulong address) +{ + PageDesc *p = page_find(address >> TARGET_PAGE_BITS); + return p ? p->target_data : NULL; +} + +void *page_alloc_target_data(target_ulong address, size_t size) +{ + PageDesc *p = page_find(address >> TARGET_PAGE_BITS); + void *ret = NULL; + + if (p) { + ret = p->target_data; + if (!ret && (p->flags & PAGE_VALID)) { + p->target_data = ret = g_malloc0(size); + } + } + return ret; +} + int page_check_range(target_ulong start, target_ulong len, int flags) { PageDesc *p; diff --git a/linux-user/mmap.c b/linux-user/mmap.c index e0249efe4f..0b786b87a2 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -562,7 +562,11 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, } } the_end1: - page_set_flags(start, start + len, prot | PAGE_VALID); + if ((flags & MAP_TYPE) == MAP_SHARED) { + prot |= PAGE_SHARED; + } + prot |= PAGE_RESET | PAGE_VALID; + page_set_flags(start, start + len, prot); the_end: #ifdef DEBUG_MMAP printf("ret=0x" TARGET_ABI_FMT_lx "\n", start); @@ -754,9 +758,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, new_addr = -1; } else { new_addr = h2g(host_addr); + /* FIXME: Move page flags (and target_data?) for each page. */ prot = page_get_flags(old_addr); page_set_flags(old_addr, old_addr + old_size, 0); - page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID); + page_set_flags(new_addr, new_addr + new_size, + prot | PAGE_VALID | PAGE_RESET); } tb_invalidate_phys_range(new_addr, new_addr + new_size); mmap_unlock(); diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5bbb72f3d5..9d89b40321 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3884,8 +3884,8 @@ static inline abi_ulong do_shmat(CPUArchState *cpu_env, raddr=h2g((unsigned long)host_raddr); page_set_flags(raddr, raddr + shm_info.shm_segsz, - PAGE_VALID | PAGE_READ | - ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE)); + PAGE_VALID | PAGE_SHARED | PAGE_RESET | PAGE_READ | + (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE)); for (i = 0; i < N_SHM_REGIONS; i++) { if (!shm_regions[i].in_use) { From patchwork Mon Feb 11 23:52:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040264 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ac8DMoMC"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z2vV6jY1z9s7h for ; Tue, 12 Feb 2019 11:04:22 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58299 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLYg-0004yZ-NN for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:04:20 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38384) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOT-0005e5-TE for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOJ-0004hy-LX for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:36 -0500 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]:46746) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOG-0004cQ-Vr for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:35 -0500 Received: by mail-pf1-x441.google.com with SMTP id g6so313819pfh.13 for ; Mon, 11 Feb 2019 15:53:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+Gn6j+ksJBWpAxFZK52yAjwPBXTbbLVYAigRV7FM7Ok=; b=ac8DMoMC77Du0UKl8t/I/Or5G9ZV/w/5o8DiKWO0cNB/qY+9ygG8u71YkPR+bXPQBN dye7vBgeRijzbfGCq3puWqRfEF9rE5BhaJO6GlJH9a4YSuQDyMte4+FYPMYBn7RihCq/ Wrj02sTQCYohJHHiwo5uaQwV25dFElnAnnnf2gv3w6BurBOyTzsJ1oDRwadQ5xnilma3 QXMr6/hbCWeWFrH31AVUH7+N4IT81jkmsKAUBT4/hls7iIHRsrOQ4NaaDsEte4hjfM0P N6kzwC63h97XB1k+f3gY+941Rs52jwzSxcK78P+US+5wrlXhQ7rnXJNHd9GgZ6qpgIpe JCpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+Gn6j+ksJBWpAxFZK52yAjwPBXTbbLVYAigRV7FM7Ok=; b=cnyaFD1gRqhYiAVTfOFRkyW6Po3+Vv2W0qGzzidNGpKzqTbJLTr2Ay30AD6eV50lw5 Z81IF5LPVEHhs0+/uxO7yi1BMXKZ+5uH8OHruV8Dek9LZ1x1PVG9NnURvD/h4CTLRMdo D5D3g13nLI5I3x71Js+fSva5F1gMZaOqsCWcSkl1mHkmmIlGm9IQVOe+84Af/u/FemJ2 A1Wskft2pa+kRf14cKEVp5CfxpkpDry40hnKZLK0e1bNAyHivGE/p9ZsnO7bsEajka32 NRSHXFUv0pt+90aPe2NvcNZXjz+Ef0e+2F/M8aSQwWofh7fHcZoFf0WFLYWWOERNZgCc Y4jg== X-Gm-Message-State: AHQUAubbev5EwBj17f6tWpjPeigXZ7Q3jluUno/ISKE6vXZqmWUu1rYs YTq4WA4/4Agj1fOtFUorVfYb4L1VyO4= X-Google-Smtp-Source: AHgI3IZuWw45bRK9kEX/iiXtkbQuDSmuykp/jgzUsP4Z8PZ3aWK3om6l8H9Fzub7StAGbN5kmdX5sQ== X-Received: by 2002:a63:4105:: with SMTP id o5mr843304pga.396.1549929211123; Mon, 11 Feb 2019 15:53:31 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:30 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:53 -0800 Message-Id: <20190211235258.542-24-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::441 Subject: [Qemu-devel] [PATCH v3 23/28] target/arm: Cache the Tagged bit for a page in MemTxAttrs 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This "bit" is a particular value of the page's MemAttr. Signed-off-by: Richard Henderson --- target/arm/helper.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/target/arm/helper.c b/target/arm/helper.c index b979ca0255..e312d62140 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -10740,6 +10740,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address, uint64_t descaddrmask; bool aarch64 = arm_el_is_aa64(env, el); bool guarded = false; + uint8_t memattr; /* TODO: * This code does not handle the different format TCR for VTCR_EL2. @@ -10970,17 +10971,21 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address, txattrs->target_tlb_bit0 = true; } + if (mmu_idx == ARMMMUIdx_S2NS) { + memattr = convert_stage2_attrs(env, extract32(attrs, 0, 4)); + } else { + /* Index into MAIR registers for cache attributes */ + uint64_t mair = env->cp15.mair_el[el]; + memattr = extract64(mair, extract32(attrs, 0, 3) * 8, 8); + } + + /* When in aarch64 mode, and MTE is enabled, remember Tagged in IOTLB. */ + if (aarch64 && memattr == 0xf0 && cpu_isar_feature(aa64_mte, cpu)) { + txattrs->target_tlb_bit1 = true; + } + if (cacheattrs != NULL) { - if (mmu_idx == ARMMMUIdx_S2NS) { - cacheattrs->attrs = convert_stage2_attrs(env, - extract32(attrs, 0, 4)); - } else { - /* Index into MAIR registers for cache attributes */ - uint8_t attrindx = extract32(attrs, 0, 3); - uint64_t mair = env->cp15.mair_el[regime_el(env, mmu_idx)]; - assert(attrindx <= 7); - cacheattrs->attrs = extract64(mair, attrindx * 8, 8); - } + cacheattrs->attrs = memattr; cacheattrs->shareability = extract32(attrs, 6, 2); } From patchwork Mon Feb 11 23:52:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040277 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="tA0F2DP7"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z39D3pxXz9s4Z for ; Tue, 12 Feb 2019 11:16:16 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58530 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLkE-0006Ev-Bn for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:16:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38765) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOk-0005uU-1r for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOg-00054N-Dp for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:01 -0500 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:46747) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004gJ-Ko for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:58 -0500 Received: by mail-pf1-x442.google.com with SMTP id g6so313846pfh.13 for ; Mon, 11 Feb 2019 15:53:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=A8TAMIXN+69/Jk9cvH3CNk1W0843jdUBpea8zUdjfM0=; b=tA0F2DP7EoxMXpVxvMAcqvCHJiVK7S2Yx1FzUTc9Nk9wEtD7kkeNxvb9WqE5Wn/6yQ O+VX/M5Rt58NTZONQFiBicVI6U4HUJakbbXyYB6A5EnFbPeFiXc1i1FZjlIGt3Fd6MKC zoxOPAJ5sPKtgXuWgztdhjYaNVVBWzm1m3sTcQceeJVrMo9HwzDG7/FcTNnphr/Rk1hY zfDUuRiec57YWDQiHsVwud0sJau27+K4HhzBWWizalxO11np8AfKBok+rvUwWRW3dULV lgO2P8rwZG0Nay3l/HZQiDXrdKJ1qahRtnHttiFI9HoWW9iZY+ddCTb6+8aCldpfhm5t dgAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=A8TAMIXN+69/Jk9cvH3CNk1W0843jdUBpea8zUdjfM0=; b=Nkt8JScZicpJCVCz+4MfEXdVp+78QWF789VHAjqcNdvKb30ybcN2zlh9joqXGwPEA2 iALXMsiEG0W8sr7fGBdVFGGM2moF/cgIjmZtjR5eunrcl5sm/eFgcY1sMwWKjg1vxVKD fP7PJ43KbItwxctId6oJn6Cy/5Fe2cJKsMcD9azSIhHD2MaxKe9Av1pMNkEPEA/rs5Au dzJCZZu9jYpfZPctP39tT+ozENieekGBZ+qy+QXKVcH8cxFM5tdybcKBCSUoEwMqwpsz Xmekyx8YClg0ZdmeVAfxjOr9Kf2lDznMcVay20Sr4ALJNIsuL1NMyoaW4f7CbNwz851Y to5w== X-Gm-Message-State: AHQUAubM+SmtWeBdPXDRo59+hAcntl5JqpcLfc9wnB3lTruk4wAYTvgG a9mbZdnFKU9+ygYyX0hpWcPYFo47s9w= X-Google-Smtp-Source: AHgI3IYh8nqixmlX3pBgrKdSsUUt75gcTTatD3FIskkLz4rXlROgveUHIkrZ6MA3E0cK2Lbgw780HA== X-Received: by 2002:a63:134f:: with SMTP id 15mr823505pgt.19.1549929212346; Mon, 11 Feb 2019 15:53:32 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:31 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:54 -0800 Message-Id: <20190211235258.542-25-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v3 24/28] target/arm: Create tagged ram when MTE is enabled 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- target/arm/cpu.h | 4 ++++ hw/arm/virt.c | 33 +++++++++++++++++++++++++++++++++ target/arm/cpu.c | 21 ++++++++++++++++++--- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index ca32939483..2626af4a9c 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -768,6 +768,9 @@ struct ARMCPU { /* MemoryRegion to use for secure physical accesses */ MemoryRegion *secure_memory; + /* MemoryRegion to use for allocation tag accesses */ + MemoryRegion *tag_memory; + /* For v8M, pointer to the IDAU interface provided by board/SoC */ Object *idau; @@ -2850,6 +2853,7 @@ int cpu_mmu_index(CPUARMState *env, bool ifetch); typedef enum ARMASIdx { ARMASIdx_NS = 0, ARMASIdx_S = 1, + ARMASIdx_TAG = 2, } ARMASIdx; /* Return the Exception Level targeted by debug exceptions. */ diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 99c2b6e60d..dccd1345a1 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -1260,6 +1260,21 @@ static void create_secure_ram(VirtMachineState *vms, g_free(nodename); } +static void create_tag_ram(VirtMachineState *vms, MachineState *machine, + MemoryRegion *tag_sysmem) +{ + MemoryRegion *tagram = g_new(MemoryRegion, 1); + hwaddr base = vms->memmap[VIRT_MEM].base / 32; + hwaddr size = machine->ram_size / 32; + + memory_region_init_ram(tagram, NULL, "mach-virt.tag", size, &error_fatal); + memory_region_add_subregion(tag_sysmem, base, tagram); + + /* ??? Do we really need an fdt entry, or is MemTag enabled sufficient. */ + /* ??? We appear to need secure tag mem to go with secure mem. */ + /* ??? Does that imply we need a fourth address space? */ +} + static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size) { const VirtMachineState *board = container_of(binfo, VirtMachineState, @@ -1362,6 +1377,7 @@ static void machvirt_init(MachineState *machine) qemu_irq pic[NUM_IRQS]; MemoryRegion *sysmem = get_system_memory(); MemoryRegion *secure_sysmem = NULL; + MemoryRegion *tag_sysmem = NULL; int n, virt_max_cpus; MemoryRegion *ram = g_new(MemoryRegion, 1); bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0); @@ -1518,6 +1534,20 @@ static void machvirt_init(MachineState *machine) "secure-memory", &error_abort); } + /* + * The cpu adds the property iff MemTag is supported. + * If it is, we must allocate the ram to back that up. + */ + if (object_property_find(cpuobj, "tag-memory", NULL)) { + if (!tag_sysmem) { + tag_sysmem = g_new(MemoryRegion, 1); + memory_region_init(tag_sysmem, OBJECT(machine), + "tag-memory", UINT64_MAX / 32); + } + object_property_set_link(cpuobj, OBJECT(tag_sysmem), + "tag-memory", &error_abort); + } + object_property_set_bool(cpuobj, true, "realized", &error_fatal); object_unref(cpuobj); } @@ -1540,6 +1570,9 @@ static void machvirt_init(MachineState *machine) create_secure_ram(vms, secure_sysmem); create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1)); } + if (tag_sysmem) { + create_tag_ram(vms, machine, tag_sysmem); + } vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64); diff --git a/target/arm/cpu.c b/target/arm/cpu.c index edf6e0e1f1..decf95de3e 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -851,6 +851,18 @@ void arm_cpu_post_init(Object *obj) qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property, &error_abort); + +#ifndef CONFIG_USER_ONLY + if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64) && + cpu_isar_feature(aa64_mte, cpu)) { + object_property_add_link(obj, "tag-memory", + TYPE_MEMORY_REGION, + (Object **)&cpu->tag_memory, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG, + &error_abort); + } +#endif } static void arm_cpu_finalizefn(Object *obj) @@ -1164,16 +1176,19 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) init_cpreg_list(cpu); #ifndef CONFIG_USER_ONLY + cs->num_ases = 1; if (cpu->has_el3 || arm_feature(env, ARM_FEATURE_M_SECURITY)) { cs->num_ases = 2; - if (!cpu->secure_memory) { cpu->secure_memory = cs->memory; } cpu_address_space_init(cs, ARMASIdx_S, "cpu-secure-memory", cpu->secure_memory); - } else { - cs->num_ases = 1; + } + if (cpu->tag_memory != NULL) { + cs->num_ases = 3; + cpu_address_space_init(cs, ARMASIdx_TAG, "cpu-tag-memory", + cpu->tag_memory); } cpu_address_space_init(cs, ARMASIdx_NS, "cpu-memory", cs->memory); From patchwork Mon Feb 11 23:52:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040274 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Ixi4F8QJ"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z34r63c5z9s4Z for ; Tue, 12 Feb 2019 11:12:28 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58437 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLgY-0002xD-E3 for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:12:26 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38691) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOi-0005tA-Jw for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOf-00051U-Kd for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:00 -0500 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:38667) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004lL-4C for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: by mail-pf1-x442.google.com with SMTP id q1so336136pfi.5 for ; Mon, 11 Feb 2019 15:53:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ah6gpD+An0QDDQ04ODgwPJ8bm3GJsZDkKDcKBtcRmis=; b=Ixi4F8QJmPd2QJM/RA/0JSAyu33wFhVUY2zFQgHscupUEWikNIZZwZk/QC4WzUz/4o rtpf5apJAcjNH8/iSZdSwkBrZ4cA/qDyWEmWKhSkMyTrMT0DRGuZBnAhUwi/Fg//b959 8jvPC8o2ab4NsBIlaj/qRQAC+nfzxN6ayDtiWu+OpY54/X0/qZ0VSA+ASkqqL6CA9iSV SRJhmVDBXNArZiEhsk7G8ZGBzPz3UxeU1Jd+Rubi5+7e5FfG5itqhnfAa2P5t8vJoFND KenPAWeDLOzl7YxIoLoe5oZla3RcgyfGXSjDwR96du3NhRJn5JwY3LE3ou1WbUvBbkcA DNzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ah6gpD+An0QDDQ04ODgwPJ8bm3GJsZDkKDcKBtcRmis=; b=mdJ6e2L553fi/oYjiZ9xYXQ7HIvpK8vX1eLSZeoMPhWGWb1MxZxuhIWsUuN8zokf82 pveUuCHYiO3M7PjlY4KOej52pic/GqIph9ra6D5vYLy1jrc8yy7ivKoVR1uIRQwXMEAX Ejn662sDjRJ4M7qP6ff9lsmMIYTvliKwr6cA+f01hvmv+IdOKs5KIUlkiyAH8Kzucir1 DvdSB8Ofe0hlsYI1aA8Rhj3FPy449cAeVzpUzsIOSBmnmVvI4IMltEBL8mfCZxKx+FOT BU1ETYwbihRc6iL6ETlZ95OKz2xbO2K6EsRy1yyMO+8uu921J8y2uMPUYxtbaSwnZ8Hu BL8g== X-Gm-Message-State: AHQUAubOHHZeFmjietRQIE05SuMa9bxEvWFkU5JxGrlqrBHJXiqqTdez 6O41WYY/018cWxRIlPicrnCnTqlugnE= X-Google-Smtp-Source: AHgI3IbZslMHV+axRj+HPc5GP+lN2rCq5GX5d8xXkjMiNFS5jlxTxFTU1xVAhKphTFMgOdVO7lu6Ww== X-Received: by 2002:a63:d5f:: with SMTP id 31mr840515pgn.274.1549929214138; Mon, 11 Feb 2019 15:53:34 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.32 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:33 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:55 -0800 Message-Id: <20190211235258.542-26-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v3 25/28] target/arm: Add allocation tag storage for user mode 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Control this with x-tagged-pages, which is off by default. The limitation to non-shared pages is not part of a future kernel API, but a limitation of linux-user not being able to map virtual pages back to physical pages. Signed-off-by: Richard Henderson --- v2: Add the x-tagged-pages cpu property --- target/arm/cpu.h | 1 + target/arm/cpu64.c | 18 ++++++++++++++++++ target/arm/mte_helper.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 2626af4a9c..ec5ddfbacc 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -910,6 +910,7 @@ struct ARMCPU { #ifdef CONFIG_USER_ONLY bool guarded_pages; + bool tagged_pages; #endif QLIST_HEAD(, ARMELChangeHook) pre_el_change_hooks; diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index c5675fe7d1..53a7d92c95 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -293,6 +293,18 @@ static void aarch64_cpu_set_guarded_pages(Object *obj, bool val, Error **errp) ARMCPU *cpu = ARM_CPU(obj); cpu->guarded_pages = val; } + +static bool aarch64_cpu_get_tagged_pages(Object *obj, Error **errp) +{ + ARMCPU *cpu = ARM_CPU(obj); + return cpu->tagged_pages; +} + +static void aarch64_cpu_set_tagged_pages(Object *obj, bool val, Error **errp) +{ + ARMCPU *cpu = ARM_CPU(obj); + cpu->tagged_pages = val; +} #endif /* -cpu max: if KVM is enabled, like -cpu host (best possible with this host); @@ -380,6 +392,12 @@ static void aarch64_max_initfn(Object *obj) aarch64_cpu_set_guarded_pages, NULL); object_property_set_description(obj, "x-guarded-pages", "Set on/off GuardPage bit for all pages", NULL); + + object_property_add_bool(obj, "x-tagged-pages", + aarch64_cpu_get_tagged_pages, + aarch64_cpu_set_tagged_pages, NULL); + object_property_set_description(obj, "x-tagged-pages", + "Set on/off MemAttr Tagged for all pages", NULL); #endif cpu->sve_max_vq = ARM_MAX_VQ; diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index 6d0f82eb99..09c387e2c7 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -28,8 +28,44 @@ static uint8_t *allocation_tag_mem(CPUARMState *env, uint64_t ptr, bool write, uintptr_t ra) { +#ifdef CONFIG_USER_ONLY + ARMCPU *cpu = arm_env_get_cpu(env); + uint8_t *tags; + uintptr_t index; + int flags; + + flags = page_get_flags(ptr); + + if (!(flags & PAGE_VALID) || !(flags & (write ? PAGE_WRITE : PAGE_READ))) { + /* SIGSEGV */ + env->exception.vaddress = ptr; + cpu_restore_state(CPU(cpu), ra, true); + raise_exception(env, EXCP_DATA_ABORT, 0, 1); + } + + if (!cpu->tagged_pages) { + /* Tag storage is disabled. */ + return NULL; + } + if (flags & PAGE_SHARED) { + /* There may be multiple mappings; pretend not implemented. */ + return NULL; + } + + tags = page_get_target_data(ptr); + if (tags == NULL) { + size_t alloc_size = TARGET_PAGE_SIZE >> (LOG2_TAG_GRANULE + 1); + tags = page_alloc_target_data(ptr, alloc_size); + assert(tags != NULL); + } + + index = extract32(ptr, LOG2_TAG_GRANULE + 1, + TARGET_PAGE_BITS - LOG2_TAG_GRANULE - 1); + return tags + index; +#else /* Tag storage not implemented. */ return NULL; +#endif } static int get_allocation_tag(CPUARMState *env, uint64_t ptr, uintptr_t ra) From patchwork Mon Feb 11 23:52:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040279 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="eM3Ut9Q8"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z3Fg290hz9s5c for ; Tue, 12 Feb 2019 11:20:07 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58569 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLnx-0000iQ-2e for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:20:05 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38736) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOj-0005uE-F7 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOf-00052i-VY for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:01 -0500 Received: from mail-pg1-x541.google.com ([2607:f8b0:4864:20::541]:44535) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004iu-9x for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: by mail-pg1-x541.google.com with SMTP id y1so306475pgk.11 for ; Mon, 11 Feb 2019 15:53:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ju0kTjI209UCLXJK9JoNZjkA22NnBtRT7DAuiRVZe0I=; b=eM3Ut9Q8OhHf/eHwpTKfKXuR4n3UxEo0v3fKALx4rnCNGvNsCyChNUJk9M4shOWu2y v8o+idtV1ZR7V0xmQa/7/U6/7IAoSNTzxfrrnOgRERvg3OZ5sN+1Ttoo7UrSQUdZ+80N jym1TYVkP+2z9RayUAKeiVf41Iwn7bGi1Nel8eC+SCkJTaTPg53+lMWzY3HqeUg8zDdY 977BRlcLpE0W243Sz2j8SHb+pAywtQPJu3/c+ogWhslMLup8RPlPwFOqE/mUXBgqGfb8 DSOtO7DlTBlYWIv+vXkZ6EYkCsZtE2wDjYNU+bWqaj/SWp8rGuTqkxaPK4hbtScQnGvp K/lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Ju0kTjI209UCLXJK9JoNZjkA22NnBtRT7DAuiRVZe0I=; b=kEIv57Zs/bt9PdNVAWSY/FbNpN3u6GimNrlX2gDw1XwZzK77biWxpaoGhBlVeKSzr6 BG1Zdx73/Z8cAirkcby9H8F1NYhrcfrLk6nnyBeIl4zT/TFWO1jh2Ex7IJt7r0EqKNPT aA+t39cI11/WhiO+n1WxWEKPIqqMgf6uH/s2MMzTrwQIBPf5QEubheOQOyiU/uc3EBe8 ROH8T24hTyNSICuZxOU6bRiVW0wJKyhA3m7nYMqoE0ErEmLI0nqlkUMG9yyva+Mgx/v1 jQLGfWE6rm/eDOEHLNfTtu8PUfJlttYFLrdyh4DBHzb0g/yTXb7As79KXdCDzyZNGhN6 2gtQ== X-Gm-Message-State: AHQUAua+ZMp2YzDVzH/xLejgBlsigm9EpJbObGZBizKUbgGcEvU3ZrZm LlCD3Cxup9JNHCYe8HBgTMf+z1CRAq0= X-Google-Smtp-Source: AHgI3IYyScaFHiLW44M62K/GCaZA4FsigUr15PqHP+iWpf9KBC4R7Kcwcq2gu1niowyLfrmOOfqbEQ== X-Received: by 2002:aa7:8802:: with SMTP id c2mr938329pfo.20.1549929215416; Mon, 11 Feb 2019 15:53:35 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:34 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:56 -0800 Message-Id: <20190211235258.542-27-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::541 Subject: [Qemu-devel] [PATCH v3 26/28] target/arm: Add allocation tag storage for system mode 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- target/arm/mte_helper.c | 96 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 9 deletions(-) diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index 09c387e2c7..53c3ed862e 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -28,18 +28,18 @@ static uint8_t *allocation_tag_mem(CPUARMState *env, uint64_t ptr, bool write, uintptr_t ra) { -#ifdef CONFIG_USER_ONLY ARMCPU *cpu = arm_env_get_cpu(env); + CPUState *cs = CPU(cpu); uint8_t *tags; uintptr_t index; - int flags; - flags = page_get_flags(ptr); +#ifdef CONFIG_USER_ONLY + int flags = page_get_flags(ptr); if (!(flags & PAGE_VALID) || !(flags & (write ? PAGE_WRITE : PAGE_READ))) { /* SIGSEGV */ env->exception.vaddress = ptr; - cpu_restore_state(CPU(cpu), ra, true); + cpu_restore_state(cs, ra, true); raise_exception(env, EXCP_DATA_ABORT, 0, 1); } @@ -56,16 +56,94 @@ static uint8_t *allocation_tag_mem(CPUARMState *env, uint64_t ptr, if (tags == NULL) { size_t alloc_size = TARGET_PAGE_SIZE >> (LOG2_TAG_GRANULE + 1); tags = page_alloc_target_data(ptr, alloc_size); - assert(tags != NULL); + } +#else + int mmu_idx; + AddressSpace *as; + CPUTLBEntry *te; + CPUIOTLBEntry *iotlbentry; + MemoryRegionSection *section; + MemoryRegion *mr; + FlatView *fv; + hwaddr physaddr, tag_physaddr, tag_len, xlat; + + /* + * Find the TLB entry for this access. + * As a side effect, this also raises an exception for invalid access. + */ + mmu_idx = cpu_mmu_index(env, false); + index = tlb_index(env, mmu_idx, ptr); + te = tlb_entry(env, mmu_idx, ptr); + if (!tlb_hit(write ? tlb_addr_write(te) : te->addr_read, ptr)) { + /* ??? Expose VICTIM_TLB_HIT from accel/tcg/cputlb.c. */ + tlb_fill(cs, ptr, 16, write ? MMU_DATA_STORE : MMU_DATA_LOAD, + mmu_idx, ra); + index = tlb_index(env, mmu_idx, ptr); + te = tlb_entry(env, mmu_idx, ptr); } + /* If the virtual page MemAttr != Tagged, nothing to do. */ + iotlbentry = &env->iotlb[mmu_idx][index]; + if (!iotlbentry->attrs.target_tlb_bit1) { + return NULL; + } + + /* If the board did not allocate tag memory, nothing to do. */ + as = cpu_get_address_space(cs, ARMASIdx_TAG); + if (!as) { + return NULL; + } + + /* Find the physical address for the virtual access. */ + section = iotlb_to_section(cs, iotlbentry->addr, iotlbentry->attrs); + physaddr = ((iotlbentry->addr & TARGET_PAGE_MASK) + ptr + + section->offset_within_address_space + - section->offset_within_region); + + /* Convert to the physical address in tag space. */ + tag_physaddr = physaddr >> (LOG2_TAG_GRANULE + 1); + tag_len = TARGET_PAGE_SIZE >> (LOG2_TAG_GRANULE + 1); + + /* + * Find the tag physical address within the tag address space. + * + * ??? Create a new mmu_idx to cache the rest of this. + * + * ??? If we were assured of exactly one block of normal ram, + * and thus exactly one block of tag ram, then we could validate + * section->mr as ram, use the section offset vs cpu->tag_memory, + * and finish with memory_region_get_ram_ptr. + */ + rcu_read_lock(); + fv = address_space_to_flatview(as); + mr = flatview_translate(fv, tag_physaddr, &xlat, &tag_len, + write, MEMTXATTRS_UNSPECIFIED); + if (!memory_access_is_direct(mr, write)) { + /* + * This would seem to imply that the guest has marked a + * virtual page as Tagged when the physical page is not RAM. + * Should this raise some sort of bus error? + */ + rcu_read_unlock(); + qemu_log_mask(LOG_GUEST_ERROR, "Tagged virtual page 0x%" PRIx64 + " maps to physical page 0x%" PRIx64 " without RAM\n", + ptr, physaddr); + return NULL; + } + rcu_read_unlock(); + + /* The board should have created tag ram sized correctly. */ + assert(tag_len == TARGET_PAGE_SIZE >> (LOG2_TAG_GRANULE + 1)); + + /* FIXME: Mark the tag page dirty for migration. */ + + tags = qemu_map_ram_ptr(mr->ram_block, xlat); +#endif + + assert(tags != NULL); index = extract32(ptr, LOG2_TAG_GRANULE + 1, TARGET_PAGE_BITS - LOG2_TAG_GRANULE - 1); return tags + index; -#else - /* Tag storage not implemented. */ - return NULL; -#endif } static int get_allocation_tag(CPUARMState *env, uint64_t ptr, uintptr_t ra) From patchwork Mon Feb 11 23:52:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040278 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="W1/tgCF5"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z3Bh1CCfz9s4Z for ; Tue, 12 Feb 2019 11:17:32 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58547 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLlS-0007HM-2g for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:17:30 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38621) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOh-0005rM-58 for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOf-00050u-CV for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:59 -0500 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:46111) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOe-0004kH-Ub for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:57 -0500 Received: by mail-pl1-x642.google.com with SMTP id o6so315373pls.13 for ; Mon, 11 Feb 2019 15:53:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=g7oNh1d8VWGEQw+YCuZLsLZ9OlLSdLVyb8nPu7OZ0AM=; b=W1/tgCF5U4YtukldkxB1PagvZ0FLkJZUzhnU3ZjVhiuaBL20g06kGBa07g+VKlGSFs W40seklOowkg7Sc0MdHkKPQcz6w9FxoDAO+aQN1oGnFqnvhJn5Om+y4OJQ5OtsSmzmqf ulvLLGoteMCtHlHLktohNii6qJ9grcEoLXMIoSZncPVTXrgLtPxxix0+8ep+jmumBvQ5 8erevH4S1OZeEagNrwRpX3cLwRZZbWx9/Tzrsyaf6ozCKVPE2o5Vr/QZmKzgpWVb6RrD CKrOYsdUNZIA+7CzichGB8LJPBa1HKQyc13ot27/wcpqbtnv1eKTPJkt71Rg/huepOaW 7uOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=g7oNh1d8VWGEQw+YCuZLsLZ9OlLSdLVyb8nPu7OZ0AM=; b=H6YXKH4CZixWN/0SaL5/ixSxu/1cASZtowIvJwBmLxU1oVErjHlRoqMdmfbbvlVjqv clz0ddTYs7KfluK+dHSYXuLQ9R+CMUHHnfQFVG2VeuBQWEncf6YJ1+FGYAf4w6dNAY2Z 1EKjRQ5+oitBXDBSUAMRv9qA5rcLUkeEN40+9dKM7sDx+D6On9Y6O3+ugt+Ch4icehT+ ffP19tO/uOMnsZyjEGSVB0jspfteEFHUmT3zmG1H/ZIsk2fnubEoa/1hqjOo5NKCCFyC WY2VpT/H5BFzhAh9br7M+PyXr5r/5A69YUBX/riuVEvZkLaRFv/rI6N+OUZQZTqv9MdC yn/g== X-Gm-Message-State: AHQUAuYzwYCmY1Nsw2SY9T1lZ4bkL7eC8swwRf6pQx+BBGJ6e1KR2el4 aG22bgfoZUJTyd3S1irtOFSyDOL3CNA= X-Google-Smtp-Source: AHgI3IYJjaNc7rmUJCz4ILQs70uCW/b0FWHRH4ApE1YffsOrASKety6VIqwrOO9nZp5E0Ab4X3musw== X-Received: by 2002:a17:902:9008:: with SMTP id a8mr971403plp.38.1549929216742; Mon, 11 Feb 2019 15:53:36 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.35 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:36 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:57 -0800 Message-Id: <20190211235258.542-28-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v3 27/28] target/arm: Enable MTE 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- target/arm/cpu.c | 10 ++++++++++ target/arm/cpu64.c | 1 + 2 files changed, 11 insertions(+) diff --git a/target/arm/cpu.c b/target/arm/cpu.c index decf95de3e..a5599ae19f 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -206,6 +206,16 @@ static void arm_cpu_reset(CPUState *s) * make no difference to the user-level emulation. */ env->cp15.tcr_el[1].raw_tcr = (3ULL << 37); + /* Enable MTE allocation tags. */ + env->cp15.hcr_el2 |= HCR_ATA; + env->cp15.scr_el3 |= SCR_ATA; + env->cp15.sctlr_el[1] |= SCTLR_ATA0; + /* Enable synchronous tag check failures. */ + env->cp15.sctlr_el[1] |= 1ull << 38; +#ifdef TARGET_AARCH64 + /* Set MTE seed to non-zero value, otherwise RandomTag fails. */ + env->cp15.rgsr_el1 = 0x123400; +#endif #else /* Reset into the highest available EL */ if (arm_feature(env, ARM_FEATURE_EL3)) { diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index 53a7d92c95..7bd761b8f5 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -352,6 +352,7 @@ static void aarch64_max_initfn(Object *obj) t = cpu->isar.id_aa64pfr1; t = FIELD_DP64(t, ID_AA64PFR1, BT, 1); + t = FIELD_DP64(t, ID_AA64PFR1, MTE, 2); cpu->isar.id_aa64pfr1 = t; t = cpu->isar.id_aa64mmfr1; From patchwork Mon Feb 11 23:52:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 1040273 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="pgI8ttDa"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 43z33l3jlKz9s4Z for ; Tue, 12 Feb 2019 11:11:31 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58429 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLfd-0002Ao-CW for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2019 19:11:29 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38721) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gtLOj-0005to-5I for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gtLOg-00053o-9p for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:54:00 -0500 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:35025) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gtLOf-0004kz-Ly for qemu-devel@nongnu.org; Mon, 11 Feb 2019 18:53:58 -0500 Received: by mail-pf1-x444.google.com with SMTP id z9so344965pfi.2 for ; Mon, 11 Feb 2019 15:53:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=D7zmCCEx4gtvzG1BwOiqP1rjcgbsuS/cyN2XMLs4c+Y=; b=pgI8ttDajKS8JdLT5zP8lwNM99faP9uZ1tmJloLqdevbf17VZribCRNhvQEzHvSUrK FXIkhg5A7/eyj6+Vk7qZ/YvcUx/hwEEFkD6Du1re4JjZWNh2VaeQf/2O1IzZp+OCNMcn wNyo6AKgdBMyd8CQmzzMc4IMzxuHGFtaIXBaYEek94et2Y18yNKwfTH59AdMehqQ3s/L LnhysVhxbYEff0elORLV56DF4+33hdNvKlbzdJa8BV6wK7GoDprNctp9zcQo8nSOk100 idDVhTgCdjqf9tAAC/eszmIGnEDdfrEb47mY4YYypqnJtOh3peU6E3BviII3U8yCwMhL AnNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=D7zmCCEx4gtvzG1BwOiqP1rjcgbsuS/cyN2XMLs4c+Y=; b=qGTwkP8vspnDXfKLuW9asqQFKvmZF5MZZoUvFNQ3nTtEugaSY9eT3dKSPDdMoktiEh lKiijdDwh20ouZ2pglTNUUh/NM4xVbfk/PGbe15KfgPbCMOr+6MzdwQqNgw/AzR7s31r wbqs+SSMapjB/rV2dVeY11YIHqStErBKTN5d+Ncz1ekaI9ryrb6tItfaEMsr+0ggTMnj r1dK58PPk5wCCamOvaRSh/m4yKM7OQVeXlXauHWoIuuD6W+SiPMoL3brq/Cflj4tWM7j ms6Ys7CiyR+X7VCvUtuygPBVlvKwnWa5Tv3kSvUK3ngblhBFiHvVE0MoXH5tsHfAw2Xa LxWQ== X-Gm-Message-State: AHQUAuaC8bC6q8gx9P/3T8xZnDG8dckx/cqXN3LnveeN02HkwxXzzKfe tUMCT759Y/uFc/BHNnwFNee+Ny9woFw= X-Google-Smtp-Source: AHgI3IaOGFAwPxZP+HikwoWg69Dyakm6rieiC0cquW3DV4Gi8hjACPOV/8ihZkTBeYgE5CEgUTOuLg== X-Received: by 2002:a63:5402:: with SMTP id i2mr805772pgb.79.1549929218052; Mon, 11 Feb 2019 15:53:38 -0800 (PST) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id c4sm11861031pgq.85.2019.02.11.15.53.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Feb 2019 15:53:37 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 11 Feb 2019 15:52:58 -0800 Message-Id: <20190211235258.542-29-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190211235258.542-1-richard.henderson@linaro.org> References: <20190211235258.542-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::444 Subject: [Qemu-devel] [PATCH v3 28/28] tests/tcg/aarch64: Add mte smoke tests 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- tests/tcg/aarch64/mte-1.c | 27 +++++++++++++++++++++ tests/tcg/aarch64/mte-2.c | 39 +++++++++++++++++++++++++++++++ tests/tcg/aarch64/Makefile.target | 4 ++++ 3 files changed, 70 insertions(+) create mode 100644 tests/tcg/aarch64/mte-1.c create mode 100644 tests/tcg/aarch64/mte-2.c diff --git a/tests/tcg/aarch64/mte-1.c b/tests/tcg/aarch64/mte-1.c new file mode 100644 index 0000000000..18bfb1120f --- /dev/null +++ b/tests/tcg/aarch64/mte-1.c @@ -0,0 +1,27 @@ +/* + * Memory tagging, basic pass cases. + */ + +#include + +asm(".arch armv8.5-a+memtag"); + +int data[16 / sizeof(int)] __attribute__((aligned(16))); + +int main(int ac, char **av) +{ + int *p0 = data; + int *p1, *p2; + long c; + + asm("irg %0,%1,%2" : "=r"(p1) : "r"(p0), "r"(1)); + assert(p1 != p0); + asm("subp %0,%1,%2" : "=r"(c) : "r"(p0), "r"(p1)); + assert(c == 0); + + asm("stg %0, [%0]" : : "r"(p1)); + asm("ldg %0, [%1]" : "=r"(p2) : "r"(p0), "0"(p0)); + assert(p1 == p2); + + return 0; +} diff --git a/tests/tcg/aarch64/mte-2.c b/tests/tcg/aarch64/mte-2.c new file mode 100644 index 0000000000..2991b7df69 --- /dev/null +++ b/tests/tcg/aarch64/mte-2.c @@ -0,0 +1,39 @@ +/* + * Memory tagging, basic fail cases. + */ + +#include +#include +#include + +asm(".arch armv8.5-a+memtag"); + +int data[16 / sizeof(int)] __attribute__((aligned(16))); + +void pass(int sig) +{ + exit(0); +} + +int main(int ac, char **av) +{ + int *p0 = data; + int *p1, *p2; + long excl = 1; + + /* Create two differently tagged pointers. */ + asm("irg %0,%1,%2" : "=r"(p1) : "r"(p0), "r"(excl)); + asm("gmi %0,%1,%0" : "+r"(excl) : "r" (p1)); + assert(excl != 1); + asm("irg %0,%1,%2" : "=r"(p2) : "r"(p0), "r"(excl)); + assert(p1 != p2); + + /* Store the tag from the first pointer. */ + asm("stg %0, [%0]" : : "r"(p1)); + + *p1 = 0; + signal(SIGSEGV, pass); + *p2 = 0; + + assert(0); +} diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target index 55420aeea6..614dfcd14d 100644 --- a/tests/tcg/aarch64/Makefile.target +++ b/tests/tcg/aarch64/Makefile.target @@ -22,4 +22,8 @@ AARCH64_TESTS += bti-1 bti-1: LDFLAGS += -nostartfiles -nodefaultlibs -nostdlib run-bti-1: QEMU += -cpu max,x-guarded-pages=on +AARCH64_TESTS += mte-1 mte-2 +mte-%: CFLAGS += -O -g +run-mte-%: QEMU += -cpu max,x-tagged-pages=on + TESTS:=$(AARCH64_TESTS)