From patchwork Mon Jan 11 23:57:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 360687 Delivered-To: patch@linaro.org Received: by 2002:a02:85a7:0:0:0:0:0 with SMTP id d36csp3290838jai; Mon, 11 Jan 2021 15:58:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJzaBriC+6PaJifSzgk7IUSQteFsqapaQtp+DgpcOiW34yM+gtrqNtwMCisfLlyDW7NPjEh6 X-Received: by 2002:a5b:482:: with SMTP id n2mr3003042ybp.25.1610409508101; Mon, 11 Jan 2021 15:58:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610409508; cv=none; d=google.com; s=arc-20160816; b=tG7OXGYqDh8Fb7ujEgwSIchTlwgH81gG9sYeGU+L6DOuPamQ/JClIIDZc9cAtJqtfv ifWlRUDv8F2b/3P5OC68rh9ShCNdZ1p9jqf2DmmTrpaPSr8f6e676aOAwC0+d+u934vt +SYbZowlqv/evwclczPt7i6125TPPAFxaQ2F1ywzBujZMdGejGEngJ7tTRpdjzQryoHo La9mpsBaqCCSBfBi17EWTR/rffgp7NiYASXehRWZppvVPc9UAm7dCPZXlOVkPmi+FOvU Qnqs/50fr1AUfb+lsjFjFEdkzXzK+3hx4ZSPPrEx3JwWJRPpthD8Kk3ciWFflU5Sg7Eu Ln/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=UMumzk4fm+ReubqkvThPEU9TX17+RjW08bNhr8jJ4Ok=; b=ZASOWgRCzkJSvr7xP5gR00r1nIHKCGTqiLt77jQ8QsuqY1N/iOmYqAhxlISp1/2PTs n5FCBxeNWR4H5zy8FW8EVd9cC5vn11sXNn3dFXMv6eQeHCQQVAVuJ4sKOafeXnxKpENt qci0jrUAUHYHsSyRx6gm6J2cLo1kIY8p+o3BKCCX1nrM0/1QBlHKFg9gSTL7iWLPHhbv 1BKFNXI+2rD51pa6a2SB/PeHFJhC4zLAeKv6g2qm4x7k3IMdPH52DbCG9Lr9Oco0raoa wxIRLgg/nnx9ZsvsIJmVj+swPEgUG32aelxEm8OF+wWgiz99qBy/JbNmR2QzY3FHsXng TD+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=Z6nuiMud; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id h16si1135486ybm.143.2021.01.11.15.58.28 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Jan 2021 15:58:28 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=Z6nuiMud; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:52084 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kz74t-0005xU-HC for patch@linaro.org; Mon, 11 Jan 2021 18:58:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:33758) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kz74I-0005Sj-Ui for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:52 -0500 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]:41866) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kz74F-0003VE-48 for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:50 -0500 Received: by mail-pf1-x434.google.com with SMTP id q20so258408pfu.8 for ; Mon, 11 Jan 2021 15:57:46 -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 :mime-version:content-transfer-encoding; bh=UMumzk4fm+ReubqkvThPEU9TX17+RjW08bNhr8jJ4Ok=; b=Z6nuiMud4Et4m4CNVFkYDEcvv5wp7NPEFXi0gyAdzzBVeQJGh/GzpZE+8QLcJi20oF CLCSl5XOpy7NQiO8neA+kiTXLnDCB4s8pH/fmyghYQKtuRQvs6fS+MI+oq3YUR6VlEGb mieW0FPOGrtwsJhNzwThadP1yCgaynCH6ZjRAHYB6gHuJDaKcyBWdaHzdlNJ6idjS87Z k+o3tli6j12Jsnsi9F8aeXdQ1+k259uvOnYHTzsyFXslDDBo7fhHgMFNhq1uFjo9gT4U BIMHaps19wtvDmEls9MH1SlACIZzp/CcEQ9HndR7fMOPBlwgCo74Mzbhg206hy+qmx3p P5bA== 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:mime-version:content-transfer-encoding; bh=UMumzk4fm+ReubqkvThPEU9TX17+RjW08bNhr8jJ4Ok=; b=JinEEUhYYDUGAiJuS/hUbhKyNBVsGTZ8Y8C6Zth3wWTlRaJEEJkn34TFjHH2tUptwS MLT7MWMgTuZgeqwHYKOhDGp0QSVxiGUvPzkQig0CZEgA4QKIuVfvPhXjckid/KtNYyfu l7xGu1AFrXa+xw5ygHH5gfenKi9k5bpRyXHMN2aL6woBA1gYbHZemHNmq/QilExDpBBf Usb4wuyB9LwR7AnsdfLzticrpK3pInKlpxoIXY8IZrrS/YM73LDVmak/8Wgu2tdYIbqz 7XIxqWLlm0zBhFb4HS2h4y0gWGsw1C5s2VhbT9gjk21y7VqAYwkJUm3Kn9Wkqaca5sba px2w== X-Gm-Message-State: AOAM531j7q6gAPcgy8YSOtwYuNuAVJjRBihIQNh0xFqorHIfViYwNcVC UvyTqj/0D/ZmFHuAy2QrPMSGufjqIjBD2Q== X-Received: by 2002:a63:d041:: with SMTP id s1mr1846099pgi.249.1610409465473; Mon, 11 Jan 2021 15:57:45 -0800 (PST) Received: from localhost.localdomain (rrcs-173-197-107-21.west.biz.rr.com. [173.197.107.21]) by smtp.gmail.com with ESMTPSA id s67sm872220pgb.60.2021.01.11.15.57.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Jan 2021 15:57:44 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v7 1/3] target/arm: Implement an IMPDEF pauth algorithm Date: Mon, 11 Jan 2021 13:57:38 -1000 Message-Id: <20210111235740.462469-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210111235740.462469-1-richard.henderson@linaro.org> References: <20210111235740.462469-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x434.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Without hardware acceleration, a cryptographically strong algorithm is too expensive for pauth_computepac. Even with hardware accel, we are not currently expecting to link the linux-user binaries to any crypto libraries, and doing so would generally make the --static build fail. So choose XXH64 as a reasonably quick and decent hash. Tested-by: Mark Rutland Signed-off-by: Richard Henderson --- v2: Move the XXH64 bits to xxhash.h (ajb). Create isar_feature_aa64_pauth_arch and fixup a comment in isar_feature_aa64_pauth that no longer applies. v6: Introduce qemu_xxhash64_4 (pmm). --- include/qemu/xxhash.h | 98 +++++++++++++++++++++++++++++++++++++++ target/arm/cpu.h | 15 ++++-- target/arm/pauth_helper.c | 27 +++++++++-- 3 files changed, 131 insertions(+), 9 deletions(-) -- 2.25.1 diff --git a/include/qemu/xxhash.h b/include/qemu/xxhash.h index 076f1f6054..c2dcccadbf 100644 --- a/include/qemu/xxhash.h +++ b/include/qemu/xxhash.h @@ -119,4 +119,102 @@ static inline uint32_t qemu_xxhash6(uint64_t ab, uint64_t cd, uint32_t e, return qemu_xxhash7(ab, cd, e, f, 0); } +/* + * Component parts of the XXH64 algorithm from + * https://github.com/Cyan4973/xxHash/blob/v0.8.0/xxhash.h + * + * The complete algorithm looks like + * + * i = 0; + * if (len >= 32) { + * v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + * v2 = seed + XXH_PRIME64_2; + * v3 = seed + 0; + * v4 = seed - XXH_PRIME64_1; + * do { + * v1 = XXH64_round(v1, get64bits(input + i)); + * v2 = XXH64_round(v2, get64bits(input + i + 8)); + * v3 = XXH64_round(v3, get64bits(input + i + 16)); + * v4 = XXH64_round(v4, get64bits(input + i + 24)); + * } while ((i += 32) <= len); + * h64 = XXH64_mergerounds(v1, v2, v3, v4); + * } else { + * h64 = seed + XXH_PRIME64_5; + * } + * h64 += len; + * + * for (; i + 8 <= len; i += 8) { + * h64 ^= XXH64_round(0, get64bits(input + i)); + * h64 = rol64(h64, 27) * XXH_PRIME64_1 + XXH_PRIME64_4; + * } + * for (; i + 4 <= len; i += 4) { + * h64 ^= get32bits(input + i) * PRIME64_1; + * h64 = rol64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + * } + * for (; i < len; i += 1) { + * h64 ^= get8bits(input + i) * XXH_PRIME64_5; + * h64 = rol64(h64, 11) * XXH_PRIME64_1; + * } + * + * return XXH64_avalanche(h64) + * + * Exposing the pieces instead allows for simplified usage when + * the length is a known constant and the inputs are in registers. + */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL +#define XXH_PRIME64_3 0x165667B19E3779F9ULL +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL + +static inline uint64_t XXH64_round(uint64_t acc, uint64_t input) +{ + return rol64(acc + input * XXH_PRIME64_2, 31) * XXH_PRIME64_1; +} + +static inline uint64_t XXH64_mergeround(uint64_t acc, uint64_t val) +{ + return (acc ^ XXH64_round(0, val)) * XXH_PRIME64_1 + XXH_PRIME64_4; +} + +static inline uint64_t XXH64_mergerounds(uint64_t v1, uint64_t v2, + uint64_t v3, uint64_t v4) +{ + uint64_t h64; + + h64 = rol64(v1, 1) + rol64(v2, 7) + rol64(v3, 12) + rol64(v4, 18); + h64 = XXH64_mergeround(h64, v1); + h64 = XXH64_mergeround(h64, v2); + h64 = XXH64_mergeround(h64, v3); + h64 = XXH64_mergeround(h64, v4); + + return h64; +} + +static inline uint64_t XXH64_avalanche(uint64_t h64) +{ + h64 ^= h64 >> 33; + h64 *= XXH_PRIME64_2; + h64 ^= h64 >> 29; + h64 *= XXH_PRIME64_3; + h64 ^= h64 >> 32; + return h64; +} + +static inline uint64_t qemu_xxhash64_4(uint64_t a, uint64_t b, + uint64_t c, uint64_t d) +{ + uint64_t v1 = QEMU_XXHASH_SEED + XXH_PRIME64_1 + XXH_PRIME64_2; + uint64_t v2 = QEMU_XXHASH_SEED + XXH_PRIME64_2; + uint64_t v3 = QEMU_XXHASH_SEED + 0; + uint64_t v4 = QEMU_XXHASH_SEED - XXH_PRIME64_1; + + v1 = XXH64_round(v1, a); + v2 = XXH64_round(v2, b); + v3 = XXH64_round(v3, c); + v4 = XXH64_round(v4, d); + + return XXH64_avalanche(XXH64_mergerounds(v1, v2, v3, v4)); +} + #endif /* QEMU_XXHASH_H */ diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 7e6c881a7e..70e9618d13 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -3852,10 +3852,8 @@ static inline bool isar_feature_aa64_fcma(const ARMISARegisters *id) static inline bool isar_feature_aa64_pauth(const ARMISARegisters *id) { /* - * Note that while QEMU will only implement the architected algorithm - * QARMA, and thus APA+GPA, the host cpu for kvm may use implementation - * defined algorithms, and thus API+GPI, and this predicate controls - * migration of the 128-bit keys. + * Return true if any form of pauth is enabled, as this + * predicate controls migration of the 128-bit keys. */ return (id->id_aa64isar1 & (FIELD_DP64(0, ID_AA64ISAR1, APA, 0xf) | @@ -3864,6 +3862,15 @@ static inline bool isar_feature_aa64_pauth(const ARMISARegisters *id) FIELD_DP64(0, ID_AA64ISAR1, GPI, 0xf))) != 0; } +static inline bool isar_feature_aa64_pauth_arch(const ARMISARegisters *id) +{ + /* + * Return true if pauth is enabled with the architected QARMA algorithm. + * QEMU will always set APA+GPA to the same value. + */ + return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, APA) != 0; +} + static inline bool isar_feature_aa64_sb(const ARMISARegisters *id) { return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SB) != 0; diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c index 564c48faa6..cd6df18150 100644 --- a/target/arm/pauth_helper.c +++ b/target/arm/pauth_helper.c @@ -24,6 +24,7 @@ #include "exec/cpu_ldst.h" #include "exec/helper-proto.h" #include "tcg/tcg-gvec-desc.h" +#include "qemu/xxhash.h" static uint64_t pac_cell_shuffle(uint64_t i) @@ -207,8 +208,8 @@ static uint64_t tweak_inv_shuffle(uint64_t i) return o; } -static uint64_t pauth_computepac(uint64_t data, uint64_t modifier, - ARMPACKey key) +static uint64_t pauth_computepac_architected(uint64_t data, uint64_t modifier, + ARMPACKey key) { static const uint64_t RC[5] = { 0x0000000000000000ull, @@ -272,6 +273,22 @@ static uint64_t pauth_computepac(uint64_t data, uint64_t modifier, return workingval; } +static uint64_t pauth_computepac_impdef(uint64_t data, uint64_t modifier, + ARMPACKey key) +{ + return qemu_xxhash64_4(data, modifier, key.lo, key.hi); +} + +static uint64_t pauth_computepac(CPUARMState *env, uint64_t data, + uint64_t modifier, ARMPACKey key) +{ + if (cpu_isar_feature(aa64_pauth_arch, env_archcpu(env))) { + return pauth_computepac_architected(data, modifier, key); + } else { + return pauth_computepac_impdef(data, modifier, key); + } +} + static uint64_t pauth_addpac(CPUARMState *env, uint64_t ptr, uint64_t modifier, ARMPACKey *key, bool data) { @@ -292,7 +309,7 @@ static uint64_t pauth_addpac(CPUARMState *env, uint64_t ptr, uint64_t modifier, bot_bit = 64 - param.tsz; ext_ptr = deposit64(ptr, bot_bit, top_bit - bot_bit, ext); - pac = pauth_computepac(ext_ptr, modifier, *key); + pac = pauth_computepac(env, ext_ptr, modifier, *key); /* * Check if the ptr has good extension bits and corrupt the @@ -341,7 +358,7 @@ static uint64_t pauth_auth(CPUARMState *env, uint64_t ptr, uint64_t modifier, uint64_t pac, orig_ptr, test; orig_ptr = pauth_original_ptr(ptr, param); - pac = pauth_computepac(orig_ptr, modifier, *key); + pac = pauth_computepac(env, orig_ptr, modifier, *key); bot_bit = 64 - param.tsz; top_bit = 64 - 8 * param.tbi; @@ -442,7 +459,7 @@ uint64_t HELPER(pacga)(CPUARMState *env, uint64_t x, uint64_t y) uint64_t pac; pauth_check_trap(env, arm_current_el(env), GETPC()); - pac = pauth_computepac(x, y, env->keys.apga); + pac = pauth_computepac(env, x, y, env->keys.apga); return pac & 0xffffffff00000000ull; } From patchwork Mon Jan 11 23:57:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 360740 Delivered-To: patch@linaro.org Received: by 2002:a02:85a7:0:0:0:0:0 with SMTP id d36csp3296604jai; Mon, 11 Jan 2021 16:07:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJxkK9F/67XbHAYRmxQNcDQ1fc/Mbtx1olDq4xlWzDhS9/ZQ2aVNWFoC1dF2kI832OCscY4D X-Received: by 2002:a25:23d7:: with SMTP id j206mr3212222ybj.243.1610410048212; Mon, 11 Jan 2021 16:07:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610410048; cv=none; d=google.com; s=arc-20160816; b=GZ7Zhjq6QDcTGrp5uOOt3o1/Sn441kSrvGKew5p22+j76lZ7PXYaOL9kS3uuDMqE0q KxJW00qT5ZaqRqcfFCkBFplONf6uZlAx0RLTzHydULdzSXGdNsb9zyeocN8rmnIngs70 6LMFm8nAg450ap5pxHZ2LYSebgqa8AOGbP4d/+hkfdS7r88cSXpr3MIP6XwNLbhLpbp7 Ojzzx/BpvVM1P0M21oKvE7qT0vxaMLXPkzc1yMLgVi1sZDHrhmVJRHpxVI9f7kkQewZs V8enbfxJK+Pu6H7hr8bAyYC4SATngHHpX8LJ6pX/lnqr8R5enl00yKrJgamYQEPBcJ9k e1DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=P/1CnPUCsHl89eN9FhdQHAGizSgbDLia/I3HSPXWjL0=; b=tQcsKXy6Uwm61/bs00vcx7LUAmtEID1gaPvtcKbAMgzLdw0xw7ExCzerXKWL+7Y6lT ygovdfwZIt+JkmdtjUbTIcriTdkPew41dDqrS/3RUb65511oIM16GGqJVnWEXLf//Co3 rWjaVcHo9fVMZQe4qK/0yLqiWzLkLEWhiMwcz33MJ+rZDIZ34zoGdxA783uteKG7djX3 x1qTG7wgQvgFmL54AnjnrFIrnm3EARxv2cGnm9FAfOu5PNWKIydlqGqg9xpdqMdqKkce OXbVRKUAdJPDz0uMcNk1mZKfVbxogyMbn7mIAg9D8X24KxOBiXfz7hkk1h/ZxrqWkqJj lBxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=lJEDjFqK; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id y14si1113185ybb.398.2021.01.11.16.07.28 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Jan 2021 16:07:28 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=lJEDjFqK; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:44370 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kz7Db-0006J6-Mx for patch@linaro.org; Mon, 11 Jan 2021 19:07:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:33802) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kz74M-0005TT-BZ for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:55 -0500 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]:43481) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kz74H-0003Vg-Ex for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:52 -0500 Received: by mail-pf1-x42d.google.com with SMTP id c12so252268pfo.10 for ; Mon, 11 Jan 2021 15:57:49 -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 :mime-version:content-transfer-encoding; bh=P/1CnPUCsHl89eN9FhdQHAGizSgbDLia/I3HSPXWjL0=; b=lJEDjFqKAiRNmQyNQm6Y7lLIclTnJ267VMey7EgI7+BQnV2LX8Q+kzIMXPwKL1VPGL L5TvQ07ij92Tx2BxkrBg5YGl1hMBffss/5IQQjkdb9jw+6o22JgzD9AD71n2XX2XQn/W rogZlgiF0SiSwB9aU09sRMkKZrWAwVBzqWi5ycnyhzvLTrCeJ48+C+TZSmjWNbdv9sji 1nlrwJOxI4N9WwFoUMTs6fdd5MbQCS0ddW76tCd2SwMed83kL4YGdXSIIzPdxfU2zqUC Sb/S5A232aTbsMTZSpzuvx1xdqo3VOaYiDXxD79DUEPWboJzA1XJMa7lUAP1e+fOS8VQ NiQA== 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:mime-version:content-transfer-encoding; bh=P/1CnPUCsHl89eN9FhdQHAGizSgbDLia/I3HSPXWjL0=; b=hg9/0IDw0K9Adly7bxNV4ACPSSZfV86jW2Obp2cufmqziHn9+XoCDAJqaLDqLogXS6 eQsHc9FrADbt18GyylVilZvxUALBk+2KWv1yTqU7RA1EUQH8vyf0aylNM7d2Y+tgLioh hh7Hz1IKjqgl0oqk4mn0PB1xEfMag32LfSZLkOWFUFRN7oZt9gZ9VXYErWKJ+GeOAdzj M3w5QxcHIJCBma9tQmWCjEoeUH5h2wFgDXvWy0Avb74a7zGbjc6G4a/9H8AXoaKt/BZj 4EoPVCbLwr9yu3JaUsRmrPiiPpuI5ek8yzvFJ33pcjluef9FtSpnCl5awgSTRfP3dLs8 b3tg== X-Gm-Message-State: AOAM532zim2yX9MvX6dkGMnbUB/A6RhZDcJVhEFgCZC6ZaI5B009/4To S6pDPi/mg1hXCuOMiu5hGqn0tbv0F3r0bQ== X-Received: by 2002:a65:534c:: with SMTP id w12mr1853033pgr.179.1610409467459; Mon, 11 Jan 2021 15:57:47 -0800 (PST) Received: from localhost.localdomain (rrcs-173-197-107-21.west.biz.rr.com. [173.197.107.21]) by smtp.gmail.com with ESMTPSA id s67sm872220pgb.60.2021.01.11.15.57.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Jan 2021 15:57:46 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v7 2/3] target/arm: Add cpu properties to control pauth Date: Mon, 11 Jan 2021 13:57:39 -1000 Message-Id: <20210111235740.462469-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210111235740.462469-1-richard.henderson@linaro.org> References: <20210111235740.462469-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::42d; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , peter.maydell@linaro.org, Andrew Jones , qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" The crypto overhead of emulating pauth can be significant for some workloads. Add two boolean properties that allows the feature to be turned off, on with the architected algorithm, or on with an implementation defined algorithm. We need two intermediate booleans to control the state while parsing properties lest we clobber ID_AA64ISAR1 into an invalid intermediate state. Tested-by: Mark Rutland Reviewed-by: Andrew Jones Signed-off-by: Richard Henderson --- v2: Use boolean properties instead of an enum (drjones). v3: Add tests (drjones). v6: Add documentation (pmm). --- docs/system/arm/cpu-features.rst | 21 +++++++++++++++++ target/arm/cpu.h | 10 ++++++++ target/arm/cpu.c | 13 +++++++++++ target/arm/cpu64.c | 40 ++++++++++++++++++++++++++++---- target/arm/monitor.c | 1 + tests/qtest/arm-cpu-features.c | 13 +++++++++++ 6 files changed, 94 insertions(+), 4 deletions(-) -- 2.25.1 diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst index 35196a6b75..70e0e4ef78 100644 --- a/docs/system/arm/cpu-features.rst +++ b/docs/system/arm/cpu-features.rst @@ -211,6 +211,27 @@ the list of KVM VCPU features and their descriptions. influence the guest scheduler behavior and/or be exposed to the guest userspace. +TCG VCPU Features +================= + +TCG VCPU features are CPU features that are specific to TCG. +Below is the list of TCG VCPU features and their descriptions. + + pauth Enable or disable `FEAT_Pauth`, pointer + authentication. By default, the feature is + enabled with `-cpu max`. + + pauth-impdef When `FEAT_Pauth` is enabled, either the + *impdef* (Implementation Definined) algorithm + is enabled or the *architected* QARMA algorithm + is enabled. By default the impdef algorithm + is disabled, and QARMA is enabled. + + The architected QARMA algorithm has good + cryptographic properties, but can be quite slow + to emulate. The impdef algorithm is + non-cryptographic but significantly faster. + SVE CPU Properties ================== diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 70e9618d13..06f5169f45 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -197,9 +197,11 @@ typedef struct { #ifdef TARGET_AARCH64 # define ARM_MAX_VQ 16 void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp); +void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp); #else # define ARM_MAX_VQ 1 static inline void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp) { } +static inline void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp) { } #endif typedef struct ARMVectorReg { @@ -947,6 +949,14 @@ struct ARMCPU { uint64_t reset_cbar; uint32_t reset_auxcr; bool reset_hivecs; + + /* + * Intermediate values used during property parsing. + * Once finalized, the values should be read from ID_AA64ISAR1. + */ + bool prop_pauth; + bool prop_pauth_impdef; + /* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */ uint32_t dcz_blocksize; uint64_t rvbar; diff --git a/target/arm/cpu.c b/target/arm/cpu.c index 8387e94b94..be18df5464 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -1320,6 +1320,19 @@ void arm_cpu_finalize_features(ARMCPU *cpu, Error **errp) error_propagate(errp, local_err); return; } + + /* + * KVM does not support modifications to this feature. + * We have not registered the cpu properties when KVM + * is in use, so the user will not be able to set them. + */ + if (!kvm_enabled()) { + arm_cpu_pauth_finalize(cpu, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return; + } + } } if (kvm_enabled()) { diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index 7cf9fc4bc6..d9feaa9cdb 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -28,6 +28,8 @@ #include "sysemu/kvm.h" #include "kvm_arm.h" #include "qapi/visitor.h" +#include "hw/qdev-properties.h" + #ifndef CONFIG_USER_ONLY static uint64_t a57_a53_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri) @@ -572,6 +574,36 @@ void aarch64_add_sve_properties(Object *obj) } } +void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp) +{ + int arch_val = 0, impdef_val = 0; + uint64_t t; + + /* TODO: Handle HaveEnhancedPAC, HaveEnhancedPAC2, HaveFPAC. */ + if (cpu->prop_pauth) { + if (cpu->prop_pauth_impdef) { + impdef_val = 1; + } else { + arch_val = 1; + } + } else if (cpu->prop_pauth_impdef) { + error_setg(errp, "cannot enable pauth-impdef without pauth"); + error_append_hint(errp, "Add pauth=on to the CPU property list.\n"); + } + + t = cpu->isar.id_aa64isar1; + t = FIELD_DP64(t, ID_AA64ISAR1, APA, arch_val); + t = FIELD_DP64(t, ID_AA64ISAR1, GPA, arch_val); + t = FIELD_DP64(t, ID_AA64ISAR1, API, impdef_val); + t = FIELD_DP64(t, ID_AA64ISAR1, GPI, impdef_val); + cpu->isar.id_aa64isar1 = t; +} + +static Property arm_cpu_pauth_property = + DEFINE_PROP_BOOL("pauth", ARMCPU, prop_pauth, true); +static Property arm_cpu_pauth_impdef_property = + DEFINE_PROP_BOOL("pauth-impdef", ARMCPU, prop_pauth_impdef, false); + /* -cpu max: if KVM is enabled, like -cpu host (best possible with this host); * otherwise, a CPU with as many features enabled as our emulation supports. * The version of '-cpu max' for qemu-system-arm is defined in cpu.c; @@ -627,10 +659,6 @@ static void aarch64_max_initfn(Object *obj) t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2); t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1); t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1); - t = FIELD_DP64(t, ID_AA64ISAR1, APA, 1); /* PAuth, architected only */ - t = FIELD_DP64(t, ID_AA64ISAR1, API, 0); - t = FIELD_DP64(t, ID_AA64ISAR1, GPA, 1); - t = FIELD_DP64(t, ID_AA64ISAR1, GPI, 0); t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1); t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1); t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1); @@ -720,6 +748,10 @@ static void aarch64_max_initfn(Object *obj) cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */ cpu->dcz_blocksize = 7; /* 512 bytes */ #endif + + /* Default to PAUTH on, with the architected algorithm. */ + qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_property); + qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_impdef_property); } aarch64_add_sve_properties(obj); diff --git a/target/arm/monitor.c b/target/arm/monitor.c index 198b14e95e..80c64fa355 100644 --- a/target/arm/monitor.c +++ b/target/arm/monitor.c @@ -95,6 +95,7 @@ static const char *cpu_model_advertised_features[] = { "sve640", "sve768", "sve896", "sve1024", "sve1152", "sve1280", "sve1408", "sve1536", "sve1664", "sve1792", "sve1920", "sve2048", "kvm-no-adjvtime", "kvm-steal-time", + "pauth", "pauth-impdef", NULL }; diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c index bc681a95d5..8252b85bb8 100644 --- a/tests/qtest/arm-cpu-features.c +++ b/tests/qtest/arm-cpu-features.c @@ -427,6 +427,18 @@ static void sve_tests_sve_off_kvm(const void *data) qtest_quit(qts); } +static void pauth_tests_default(QTestState *qts, const char *cpu_type) +{ + assert_has_feature_enabled(qts, cpu_type, "pauth"); + assert_has_feature_disabled(qts, cpu_type, "pauth-impdef"); + assert_set_feature(qts, cpu_type, "pauth", false); + assert_set_feature(qts, cpu_type, "pauth", true); + assert_set_feature(qts, cpu_type, "pauth-impdef", true); + assert_set_feature(qts, cpu_type, "pauth-impdef", false); + assert_error(qts, cpu_type, "cannot enable pauth-impdef without pauth", + "{ 'pauth': false, 'pauth-impdef': true }"); +} + static void test_query_cpu_model_expansion(const void *data) { QTestState *qts; @@ -462,6 +474,7 @@ static void test_query_cpu_model_expansion(const void *data) assert_has_feature_enabled(qts, "cortex-a57", "aarch64"); sve_tests_default(qts, "max"); + pauth_tests_default(qts, "max"); /* Test that features that depend on KVM generate errors without. */ assert_error(qts, "max", From patchwork Mon Jan 11 23:57:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 360692 Delivered-To: patch@linaro.org Received: by 2002:a02:85a7:0:0:0:0:0 with SMTP id d36csp3292849jai; Mon, 11 Jan 2021 16:01:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJyofX0yIHNrqBjI2oBIfrQKjkhFHQqsOGSKBBIKCF3v6W6toGHr7U81Neo+aXpBUgJTOeiW X-Received: by 2002:a25:6902:: with SMTP id e2mr3178143ybc.97.1610409691340; Mon, 11 Jan 2021 16:01:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610409691; cv=none; d=google.com; s=arc-20160816; b=Q7t6gr9NdgwoyKTobXHRsTHIKpo1P43PrsIn1Pv/rjF4LcgTNWwEkVQSZmHxwYU2z7 sp2HhgzULQCoyyhlGT5k+WK14dxMokMbhTeAuyeXR8D6VC6yMnZa51AUQmAhV3R7L5Dv qR74Qc18+XQ+mvO5K73LTqzHwPyBQTTr0WD66ZkiFXWYw9bdvCvbna6QDPI2wwxDRk73 k5i1BVaw9JN6UwNh47sVSOboJkh3uSb3n4wUlRkMSBAD/knWB/tOfa7i70HCtqpIOed6 qHQT738H+EOUROpaqZ1csvPajqTlV74qbK2daCVyNstUc3YmFYYfUO6KbpqauLXMCLVY 56/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=uSqBlmmaV2nVJPAfpMvtZ9TuNPcVPPBGEyURqCr9eR8=; b=ukKYZUvbcLRkqJtHG4RZAdAH3K3dxVwWt5gD9CrTkZQW0QzdZBFE+IbAioN2f/kUjm dLWZcs5cj6rZRvAfHhmaQNTMmY+ogopP3OXbE3+hVRm31bm21vjL7lRitUcl/oKfRhHV m4QANMo+rIRDZgo9tWeNcsIKJXBmdVg800nLA5gcVaCx5dufashdJ6x0N/IeYJ0Xp+SO rOIzDddUnLnypyDmsIIj7Hlr1FGkJQAzhfA22okphmi7IYjuD92WHE/QLIu5zwKyGhSe zfvr2UZBhpuhZ67cICcNSCeRPShSsGN0owL87jY0vBwBRaEy5f55CeMYdIHh3EFARyoE Ph1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=CRTRbErT; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id y16si1224468ybr.22.2021.01.11.16.01.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Jan 2021 16:01:31 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=CRTRbErT; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:60070 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kz77q-0000ts-Qr for patch@linaro.org; Mon, 11 Jan 2021 19:01:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:33808) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kz74M-0005Tj-NN for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:55 -0500 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]:39654) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kz74K-0003W3-3H for qemu-devel@nongnu.org; Mon, 11 Jan 2021 18:57:54 -0500 Received: by mail-pg1-x532.google.com with SMTP id 30so218665pgr.6 for ; Mon, 11 Jan 2021 15:57:51 -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 :mime-version:content-transfer-encoding; bh=uSqBlmmaV2nVJPAfpMvtZ9TuNPcVPPBGEyURqCr9eR8=; b=CRTRbErTNODBug8HUhEufRXM0LFFPOgyd/FFOsAp7DwXzHbzeAzvFbUQl617faWuVZ vCXGHbzXUYk8qGLXh49EdFtGADBs70lUXjCI4PrMvSBqa79QLzH5+4YsubK0ywK+g3Rg /xJf43mRWig5c+nrC1j0GZlFPiVNgwAfjquXn3Q2qOytJWZLbbE9DQYiRkqoSI0bOsUR KlffeN9RokTJOV/94dPahkIBOVugEIPePSYzA0eXfTBDRnHf7ZMqim/ha6n+bFPXjkOn zKflrdLKSJNJtnnVYka3iwbHueQrDkZrHgI4QvEjdMlv9cLWPLwotFLEnFXeX83lQdpk SBuA== 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:mime-version:content-transfer-encoding; bh=uSqBlmmaV2nVJPAfpMvtZ9TuNPcVPPBGEyURqCr9eR8=; b=Fh2tEqvbXaMaQe9NgNjM7Z+yTs4DQzelZK8T1CKP6/9uOgedrePMFGv0uPe4ovN9Pk W8/PmzZWTPEtKR7nr4Y2cAkz51ENqVGwmNITPH5mjoVwQ37xTH6U9z348khVogl3ark/ CqILt1uZxuPMcZOtNlHhN9V6LSIMZ+axIP+Q5mOjh7i+oTeYcUw62opWBPvm60L5wlxk e5Y47fO5mBp+DCOtmS/rV7wYGu/gCRoB7DLvjiXoWMWS1t80o8p7GuptaLLzY5YvdfEp X0bBuE8q1mri0l22eO2YDVm0ikp+tQdRUoOCqjIpvoIi5Lyase86y/9W+5IAtpuv2e/6 gfFA== X-Gm-Message-State: AOAM532r/OGTMeNxLsix7WHmRm9R8uECwslYOkkTFEmlpZaSyNpnlgvx uAn+90762peiM46RlL483j1A3Cb7wPUsKw== X-Received: by 2002:aa7:9706:0:b029:19d:a2c6:aeb with SMTP id a6-20020aa797060000b029019da2c60aebmr1788490pfg.36.1610409469678; Mon, 11 Jan 2021 15:57:49 -0800 (PST) Received: from localhost.localdomain (rrcs-173-197-107-21.west.biz.rr.com. [173.197.107.21]) by smtp.gmail.com with ESMTPSA id s67sm872220pgb.60.2021.01.11.15.57.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Jan 2021 15:57:49 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v7 3/3] target/arm: Use object_property_add_bool for "sve" property Date: Mon, 11 Jan 2021 13:57:40 -1000 Message-Id: <20210111235740.462469-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210111235740.462469-1-richard.henderson@linaro.org> References: <20210111235740.462469-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::532; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x532.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, Andrew Jones , qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" The interface for object_property_add_bool is simpler, making the code easier to understand. Reviewed-by: Andrew Jones Signed-off-by: Richard Henderson --- target/arm/cpu64.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) -- 2.25.1 diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index d9feaa9cdb..8e1fad00bb 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -488,6 +488,12 @@ static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name, cpu->sve_max_vq = max_vq; } +/* + * Note that cpu_arm_get/set_sve_vq cannot use the simpler + * object_property_add_bool interface because they make use + * of the contents of "name" to determine which bit on which + * to operate. + */ static void cpu_arm_get_sve_vq(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -529,26 +535,17 @@ static void cpu_arm_set_sve_vq(Object *obj, Visitor *v, const char *name, set_bit(vq - 1, cpu->sve_vq_init); } -static void cpu_arm_get_sve(Object *obj, Visitor *v, const char *name, - void *opaque, Error **errp) +static bool cpu_arm_get_sve(Object *obj, Error **errp) { ARMCPU *cpu = ARM_CPU(obj); - bool value = cpu_isar_feature(aa64_sve, cpu); - - visit_type_bool(v, name, &value, errp); + return cpu_isar_feature(aa64_sve, cpu); } -static void cpu_arm_set_sve(Object *obj, Visitor *v, const char *name, - void *opaque, Error **errp) +static void cpu_arm_set_sve(Object *obj, bool value, Error **errp) { ARMCPU *cpu = ARM_CPU(obj); - bool value; uint64_t t; - if (!visit_type_bool(v, name, &value, errp)) { - return; - } - if (value && kvm_enabled() && !kvm_arm_sve_supported()) { error_setg(errp, "'sve' feature not supported by KVM on this host"); return; @@ -563,8 +560,7 @@ void aarch64_add_sve_properties(Object *obj) { uint32_t vq; - object_property_add(obj, "sve", "bool", cpu_arm_get_sve, - cpu_arm_set_sve, NULL, NULL); + object_property_add_bool(obj, "sve", cpu_arm_get_sve, cpu_arm_set_sve); for (vq = 1; vq <= ARM_MAX_VQ; ++vq) { char name[8];