From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523950; cv=none; d=zohomail.com; s=zohoarc; b=fThgzq2l9jkmiIO9XhWNqik8MX+GZy9X9UoVNoesnjeqAReiEPmFH7vy27GzlBXvvtFPNL9ffoPBSCgjYb2he6w+giLCZNj4ctylvmVfxjMXRlawkyz31yR5D1+ERUKuOW4LG31sFVPDIzkTYxXtO0hV/Hnl2MS/qRPgWF2n9+U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523950; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7jM1jwUY6doQWw7cNzzrKAiwqt9SLepu9Iq35gPFd94=; b=LocfxPCjfbbksjmqMkcTECrO7Xtl8Hi87xwYpArGp0fsKhasmLUxSdhL2MRK0+DlHahPTpxSRY0ezrKw1enXZ5JzO3vuRmyJi510lfPT46PSu53DJL831ydeFUhx6rJiqfTej/Kh+9F/Qx1Z9CwWTK7yXQX2ZnATwhZI991vk04= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523950290719.8648177259771; Mon, 11 May 2026 11:25:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHT-0004i4-T3; Mon, 11 May 2026 14:23:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHO-0004gl-69 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:58 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHL-0002fH-Ks for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:56 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7dbccf6a23dso3854735a34.2 for ; Mon, 11 May 2026 11:22:53 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523772; x=1779128572; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7jM1jwUY6doQWw7cNzzrKAiwqt9SLepu9Iq35gPFd94=; b=LOpswAWheLxSQlCveCN1xCfeoWRsZuPAc3M31h9D7wF34g4blrKvDmgM3tbsZWYaLL pNU45Q07bv+VV1L9qsI/0Y4BsttBDrax5DbcKM1jdaZYIpUYrTHCNh1pBdxWqg1aLC4K mZFql4xohhKATijpPRdsfR3eDi5LdUZBGdT/kP52XwgoyQSraWXrdEFXymEMNtixYv/Z bXwa4N8ZKel+6QccFPGOAkfWGK8tXOkm6nlyieDSIdB0oCk/QgW2sHrkiohxGzrZaX0I gh5cIMgbHP6QOtPDEnl8/zX0luSoE6gZXjsBJWxzzlEA5oa11OtvMzTWG20zkECXxCGn aETQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523772; x=1779128572; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=7jM1jwUY6doQWw7cNzzrKAiwqt9SLepu9Iq35gPFd94=; b=nbuzGc9jhE3POj3QUZfHAcuiiWQAIOiSVu8WkR2dCn2ACLrHoZaNUjecEjKf6qazdg 623FpVCpgy98kxRbzQMH1jnqxyFY1ReRXliPTzmbB76ppoB280ECTDUqk3WrHq6sT7nm 4MJ1UZpk8hTjwFwMYvgM5uv41cY8vJ6YGEY9A5gygrq3dGbG2/Kqlu6FEf9Q3YOfrW8q 3dRsTkl3zXEKJlJcMymqCHh7xxMSWbxnwqjJJLQUKzD0/6UwkNuI4JixGT+pm+dIkMQT 49duiLGrYVheAE4Id4+aN74pxMnr+tTJkJJTjTb5janQBMlGLwQiJ098MKSiZDS1esld 6YZQ== X-Gm-Message-State: AOJu0Yz6c+UQiKdHPSB8SQOdRtlP+IeRHF7qgnL6V4zAny7whIk8iDxU 0h8QlEwlc5330BIYSAhbP6OsG6tQoT/w5s1g480PM/4SYMlQ6i04hOeB X-Gm-Gg: Acq92OHfUhlXvH6YQ5UVdmWa0mU+Tt3uNIBBD5v5u3i2eU0uj5Jn2jw9pSAIy2j761N lEFYvJ/0PuVCYtEY0vgoMMAvBrqzih94xUYq52wRgqMx9fXgyc8cGLSyXhvcdmHzKEJcUys25t6 CXwlXucSPQ/NCZ9TLNphvzEDe4LcW/FXz0aH/gR+FZhSaHVDsaSUZD5xHSC9Q0qN5EQJPI/2UW9 l7w4oM7OiKKXctvHud3oifAItF+SBCcoBJ+daLudJKbriK86e/vtYUUXIpKVOUsDGLIFYi/Oc8L HAugwDfZGgsEuUab4bqsgkCkeAnxlXLpxaSauiuLomft9EF5B5gs/v3Bhn+RG26EzRlwrYWXnq7 EefV+2R4MkPzDiM1nQ/kbueZGdXIxHkoHJ8ZJh95b8k4Hm9EHPzSpqxyJgM1crLF7bGNVCj19eB 3r57adhVAd7Oiv9RDQgLfGeNL5oM3gkLOrChyCuvAnTFOOiKPc96jmssagSzKe3NwXeZxgjhXB1 QI/d5uHfI1JsskdvAoZtVqFqwoTx+ZPXuv+8xg0FzNJ5dVXzaYiGvScn3dnKKE6ETzg X-Received: by 2002:a05:6830:3114:b0:7d7:e57a:bcd with SMTP id 46e09a7af769-7e36682669fmr9202823a34.20.1778523772345; Mon, 11 May 2026 11:22:52 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:32 -0600 Subject: [PATCH v6 01/35] linux-user/mips: implement sysmips(MIPS_FLUSH_CACHE) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-1-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x332.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523952479158500 Add the target sysmips dispatcher and implement MIPS_FLUSH_CACHE as a successful no-op for linux-user. Self-modifying code is handled by QEMU's normal user-mode translation invalidation machinery, so the target ABI only needs the syscall command to be accepted. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MIPS_FLUSH_CACHE out of the combined sysmips/MIPS_FIXADE patch. (suggested by Richard Henderson) --- linux-user/mips/target_syscall.h | 1 + linux-user/mips64/target_syscall.h | 1 + linux-user/syscall.c | 17 +++++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/linux-user/mips/target_syscall.h b/linux-user/mips/target_sysc= all.h index dfcdf320b7..3f36c1695a 100644 --- a/linux-user/mips/target_syscall.h +++ b/linux-user/mips/target_syscall.h @@ -10,6 +10,7 @@ #define TARGET_MCL_ONFAULT 4 =20 #define TARGET_FORCE_SHMLBA +#define TARGET_SYSMIPS_FLUSH_CACHE 3 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) { diff --git a/linux-user/mips64/target_syscall.h b/linux-user/mips64/target_= syscall.h index 9135bf5e8b..20ea7c6ab9 100644 --- a/linux-user/mips64/target_syscall.h +++ b/linux-user/mips64/target_syscall.h @@ -10,6 +10,7 @@ #define TARGET_MCL_ONFAULT 4 =20 #define TARGET_FORCE_SHMLBA +#define TARGET_SYSMIPS_FLUSH_CACHE 3 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d3d9fffb54..73f09bb775 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6630,6 +6630,19 @@ static abi_long do_prctl_syscall_user_dispatch(CPUAr= chState *env, } } =20 +#ifdef TARGET_NR_sysmips +static abi_long do_sysmips(CPUArchState *env, abi_long cmd, abi_long arg1, + abi_long arg2) +{ + switch (cmd) { + case TARGET_SYSMIPS_FLUSH_CACHE: + return 0; + default: + return -TARGET_EINVAL; + } +} +#endif + static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5) { @@ -12102,6 +12115,10 @@ static abi_long do_syscall1(CPUArchState *cpu_env,= int num, abi_long arg1, case TARGET_NR_prctl: return do_prctl(cpu_env, arg1, arg2, arg3, arg4, arg5); break; +#ifdef TARGET_NR_sysmips + case TARGET_NR_sysmips: + return do_sysmips(cpu_env, arg1, arg2, arg3); +#endif #ifdef TARGET_NR_arch_prctl case TARGET_NR_arch_prctl: return do_arch_prctl(cpu_env, arg1, arg2); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523808; cv=none; d=zohomail.com; s=zohoarc; b=P2txUXhFhMsIqmhbKpQXESXVgw1qVcPwCDXpOkX7pMkxVooy3W18f8H2CHxiCBepnf1Jf2TBTvem0hmrflRhq4cQECe8pn8sxjTsf1Kckrh9SRHlyDKcRXRn5wbUtEBo8T8Rl+l5y+jRLOrdglS1m9ACqYZ4xDpgHH/Lgb23yNY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523808; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=khVlB/iuHBqSxDf1ci1EMIV9f0Ywmy6N/0aX6cS55HM=; b=MOTHDr2WzgLKRt5hMECSXdOQf6oQGW+drEEvIfWs7Y4A6XIi8dS5GJZS3HejbwhX8I0A31JrI5Fh5RZesvpq4xGWhCETVKUtODkXDFtYwD6mWGw4EldhwV8M17cvf69h0w1jlO9k76mTP8AIqvAvYKcl68E8WwVmJDSDsdVJXtk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852380869325.57977415596872; Mon, 11 May 2026 11:23:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHY-0004it-3M; Mon, 11 May 2026 14:23:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHO-0004gk-6J for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:58 -0400 Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHL-0002fP-LE for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:57 -0400 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7de4a9cb8eeso3989374a34.0 for ; Mon, 11 May 2026 11:22:54 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523773; x=1779128573; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=khVlB/iuHBqSxDf1ci1EMIV9f0Ywmy6N/0aX6cS55HM=; b=pKxHWaCxuwU1AKM8OWlfSZdcNFMyTarc0Flfdgg/KY6oBneDRRaDnTae3Db0ijHtmx uaXgeXcxx/BHjpKbMZNtkq7N8PAUyxKhVuZcKZ++DYn+mnVdLFtTAXHvU8lZgyjQenhb tD4DYrHYv6YDR7xL13UFl38Ghacfjjl+HI7pk4DuxNGi+cAON+PsaUqhx4zxZGqxX1// L90U+pI2QffKvgNnwRMDD9pte+4W7RKh2wp6OMDi7UgkoARfGbz5QGdry/yMqE5bNhI3 nCxkLqjzvzUNhIA85qNa8ISSgtBYijgSch4x+I2XyGFpk98tXthNTh/1oX3Gf3XmeK9O oSJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523773; x=1779128573; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=khVlB/iuHBqSxDf1ci1EMIV9f0Ywmy6N/0aX6cS55HM=; b=NWM9U/LC3Pv0l69mr7vCfRz2juBNELqmVc/9gDgkuZyIgX26cqHE2bBpdQPEEqP/Qg PtXIC5YYtH5Q3lwWHGJhoD5JuogizCyehACKYnS2RAo0LKCA65BRTGgHkTYhNALVD/KJ bKXzIFY9UWR091mvJX4shDfCKaZh86V63Rnt18lyV+ufwj492tuTPoeB07ToHbUvfNia Xpn8Um88sFTnVUUz/gHvPJ+aMDCsJAj9uf4kTShSOdrvRSpPk4ULilKAhwqJElMTowNM Q7mI0cr+WmMOTpcxIxHSPcCAyJumVqgNgP4YqC+BPfblwoCcZiS8KLm2MNX7SyIDQ8Um Y4/g== X-Gm-Message-State: AOJu0YweM7s0i1Pv+XOwB48lDV9milf+aTp8bE+2jxtNmiLoOhrsMEtH jW33uQB7Bvi8HxfqymVUHesiI9v31UNQfpLqHLxVZVpAMGE6wtfcsN4p X-Gm-Gg: Acq92OH0pTVzJwkcYDmyG/Du/Q9wJg8c1WyKFd9RBcqvxsr93NMXZMAUmSt3xdGWxr6 nTdkSKOuXOKLgpoVkg/gZCkUaZ6UKgD1uX17tlUiI4cl2H8YLTJsTo46DPZkQiKRluvx6ooU4gA UweiIHN33ggV639CrdPRN+uetQLVByWXXoKr5y/Vi2WDpqRP/QxWFO7FU8xMMH6h5osksVg9fwL nTtUuiGgw0G/uk0QYdAgwZVnEHIFWGsOIT2Root2xl1H3BQEVorziSU1xtiNTtUUcj5vipnAiLf rI4gLolYvJnP0noxE9b00zvt2US3J43LN2nlQ0zS+/9Tb46T7KNzlvpPLUhe6B2BmE+weZS7J5J BroSVZqmm3Tt+szWEomfI4qOSfiubnJpRwkMBFrNXJfWM+GX61LmB1U59lKALl6x3UVWi/gYlqp F2Q4fWx1vsYABghVVYUpTOsbx4HZCmTaGdPYdo4zqmmZt1wMkIvrytrjRbGehlYPaynyAvKpLWx 4RyOetVnPOAvXIgv/FfgeYzeSBEYvzaOZvk/WAsquhR9+Uy4Korf0uAyxrJ0lYkZElWpwKDquUO F0g= X-Received: by 2002:a05:6830:378e:b0:7dc:cbaa:d730 with SMTP id 46e09a7af769-7e1def3deabmr15233129a34.8.1778523773326; Mon, 11 May 2026 11:22:53 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:33 -0600 Subject: [PATCH v6 02/35] linux-user/mips: implement sysmips(MIPS_ATOMIC_SET) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-2-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32d; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32d.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523810499154100 Implement the MIPS_ATOMIC_SET sysmips command as an aligned 32-bit atomic exchange in target memory. MIPS reports syscall errors through a separate register, so successful old values can overlap the errno range. Write the return value and error flag directly and return -QEMU_ESIGRETURN so the common syscall path leaves the registers unchanged. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MIPS_ATOMIC_SET out of the combined sysmips/MIPS_FIXADE patch. (suggested by Richard Henderson) - Always use the explicit MIPS return-register path for successful atomic_set results. (suggested by Richard Henderson) --- linux-user/mips/target_syscall.h | 1 + linux-user/mips64/target_syscall.h | 1 + linux-user/syscall.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/linux-user/mips/target_syscall.h b/linux-user/mips/target_sysc= all.h index 3f36c1695a..9206694f4f 100644 --- a/linux-user/mips/target_syscall.h +++ b/linux-user/mips/target_syscall.h @@ -11,6 +11,7 @@ =20 #define TARGET_FORCE_SHMLBA #define TARGET_SYSMIPS_FLUSH_CACHE 3 +#define TARGET_SYSMIPS_ATOMIC_SET 2001 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) { diff --git a/linux-user/mips64/target_syscall.h b/linux-user/mips64/target_= syscall.h index 20ea7c6ab9..e07687f8ac 100644 --- a/linux-user/mips64/target_syscall.h +++ b/linux-user/mips64/target_syscall.h @@ -11,6 +11,7 @@ =20 #define TARGET_FORCE_SHMLBA #define TARGET_SYSMIPS_FLUSH_CACHE 3 +#define TARGET_SYSMIPS_ATOMIC_SET 2001 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 73f09bb775..3786a34041 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6631,10 +6631,41 @@ static abi_long do_prctl_syscall_user_dispatch(CPUA= rchState *env, } =20 #ifdef TARGET_NR_sysmips +static abi_long do_sysmips_atomic_set(CPUArchState *env, abi_ulong addr, + abi_long value) +{ + uint32_t *ptr; + abi_long old; + + if (addr & 3) { + return -TARGET_EINVAL; + } + + ptr =3D lock_user(VERIFY_WRITE, addr, sizeof(*ptr), true); + if (!ptr) { + return -TARGET_EINVAL; + } + + old =3D tswap32(qatomic_xchg(ptr, tswap32((uint32_t)value))); + unlock_user(ptr, addr, sizeof(*ptr)); + + /* + * MIPS uses a separate error flag, but the common linux-user syscall + * path infers that flag from the return value. Successful atomic_set + * results can overlap the target errno range, so write the result + * registers here and ask the CPU loop to leave them alone. + */ + env->active_tc.gpr[2] =3D old; + env->active_tc.gpr[7] =3D 0; + return -QEMU_ESIGRETURN; +} + static abi_long do_sysmips(CPUArchState *env, abi_long cmd, abi_long arg1, abi_long arg2) { switch (cmd) { + case TARGET_SYSMIPS_ATOMIC_SET: + return do_sysmips_atomic_set(env, arg1, arg2); case TARGET_SYSMIPS_FLUSH_CACHE: return 0; default: --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524038; cv=none; d=zohomail.com; s=zohoarc; b=TS3VoBmAavQZZJ1A+4objIFgL1nyVUnd2lUSt/bu89ebUiutrDPCJEw09UfAiKr6mv3j1f2e1+T75j8GmMtzlHpGgKz8odf+UbsYPXmuBg0hsyb3b7kCh6zjLBKSE30i5RJHVZOWgLpPXn+b/5gM0aP3C+22yI6mFRH/I8tEvBo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524038; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=muRRlgjx9MFhD0Pp20yLIk8Ku1tknLVnfgDx3b/+agQ=; b=POtsuyD4QSfwLLe6lYTzCmSsae21p70SswBQUXnLyeu1Wn8TFHfuis2CMCfNdrFydwemefatq60lhcXb3xbjj83G77QssTyhv1dXTr4Edwzj++KPMV5Ymer8mtobnsbnMcaufssRBMfDAS5grAP4b9btES4qP+o9i3tLQmwmd8w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524038187783.4496481555481; Mon, 11 May 2026 11:27:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVIA-0005cK-Iw; Mon, 11 May 2026 14:23:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHP-0004h0-1J for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:59 -0400 Received: from mail-oi1-x22a.google.com ([2607:f8b0:4864:20::22a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHL-0002fV-LE for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:58 -0400 Received: by mail-oi1-x22a.google.com with SMTP id 5614622812f47-479d9b155deso1648904b6e.3 for ; Mon, 11 May 2026 11:22:55 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523774; x=1779128574; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=muRRlgjx9MFhD0Pp20yLIk8Ku1tknLVnfgDx3b/+agQ=; b=Jl7fLrDUIlnEYzZXujPyks7DRs4OMqw2dN8vUdILQ6TwW0AeBdKJEJtFxIKZQNkth8 38xd45ykk19kuW244L+D84RXdKBRj2KIASxcRATVke3WPi5U8t0qP7ADfsTMJoDMu+lU pYby94hE3v8r/ZYcJeO4bk1j2ohOTo3i2hD8Trq2bnKlT36UmO+rmJzAMMzoM9ezynGl MmZ0XqPdKQ4bJobDtJeOT748Sp1KOcMyX1BngzB4iJ2ZNxe4oJpsMf/hDN8n1t2JAY9O k4DC1pkO87xSSpVp5oXl8/oyyxSl9NkAJyBWO4QXAFt77t5BozUgZfXSKMBnaEnaxObe wGDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523774; x=1779128574; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=muRRlgjx9MFhD0Pp20yLIk8Ku1tknLVnfgDx3b/+agQ=; b=evnBPAnBEZfX/gPaqNl29cd2nrIQzv32SDf/IIRi+RUs9j9mQu3HNYYCiWCGnjMqCj qunwTw1WtOj+g55KeEHSgvT8vRBGS1vcfD8wE8yQQr0nT11suI9arn1NUx3yPV60ny5y 6ZFyzhCRbpA8nJFJKe9n0oEFLNnjKyQXXc3jzwyQ60WEqD+h+2m0D46iaROIehJuc4UZ JH+VRq36cbNb71kPo2Kt5pmzo0Cyh8C9wS4J6byb472D+XsgwwWfBgti6yZr8DMIlF3X mGIPMJ4gJNII1rKcy0rm+7Xg8wyYCq1Ow+sx5/wvnAzmXpeRtF55I2fXGfMOKxKXn1xg oy5w== X-Gm-Message-State: AOJu0YyKA+kRUqlwCel5VQ9HZDxR8g9fR8AjEWdiJ8LWMoKCQx3z7Jd9 ifpOjpv14gnBbZYe46SdBN96HhKtzBSkBgRNcrX/KgsYX/6K3Yw0ULZ6 X-Gm-Gg: Acq92OFkbXmPLqyxkW8Hk1iTp+EnoKBfnF+tAaPGVYlEkHP2llYefMyvkVDs8bWg+Q7 RXpvsAuS1Tr3TRGCfDNJhLmrFFQEi9iyzQoLYeeyodmhVEzb0RVsRF8twdZa4V29DFfZZN7ThSp 1Oe8XMBhjaL1t7BolSFH9LuyFEH7exE0hivZfdYHlH/5xEY5wTD7MyxsihEUJMIcWWQ36XmOlZa 6SYJ37Rn4jz2FNJ+KmDU8is0z6JkDntmOc9oVdUg79CI2ahHpmVOwcOVybwcOd6x44tO3iFQnOR hR03qJeovf84ari0WFlkBIwS8xXo9qdMTxcHT65geI843ooLK8A/hjyb5bYyDF9PoHEoPXzUEJK JAoyzC9glffI1gJR1GTgKUXSOZZaU5ZavAydhv2m4PcF4PhBsyO3Yf+3Ey2zIMti6/XRO6Uly1G Pm5vB9NPemYIEzBahm4X3vcVH5MfaKWZywTZqsrPoSnQi/aPKyA1kqCa4rFhizFS+UrtmxBQkPj RQyriy1Wm3Mwe3/0thNo4QL2vQ+Oqr4s7vzywRF4HpYPt/sl5d1pYVnOG52pgrltP3wIfB1O1in PKY= X-Received: by 2002:a05:6808:e647:b0:47b:c96a:a3b6 with SMTP id 5614622812f47-4804258fb69mr11254737b6e.44.1778523774168; Mon, 11 May 2026 11:22:54 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:34 -0600 Subject: [PATCH v6 03/35] linux-user/mips, target/mips: honor MIPS_FIXADE for unaligned accesses MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-3-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::22a; envelope-from=james.hilliard1@gmail.com; helo=mail-oi1-x22a.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524040498154100 Linux/MIPS enables software fixups for user-mode unaligned scalar accesses by default through MIPS_FIXADE/TIF_FIXADE. QEMU linux-user did not model that ABI, so MIPS guests took fatal AdEL/AdES exceptions unless translation was forced to use unaligned host accesses. Key MIPS translation blocks on the linux-user unaligned policy, implement sysmips(MIPS_FIXADE) to toggle that policy, and raise SIGBUS/BUS_ADRALN when fixups are disabled. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v5 -> v6: - Rename the TB flag from TB_FLAG_UNALIGN to TB_FLAG_MIPS_FIXADE to match the MIPS_FIXADE ABI policy. Changes v2 -> v3: - Split MIPS_FLUSH_CACHE and MIPS_ATOMIC_SET into preparatory sysmips patches. (suggested by Richard Henderson) --- linux-user/mips/cpu_loop.c | 5 +++++ linux-user/mips/target_syscall.h | 1 + linux-user/mips64/target_syscall.h | 1 + linux-user/syscall.c | 8 ++++++++ target/mips/cpu.c | 8 ++++++-- target/mips/cpu.h | 4 ++++ target/mips/tcg/translate.c | 6 +++++- 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/linux-user/mips/cpu_loop.c b/linux-user/mips/cpu_loop.c index fa264b27ec..ff9d293c29 100644 --- a/linux-user/mips/cpu_loop.c +++ b/linux-user/mips/cpu_loop.c @@ -161,6 +161,11 @@ done_syscall: case EXCP_DSPDIS: force_sig(TARGET_SIGILL); break; + case EXCP_AdEL: + case EXCP_AdES: + force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN, + env->CP0_BadVAddr); + break; case EXCP_INTERRUPT: /* just indicate that signals should be handled asap */ break; diff --git a/linux-user/mips/target_syscall.h b/linux-user/mips/target_sysc= all.h index 9206694f4f..be6942445a 100644 --- a/linux-user/mips/target_syscall.h +++ b/linux-user/mips/target_syscall.h @@ -11,6 +11,7 @@ =20 #define TARGET_FORCE_SHMLBA #define TARGET_SYSMIPS_FLUSH_CACHE 3 +#define TARGET_SYSMIPS_FIXADE 7 #define TARGET_SYSMIPS_ATOMIC_SET 2001 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) diff --git a/linux-user/mips64/target_syscall.h b/linux-user/mips64/target_= syscall.h index e07687f8ac..c11d0a0888 100644 --- a/linux-user/mips64/target_syscall.h +++ b/linux-user/mips64/target_syscall.h @@ -11,6 +11,7 @@ =20 #define TARGET_FORCE_SHMLBA #define TARGET_SYSMIPS_FLUSH_CACHE 3 +#define TARGET_SYSMIPS_FIXADE 7 #define TARGET_SYSMIPS_ATOMIC_SET 2001 =20 static inline abi_ulong target_shmlba(CPUMIPSState *env) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3786a34041..551caa8e7c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6663,9 +6663,17 @@ static abi_long do_sysmips_atomic_set(CPUArchState *= env, abi_ulong addr, static abi_long do_sysmips(CPUArchState *env, abi_long cmd, abi_long arg1, abi_long arg2) { + CPUState *cs =3D env_cpu(env); + switch (cmd) { case TARGET_SYSMIPS_ATOMIC_SET: return do_sysmips_atomic_set(env, arg1, arg2); + case TARGET_SYSMIPS_FIXADE: + if (arg1 & ~3) { + return -TARGET_EINVAL; + } + cs->prctl_unalign_sigbus =3D !(arg1 & 1); + return 0; case TARGET_SYSMIPS_FLUSH_CACHE: return 0; default: diff --git a/target/mips/cpu.c b/target/mips/cpu.c index f803d47763..6e827c72de 100644 --- a/target/mips/cpu.c +++ b/target/mips/cpu.c @@ -565,11 +565,15 @@ static int mips_cpu_mmu_index(CPUState *cs, bool ifun= c) static TCGTBCPUState mips_get_tb_cpu_state(CPUState *cs) { CPUMIPSState *env =3D cpu_env(cs); + uint32_t flags =3D env->hflags & MIPS_HFLAG_TB_MASK; + +#ifdef CONFIG_USER_ONLY + flags |=3D TB_FLAG_MIPS_FIXADE * !cs->prctl_unalign_sigbus; +#endif =20 return (TCGTBCPUState){ .pc =3D env->active_tc.PC, - .flags =3D env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK | - MIPS_HFLAG_HWRENA_ULR), + .flags =3D flags, }; } =20 diff --git a/target/mips/cpu.h b/target/mips/cpu.h index cbb9b3e1b1..b478f834c1 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -1161,6 +1161,10 @@ typedef struct CPUArchState { #define MIPS_HFLAG_ELPA 0x4000000 #define MIPS_HFLAG_ITC_CACHE 0x8000000 /* CACHE instr. operates on ITC ta= g */ #define MIPS_HFLAG_ERL 0x10000000 /* error level flag */ +#define MIPS_HFLAG_TB_MASK (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK | \ + MIPS_HFLAG_HWRENA_ULR) + +#define TB_FLAG_MIPS_FIXADE 0x40000000 target_ulong btarget; /* Jump / branch target */ target_ulong bcond; /* Branch condition (if needed) */ =20 diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index 54ed253a7d..dac30aff8d 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -15070,6 +15070,7 @@ static void mips_tr_init_disas_context(DisasContext= Base *dcbase, CPUState *cs) { DisasContext *ctx =3D container_of(dcbase, DisasContext, base); CPUMIPSState *env =3D cpu_env(cs); + uint32_t tb_flags =3D ctx->base.tb->flags; =20 ctx->page_start =3D ctx->base.pc_first & TARGET_PAGE_MASK; ctx->saved_pc =3D -1; @@ -15092,7 +15093,7 @@ static void mips_tr_init_disas_context(DisasContext= Base *dcbase, CPUState *cs) ctx->CP0_LLAddr_shift =3D env->CP0_LLAddr_shift; ctx->cmgcr =3D (env->CP0_Config3 >> CP0C3_CMGCR) & 1; /* Restore delay slot state from the tb context. */ - ctx->hflags =3D (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 = bits? */ + ctx->hflags =3D tb_flags & MIPS_HFLAG_TB_MASK; ctx->ulri =3D (env->CP0_Config3 >> CP0C3_ULRI) & 1; ctx->ps =3D ((env->active_fpu.fcr0 >> FCR0_PS) & 1) || (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)); @@ -15112,6 +15113,9 @@ static void mips_tr_init_disas_context(DisasContext= Base *dcbase, CPUState *cs) ctx->default_tcg_memop_mask =3D (!(ctx->insn_flags & ISA_NANOMIPS32) && (ctx->insn_flags & (ISA_MIPS_R6 | INSN_LOONGSON3A))) ? MO_UNALN : MO_ALIGN; + if (tb_flags & TB_FLAG_MIPS_FIXADE) { + ctx->default_tcg_memop_mask =3D MO_UNALN; + } =20 /* * Execute a branch and its delay slot as a single instruction. --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524064; cv=none; d=zohomail.com; s=zohoarc; b=fNMbfSi6cORvNHZtIvLSavS8npKKh/oMH96DAN/kCl8G/7uvmKwJ+e9WP7yX6ICd4fPCYb9D1mPZXoSv/6wjbMgzH6Pf/q2lPL981ZKATdqMGPj6U3wYA8fpKN6TO8a0Lqs9OWlFkczWnqT4wu1e/muJE3K8IKMXbsU2ubGSyD0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524064; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=DMtQ6otfSvVpuO6rahx7fwVTGsLSe4NmUYhcy52IxfI=; b=ex7ziTSyQIjYhxmCgRefkafpBVACVGwgfi7aHAV+wjJmceRiaSDzfEVdzRpDGnOy79W5wKHWj7GriYUvMQXE8joI9oOcytd2j6kzYI9G9+Olfl2ZFwPyFBbShDud+43XP6zMWTTGdSotBJO2afoIVmeMV0OZ5fSC69WU/cwkJg8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524064921506.25017297686554; Mon, 11 May 2026 11:27:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHa-0004kN-98; Mon, 11 May 2026 14:23:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHP-0004h4-I6 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:59 -0400 Received: from mail-oi1-x232.google.com ([2607:f8b0:4864:20::232]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHN-0002fb-TE for qemu-devel@nongnu.org; Mon, 11 May 2026 14:22:59 -0400 Received: by mail-oi1-x232.google.com with SMTP id 5614622812f47-479d4df9035so3694350b6e.0 for ; Mon, 11 May 2026 11:22:56 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523775; x=1779128575; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=DMtQ6otfSvVpuO6rahx7fwVTGsLSe4NmUYhcy52IxfI=; b=fC6y9StAx8Ak1nzFk5pYlgGr6YtwIY50CJhCIZgJ5jwuPdu1jeo2aKJOcIGl4M9gA7 zK74ei2mxqfSz2aeOnyEGk8w35emjiry6g83wIsa2gPxjRulX0Lt5N1Ftk5V31KAQLZ7 qTMN1ln0vlhEBV4M+ARisoVUZBwajWR2BYVlx8tZehDHV/INWpe1b2TpNT6wais87ETf ge+x5MRxiLUvQgNkS/yrHfEMPOevkwaysZnRz5BQe328JJT0+RLKwExYptV1t5yulXqv IEtm4mO+sy0VZ+mLwliS6F/Tvw+1DnhR8j64z1PPSFEXezYkHxoFtWvzPJ5eFsZsiHHh OWcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523775; x=1779128575; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=DMtQ6otfSvVpuO6rahx7fwVTGsLSe4NmUYhcy52IxfI=; b=NYSHjsa/o0OAqR3Oc6Ct/dNkP2dcajPV44rteCv/8ECQT4zAjDIrzGbgaKtpbxIvT+ jx8T5puW0YtefG+ok7MF3dafiE+eU9nEjSb/c5hlVOgcwlJXtWnIpqtyXjWaRNnKP0vu pqxmXYRCxksm2W8Zgl1bQhKOzKX9gCkA/uA43Mw/RU36RIllS3+wABDaOhOIqMUBo4KF Vy6ODhGGzKLorgWxc06PEu+3qIDmHtGLT/Uo+sirzJ1eJwoROmuLLvx33LlXn1SJpMOV TkHEr58wH0lGlUnpJ3q0W+q/SEC6ypGZpWMh7PfDj292Vch72R4wypLoR8qU3b+6z7zj fd3Q== X-Gm-Message-State: AOJu0YyWznsumq835GJp7/PWFmYZJ01EVW3mNNpOCHPfFgLIge28OPR7 Rs/IthZ5Zs3N5CmrN7dwagJe0dhY1D44sp8aOV2aFCdF7pkKUdSf3jqe X-Gm-Gg: Acq92OEvF5EK9HcFbH1pjHphCuBOr6d5vcJKX2VRjB6ab5zxpUT4pzGjkIaqrdQbshV /hQLTvRaqhbC25fMfkQaeicAjcT9R+9xYT353GGCQ3p5mDSaGfpR5KeoYO2f8M8/WK8kX5FTwp3 R/EeMZ/GA11xLKv4SbSG4/pSi9DzYuvU6lO0ksNESpFAHdVBjPb4Vi3msvR4jILpCXiuSXvOj00 cbz8gbd5aAyZ4kVReh0CubM3Bm4nkZTASZ6RFnHB3OYXksa3cYbnfOqnK8fi/KlcCAiFDGYQXRR 2osHGTE2dzK03XSZ/6QSD4wdhcnRO8ybiNJwpnuIwTtXOJ0fofMKUxzWntPaz/LxZET1GFkRIdI bT/xuBAnMzJY9ofatoF5Dr2X7eeE2n0fSLWyqcEo9MlBc0GqkGupkjdRNngv/3M6AeWOJlBYfMJ JXQ1rXaJvmggk6MbCoVgC20F4QLwFpghSUIlJGpH2NSYjWSNpIqB9ROTyre2gXiJb8sqCr35QHR 8b/16BpRrNcgmKjcASzWyepIWSt0qcw8PCkhk2Xl1t5wYPyNm3ApY/k/2fWQ4ej2foQ X-Received: by 2002:a05:6808:a58a:20b0:473:f3c1:250e with SMTP id 5614622812f47-48293d40629mr280473b6e.17.1778523775026; Mon, 11 May 2026 11:22:55 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:35 -0600 Subject: [PATCH v6 04/35] target/mips: fix Octeon arithmetic destination handling MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-4-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::232; envelope-from=james.hilliard1@gmail.com; helo=mail-oi1-x232.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524067003154100 BADDU and DMUL write their results to rd, not rt. Route writes through gen_store_gpr() so rd =3D=3D $zero is handled consistently. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- Changes v1 -> v2: - Split the BADDU/DMUL destination handling fix out of the Octeon arithmetic instruction patch. (suggested by Philippe Mathieu-Daud=C3= =A9) Changes v2 -> v3: - Remove the rd =3D=3D $zero fast paths and let gen_store_gpr() discard writes to $zero. (suggested by Richard Henderson) --- target/mips/tcg/octeon_translate.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index e1f52d444a..4dd7626835 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -45,18 +45,14 @@ static bool trans_BADDU(DisasContext *ctx, arg_BADDU *a) { TCGv_i64 t0, t1; =20 - if (a->rt =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); t1 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); gen_load_gpr(t1, a->rt); =20 tcg_gen_add_i64(t0, t0, t1); - tcg_gen_andi_i64(cpu_gpr[a->rd], t0, 0xff); + tcg_gen_andi_i64(t0, t0, 0xff); + gen_store_gpr(t0, a->rd); return true; } =20 @@ -64,17 +60,13 @@ static bool trans_DMUL(DisasContext *ctx, arg_DMUL *a) { TCGv_i64 t0, t1; =20 - if (a->rt =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); t1 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); gen_load_gpr(t1, a->rt); =20 - tcg_gen_mul_i64(cpu_gpr[a->rd], t0, t1); + tcg_gen_mul_i64(t0, t0, t1); + gen_store_gpr(t0, a->rd); return true; } =20 --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523797; cv=none; d=zohomail.com; s=zohoarc; b=a/nuYjoNV14npM+vreI8SYvVFXOUM6AfxbMkdrrFpc2QfMtLWp7zEDOjuex5l2JR4h8DgDwgWnMZ54ZdADtmJzYHbqtShp9ZqVB2rGe5z3EXqVlz2v452CQLKakvUG5bG09Sh6bgr+I2hx3rnne4tvuie+piFyZqEJaCr9kscJ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523797; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=nr1RHhakz2fMCwd5oVw8Lh14BokGT3MnBkKAzUjV7o8=; b=hCSu04Ho05LD/Zt5y+khamU4OEPSj9rqzXFtO1U4H77o6R2ZrCDADfJUfo3S8mLCsthgGJBnOftfX+YdVJymMCvfCRyt0xgTW1JbAhdOBIhKNQkBavEmZW2rJZLRXwWi//1nHcKTS6jrlxxTHjW7f3rJBnbeIzrpSVfmU4IqpDs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523797628458.4084192075062; Mon, 11 May 2026 11:23:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHb-0004kj-Lg; Mon, 11 May 2026 14:23:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHQ-0004hY-Gh for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:00 -0400 Received: from mail-ot1-x32e.google.com ([2607:f8b0:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHN-0002fj-TX for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:00 -0400 Received: by mail-ot1-x32e.google.com with SMTP id 46e09a7af769-7e363c6141dso3047611a34.2 for ; Mon, 11 May 2026 11:22:56 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523776; x=1779128576; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=nr1RHhakz2fMCwd5oVw8Lh14BokGT3MnBkKAzUjV7o8=; b=M90wcVcnYxxuPX8qs6ng1oJ3MJuIcCkD575x9ktsGl4McmbRlF+2uJjd9ZWMdtW12X aQ2Oc1emoagrk2awdSizzuJBagVKpBTeAP1bdabfp/yTs7VGyct+j04lYDXUGHoPkYUb RMGrLg0cgHLIrom/vI0tBLfsY4M+ydh/M4wpHIzuwqZ+560FmSTcgFPrgW5G6PFVEk5p bT+9XiFS5ysLYTdIS+ps3S2+enYNwQyeF3tkXe7O8dZNq1XjOkcesf5VVM7lv94ZGinc 9cP2opYL02iqUoCGcb1HDOGQjfwtqFPs3YUm5nxEs9hA2SXS1O7qfuYYgWdzSzomLK8K vdBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523776; x=1779128576; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=nr1RHhakz2fMCwd5oVw8Lh14BokGT3MnBkKAzUjV7o8=; b=fAZWXb837ynVyTlkTm6BhiYNLUiZF50GPof9RYyHTWji6nXzT8aC+ibTnV91akn3pW opOxAJDzOcmYt7awapfoN7QMt4zDVOo69OqlHmitVbBWNXknABSTl2L1UX055GUXkOfM seCsp7q2iPBOvr8qeONhR6LzypRmSd5r7n6GbWkP/xmrbHlr2/dTuF5DWme1m1vXP07n Obf8h5RM78XhHAgNN2tbvReQtay7n1nmZJJ7RuIwroTtpUU6y2u9Qv/vvmPPjHDaCmNa y8UvdxVZMi+A+mkuVwOekbDULUvcr6b/tvyijutip3BWc97TU7lAE3co/ScR6sd1bNEX FBUw== X-Gm-Message-State: AOJu0YwyC0oMc85myiMI4aSjTsJiOPeW++SkAXXV73pFTpA0cDEhF9fT fpv+kjqm175GHBPIQbhQgii7W2Y1j0iegYe+k5AjHbJUpm/Wie/k6QBi X-Gm-Gg: Acq92OG8VkbGPLWII0hzESw+bCqs7T2veoH/j5/X5wNeEIh74wXmi5jo+4ZtA9yWGaq ugJ3b0Hoprr9N2gEIYIzBe2uMASKy1HXmi6M6M/8ZGy4jo16I+/1nHmJPL/5esqGqQ8lc6EAPfM D5J2Jpac58Kge6Z49fwtgLFtSJISQJXu773PTUGRT2ugNtUcHNIy0GehvYLbdmQv+f6ghAZie4F 7D+B21IybI8dtCu/dlT3ohG7uupe774HTVrAvIKFt/YC1kfqKeZk6LNbM4Sg9h68TIi0GY7fIwj nAREBmXU1frzvn1JOGDubGsTgaHUNSGnKCD39MvIudEZMT0Gxc8ApLNNCy83TV1iL5L20QQGyOK HOumSI7pCQebw70/gL/TpvrGtMQoy3b9Ig4GKpGejIUbviXpHVKuN4e3OZ7mgKnUU4EYZ5QmNee maXRvt+6awOx/v4go2t+gUY3qj2FqKhS6WfZD8UASxSJvLczQLg9UJHFXJKD9jvMPwgNfArg+kC sLuG5JbRcAX6osgNZpKZQIXCHoHC2f9wD6fuK6kWQp6GlCwvFNk4yaGVA8tVIz2+B52RN697mFu F9E= X-Received: by 2002:a05:6830:6734:b0:7de:42d5:6243 with SMTP id 46e09a7af769-7e1df0da8c3mr15487439a34.13.1778523775975; Mon, 11 May 2026 11:22:55 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:36 -0600 Subject: [PATCH v6 05/35] target/mips: split Octeon SEQ/SNE decode MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-5-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32e; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32e.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523800328154100 Decode the equality and inequality forms as explicit SEQ/SNE and SEQI/SNEI instructions rather than using shared generated SEQNE/SEQNEI entries. The explicit decoder names match the architectural mnemonics, which makes the translator entry points and trace/debug output easier to correlate with the instruction set. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v1 -> v2: - Split the SEQ/SNE decode cleanup out of the Octeon arithmetic instruction patch. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v2 -> v3: - Remove the decoded ne field now that the instructions are split. - Reuse @r3 for SEQ/SNE and pass the TCG condition into a shared translator helper. (suggested by Richard Henderson) --- target/mips/tcg/octeon.decode | 7 +++-- target/mips/tcg/octeon_translate.c | 52 ++++++++++++++++++++--------------= ---- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 102a05860d..a2bfd0751d 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -30,6 +30,7 @@ BBIT 11 set:1 . 10 rs:5 ..... offset:s16 p=3D%bbi= t_p # SNEI rt, rs, immediate =20 @r3 ...... rs:5 rt:5 rd:5 ..... ...... +&cmpi rs rt imm %bitfield_p 0:1 6:5 @bitfield ...... rs:5 rt:5 lenm1:5 ..... ..... . p=3D%bitfield_p =20 @@ -38,8 +39,10 @@ DMUL 011100 ..... ..... ..... 00000 000011 @r3 EXTS 011100 ..... ..... ..... ..... 11101 . @bitfield CINS 011100 ..... ..... ..... ..... 11001 . @bitfield POP 011100 rs:5 00000 rd:5 00000 10110 dw:1 -SEQNE 011100 rs:5 rt:5 rd:5 00000 10101 ne:1 -SEQNEI 011100 rs:5 rt:5 imm:s10 10111 ne:1 +SEQ 011100 ..... ..... ..... 00000 101010 @r3 +SNE 011100 ..... ..... ..... 00000 101011 @r3 +SEQI 011100 rs:5 rt:5 imm:s10 101110 &cmpi +SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi =20 &lx base index rd @lx ...... base:5 index:5 rd:5 ...... ..... &lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 4dd7626835..8e49e16b5a 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -121,52 +121,54 @@ static bool trans_POP(DisasContext *ctx, arg_POP *a) return true; } =20 -static bool trans_SEQNE(DisasContext *ctx, arg_SEQNE *a) +static bool do_seq_sne(DisasContext *ctx, const arg_decode_ext_octeon1 *a, + TCGCond cond) { TCGv_i64 t0, t1; =20 - if (a->rd =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); t1 =3D tcg_temp_new_i64(); =20 gen_load_gpr(t0, a->rs); gen_load_gpr(t1, a->rt); =20 - if (a->ne) { - tcg_gen_setcond_i64(TCG_COND_NE, cpu_gpr[a->rd], t1, t0); - } else { - tcg_gen_setcond_i64(TCG_COND_EQ, cpu_gpr[a->rd], t1, t0); - } + tcg_gen_setcond_i64(cond, t0, t1, t0); + gen_store_gpr(t0, a->rd); return true; } =20 -static bool trans_SEQNEI(DisasContext *ctx, arg_SEQNEI *a) +static bool trans_SEQ(DisasContext *ctx, arg_SEQ *a) { - TCGv_i64 t0; + return do_seq_sne(ctx, a, TCG_COND_EQ); +} =20 - if (a->rt =3D=3D 0) { - /* nop */ - return true; - } +static bool trans_SNE(DisasContext *ctx, arg_SNE *a) +{ + return do_seq_sne(ctx, a, TCG_COND_NE); +} =20 - t0 =3D tcg_temp_new_i64(); +static bool do_seqi_snei(DisasContext *ctx, const arg_cmpi *a, TCGCond con= d) +{ + TCGv_i64 t0; =20 + t0 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); =20 - /* Sign-extend to 64 bit value */ - target_ulong imm =3D a->imm; - if (a->ne) { - tcg_gen_setcondi_i64(TCG_COND_NE, cpu_gpr[a->rt], t0, imm); - } else { - tcg_gen_setcondi_i64(TCG_COND_EQ, cpu_gpr[a->rt], t0, imm); - } + tcg_gen_setcondi_i64(cond, t0, t0, a->imm); + gen_store_gpr(t0, a->rt); return true; } =20 +static bool trans_SEQI(DisasContext *ctx, arg_SEQI *a) +{ + return do_seqi_snei(ctx, a, TCG_COND_EQ); +} + +static bool trans_SNEI(DisasContext *ctx, arg_SNEI *a) +{ + return do_seqi_snei(ctx, a, TCG_COND_NE); +} + static bool trans_lx(DisasContext *ctx, arg_lx *a, MemOp mop) { gen_lx(ctx, a->rd, a->base, a->index, mop); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523797; cv=none; d=zohomail.com; s=zohoarc; b=Qhiqh1TTnnAZ5+XvpmqrkBaEiU0sSOnqtqtR7EojXwmGRScuHo3aXIE0HHiQ9uWNmdWOZtErKVlD4zE5HdUgfX5XSqPCcuEoFlHtA9OuMCWVcXaGpZGPLmAMbI8K24Q4DcSu8TapLperKgh9mKB65HPMBQGj3TxyA2T92NTQ0Lo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523797; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=riSBN5i1giMN1aGqVtPhbyNKtygz2qVbg+uw6OxejTo=; b=XQykBu+qBblmxTxSnXPZFxo3hcsJhEaCKGbF/FeCDtR5fTcjpDGLgHs37I+6nlmGuS6YpGKNuHpdo2rsVvBhCbIaa1mNXJSPiirrV/vrHOSXZu8GF/7A59dv/ppz1fYW+kqOdrpG5MyH+bDGeWJlDpNW6nGOgWK0Y5IlJrTqmmc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523797071913.833927722069; Mon, 11 May 2026 11:23:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHZ-0004jd-5c; Mon, 11 May 2026 14:23:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHQ-0004hZ-J9 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:00 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHO-0002fr-Pm for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:00 -0400 Received: by mail-ot1-x333.google.com with SMTP id 46e09a7af769-7dca4debedaso4600314a34.2 for ; Mon, 11 May 2026 11:22:58 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523777; x=1779128577; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=riSBN5i1giMN1aGqVtPhbyNKtygz2qVbg+uw6OxejTo=; b=NHwxVvALp9PHp7UEaSmZDh1eRPvTLj5PGPyD6WO7Nv4EXBQR8cD8OdaycRlGRnDuId Zrn7CXWmGuFWsNtIEW453Iiwdhi1jY/3krsOHZnMsskTYb/tk+am6xBdy5TZBFMHt5P4 tI//F/Gqk652KK0q1e/hrwtPTMQ1PgYmKvZSvUl0SKfhz3b/O2hm5CqWuQI2DwPsv5Vu PipS41QE4cX91Rlm+c+N3QeP2GiBDxM5l/W3WPLDW4+rAnmuz471FrjIb5+gyq2LpuzX Grt7KrRzO0tTrrV5Y43o9oTgKDI3n+3VZQN1VWBZ/m4pTJFr6fTP2+absz5JZ79nhbkR J6CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523777; x=1779128577; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=riSBN5i1giMN1aGqVtPhbyNKtygz2qVbg+uw6OxejTo=; b=NtkOU14VjNEXqUWw0SmVDnz05Nagw7S6tu/eLzsbfWBIX+OtqyMapH9U4WwdONNZKT kgVZ5xnRs4jj0+fhh4YpmNcfRNJp+W35Z+GiEJ0RBg72dRAKTkfFaZe3Funkfum/ip2/ NFr1YucYOIB28FdCno64DTQbIYnouLllXpjM0W/RcUHZgxC5C6wL3+Hm8hmndhhPF+Oo EvHoFKGQHlyZVMG06uSfzN3DdYxQxKcwZLPbMD/WjMRUOahKW0GN5A0xYTUimb/dGFD5 KhDQ8fzhqbf0n1gclfeUXfPh0rE3M6+Mw2dPJlAukK0+yh/yMyb6FAyeO3TgYw4CJQk+ dj3A== X-Gm-Message-State: AOJu0YxKc1D1o9491dLWx9Y6AIXgAN8Tjz1xWF7a2rLdFKRk5N+x7Sa6 joNpihlpVHxuSZR72XX8jhJhSOHAUbkTBHYgcG3OLijg8HDvs8aKZo+P X-Gm-Gg: Acq92OGcdoD2QxOG7mZE8FtYCyDSwqrlsR49bJyoTDL6h4/4NHtY8NaHsAPT2ZkTJHx Ed5qwDrH7kVkmQGMsLzFzO1rC+BnQAOKM//7XVBxbdEaIanmWZtongeD1htZ0bpZv3i60CAhVyQ 0UrOivXWvQL6BDDrBx8newYnF2sV3rlFCo6Cbug0EE/nPaU2AH4w2ta1lazw96IVQmngO1SxcW9 r6aGJJd9xLcvi4gWZaBJ2HJj9lE84/a3ZYvPDYkN/rXb1XUjuXINqBa4Dllr+1FA+TOxoDbmnij Ev66Yp4dBfchRjguE742Njif3dUAo1uLB1SBKevS1QAZyB28N1aYQTX2vrKIPCry7r+hbGG6wM/ yjHl8R7y6xYMN0uw311nFeGzl+FwmVqjpZDA00+B+EH1Li2B4b3yp0lOns6ASlWgZaxLO+2doSc 1e8KFLC6e4n6rTOfJJhlj7i1OKTNsM9t/Bbz/bd4LOvaDj+EN3BcjAJsikiQtiOTIkD/piE/+46 HSfk4DqYVJLYaqn5YMDx5yrOQiTke/y+ncoP0Ra8t1SkGfXU9+DzvbJIibOj5KeX0nY X-Received: by 2002:a05:6830:3691:b0:7db:f6a1:3742 with SMTP id 46e09a7af769-7e3821e4c3cmr6809177a34.28.1778523777089; Mon, 11 May 2026 11:22:57 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:37 -0600 Subject: [PATCH v6 06/35] target/mips: drop Octeon zero-register fast paths MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-6-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::333; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x333.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523799232158500 EXTS, CINS, and POP route their destination writes through gen_store_gpr(), which already discards writes to $zero. Remove the remaining translator fast paths for destination $zero so these Octeon instructions follow the same shape as BADDU/DMUL and the generic MIPS translator helpers. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- Changes v2 -> v3: - Remove the remaining destination $zero fast paths and let gen_store_gpr() discard writes to $zero. (suggested by Richard Henderson) --- target/mips/tcg/octeon_translate.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 8e49e16b5a..5497ddfb10 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -74,11 +74,6 @@ static bool trans_EXTS(DisasContext *ctx, arg_EXTS *a) { TCGv_i64 t0; =20 - if (a->rt =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); tcg_gen_sextract_i64(t0, t0, a->p, a->lenm1 + 1); @@ -90,11 +85,6 @@ static bool trans_CINS(DisasContext *ctx, arg_CINS *a) { TCGv_i64 t0; =20 - if (a->rt =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); tcg_gen_deposit_z_i64(t0, t0, a->p, a->lenm1 + 1); @@ -106,11 +96,6 @@ static bool trans_POP(DisasContext *ctx, arg_POP *a) { TCGv_i64 t0; =20 - if (a->rd =3D=3D 0) { - /* nop */ - return true; - } - t0 =3D tcg_temp_new_i64(); gen_load_gpr(t0, a->rs); if (!a->dw) { --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523831; cv=none; d=zohomail.com; s=zohoarc; b=YEihVceWQP+8/Ze5wrlyfTIMZAClp0Zjz2EkwHBL1PvTrDgkbZNLDh3NErz+xUxJ8HnNPVlerWpp3S5IdJM3FG5vSboss+c2y914NAozpE7qevU2hhpmC8qqSnPEO8bJ3VM5PDXlAk6Fstip3zdnI+UzNHR2pr4efMi4wsLRVGc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523831; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rZs1QwMgMBOIZ7x0GopuMPx3PhSKBhRZ0iB31cIY3R0=; b=JY3EgwA+Rtd+gGcSKDoAMa3R4yQddKPRKG/7GDY5Uc+t5vDlLsZHcqrMVNzceh+Ox+b0v6aRTsV5r5r/DwuYfpjcDq6+zwe7cga2iC7D6uORgK4NzEb1vodsyDTg4RZHPxyCV2N/NE0M3iSuRL1dOHMLW8vctigCqEluZp+Sjm8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523831326206.38468960702232; Mon, 11 May 2026 11:23:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI5-0005Ia-N4; Mon, 11 May 2026 14:23:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHS-0004iN-1P for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:03 -0400 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHQ-0002gB-8L for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:01 -0400 Received: by mail-ot1-x334.google.com with SMTP id 46e09a7af769-7dca4debedaso4600330a34.2 for ; Mon, 11 May 2026 11:22:59 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523778; x=1779128578; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rZs1QwMgMBOIZ7x0GopuMPx3PhSKBhRZ0iB31cIY3R0=; b=VQLOBo3x1ek6qhuZEq5ou4d/wubrc4AAxAq85vahfYISCdNNmzRneFSaETnjhxJTp6 /Q4fu2K/iwJvU/FoMvxlR9SNeC1VYSxPJWLsxuTjPi0iKI7Wn8D8v/LvjfgI2JULdBWb 47RsBS9EApoRsIgIMP8icCf/mRxcaQzKh7kKB/YpUqkBV6tjNV2a4eohI0e4tSE8MFDj /x/Sbg9rSDfCUvFz83pnXT+U3ERm+rSWWzMQaaqjqUslAgxNyrle7tv5J5biCn1N+3vZ wQIdEFJlIzWT7l2aXMp5GDUPafBGH8kOPOBe5X12XIIeLfGlQOc3TkVKVnzCfONz2AaF cdzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523778; x=1779128578; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=rZs1QwMgMBOIZ7x0GopuMPx3PhSKBhRZ0iB31cIY3R0=; b=HPmhEYTTT1s9dOkYlEIIkuIDV+5XpdBI+T/xMtv38xFhu3YCDvtdn04v9xQ4FrLWAQ ATQZOhaW7mlTgNa9s272x+/2iV7gKz7YBFvRP03fYYrlUMS65KhqcWOR/Egjfu4b42b9 DuA0VcVgemoxk1Kk/074DNY3mcN9+FPJygp8Xh3Cz/0em7IxJT/Vcv/LL4bEovldGADV PwPa/kz6rLVSDrmjy6JSyWugRfDYNan7b94dIbY/ra8hBbAHZy53fQA3rzI9Rory0bq5 kzqtPYjQE9y0o8kEQwPzRXUHOYBesM6h6IiU4+4oT88FjeYMl98WPjPiAYyDmJdKnjyZ XXFw== X-Gm-Message-State: AOJu0YxPnM/SS570Nn1df6xIPY2AmlHwNsLF9+KYW8n77VX1Y/4CeCIP MvNthmD1D2L3JnhK0VXhZHQVJ50qJT73j1hRyNgfGxolTu7EwyrTOl5S X-Gm-Gg: Acq92OEkfZ/TIkdLKdbnw0POMcR6QwbybzoCME5J1fpmRP9f865ca3aGD2RK6U/6Bgm 75rYBnKNXomh38cvhjQgk8xueqsv8eTz/H4DewzOyjkpC0gp3FmOMPuOi1R+/qwL4T80Xp256pJ 8K0zJMAJ8A18vBxs/5kla6nb6CrnKv7yROX4UF1yYH1PEJKIWSp0ojf8hg6bBvhL+LSqNFEhKAe pD7R3G/m0sFUpPT3RR0F57GdyxkaPe2Vbtu1nJj843lmD9gMFEuB9ltFGbu6OBCj2P8s6JP6iFi Jj4er3UJ4wffjOoMBnJLqQ4CiEO6lXnIV+0daXgYJoDPrUg0+EBVW9RTXdko4jE+qw2vCsvM+1n MBfAmQn8vwSnuw5sZGVP/bnEsJw+uwykw/3QF1+DsZmRQroumhddBOXO2FYxl0UY4cvi0JEbglj aBFIcmcW+AB2ned7Ms5dzzzI2e/B+U2BZSBAVoZRveXyopgojLNdRE5A3/s05ZQdaSUQTpMTavu p5iZxCws8SqB2nUVmlh2gB9LJqtv+DeDB3OLjWCZuk4jVH15TqwK2uNJae98933Wj6a X-Received: by 2002:a05:6830:6684:b0:7e3:7dcf:9d3f with SMTP id 46e09a7af769-7e3820e58f5mr7503012a34.16.1778523778055; Mon, 11 May 2026 11:22:58 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:38 -0600 Subject: [PATCH v6 07/35] target/mips: add Octeon multiplier state MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-7-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::334; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x334.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523832943154100 Add per-thread Octeon multiplier state for the MPL and P limb banks used by the VMULU/VMM0/V3MULU instruction family. Octeon3 extends the older MPL0-MPL2/P0-P2 state with high lanes MPL3-MPL5/P3-P5, programmed by the two-source MTM/MTP forms. Represent both banks as uint64_t arrays so the TC state matches the architected 64-bit limb layout used by Octeon68XX user-mode code. Migrate the multiplier registers in an Octeon-only subsection so non-Octeon CPU models do not grow migration state. Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson --- Changes v2 -> v3: - Split the multiplier state out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Document and keep the Octeon3 MPL3-MPL5/P3-P5 high-lane state used by the two-source MTM/MTP forms. --- target/mips/cpu.h | 12 ++++++++++++ target/mips/system/machine.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index b478f834c1..346713705a 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -459,6 +459,14 @@ typedef struct mips_def_t mips_def_t; =20 =20 typedef struct TCState TCState; + +/* + * Octeon3 adds a second bank of multiplier/product limbs used by the + * two-source MTM/MTP forms: MPL0..2/P0..2 from rs and MPL3..5/P3..5 from = rt. + */ +#define OCTEON_MULTIPLIER_LANES 3 +#define OCTEON_MULTIPLIER_REGS (2 * OCTEON_MULTIPLIER_LANES) + struct TCState { target_ulong gpr[32]; #if defined(TARGET_MIPS64) @@ -497,6 +505,10 @@ struct TCState { target_ulong CP0_TCScheFBack; int32_t CP0_Debug_tcstatus; target_ulong CP0_UserLocal; + struct { + uint64_t MPL[OCTEON_MULTIPLIER_REGS]; + uint64_t P[OCTEON_MULTIPLIER_REGS]; + } octeon; =20 int32_t msacsr; =20 diff --git a/target/mips/system/machine.c b/target/mips/system/machine.c index 5880b401b0..f988b3695b 100644 --- a/target/mips/system/machine.c +++ b/target/mips/system/machine.c @@ -120,6 +120,17 @@ static const VMStateDescription vmstate_inactive_tc = =3D { .fields =3D vmstate_tc_fields }; =20 +static const VMStateDescription vmstate_octeon_multiplier_tc =3D { + .name =3D "cpu/tc/octeon_multiplier", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT64_ARRAY(octeon.MPL, TCState, OCTEON_MULTIPLIER_REGS), + VMSTATE_UINT64_ARRAY(octeon.P, TCState, OCTEON_MULTIPLIER_REGS), + VMSTATE_END_OF_LIST() + } +}; + /* MVP state */ =20 static const VMStateDescription vmstate_mvp =3D { @@ -247,6 +258,27 @@ static const VMStateDescription mips_vmstate_timer =3D= { } }; =20 +static bool mips_octeon_needed(void *opaque) +{ + MIPSCPU *cpu =3D opaque; + + return cpu->env.insn_flags & INSN_OCTEON; +} + +static const VMStateDescription mips_vmstate_octeon_multiplier =3D { + .name =3D "cpu/octeon_multiplier", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D mips_octeon_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_STRUCT(env.active_tc, MIPSCPU, 1, + vmstate_octeon_multiplier_tc, TCState), + VMSTATE_STRUCT_ARRAY(env.tcs, MIPSCPU, MIPS_SHADOW_SET_MAX, 1, + vmstate_octeon_multiplier_tc, TCState), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_mips_cpu =3D { .name =3D "cpu", .version_id =3D 21, @@ -363,6 +395,7 @@ const VMStateDescription vmstate_mips_cpu =3D { }, .subsections =3D (const VMStateDescription * const []) { &mips_vmstate_timer, + &mips_vmstate_octeon_multiplier, NULL } }; --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523924; cv=none; d=zohomail.com; s=zohoarc; b=VE5zRd8puX5AOUi3L8r2RA8Wr+rXEliFrN02k7Bby2OT/uIHDoTvxo6+RzhZEQhwNl8ZWD6DVvpchWivGHGQrpXa867eFh+n4BjbbDpngg5w4fbcWEYIPCn8zoygxCskQfVLcD8Zj2Ydl5YQufBHv9OyWq7rJP+LUiot4F05XAs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523924; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=FUxO3ut9ObnZrS6XN2L4dCBHexksaIUiGR+LxlMcBuc=; b=bddFmVAYCRabTbVLo05jmFlllcKhektX5PlzleJeXiaHtpLyybaYeuEv0MRv6EuY4/yKTE9FFxQXHkOkYnyBSq/wY4N9KolYFGjUD4ux7j2WOBjwjgv4XEYsgAcg0ZO26EamKO7SZaPed1d5EPAmJYAJAgb+5XYdzwOVbnzjjZw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523924462775.2008955125046; Mon, 11 May 2026 11:25:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004kq-0g; Mon, 11 May 2026 14:23:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHR-0004i5-MX for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:01 -0400 Received: from mail-ot1-x32f.google.com ([2607:f8b0:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHQ-0002gP-3w for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:01 -0400 Received: by mail-ot1-x32f.google.com with SMTP id 46e09a7af769-7dca00c1591so1572281a34.3 for ; Mon, 11 May 2026 11:22:59 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523779; x=1779128579; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=FUxO3ut9ObnZrS6XN2L4dCBHexksaIUiGR+LxlMcBuc=; b=d714ENlOSufkVZ8kgxv36Gx0WTOte5PaAkeSsQuJux5+xe7MkTmB6/NNV6KMAex1+Z p2i3757ypdPA55LqrOxfL6R2AtbtHu+6z/LNrs6d39LUWG1xu2RoXdbpt3lHWbT8Sviy vLp/b+qDGzBZvFCpgddMxuPtN1cgD5Ddc81MNCMWi4hUnmrPrEn8IILWs/cnHIAmYZnp xN51kPYezdenJ/EVLugsxbUCsiqWM4mzMMsq7pyLwbPyAH+A8Q2Cm4y+OhxBxxCVYmI9 s8ERAMagEM7uEC9t5C5NnmURsmxj0Dp8YjloE3+CZ0zfuf2ragsznxZN6bdZGJl+r+34 6tMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523779; x=1779128579; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=FUxO3ut9ObnZrS6XN2L4dCBHexksaIUiGR+LxlMcBuc=; b=RDzoMTEKeD+T4+WrjGs/fzYqxXMdHRC94t7JC59XcB06dDl0f3lltXcagdAEcdaRW5 19eAfU2PWzen+dWqggXhZDv9+9j4e+AKf3LCqOTWs0V39MFq2x18RJQaoKbOYCxf48i3 jexh/WOWtIb4Mo52bquQBTvBxgGqfu669UIwrVfWtub8cF/xBvN+gJJcbdsRtEaUUf7Y GQTEOd2kfFjdsH6h/GOTl3TzyW8TNl6bWFdAElxczxwWiG6WVnI32FlXKcuJ2+1DqWS+ 0LwjdtAX0lzyfAV6MtU/aDOU8E/ihTRM8F5XxExZz+oJpuogpmP1WVIDyHYBWNu83PDa OrXQ== X-Gm-Message-State: AOJu0YwGvNO9NHhy5fuRkEosn0VpPhz2AHTBxDxfDfP6wGTafCeTZXVq 8H5wu55vO8NAUETRSTollXkPww6c2wQzNgK2x7a1SIuUlHVQBEsdg5GX X-Gm-Gg: Acq92OHuN7+kbbbgee8j1af/QS38Teyeb71LzvrKge7F/CTyimEIxfv7qCb66YWnqw0 mhcH9UPkRGIo/JQwuJgVTL8IO/Ksuk47XQIAS3KR3g5VXqbWJvJZtnXojKEIP1w1QynH/KWsu4I ANQFOtV+zsCNjGSzOgybq6AyjjDVH8WhErlYHH9p3COs5Hgex/pa5LwpXCLn2Ayuk8xq8j2FnsC 9JqZTyjbH20Q7/U1Gu9jrdYomF3ljN6QnQdSRre6n1eS++Ydu9k7sO7lHCUuGpqHU4EtsKMUW7w efLPyjUKJmRrdgKTipdqvRRUALfePtmFHLU/LvEFuP+ZUTdjVuAQpJlivSrPiqampr4DLu7QWOO r78I7RjNtPkuAXAbxC6VOgTqYd+COLe4r8T+D/mC/WvTLWT6Iwwu5ZF06fV1EQsQ2DnIfXWRUyG okS4druN7aIAjc5QuROKYRBl0q6E1E9M8TrFaiEQGaNU4CloRyOMo05KLuRCHOuOw2PYDUBuECD 1nYx3E0JFEefgmLsviMseeClpw+W9i3Ed7t1KBbou2rSmOQOGPAhL5CId/Y7k6ifrW+ X-Received: by 2002:a05:6830:921:b0:7d7:d615:3040 with SMTP id 46e09a7af769-7e1defe8469mr14955148a34.17.1778523778980; Mon, 11 May 2026 11:22:58 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:39 -0600 Subject: [PATCH v6 08/35] target/mips: add Octeon LBX instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-8-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32f; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523926271154100 LBX performs an indexed signed byte load from base + index and writes the sign-extended result to rd. Wire the existing indexed-load helper to MO_SB so Octeon user-mode binaries can use the signed byte variant alongside the existing LBUX path. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- Changes v2 -> v3: - Split LBX out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index a2bfd0751d..efb1a48b38 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -49,4 +49,5 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi LWX 011111 ..... ..... ..... 00000 001010 @lx LHX 011111 ..... ..... ..... 00100 001010 @lx LBUX 011111 ..... ..... ..... 00110 001010 @lx +LBX 011111 ..... ..... ..... 10110 001010 @lx LDX 011111 ..... ..... ..... 01000 001010 @lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 5497ddfb10..451737cda1 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -161,6 +161,7 @@ static bool trans_lx(DisasContext *ctx, arg_lx *a, MemO= p mop) return true; } =20 +TRANS(LBX, trans_lx, MO_SB); TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); TRANS(LWX, trans_lx, MO_SL); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523851; cv=none; d=zohomail.com; s=zohoarc; b=BcUZqg8XmA6zRpwyjbNrr+bDPT0Qt749Vi5I8hS5GSTsEcrvdR/deez5y30JXY9KU3ntWWYTX8sI4MFInHdXX9gmUoHgHMAC2mCBF322RPi6PcC7XGLHnR0uDo965Vg+QedM+ygCFLgf56WCf1MZ2WG2v7DCkt3CTBOC6lX9Nqg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523851; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4oy0U3XEsfWbYaF1iik522GRUy0oG3xJODsuybXn2yw=; b=Lk8zHy7azGytuQwWDoNarPPEzjL/l4uXDmywSEW0ZlCkoAlMQfUlmPTnNdeBce289r0hVQk286NW1+0imVm65TsUSuUlCu5nrn0ZAwWNZsYVowJkiOofhgDcmzQpGzcZq7iNXAI6436dEpjry+yuX1g80w0Azbmt6RKdGBqoiWk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523851967837.0796583380428; Mon, 11 May 2026 11:24:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004kt-9s; Mon, 11 May 2026 14:23:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHS-0004iQ-Fp for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:03 -0400 Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHQ-0002gn-Up for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:02 -0400 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7df05fc49e5so4527023a34.3 for ; Mon, 11 May 2026 11:23:00 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:22:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523780; x=1779128580; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4oy0U3XEsfWbYaF1iik522GRUy0oG3xJODsuybXn2yw=; b=a/J3BTnj/TsvLuA7mXfmcyaZxpBPQZpqIWORdTJjXpsU5WFcZ0tl+Ow4SHMqUL9CiD l2N4FxpmTwqlTVVBX1119ywhDRUWgg0Cbg+VH+gqRTqzvAyHOsv5FGimrnZ7LVMmC3Xs dSzeff/mXTF6n3olaYQ/ngnB98syGcXlVN+eMZXkGttWpYByhT7NYPqFMXrfHMRXS9fJ lUeQWp6aXsf/qJFj5a9wfH7mXAadzEC5Rb6amLrsom/7CnA3qxp+lOFldwaAWXqPeZIE XnzLHKJRBlUaFc/zjI7MtpE/OpLmmgL0AnkyfW/wac1G619lTCk3BO6hXzo8sZL2VKK6 Gwnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523780; x=1779128580; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4oy0U3XEsfWbYaF1iik522GRUy0oG3xJODsuybXn2yw=; b=e1B+DSbXcXvXJCmQQT+CA9rOUmVhVL5TZk9oTvXCFRRI8NSuVuRVlkGsMh6yUTqKIj pNlnXn9fSgilXhiGPGeJAjVmw5L5M3FX/rIOc60jl1GgkW+wLdm21VE4lS3PHD/uav6m vHZAF1SfMdkrkzDP8/Ili9Kuj9K/8UH7vhoRAIxLNzMcc99BwLq/XZF8NBrgUaP7F6zt SZnLfHRX2VNg4aZ3Gqi32++geBvvE8s3yH8U+1vr/1ZPp5tKE7UnCp19nCd/fQ2uT90s KKlas/ku9itNhh8iTEFqUamFtP4k5AZdpuyiQBjf0PliD/lUtzoXhEihBbnf/2iMw/i0 pspQ== X-Gm-Message-State: AOJu0YzHgbWEC9CW1lq6A+5GIAsMrgejwtNKUwhYbGQdJTiTlqfBz3xE nF3TDXp/3irBufS9DIut45p5aPeedym8FQcNDN47+k9ng+LSOUWIdRr3 X-Gm-Gg: Acq92OFXf4dJwCLjdmTITaNwMKYCD8SHk800bpnhB41H7KtVFWNx9tQYvn+TGmK1+87 vc48UQqYk8CVnfDbxqQwQbfOPNtTvceRx4OMUjm+1NBXnQcOsSZl/C5eiEfyCifglHqH+0SId+h aKLfO6wgXuSdzU89iqCq00oNt0pFK5ONchMQznBfXDWTlzmPnGJRzbAu5v0vGHFMyxRrWc97eCP foVo4Z6GqJ/pAbheEeJ0Jf19WVlBX1AEBvfecMo51aUA9N0n5kVSzZFCtQpnPil6scBKaeWs1oK xRw6ntz4tlQUXVD62Wsv8EX2R1ahIgVfHyU9dQLAJeE64xRuX6ecmNTueUGpISU7RLj3veqIrX2 /7FMrB476A5Mc3rYUDtvNFUADVOPqtiJ6t9FjnsUCPDsPe/YYD50qTM+82qfaImeCskPxp5mxFq 7fOwZNxhJRTdBXX2uROI7bxzjmH4XVEnHGKurd9qbLiI8y+T+ann23bT6u2Tj5b4hKn0L0PebIq rWyxYmV0LqSGibzsjxwKFBQTyzIpWtXTDyRNvFPgAbF11Jp06iYfe2XeWfIu8S1mBtp X-Received: by 2002:a05:6830:2656:b0:7e1:f7e9:327e with SMTP id 46e09a7af769-7e382157b1emr6645945a34.22.1778523779831; Mon, 11 May 2026 11:22:59 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:40 -0600 Subject: [PATCH v6 09/35] target/mips: add Octeon LHUX instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-9-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32d; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32d.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523852890154100 LHUX performs an indexed unsigned halfword load from base + index and zero-extends the result into rd. Add the decode entry and reuse the common indexed-load translator with MO_UW. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- Changes v2 -> v3: - Split LHUX out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index efb1a48b38..8a755075e8 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -48,6 +48,7 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi @lx ...... base:5 index:5 rd:5 ...... ..... &lx LWX 011111 ..... ..... ..... 00000 001010 @lx LHX 011111 ..... ..... ..... 00100 001010 @lx +LHUX 011111 ..... ..... ..... 10100 001010 @lx LBUX 011111 ..... ..... ..... 00110 001010 @lx LBX 011111 ..... ..... ..... 10110 001010 @lx LDX 011111 ..... ..... ..... 01000 001010 @lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 451737cda1..f897b42807 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -164,5 +164,6 @@ static bool trans_lx(DisasContext *ctx, arg_lx *a, MemO= p mop) TRANS(LBX, trans_lx, MO_SB); TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); +TRANS(LHUX, trans_lx, MO_UW); TRANS(LWX, trans_lx, MO_SL); TRANS(LDX, trans_lx, MO_UQ); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524068; cv=none; d=zohomail.com; s=zohoarc; b=HMThFcfAPjsBjX3C1hlygocA8ia9P3GkoPXGdK/LfIXlITooVR6xK82ltnM04REGxjNzSkeZ6p3KFqkolDPAdaTAhjUjBj/RuErvWZV7R6eufu2laVs6jLGzczE5vFalo0Ikq7f4agsfrG/dD/z8toW8AUicIk+xF8QZbpVr9yA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524068; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=epwzgyqWUwHcHcXE43xJX3o43C9OR5h/s86x93rUm6w=; b=oAs0jdaKmKQF6CsM+aFn910T1BuObFYQNIS0UpiJT7D01oobBFdT/iQuw1Zm3BD4BstIa+TC/Wm7Jb53Rt/NAGn+p2HXIM90/Uv+e540r3oVTIzcplscck5ZGh2cpst0mcLyG35l0nz5ZGsiTs4TysyIbK9NhN/RvfIKYXubA5g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524068442211.40699378373006; Mon, 11 May 2026 11:27:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHa-0004kS-Oo; Mon, 11 May 2026 14:23:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHT-0004iR-FX for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:03 -0400 Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHS-0002h3-0d for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:03 -0400 Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-7d55b97f358so3291376a34.3 for ; Mon, 11 May 2026 11:23:01 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523781; x=1779128581; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=epwzgyqWUwHcHcXE43xJX3o43C9OR5h/s86x93rUm6w=; b=SX7DP1RmvUQaRBhuwt/dr7oAN9rk5Kpt6SKNYjVT0Y4n7Fwy931Kv+ulpnACwTq9pw Qcckq+SmAyqCOw8/dXaJoIw5616LrQwP3ROQ7K5GF/Jca6FLNxidyLTOmUf62y+GK1VC KtdfVW5Ybi0LALbeJZsGqpEoccFgYg2ULOGpVn72cSCF4WfJ/LkoWGecA7V4LUxG4oOC ezYNLfrxCVCqv4SgK85TXNm+62ESg197Np3VAjbvR+iXrR1ccG9zZuB/BIgerndhWPGx 2t+UG8Xp19ys2K00tWUN6Xz9gK1YQuGozaWvHjZ2rF26WXaphPAvftFJrJpjX3swe2J3 3d3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523781; x=1779128581; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=epwzgyqWUwHcHcXE43xJX3o43C9OR5h/s86x93rUm6w=; b=eR2QHjkMEUVxXRviQNZHEujHm1UnHrXnybo8dgKhraD9eDvtvsEWV5clsst8SqyR3B AXB1bbwUxwlHRSpLxZ+cNyenYoYE2V/FISab79fxwwFJ4S5wY+hw2DVFU/VpLTuxtMv6 oocWrtNwppBLpKPNjEVBafoYINiii2lH7aUxDhpdCFHX2BEMpO3Xz0gQl+Kbrab/Qdfa gVbeQA73y8BhidASdNjCzjno5UzF+ENfTlwtUcbqsEYbgGtmZ6MrKYJL8FerQapEqTHc sL8NyV13G+Nnp7Z3+oFVKodaCF/UJzYt9XvHmh91ndVHwpzZVboSgp6IXxp8ZytXZTkY UlMg== X-Gm-Message-State: AOJu0Yzo7DoLQcqR0wBeUToc8lzpVJTB58I01vsBuTgx4br7FM0O3wZV j7zrOOOuvIxLYI5Zs0xdEZrvQxXkdMkpnoa4YMA0ukqucCxqHCEUzi6S X-Gm-Gg: Acq92OE7bZ7nMbO6GQMzGr6SJGRnU9of78lmL9BZfOzp5goB1TSi4tW9f4MTcFMV7MX pJJPVWCevGa+O9DCabNpbWxlchVi/Irycgbl7QQcgkd81w42sahXdDzfKZ2S1JwMNYDxAsW2tXG zyu1gPfdL691o/wyccSVKbNDlbmsycNzgE/d/PfL2FbyH3POOXdRJbxgfBQzp3wpUMNnQdFs6YZ mIqgi+YMjTDwIiHCDqQBYVdlZ1FeDch/+A6RqBmx1jFvWS6JCWN2pnQBLSJhHh/FGetQq64yh9G 3MLHPjcSmp10/ld7msybsGKUrwmd+26LgxDcPCkNXqJ/NIqArNGf2i3yFqUHGhI/uTr8lGKMIZ8 VnHS+v17wii+QqU9dm5RdyGOQz7VaUwJj/6+Z+ZwWQpCVBs4E8psP9bttdJ7F0rfP8h8XjQFvOz fR/PMJ+Jy1LqaKjzhB/EW+AQ+L3nKo803CRE5s3FCGwfekrbHnSBMk12+SC/l0k2wUe1kECw1H9 DTwf/+6vI6FZSOR38xPCj6ULbKkG0GonF+V3srEnx5HF3/tPW6t3r0mBbSqRMDhybdg X-Received: by 2002:a05:6830:6110:b0:7d7:e59c:80e6 with SMTP id 46e09a7af769-7e1def44dbbmr16041397a34.12.1778523780694; Mon, 11 May 2026 11:23:00 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:41 -0600 Subject: [PATCH v6 10/35] target/mips: add Octeon LWUX instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-10-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32a; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32a.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524071128154100 LWUX performs an indexed unsigned word load from base + index and zero-extends the result into rd. Add the decode entry and route it through the common indexed-load translator with MO_UL. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- Changes v2 -> v3: - Split LWUX out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 8a755075e8..db7d5f55f0 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -50,5 +50,6 @@ LWX 011111 ..... ..... ..... 00000 001010 @lx LHX 011111 ..... ..... ..... 00100 001010 @lx LHUX 011111 ..... ..... ..... 10100 001010 @lx LBUX 011111 ..... ..... ..... 00110 001010 @lx +LWUX 011111 ..... ..... ..... 10000 001010 @lx LBX 011111 ..... ..... ..... 10110 001010 @lx LDX 011111 ..... ..... ..... 01000 001010 @lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index f897b42807..401c4bd14b 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -166,4 +166,5 @@ TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); TRANS(LHUX, trans_lx, MO_UW); TRANS(LWX, trans_lx, MO_SL); +TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523813; cv=none; d=zohomail.com; s=zohoarc; b=OE5V0ODq+5+RaECfPpgjntBQuljnSPw335FhUNhEhN/kJfhgmbWUtJbEMdizA8twWuSjI0LwSJyYrzzqCcjqQqIgqNap2Ad+ahhDZhYp89inFXPYV7WY3IvApm/OYc4MRRaHme3qREzmYpSAvnSrgbtM6m+DUnQD6uiYd3h1nXA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523813; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HVPSObz67Q1en6kF68iPYdaoC41Rm329SBVIhXooLco=; b=WdgZNtrr4/58yWQDs49B3b6RVTb0OAYKXw9DRfV5VpbMy6BKcRGVYvr/RLt43JjRfbygTYvGcHYu6UAZqxZ4CkKucra//1Pz3TM6MOqv+tNy8obGmaHfZCWkYP5M1xjfrU6jsuielDOJHpM6JH81+0HcZJeI/I2b30B/9Mq5zkA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523813734737.4467315040243; Mon, 11 May 2026 11:23:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004l2-Mt; Mon, 11 May 2026 14:23:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHU-0004iu-W4 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:05 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHS-0002iw-RR for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:04 -0400 Received: by mail-ot1-x333.google.com with SMTP id 46e09a7af769-7dbec19732eso4288673a34.3 for ; Mon, 11 May 2026 11:23:02 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523782; x=1779128582; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=HVPSObz67Q1en6kF68iPYdaoC41Rm329SBVIhXooLco=; b=cKy3QeZVRd2KPkfcTyXgJy/wM7ypI3npHUkTvBuISkEOvf/ZKnb5sJ+k0z+Aa7mNbG vGJif+EOwd4hTYNVe9n2hpQJfGbQUHr+R+mraq0hK5KbnWV1VPh/tkSM/4rrldLHjsZ+ K5B3TDdIOvXJo5N003pVAtHxNCnUQprbCBdNWEI1NJpd3dliRYVef/+nymXwB5SfLyKe X9d/p07zWJjlLQcocveU05idZBCemcQI/3Lu/qW7fpHSf3RHIQ9byAUasovzL3YTaB0Q MgoPTXBEt41//d5juvTn+et+aD0XfcCazCM2Iu+4UASUx3v0wX+havzViSMENGzLlFZT ghOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523782; x=1779128582; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=HVPSObz67Q1en6kF68iPYdaoC41Rm329SBVIhXooLco=; b=PuZHEpsXfO/xarBbG4zckRwG3/936iYaZ9f6JgTiXFfHdoUk35bLyqIpDyWuAtP+xI TMIilXwa0r/VY2QH3h15lXnCf0Iv7gdbrV2oURniduzxoWxDmfbV/t3//B2dMs+JhakF KXl87kR6KI5dg7emF2TA6O1JJesCi70ACZBwggnyFdafYl24/12wKYaQk3MOxSX2DqjU tFD/519ajkA0fGZKrmVjwgrEiVbO8YCzCT0dQOIXZMQV3GqmJeiSZ7C/uf8b+snuFTZU 6h2phpJCFzbhEEuutllmQgfTZpvvEZTJ1xHfbAxk3e9TG7NJ8tDtK2tLsuhOARgXxCsN 3JjQ== X-Gm-Message-State: AOJu0Yw+ijxxmBlUIpzwN8WHFvFj0sM4bNOnE/3qyjnUAHfllqFGALWq z3xFZ4EB79NvbdxKyd1xbwnwQr6wjGXQuATKHeWuT3uRshCz6PlDW++y X-Gm-Gg: Acq92OEy4KOY+mIn/yWMN+35BVVRG3NQPdhFJOPNnIiGDR4oSflqvNa7lDcWseYzwjp 8+WLj9QoJTpxse6SMZajET1ykWxKNn6PYE3/7Ff3Lm2K9FCLBO0Kb8qJ0Z3aXYFIpO0FtASPis+ kwf8Tj+lfBp+QndM7LPr4xbVoVCZdJvxKpv3wQfU+sQz7SSNaTsNtTk/LKvZIxTsUiYF8oU+b1e UtKwfNqoQ8XEJXREaZEWC2/VGrhxjO6ikz59nbaY+Coaj4HcEHID9aOILEgUWi096BedVo3taQm gKPbiOkVn95bjBgb9+iKgbLcU5GKZ9VrVl7XJXklkueL/1Jz58EVurnrGkIZYqcQpxRKH0vW5/4 QEfv4wZ6HhEnk2fQn8xuBOUeSdcpEpLFMV+QKhzA5PuP8nc1BQ0AtXEcMhYKMOV1vubkms3vO4X 6kn2UvCxXAB37YTxxH8cvURBccPJ0tE8Gr/lXbG5jXHMtlUv/e/FkPNRwuqRZf70ATAUA5t+Jrh /n5YnZJJBjy0AgMjlHZh3QSkUfOygwZNyRGriOjZ6nz6N0D1R6FX0B5rBjLEggjrj/u X-Received: by 2002:a05:6830:82eb:b0:7dc:4a43:fb5c with SMTP id 46e09a7af769-7e1def1f614mr15669270a34.11.1778523781721; Mon, 11 May 2026 11:23:01 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:42 -0600 Subject: [PATCH v6 11/35] target/mips: add Octeon SAA instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-11-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::333; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x333.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523815398158500 SAA atomically adds rt to the naturally aligned 32-bit word at base and discards the old memory value. Implement the common SAA/SAAD translator with TCG atomic_fetch_add_i64. The MemOp selects the word or doubleword transaction size. QEMU only has one Octeon CPU model today, so keep SAA/SAAD under the existing Octeon instruction feature bucket instead of adding a finer-grained Octeon+ feature bit. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split SAA out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Gate SAA/SAAD behind an Octeon+ feature bit. (reported by Richard Henderson) - Use the i64 TCG atomic add path for both word and doubleword sizes. (suggested by Richard Henderson) Changes v4 -> v5: - Drop the separate Octeon+ feature bit; QEMU only has one Octeon CPU model today. (comment by Richard Henderson) --- target/mips/tcg/octeon.decode | 4 ++++ target/mips/tcg/octeon_translate.c | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index db7d5f55f0..d6b241de42 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -44,6 +44,10 @@ SNE 011100 ..... ..... ..... 00000 101011 @r3 SEQI 011100 rs:5 rt:5 imm:s10 101110 &cmpi SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi =20 +&saa base rt +@saa ...... base:5 rt:5 ................ &saa +SAA 011100 ..... ..... 00000 00000 011000 @saa + &lx base index rd @lx ...... base:5 index:5 rd:5 ...... ..... &lx LWX 011111 ..... ..... ..... 00000 001010 @lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 401c4bd14b..441d71d57b 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -161,6 +161,20 @@ static bool trans_lx(DisasContext *ctx, arg_lx *a, Mem= Op mop) return true; } =20 +static bool trans_saa(DisasContext *ctx, arg_saa *a, MemOp mop) +{ + TCGv_i64 addr =3D tcg_temp_new_i64(); + TCGv_i64 value =3D tcg_temp_new_i64(); + TCGv_i64 old =3D tcg_temp_new_i64(); + MemOp amo =3D mo_endian(ctx) | mop | MO_ALIGN; + + gen_base_offset_addr(ctx, addr, a->base, 0); + gen_load_gpr(value, a->rt); + tcg_gen_atomic_fetch_add_i64(old, addr, value, ctx->mem_idx, amo); + return true; +} + +TRANS(SAA, trans_saa, MO_UL); TRANS(LBX, trans_lx, MO_SB); TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523999; cv=none; d=zohomail.com; s=zohoarc; b=Ds2woRYIy3U+Y5FLzI7FC9VOjmTgvY39GzzWK5DAHvOuZYlePnUN8WrXWM1RUBKVXPo3H+mvKRs/Sp/zQAlcktzfuu4k6sOSoZ8MwF5P2c8rvYbNF+l9V3catnYdeEXF7FLhgiAh1hcrR9ptlocgC8bvCO9UiKsQ4sk0wY2rxJ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523999; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qxf2VIGh8FXF2BrFMNAX2p8LvMxCEZUgp42x3jY4KfQ=; b=Srjy067RpT8MlaAkuTfiI9MyhtJt9ApKaBiXm8tD+51mGV3n+qj9MZQQ/qzFQEkyB8woWk9NfDrbrUoBYoXZx6ZBqohvkoVQ90HhXP1D28TbtqT2Df8ygMhbYErB92dHdR0dTVpds/H2kIpHu3dY9Mm62TG1+qEKA+JTATXzF68= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523999347987.2595435281534; Mon, 11 May 2026 11:26:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI6-0005LD-DY; Mon, 11 May 2026 14:23:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHW-0004j4-6H for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:07 -0400 Received: from mail-ot1-x329.google.com ([2607:f8b0:4864:20::329]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHU-0002kz-Og for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:05 -0400 Received: by mail-ot1-x329.google.com with SMTP id 46e09a7af769-7dea20cf21aso4304627a34.1 for ; Mon, 11 May 2026 11:23:03 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523782; x=1779128582; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qxf2VIGh8FXF2BrFMNAX2p8LvMxCEZUgp42x3jY4KfQ=; b=fbJdW7Q6DqXGD54hx2+gQckGflE+I6/PwEbI4R5NJ9fHJK6RVqmzMfMTfyxFq/ppzO NzdEZ8OIIrIdptWOGlwrIwDmo7gZcG2Mvq3TjnYH9asR46/yoTFOi0XEmpe56ltPhfir 5DBl73MK3yUQMlrSsM0KrSR4PIoEyxqJPT0wlYuwU2CZHX4IlRF5fr0IngROqOyeyLEW QtqL5JdLvm96tMy1EdSOqfg55yk+/9LCvgXs6f1ZHtK+XXYHfIN1S9nCzMoQRPGJmdFF F5SZcAqJa7m8HlC5N13duUTHcMiEVpSoHzFMciPxfHMSH2u/WL8B2c7QVFhWqUDhZxBe g0Gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523782; x=1779128582; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=qxf2VIGh8FXF2BrFMNAX2p8LvMxCEZUgp42x3jY4KfQ=; b=gPnipLsqws1KUeddw+a6ewH8wB09LPQFXs3cUYZO8LvhMXKePIjiiIQydMMHe5ROeN KjsIm+BCQ+/QOKiKCzntkxZOzn7iBbTv4T447polJncOLldbJgA7+zjeHCM4hhlT7vzc vrOVTXe67EA6Rl/N8MqTzxKyvsFOnnEIwESyprS5t2kmU2ApWrOAkbvyR1MH9ZzjDHfn NdBIx7F5iX+IfaVbQ2KNFx0JFNB37GRQGQPvjjwIoBPVmVQf2/gWrGi/C2HpsVI27iUs NlohKUE86ZsF6EQiXkh5p/PZ+zt9hieUlv/DlGnviIc89SYccQ0osbEq+LcKbEzQBDKi uTWg== X-Gm-Message-State: AOJu0Yx4wHvrVeEJ1XilO/JYa4cgqILUd10rKx6A92Fa4LolRY9c6nhx itxxKybScWc9vJ1JrdynAjg9EoYykdbNdnhlYaJj4/tkReygBTeu1YSH X-Gm-Gg: Acq92OH685bIt7WaeuS7/cUlz8TcJyGGtNcCb1NMyyZ/WYpDW9NjDuzljAfC1zztH61 UrDY+XrBnL6Rbm2R2I3PYXY1eByUt2vJceTCwzDJ/6oXqndBw1W472defwx8pe+lhMJwYGNWfX1 9T8qyeBGXD1YpBiiVscXky55CV0LqYiWjr/v74wdDQXDKMpaCCue6prhcv9GvBRWM0YfQyzDR5y kqSI944CLWh0cx20wRAvgaeXc8SdV36knLmD/eSqUQHFfJWyjKf9FSSIUiy1msLB7ai98zz3ZiB xKd0DMp5Fr2CPhCSdaDG0wmjJ4t/Y9/1B+t48hKx0q7xOr+Qe36hyHbKfYGmhC3gt006EYtLkJ3 SGyq+676A0meXElu2AgfZ7OyPhwgPtD4iEjfuBTybrRQ1NalARK3b6VdlQVh/sCa/F0Zn7N+gAC UWrZfRMgrKfiWhpvxVLyWTxjQdy2SpfBnIBGMk2p6MfOJKZGkWqhH6tQGjMKeX5PBchlBDGNoZ7 FqesPGlUMJxjAXCrzIQ13i16SuATeCQdxtcZHJuXfxeFhFxtf/YJtctgEOof9GyC5xg X-Received: by 2002:a05:6830:3894:b0:7de:4f6b:9e10 with SMTP id 46e09a7af769-7e1dea53c38mr15836472a34.0.1778523782583; Mon, 11 May 2026 11:23:02 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:43 -0600 Subject: [PATCH v6 12/35] target/mips: add Octeon SAAD instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-12-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::329; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x329.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524001779154100 SAAD is the doubleword form of SAA: it atomically adds rt to the naturally aligned 64-bit doubleword at base and discards the old memory value. Route it through the common SAA/SAAD translator so the MemOp selects the aligned doubleword transaction size. Reviewed-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split SAAD out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Note that SAAD shares the Octeon+ gated SAA translator path. Changes v4 -> v5: - Drop the Octeon+ gated wording/path and keep SAAD under the existing Octeon feature bucket. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index d6b241de42..d77717cd50 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -47,6 +47,7 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi &saa base rt @saa ...... base:5 rt:5 ................ &saa SAA 011100 ..... ..... 00000 00000 011000 @saa +SAAD 011100 ..... ..... 00000 00000 011001 @saa =20 &lx base index rd @lx ...... base:5 index:5 rd:5 ...... ..... &lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 441d71d57b..daeaf07072 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -175,6 +175,7 @@ static bool trans_saa(DisasContext *ctx, arg_saa *a, Me= mOp mop) } =20 TRANS(SAA, trans_saa, MO_UL); +TRANS(SAAD, trans_saa, MO_UQ); TRANS(LBX, trans_lx, MO_SB); TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523893; cv=none; d=zohomail.com; s=zohoarc; b=m6Zm6a7xS3qHAYYueqkOlR4khfkuEWK98qdc+CUXnCZVdpfJ+fpyvc2C/th1o462rK8F5TWl/i3nfJWYKJzczWVEsMo+6bDUJJIyZw3H/rIYL5SSwkLmC3NjmoW/Y3im2KJyODimSkqmQpSmoKmAY/DydVf/XYuDkVFaf+opEI4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523893; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7LYD0+Gj4tjwx40OlV9ysdQpDSTlLZUgQ3DQLRj+lFM=; b=OiFZq7AGDJrcUWqlt4Hs5zbZ3VQJcHyU7iI/CoRbBbC6FLn0/MsGNqJVhJAGSZn/vu0pQNVGC6g4RBMWiU4IaXXJtmaN4GHzxv5IOfSx6d5F7K+f3FGBs4NnKS8YD9cGA8rVWgupb2MeOGFlcaRMwvXcHHsfS380Hpz+GjYHEL4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523893336658.0758259943213; Mon, 11 May 2026 11:24:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004ku-A8; Mon, 11 May 2026 14:23:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHW-0004jB-FK for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:07 -0400 Received: from mail-ot1-x330.google.com ([2607:f8b0:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHV-0002n5-1h for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:06 -0400 Received: by mail-ot1-x330.google.com with SMTP id 46e09a7af769-7dcdaf06498so3253013a34.2 for ; Mon, 11 May 2026 11:23:04 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523784; x=1779128584; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7LYD0+Gj4tjwx40OlV9ysdQpDSTlLZUgQ3DQLRj+lFM=; b=rtSzyG10JSMMzs9UDOMkQUKi31WdCiFIEUfhuWtCJ1yw1GgSTbDI1aqw0YxB9Ryhcs aI3KFs4INoi7q7fnzAmbVImlymyJQjOQcHtRNqkSxcR8D/1rBKGIRlma5Jss2/Z5YgLc 03xQs0hB+cOfZiM1oVfyn6owd6irsllB7F753w+EzsZKHRUCcMyVx53ocbDfjFjWeTJ7 Mqb8JIQ23HmiUQs8NjQ38hMtsjXQlbEVYmtIrx7TYTFMKXaC10Tv+RvsZJQQMWL8gNzR NNP6+aQXtoiyd3civxEsItggh0nC2NY+/05mVri2Zt//dPHP3i+ClBkGlmuPZiAvE/YX nQuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523784; x=1779128584; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=7LYD0+Gj4tjwx40OlV9ysdQpDSTlLZUgQ3DQLRj+lFM=; b=gtoeMS0GJwRJ6vKehtuTCJL7OHKcEQjrl66x7qVvQgDzMRH020D3P7Sk1MhcDyL686 DMqKdYALImzEr/gaetey6R1FjnSNnJ4wqjwGCaahf8EHrLMZ8uCp6YVCvDxsnaPNdhSQ Zm7DvUCCyjNyEGCjhLUNC2BywI7DfUiAxTn2PU6pVa0ccAp0hvP9xnTc526O5WuxGMW0 +uULvCjCiRNSldCOmh8V9H7opLjg83hu28JTvJc9M8Ul49gGHQP716u1kPvfHOPeYxWe KnPIBB6r0LEgTFTEPm4zxLxVp188DqmMN/YgpLatFxeSJlIZp+Uk/1rvFGxBgVBot12c Y0Yg== X-Gm-Message-State: AOJu0Yzy6ncWuiBsXohNg5TlzYy+2FC3bD8JY7LFWPD6zKRLtiWnlBZu ntBHsjC0XO0xjGC+pwaTIcOBybxjWeEe3Silz21osY5p/u/P+4RIHnO1 X-Gm-Gg: Acq92OGe9+BKfWkJGaK6qLkzPE6bIcJe8ExPK1lnPll6Flr1lQVvM4BzEt7+K3W/1Pg iyGrahQxlUeDkGq5fEIOSQcQC5v+oM3ZWQnuadEZVZyz7ZYxqibbB6HYv1mEQSYMyG0eCqe4ZZy /vUF3tbhSGIVZSQj9mqLwJMKS2l2Ep3wcsNb5toYvI/mrDGJcjil5DbyfUSE9PMvDdkaqQa3+Bg 01QwVgGiR1S8gvt8kkWG1hYHfrbWCq0kMRjed8tOGb+X98uhbee+ugHYCm8gNXH5t0tWGlmYQU3 GmAt7EkMpKzGU6KpC43AyDt3UimNC3JK4roI3SqX21EZiNJPqvCQxS8/xKD6m3oggKiFBbeEG6C dbUEaWMz64dPsUPuch2vWBJicsPs1ghvrD7cFtx/1SZ5ypDKsF4er2Iq7Zzh3i9z7H5/6pEPsuS 7wCUfnAX8fmgcOJmfgKDEiAJY35ES5PvuRJdjwUb+9xV6wzkM6i/zEW10TX1C7X2wZYaeqsrkNd ZdIcJYthDG561DPd0SmlEgMRbxSpyNMa8gCmEFJfR7uC6Yz0RMvesZk00T87RORZYQt X-Received: by 2002:a05:6830:8089:b0:7e3:7f84:4cf9 with SMTP id 46e09a7af769-7e37f8497bamr5291204a34.11.1778523783941; Mon, 11 May 2026 11:23:03 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:44 -0600 Subject: [PATCH v6 13/35] target/mips: add Octeon ZCB instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-13-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::330; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x330.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523895636154100 ZCB zeros the 128-byte cache block containing the base address. Model the user-mode-visible effect by aligning the address down to a 128-byte line and storing sixteen zero doublewords to guest memory. Acked-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split ZCB out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) --- target/mips/tcg/octeon.decode | 3 +++ target/mips/tcg/octeon_translate.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index d77717cd50..d8a1bfce77 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -49,6 +49,9 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi SAA 011100 ..... ..... 00000 00000 011000 @saa SAAD 011100 ..... ..... 00000 00000 011001 @saa =20 +&zcb base +ZCB 011100 base:5 00000 00000 11100 011111 &zcb + &lx base index rd @lx ...... base:5 index:5 rd:5 ...... ..... &lx LWX 011111 ..... ..... ..... 00000 001010 @lx diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index daeaf07072..75b28c4338 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -174,6 +174,30 @@ static bool trans_saa(DisasContext *ctx, arg_saa *a, M= emOp mop) return true; } =20 +static bool trans_ZCB(DisasContext *ctx, arg_ZCB *a) +{ + TCGv_i64 addr =3D tcg_temp_new_i64(); + TCGv_i64 line =3D tcg_temp_new_i64(); + TCGv_i64 zero =3D tcg_constant_i64(0); + + gen_base_offset_addr(ctx, addr, a->base, 0); + + /* + * QEMU models ZCB/ZCBT as zeroing the containing 128-byte cache line + * in guest memory. + */ + tcg_gen_andi_i64(line, addr, ~0x7fULL); + + for (int i =3D 0; i < 16; i++) { + TCGv_i64 slot =3D tcg_temp_new_i64(); + + tcg_gen_addi_i64(slot, line, i * 8); + tcg_gen_qemu_st_i64(zero, slot, ctx->mem_idx, mo_endian(ctx) | MO_= UQ); + } + + return true; +} + TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); TRANS(LBX, trans_lx, MO_SB); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523896; cv=none; d=zohomail.com; s=zohoarc; b=M2YXBTGMQQRuCCJBMznkA0kgiqk84oqSWmQwgmEUfcZcodpjeYmOlmRcjgvEG/UQK7IrN6Zcl9X3/8JAscZZE7RHspFddmSx2X9ml+UCyJjWigNai+gcWcA423DeqgIxaO0Ipe+GqtxqEsXNb5oaoNhZjWun5CRc/meqnjqsl4A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523896; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4IK85PPMBI2youTGdlMjIY8YEP9i5/O2uDLfdpbX004=; b=jmp9EyIdzVhRpVXAbScddV/XWhfhK4NtCccp8bIrk1SkLLq98MddhbjYc+7NpRBXho313su+KVdnWc1nZ/UR+5Ox2T09GjfKTbH4iTyurmr/QYQbE9FffFXfkcUaH3dCEH5UHQjKKycTW95j1XW+kdvr80V2c8GvfQsq8W2zsf4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852389698028.834234441797093; Mon, 11 May 2026 11:24:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVHb-0004ki-Ld; Mon, 11 May 2026 14:23:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHX-0004jD-7M for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:08 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHV-0002nl-T5 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:06 -0400 Received: by mail-ot1-x333.google.com with SMTP id 46e09a7af769-7de44ed7a11so3692075a34.1 for ; Mon, 11 May 2026 11:23:05 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523785; x=1779128585; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4IK85PPMBI2youTGdlMjIY8YEP9i5/O2uDLfdpbX004=; b=MfQM7FSOPwKJlRWnWS3gHDzpphhEZlK+G7eziWMLL6/pUNVgQBPj+uoS9ryulNkbBz FyhrTY3gBavEu8YJakgMTlTxNAxOHmLWyxx91L+OvYQ3IY45SzYcnm7Gs1N/08s3v0Sk PAV6KbTZ+KMnbTZtkEZsdtH3Zd8DoT6ktbtWjmaVMG2PVs3clzQVYlGyvMJ5UeWcbuqE +11XKc1jCjgOJjk+MEq64gK72xSskPnkRQDYNrHY3atMumXXBlFREMqkChjwfUuH8HIQ XnhLYIFli/VR1zqKPe1jvHov25qbMt8vtGo8KxieS0Ho0BODq/KWg3H0fkws1IDHFrOL 3DDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523785; x=1779128585; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4IK85PPMBI2youTGdlMjIY8YEP9i5/O2uDLfdpbX004=; b=NxZ3N+RucL7YUBjVjjWzXjHlXSTtYmz7UDAzrbvy0H6EM5hXa08CqbOcHA3rpl/GV5 J+mEUJop607jnv91s7SpZbaot/oagB6NCgx09eWdnk9FDn5YXtsyBoVlEc3dhlvTg9Ld Lt+IkChY3cCVALmA0Z1sv8Y4/T/SkBXf48dPrmemf5ovk6Jvit3Po2HqL1oDMcMpBZl8 lY+m/OgaCzwQCn0n7RZtUodwiKT1jxxrTpRGGZnoICCzVBiw+Syi08OaScpcNLIkaz9d PiBIkTvLWi5aXVdbnpilzcUoCSDLHe9z5S4gLj6Aw05aZG/W9Y+1+W3APA9ei681FwSE QaKQ== X-Gm-Message-State: AOJu0Yxh3zFdepe0OUS1QtExj0opihIxBHWUdmR+R1mRkF3PcsxGpqHo 7wnwl7glJoYaM8qg5rMI24+aWTWSDSuOlOpX1CYeIqU+6ToQAugNFmZM X-Gm-Gg: Acq92OFTi5Q5cCpFySxpQntv/Ndrxjm4ufbsIOtEX9vop7zkhdsap5czB1zLPCD6FU4 xToA0Dg3cmUYCLqQLGLgIUZvZRRLJTI+L/cSHBkEMB6syB1aCZVliMg8M+Ux1YWHRZWzSsAvaoX yiLFfaFkXEU/vqpal16Rnk4F6O26LmfGHBU0SgMiIQf8oMKegD3MVJwl0rvXNT7dHjbKgS5UXyj Xwk0GarhKs5mGYxCsP6m2dFCR8n6eHBblahH0tL00Y01DOxcbLhABMyU2XG8Grj3n5vVt/wPBOk c/vQqPy4guOjNwk46BCvnBjAKOL1tL44QuwJh0pVjZGB21Y/e/5Bp+1GYYhVoBoKBgO6cjm1MYs /zd1GkcAq75YChq73o/+xhaqph5BSJVvUizU7z+7jX1EV4tg0jWRnR8V8qWxKQVD5VqFtLfSLcq 24jbLUQE0qpYhVeaDpphNndkOfFp1ojnjo0mZqfmcIXZbWELYOSo8Wfd09Pptt+uWwsZNOzKwH/ /RvYoja4ImARCTSoN0g8iELhHnYk3F09vO5bXeRVv/5iaqRK4SqBuwOA0hlj9sdkP8+wzdD8WxY jLw= X-Received: by 2002:a05:6830:608b:b0:7d7:58b0:7685 with SMTP id 46e09a7af769-7e3666ccc61mr9384420a34.13.1778523784773; Mon, 11 May 2026 11:23:04 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:45 -0600 Subject: [PATCH v6 14/35] target/mips: add Octeon ZCBT instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-14-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard , Richard Henderson X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::333; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x333.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523897913158500 ZCBT has the same user-mode memory effect as ZCB for QEMU's purposes. Reuse the ZCB translator so both cache-block-zero forms clear the containing 128-byte line. Acked-by: Richard Henderson Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split ZCBT out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v4 -> v5: - Fold ZCBT into the ZCB decodetree entry with a selector comment instead of adding a separate translator thunk. (suggested by Richard Henderson) --- target/mips/tcg/octeon.decode | 1 + 1 file changed, 1 insertion(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index d8a1bfce77..5377f7b3ef 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -51,6 +51,7 @@ SAAD 011100 ..... ..... 00000 00000 011001 @saa =20 &zcb base ZCB 011100 base:5 00000 00000 11100 011111 &zcb +ZCB 011100 base:5 00000 00000 11101 011111 &zcb # ZCBT =20 &lx base index rd @lx ...... base:5 index:5 rd:5 ...... ..... &lx --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523937; cv=none; d=zohomail.com; s=zohoarc; b=jFN5YPgjiQ1dHmOdxnMAfh6tIqxswyIK7cK7mTNDcDFVBhhnha1kjNHZI2SOyJz3Ic2uXSzHip0OIjlraycZEkUK3VXCTKHDaALrzKnsufA1S9y6uhZWNZnPn6FoI7Vc5aQtVzLaOQUH3yMsimtRX+HuGkePVIFla1Xe7mZjqI0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523937; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=T69P05u80FP16DZG5zP8y7vdBjPqc7mC4DbwV5goiCM=; b=l0CUlPLVBEJBkSasNa4uLMI5+oBarynu4Vhj0VuaISdC2MuYoRmm907XrWVbEfJYALpfHDNGDVC9UwY3f52azBo9VSyYfonzhZy3XC/o4vuCW42oX8/XKl2CIbFJ4tNjTZ2xQx87q+SnbiN+KVMG9TbpzZVCaj1ClZ4Qg1Ps9GM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523937531570.6976648764527; Mon, 11 May 2026 11:25:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI5-0005Ez-0N; Mon, 11 May 2026 14:23:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHY-0004jl-TS for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:09 -0400 Received: from mail-ot1-x335.google.com ([2607:f8b0:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHW-0002pm-SZ for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:08 -0400 Received: by mail-ot1-x335.google.com with SMTP id 46e09a7af769-7dccb8644c4so2422282a34.0 for ; Mon, 11 May 2026 11:23:06 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523786; x=1779128586; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=T69P05u80FP16DZG5zP8y7vdBjPqc7mC4DbwV5goiCM=; b=qku1VJP4WkkRD9cuMe645qJkL2DPFfoHYO1XbucyxsxIKZ7CWLu5c8BriHu8BadYpf /an36RVjOMxujtAQZNlJrT1W9LNA+kymuqN3QhnaBeGNHfixSEyLhiIkC+5wHG789Kxl VA3xKEFUNVXM5R/K4+NtnmgVGDY+lWSTTwld9ggpSQd2nFGMH9sMkivWwK0qvIQQnfhw kF7y2Y/5dRNF1BocgH50ogCGp6a37Ox7XEBgbn6GHasa5Ulcc1IskX57JLeUNBMczHfm FdWY7XZjcL0GvLQfjo78kwucfL0E2/wqVr4+lJfFEXM7eXf0UV/vhjcb5YWT2WD/GXsw jSMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523786; x=1779128586; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=T69P05u80FP16DZG5zP8y7vdBjPqc7mC4DbwV5goiCM=; b=D4h9zS3DT0Eyw8QKvrIn5r+u9ruB99ZeoqQLKfx0XIPhhLbg9IrFhXVIlLP98g+lJ3 gY98zb5MOYeji1CD7WaOG2jrJXA9cvkfPLD1Er6ZDHRm4t8GKTSFtB0+29Q94/CSH6XS IqwnYEGY4lf/RMlhKAgmFss8DtlV5u9piyEjR2FlhirJIisz2h8eT4+l4MauRqN3V0zC CkRSfE2V8B/DJpnhQUj+qEi/vM+X/wogcEBn2kpw4oMCCb5OuJQ4s7gIlTb+L03jlq6E Z7fYxSY1r822VLxzXzYZzhZ/axO1VADbAzyE7+9KiuPByzNURecI1T5MLfFHo9XboBlF aeQg== X-Gm-Message-State: AOJu0YztKRqbueQVcLOYfRhJEyJoGHio0nD/e9CopvOE8SWdKiMIcTTr iKYNlb5lI25ibhR4Qe1l5tclJ4pFKLcUaOtjWisb5mZcGDh1J6T57IGh X-Gm-Gg: Acq92OE84hxWiD0AWezcW8K4IfNXOeAGUemAfC9c2OE1zoOGs6Z1/HJewvolC40GBi6 vqIEWUOH/iYVfsu4GcFLp0gqmxxIyXvj5yEk+esE5PChdR1kGe3mYWGCsaMiGuWFCdOwHKbUlmF pjyXY3iRFmTDHVwF+D3AtUUEJyDQnKaT0r0e+ayqRsxnIZtpipfCP1KZnfhRncL0Yp644SQjYUA kVh4GdjvTwJi0+gSpBBOmqGi9h329j8l2APqdYOBhnIv7ogWqpj5h3SlthSUDEkBls0oqYCp1EI mMmHny3sdHf3+oXPT1X2DGRJ0UaFPYjvJ23Vr1a20Ts+l57l06JA3RcQR+/X3sPZiNPisvedwkB BL8+X0OQil+YFaS4oL+rzdefp1nSFAkIq/DIbFiZW51busalSGbXGVFvDGBdB/uLiEb0FNdPNML 5Kk6BR1nuy4bSm4FnqVpzMcdEdreaH+98fT4KqoG+CEDvIe1Gj/IPzAAPvTGGmyvc/Ln3KGDpJK Z2Y2WlUl9YfDBsP8SXNmsBREWH/SZ455q64h0ApC8su235t71y1lZNNqU4Qu6A9S+n5 X-Received: by 2002:a05:6830:6a13:b0:7de:84b5:88e3 with SMTP id 46e09a7af769-7e1def6b71dmr15036681a34.8.1778523785782; Mon, 11 May 2026 11:23:05 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:46 -0600 Subject: [PATCH v6 15/35] target/mips: add Octeon MTM0 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-15-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::335; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x335.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523938577154100 MTM0 loads the low Octeon3 multiplier operand pair from rs/rt into MPL[0] and MPL[3], starts a new multiplier chain, sets MPL[1] to zero, and resets partial products. Model the architecturally unpredictable MPL[2], MPL[4], and MPL[5] lanes as zero for deterministic emulation. Legacy single-source encodings have rt encoded as $zero, so the same translator path also preserves the older Octeon behavior. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTM0 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Keep the Octeon3 two-source rt high-lane operand and document that legacy one-source MTM encodings use rt =3D=3D $zero. Changes v5 -> v6: - Clarify the CN71XX-defined MPL1 zeroing and the modeled-zero unpredictable MPL lanes. --- target/mips/tcg/octeon.decode | 2 ++ target/mips/tcg/octeon_translate.c | 57 ++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 59 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 5377f7b3ef..bf1dab61e1 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -43,6 +43,8 @@ SEQ 011100 ..... ..... ..... 00000 101010 @r3 SNE 011100 ..... ..... ..... 00000 101011 @r3 SEQI 011100 rs:5 rt:5 imm:s10 101110 &cmpi SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi +&r2 rs rt +MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 75b28c4338..4507f8a5bc 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -198,6 +198,62 @@ static bool trans_ZCB(DisasContext *ctx, arg_ZCB *a) return true; } =20 +static void octeon_store_mpl(unsigned int index, TCGv_i64 value) +{ + tcg_gen_st_i64(value, tcg_env, + offsetof(CPUMIPSState, active_tc.octeon.MPL) + + index * sizeof(uint64_t)); +} + +static void octeon_store_p(unsigned int index, TCGv_i64 value) +{ + tcg_gen_st_i64(value, tcg_env, + offsetof(CPUMIPSState, active_tc.octeon.P) + + index * sizeof(uint64_t)); +} + +static void octeon_zero_partial_product_state(void) +{ + TCGv_i64 zero =3D tcg_constant_i64(0); + + for (int i =3D 0; i < OCTEON_MULTIPLIER_REGS; i++) { + octeon_store_p(i, zero); + } +} + +static void octeon_reset_mtm0_mpl_state(void) +{ + TCGv_i64 zero =3D tcg_constant_i64(0); + + /* + * MTM0 defines MPL1 as zero; model the architecturally unpredictable + * MPL2/MPL4/MPL5 lanes as zero for deterministic emulation. + */ + octeon_store_mpl(1, zero); + octeon_store_mpl(2, zero); + octeon_store_mpl(4, zero); + octeon_store_mpl(5, zero); +} + +static bool trans_mtm(DisasContext *ctx, arg_r2 *a, unsigned int index) +{ + TCGv_i64 value =3D tcg_temp_new_i64(); + + /* + * Octeon3 two-source MTM forms load lane index from rs and lane index= + 3 + * from rt. Legacy one-source forms encode rt as $zero. + */ + gen_load_gpr(value, a->rs); + octeon_store_mpl(index, value); + gen_load_gpr(value, a->rt); + octeon_store_mpl(index + 3, value); + if (index =3D=3D 0) { + octeon_reset_mtm0_mpl_state(); + } + octeon_zero_partial_product_state(); + return true; +} + TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); TRANS(LBX, trans_lx, MO_SB); @@ -207,3 +263,4 @@ TRANS(LHUX, trans_lx, MO_UW); TRANS(LWX, trans_lx, MO_SL); TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); +TRANS(MTM0, trans_mtm, 0); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523834; cv=none; d=zohomail.com; s=zohoarc; b=KPIgGx82wMgJL5RsmlgBh7F6Vntaec5DG3CsF59/b2qQt+paZVA/6ck7mW+ABChA1IdBHsfdmkDoAPlUyvIku9XkajiSHB9jXz3ylFhiDBVS34DjMizm3L7xIjlmdhXE9G7/NmDmnWwbyHmQ6WD8XGxqw9TThxxSz3bBVzUZv4w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523834; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WB5qg6ChXWvMZr4p7egqKDXfNM6iJU7r7xKUy1R3WFY=; b=MdeFNuvXklutpUHCuatYN6R4TuEqi+2W7d+qShQtooUekzXGnT8eDZqcKat2SYAlmN37AWvW38HR0Tati8dfGtGdYAbiCrhOcGTVVJE9V39r+rpknpKIGXrrUXZyPYUdrlOdJpNyxXlsAz8thVpEY9v2+mrmUeobTZmCuNIhGkw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523834019666.4825890804779; Mon, 11 May 2026 11:23:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI6-0005LN-FF; Mon, 11 May 2026 14:23:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHZ-0004k2-Ia for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:09 -0400 Received: from mail-ot1-x335.google.com ([2607:f8b0:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHX-0002s6-Q2 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:09 -0400 Received: by mail-ot1-x335.google.com with SMTP id 46e09a7af769-7dbd23bc684so2748717a34.2 for ; Mon, 11 May 2026 11:23:07 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523787; x=1779128587; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=WB5qg6ChXWvMZr4p7egqKDXfNM6iJU7r7xKUy1R3WFY=; b=HZx0nQAj/aVjCQnz8quuqGgpl3i9by4TN7XANTijS4joKVicl8k4tptSmFLu1j8Ic2 U4knMWIiqQmIRHxsDyL6eueSuZzN61Be1RCUnPUc7wCD7auDgPqw1bWb/O2QOgjt+UCq V1diPNPYfR8OALLHV2pHFkfojdsD3InF474vefV9OBzPUCG/idIfRM5AogHZDnbr6wlR n4bhK7Temr0Kt0A32eHiCfVU7M0D0cRGNIWp7cR4nIKDJde76DXorWJtKfY3Z8bTRSde Nqxnvgy3+vlCBDLhM2tpGPKihuHYyVT62WJ+x4wDbRyc5VMdv4z1vIZU0FWU11bc3wBN /wiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523787; x=1779128587; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=WB5qg6ChXWvMZr4p7egqKDXfNM6iJU7r7xKUy1R3WFY=; b=kv2H3vF+H3+mit60YZSH/RBAjkUjl67v+eBzPEqy/+jq/FGJKdzyXEwOn87qpZFILW 4Ymg0odvJJM4UxFwZfsRPx1j6RSEq+MczjgsSvNzSCNCpZ8Gc7PQkZ7x0v6XuANt3x0N hDAJ6XKFU7dPK0iwHzEeocLqsTjIdcyHMkKs8LXpVRPqcYEHII28mb9TXj0iIqvAKt+C p0BFIpy2DJoJj2S13RH+m43JkIxQLJ4t+hYQeZyDhBVNg2DbgSPKxHMngu1W2DpoRe4Q 7kkQtHIUIw8gJSGbUqh5kMiuR6QhxidKP1TV5s8Z+r56eNvTdF2dLPHTvDuXa3GZVGS1 NaTg== X-Gm-Message-State: AOJu0Yx3aBND+oTf2wf8TvamXJPCvSwA4VDk4XOyGKP17OeB0Gvl+Xzl FXzjv8nYY5WYZVvsMfDm7jGXSCKArhIhJM4S8o21D7WRJns/EOv509Jj X-Gm-Gg: Acq92OHIoHtwBA8KxNStVQa4YhktPPvzhf7vw9iJL/d1zo+mFmXxWEotlqVCh0OTDrv G6/o/vRMJw6h16gcKByruWWCDfpr8qzrL7+DIv45BSQBb67kjnjKI32NRqTTajP/pZEdMq9yTu9 0Fo4e4dsY2l91aNMUcGE4fOd75hjhphait88iwrnfWtqt51ooD9Paa70hZSDfWYOv4S4U02KIYZ vmMDtEs1fvGbRYVB/LLgRT2zBYHEEg3dMOwzTyiJDYth16CzPgisCPPdDpIyIYYysy/hDQXNsVG 9cduM6aqLud/j8/rDDlMQMfs+GSGK81tzoSFEmTnH1Tgtp7iBsCoTYwQ8H6YWR1DtdLZwNrvaB+ 2l+wnwq3cO9f4wX0SbejpvBmuxiGn2ZuU+G5VSklyqblFNOhN2UxDE6+yxsAj86ML4dV6oWgOXP rjXgt8XBUA9q1Z0pBsswhfJvNlYJ6RdiaeonFLcQcGDBrBnzU3r6cTF6EShQ6ipfdEe17tcPLh+ ytopF0THWOY79U5dzS536KnVL3YM5Y4tD52t3Hqx4OdBKBdyQRkzTzAFxYBvHirzxhd X-Received: by 2002:a05:6830:3494:b0:7dc:dd58:50b8 with SMTP id 46e09a7af769-7e382125c51mr6971665a34.13.1778523786683; Mon, 11 May 2026 11:23:06 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:47 -0600 Subject: [PATCH v6 16/35] target/mips: add Octeon MTP0 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-16-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::335; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x335.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523834679154100 MTP0 loads the low Octeon3 partial-product pair from rs/rt into P[0] and P[3] and sets P[1] to zero. Model the architecturally unpredictable P[2], P[4], and P[5] lanes as zero for deterministic emulation. Legacy single-source encodings have rt encoded as $zero, so the same translator path also preserves the older Octeon behavior. Add the translator storage path so subsequent VMULU/VMM0/V3MULU operations can consume guest-managed partial products. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTP0 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Keep the Octeon3 two-source rt high-lane operand and document that legacy one-source MTP encodings use rt =3D=3D $zero. Changes v5 -> v6: - Zero P1 and model P2/P4/P5 as zero after checking the CN71XX register-state table and description. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index bf1dab61e1..59ab7401ab 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -45,6 +45,7 @@ SEQI 011100 rs:5 rt:5 imm:s10 101110 &cmpi SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi &r2 rs rt MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 +MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 4507f8a5bc..88f64e791d 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -254,6 +254,33 @@ static bool trans_mtm(DisasContext *ctx, arg_r2 *a, un= signed int index) return true; } =20 +static bool trans_mtp(DisasContext *ctx, arg_r2 *a, unsigned int index) +{ + TCGv_i64 value =3D tcg_temp_new_i64(); + + /* + * Octeon3 two-source MTP forms load lane index from rs and lane index= + 3 + * from rt. Legacy one-source forms encode rt as $zero. + */ + gen_load_gpr(value, a->rs); + octeon_store_p(index, value); + gen_load_gpr(value, a->rt); + octeon_store_p(index + 3, value); + if (index =3D=3D 0) { + /* + * The hardware description and register-state table define P1 as = zero; + * model P2/P4/P5 as zero for deterministic emulation. + */ + TCGv_i64 zero =3D tcg_constant_i64(0); + + octeon_store_p(1, zero); + octeon_store_p(2, zero); + octeon_store_p(4, zero); + octeon_store_p(5, zero); + } + return true; +} + TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); TRANS(LBX, trans_lx, MO_SB); @@ -264,3 +291,4 @@ TRANS(LWX, trans_lx, MO_SL); TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); TRANS(MTM0, trans_mtm, 0); +TRANS(MTP0, trans_mtp, 0); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523966; cv=none; d=zohomail.com; s=zohoarc; b=kxZGPW7YwB+8fDEXVWbpqz79wbynjuXOHSPeoezRAi64QBcFwsMHqV8QXfnXsGLuMFiBCkKZOWvwIYxI3SmFALmPBBkVnAUr6fWThuOkkq2zJ33P6oVb6bKPjH/GNs8pvPRiBOx8UWjSHkgKr8ApDF192uKN/XFkX4m86e2RChs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523966; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=K+G3B36X/9ry336xbKmucfkEPyEB6BJHY5PfVXdyEMQ=; b=jLCJ1gsLKvgbrMVg7e8RK9nOkJMVr9f7xl/G+22iLkTpFN8YTP5X+dOLy1iimxBmUsM0wwH/uZ08C7ZQJd7ySbPQkp+sBDej/pErnaw1Xs99gx5gGu7X0XkKSipDTPLKpGqQjRBI9kCHtoLd7oIQsB5uTuQlYWpm4xf2k0+e2cw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523966160809.2265517650238; Mon, 11 May 2026 11:26:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI7-0005OJ-Gs; Mon, 11 May 2026 14:23:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHa-0004kO-As for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:10 -0400 Received: from mail-ot1-x32f.google.com ([2607:f8b0:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHY-0002sq-MT for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:10 -0400 Received: by mail-ot1-x32f.google.com with SMTP id 46e09a7af769-7de7c57b52cso3783815a34.3 for ; Mon, 11 May 2026 11:23:08 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523787; x=1779128587; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=K+G3B36X/9ry336xbKmucfkEPyEB6BJHY5PfVXdyEMQ=; b=qb9DD+JuVMNOKGe6fIckQsHUMDIMv4l0k1mfY8U/2JLMaHk45ps0D4hd/MRHuerdbf Ts9Fi+dXQ0uTPFud3yY7dw5taIXLoEydIIVMJG71uqo4ystPDQYlQygCFLNzUV2cH4O0 L/8wNbLrPoBzhgL0uXz7EK+P5RLm9PC+0DDcKjRkMnycXhf6ulB4+R8Gfwq/x1oPC0FB h0DxsxVHD5w8YlgF1Q4cuewmfCaXO+T8lLM4W1H64yvf5yGPxNfatbB52dzqqD5/e2ta mlorg5N3PvbgxqzqomN0xWtih4WRgGJmFok10gGcbYzpmGVZOuC9kcj9mc/c3IQNOATG EQRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523787; x=1779128587; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=K+G3B36X/9ry336xbKmucfkEPyEB6BJHY5PfVXdyEMQ=; b=KejsZ96weEAlG4k/lpQPkySNCqscYDGhGXGyEw+4BfDmHkf6DPTssTsl1Ww8WveF6I zLUATIP71LbJdlrGoodY0PKta5Mx6Vdh79K9M735fmP995tpEY37OxOc6pA4B5MwZmCh dnrYALcjto08ARfzQVVtBsoAFv3AiUK9yVbXaqyNkj7VQmab04y2UfRJnQAFY7DJYClM NbeF/XtDjgjT4RmhC+NIi6A+HCYTqtt4tS95IbmSCaO6EDYl15KGaD241Wavwsxuilaw lhz8yRmupYZ73SgAi2+6Hvp9FQq8EYhiVLFlaW4Gbw6nqjKOrP+QnESa8/Soo65piv2j vYHA== X-Gm-Message-State: AOJu0YxIa20k1rNFVs8Xv+IB+PyMOWPKSiAN4rLKIGFtkf0x8MVq5tpQ F82zklVX05YjKo4rwH5YttEcIJzMwd7ZiUA752Jj2NDDP8hMSkdkwYzf X-Gm-Gg: Acq92OEq2J0ENzE1H0KNxee81a1JR8eSwLVibgmwf/+PQ/+CGUC5yletZvklgBz2wwA Tf5FOUyM0i31FDrd7nrwx7wEpAC1aue7+p7YbQLmesMyrlEX8z4ymFxNNJfMRErHITVos/m2g2S QUlop9pch+zfaVmqA96NuMgTRs8ST6Fy+4lEaJsFNRiQQMBvj0Nc0Klkr9dur2Rq2sJpSeRaQxH 4DWLWC7PjNM9KMqouI1UOGyhMxWlcZIWrBvlJJA5EgM6PMnmPqb3wRzU3DAfnuYlSwT7t9igfmK daOSaCZqnZfv0eZjf73HrUpwSXvnMnfMYsVke8MM3T4XbGh3dxvEvLdAEiNmSdbgVWFBm4UhBcz gIBnpUGRD5ReIsBCI1MG+DoXUBsRI0WDuSOjvSv56pJbaio3ap0t7mwZ3+xYokGmxSvGsIwEZHF Ua12vZgPDQVm+Ws3PpZG/hZaE4fFqTCheqLL1J/gIDtTKu3JL/xgZUQ5yeQc4kJZfTi4Z2HTkRw ItYgBUgU8Dv+enVXghDTIcjiBnybAduvP4A3tCDVs0V2hkkFzessL0KwCguT5RZ0lHk3U5L2iwa pD0= X-Received: by 2002:a05:6830:4986:b0:7dc:e032:9b5f with SMTP id 46e09a7af769-7e1df220611mr16751181a34.25.1778523787580; Mon, 11 May 2026 11:23:07 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:48 -0600 Subject: [PATCH v6 17/35] target/mips: add Octeon MTP1 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-17-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32f; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523967142154100 MTP1 loads the middle Octeon3 partial-product pair from rs/rt into P[1] and P[4]. This completes the second guest-visible partial-product slot used by the Octeon multiplier helpers. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTP1 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Describe the Octeon3 rs/rt P[1]/P[4] pair handled by the shared MTP translator. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 59ab7401ab..670a12a956 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -46,6 +46,7 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi &r2 rs rt MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 +MTP1 011100 rs:5 rt:5 00000 00000 001010 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 88f64e791d..3f954eb134 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -292,3 +292,4 @@ TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); TRANS(MTM0, trans_mtm, 0); TRANS(MTP0, trans_mtp, 0); +TRANS(MTP1, trans_mtp, 1); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523933; cv=none; d=zohomail.com; s=zohoarc; b=csngOskZScwTCJaHALAMEmd/ZDRihTsvRlou6f2jxC4C7faOy8O+BlkGo+Xet7VRJS9J/ZY37oBKTKThFkQ4UCvmlZ2omaxcLfcIU+aGRASPId6J10M8Zww+tkQRcAJH5G/b5OsWMmi37softHQ8ngGSoc2D516gbUbXDz3SU3E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523933; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UZ2HOXeiH7AQETY3NGgpvTbBdN30HRNwLj5z28WQTYw=; b=Ae5HQLfGebLIlWBQgQvEiTMvLcLV1Kme0G8AxLBrct8X9mmrYg/UpaoXVKWotaEYANa2Wg3pJ2/HVqMJAEOuk8FpRmmh/WG0BIkJfahRWHySRvVZ4bqfs+ryyRuOoPRLqLXOh4fuXunj1pjnpvLFvmSkdRQUzrmO9es2Yf0HLeA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523933965403.35629505537474; Mon, 11 May 2026 11:25:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI7-0005No-Bg; Mon, 11 May 2026 14:23:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHb-0004kh-3T for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:11 -0400 Received: from mail-ot1-x329.google.com ([2607:f8b0:4864:20::329]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHZ-0002t5-M3 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:10 -0400 Received: by mail-ot1-x329.google.com with SMTP id 46e09a7af769-7dbd23bc684so2748730a34.2 for ; Mon, 11 May 2026 11:23:09 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523788; x=1779128588; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=UZ2HOXeiH7AQETY3NGgpvTbBdN30HRNwLj5z28WQTYw=; b=XV0KMmby+9CI1ctlI323zh0QczG1dM2Uo/UIBLzhT2pSKBMtCSeMAuKBGeK516LDzk m3/jbEUisTPoy1GYXPbAKU38+qmiYkA+INVQHLk+2O1l6JSopvIyCL7ajmifG/gI52kF 7/JoCai6W6EcDl6KdHrLQKlwffzOZej6CXhjGbMg/aezGPI2ITqvYKdvJQZRU4ous9CB fBJgKMjJeHDheXRw2QTrOYuf6Hacf06bGU25xCqDbO6DF0rbm5TsO4s5RrSOwnSs3Grv pXuvQqQ2gtOwYJ2e0uEU8BsCMI8fLKuptwawBoswjoSw1S1sXeKJPdTkLjY/6XPBSAAj xETw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523788; x=1779128588; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=UZ2HOXeiH7AQETY3NGgpvTbBdN30HRNwLj5z28WQTYw=; b=pcv26AMCBaxUCZHn56xAyLuQKTcHvOH/2cpNca4bq6vmMm8NgGVwf7ICdOEJ0TuxXs X9gYp1Smoryi4qj0Tng+e9pw9pjM+RxWMDi+Vs/lbLFgPD/+teJycUzBFMBw+7xULKGJ RXOVQPFV1A5sI/CIJMIVXUY85EDb/e1eymPvfhB4Sw0xmJ9jmAgYLkSE0JQnYkRLRREY jdjg0I+4SBlyjPeSdt48PucJJgZrQEttSpcDON7SaN0NKbhbyzgpXpAZpodFJCzykNP1 I7j5OTwolm4ZEGhyTr12fhLV7o1zGjAxhYAXE+ICKLDyLpqOAQ4NqOfam2CnIJgTZQ7T ca1w== X-Gm-Message-State: AOJu0Yz/MzamIzKu1Dgme97Y3LH2rcHEkiMlaCDc1u3zWf5GJyr+XqfA jwiNXr3Sby3TZDKEn8aW9Gwzp9GEKLIvz50mPA67s2noGCg3CH9uN+uE X-Gm-Gg: Acq92OHct3xqqNtTRjo2o2y/b4xmZi6RcxqZQwlDZ9F3dEq+IvN7ZHIdrk+gygfUVbj oLRhSTPLl6FzH2Cw44M5Ql4qNvq6jJN8+L32r0Te8QL/Iv25GHtyjSW7pi/9cE9CXPnYlIlbEqs 6qxsM1/fl0s7M/en6Z8wO8rHO2vCuKlENTUDXrELwyVCje2odn1/TxxAtJCWP4DMmy3RlbHZwfm 18hu1tmTDCxEwun4T3xWDva8BB2DNSYLFgfRRT8tU8wTjbBr4iOweZLGMBrhdFLt1RLRFmgPlic CAhIyoE752xk1R5ascbEIz+95xTU729mnjtaIjymYREOJzBQO6B74ixI+7p2WdmARF+sGP+8768 wPlRJn0nBAcYW7tGK/wgoutXZYF/DMlf5WTSBerEhuKZcnAQexHXV+AajnFOj4r0qPE12EXbZ2F AplPGODdYSQ1YnHqWhH+aVhcmjTFHuwn5bimVotiPwvnVkPgbHGA5514IuUdKGNe8hf8Dze0gtt EY3+ZX2clf5cQMIMVJc0lb8szVjPSUuviE8jj+myzFZ4fftdA5EVPvQpEjV9YSzcTr5 X-Received: by 2002:a05:6830:922:b0:7dc:c4ae:a689 with SMTP id 46e09a7af769-7e381f0fa5bmr7002574a34.2.1778523788474; Mon, 11 May 2026 11:23:08 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:49 -0600 Subject: [PATCH v6 18/35] target/mips: add Octeon MTP2 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-18-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::329; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x329.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523934309158500 MTP2 loads the high Octeon3 partial-product pair from rs/rt into P[2] and P[5]. This exposes the final guest-managed partial-product slot for the Octeon multiplier operations. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTP2 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Describe the Octeon3 rs/rt P[2]/P[5] pair handled by the shared MTP translator. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 670a12a956..99606c80f6 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -47,6 +47,7 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 MTP1 011100 rs:5 rt:5 00000 00000 001010 &r2 +MTP2 011100 rs:5 rt:5 00000 00000 001011 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 3f954eb134..55e9ca298c 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -293,3 +293,4 @@ TRANS(LDX, trans_lx, MO_UQ); TRANS(MTM0, trans_mtm, 0); TRANS(MTP0, trans_mtp, 0); TRANS(MTP1, trans_mtp, 1); +TRANS(MTP2, trans_mtp, 2); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524040; cv=none; d=zohomail.com; s=zohoarc; b=j/9pWvuJO7UjnjcgDG/BlaVt+DUE+XTzzf17jNoQPFew+I6luRFkxhMWxysyhLasKrjD8Rq5peXOcFaOe1m3r5eoLS7tK5UpkDQkELR+q03QVwkq503Dng7xPaAKIgz2rVBbOrDwf4p0FCxy+Dd4QerJLnnDI+UrQj8TT7vKIuM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524040; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=e2rdisLTgwrX/LMcUGAISxAga5UTvEV56qsuS3QA7Ok=; b=Ppht3FmNHXw7C0ay/Hj6+kjyUNbxUQLo9Gy0aHvg59QDUwGYI4eOB+frADWXWhaBHPw+hlTgu3j+0eYVFkfiuiYBly+PAbwYrLS0ZW7JqW+jxJubUDKThrs1CQqunIa3+Z5s+sT1JJtLBwb06hWQPA/2RZdGR7TjAdGyz/yQfUQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524040695955.6063534321761; Mon, 11 May 2026 11:27:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI2-00057L-DO; Mon, 11 May 2026 14:23:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004ks-1t for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:12 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHa-0002tE-Bv for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:11 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7e363c6141dso3047826a34.2 for ; Mon, 11 May 2026 11:23:09 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523789; x=1779128589; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=e2rdisLTgwrX/LMcUGAISxAga5UTvEV56qsuS3QA7Ok=; b=aJr5H4jcsXi23PiicYLcBcUN9wnMq/eUwWrt4HQqFvwCfxzXWYCIq00SR/QVBztLT7 416LxhUKpNtnuq86UeD88YPI0ZKfOBC+Yh6zivfC5oEhAh91T6oSxD+Pk8RbGSht08PF ICIzR5Rb9O/yQY1MrSn3UnBuj8+qNYCotQJ8LcoOryY8EmzNkLtGrqGr6p9GggrXz+q0 X0MV2SVKj+861F0pTWV22F1z/Orjr4Hrykvwrkt9n/SpgUuCxUBXqpe/ySV4PTzuGYNI rZvHZ8TgtZOKZ8W99oJFy0oIZsnCvVGALZwkSRuEIc6HXWQqO1/Je6fsK3j5gR2ywA8M 8DgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523789; x=1779128589; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=e2rdisLTgwrX/LMcUGAISxAga5UTvEV56qsuS3QA7Ok=; b=b79mMP42UDH/aMzrZPu6T2mbjXK8wXulXalY3fkdnRXau0Vma4ngG60cyMjIC/+2mz 5sR0Jaw9GNaTiY1mfJLX+tEZgDH5jhXj+EBn75NvLqe7Ua2F0VBHgoCnVvDY7Md+uQ5Y bTwaZOAwNXsUDK0hv6a1mpKrbxQEuh96tZUv2jbWxffQlYHEuFFz8t6hxWz3IAFgBcfd 7wL+NTjqzj7OC7Ib47ZnY+3UpIYDOigMKX1l5APAyxv5WPUT7kG9PcFDRcUJD8UauJkE MtuoPYt2+vu15YtIXq5wiK5kt4mWxKiXpTF6U/njiU+Fwiz+hMye+Xuw7Vv3t66fu0lL 8UXg== X-Gm-Message-State: AOJu0Yzf02ivq8IR1mRWfY8wLiUHixaRyhVwjdsfPhdb/JX0y4kM2vEx YjzKRySOSVe0cZlKRJ9qRKPqLDCnJVRe9H4909B0HAC6WRUSsMXw52l1YFk/KEhO X-Gm-Gg: Acq92OE+vWpAPck0URZjDnE9CKZon7o9ilNJtQzx4IDOTAMlQT9Q3PeO6LTvLdomOQt xFnDTwGkRNmFV3w7UKxusHXVS5g5oFdATykwygmHaimbeDWRevRIvZJIsyOA0W+XrJf0nkjLLWb DGqF8CqB2qQVjdevd1Ukao9eXy6278U4Dzqe8jR2arx72ehACGSpOfwFtms5e8OmFfxyGc+tS8H rpOtwxec73MoCpNUlRsW1LWt69HE72jbjp3z+LVQHAVaqtPoNtrlQQeVt2BMZOIVAXKp5UGb3bv OE2K/HvxTh8B+seoqNEg8F0IVWUZz4DmK+Mou+TOoOGGIGe07vmkig40dK4mQYm5vkyo7HpqQCD Sf5o1cdu4RXlcahf1YlRuEgukxccyoEWrn7sBsJ1YkJDdTe5SbDbn1Xdj1lwfYD4CN67DogGrJH FiP2R5nUTCJntYkUqptKdtG7knSOFP0225ZZCaAzUIDezT0fxVSRNRW6d2jAtT+/9UcmfK8AoZO YmyeHixbbmmF7DipiWkJdQ6j/GAx69UCrLwPVluVHAm4lL3SKiwdRWnL2+r0BBN3vwh X-Received: by 2002:a05:6830:608c:b0:7d7:fd71:f2e4 with SMTP id 46e09a7af769-7e1df0d2a5cmr16270278a34.14.1778523789343; Mon, 11 May 2026 11:23:09 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:50 -0600 Subject: [PATCH v6 19/35] target/mips: add Octeon MTM1 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-19-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x332.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524041400158500 MTM1 loads the middle Octeon3 multiplier operand pair from rs/rt into MPL[1] and MPL[4]. Like the other MTM writes, it resets partial products so the following multiplier operation starts from the newly programmed operand state. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTM1 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Describe the Octeon3 rs/rt MPL[1]/MPL[4] pair handled by the shared MTM translator. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 99606c80f6..c85199ae32 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -48,6 +48,7 @@ MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 MTP1 011100 rs:5 rt:5 00000 00000 001010 &r2 MTP2 011100 rs:5 rt:5 00000 00000 001011 &r2 +MTM1 011100 rs:5 rt:5 00000 00000 001100 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 55e9ca298c..c9ea72d832 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -291,6 +291,7 @@ TRANS(LWX, trans_lx, MO_SL); TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); TRANS(MTM0, trans_mtm, 0); +TRANS(MTM1, trans_mtm, 1); TRANS(MTP0, trans_mtp, 0); TRANS(MTP1, trans_mtp, 1); TRANS(MTP2, trans_mtp, 2); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523949; cv=none; d=zohomail.com; s=zohoarc; b=WMxQMqd9zPebUtq8ED8mJy3kE57BOTj2JIy+dgfIroVmC/ybfyKvH3ig9iK6wsSB8y5hpvKDnKse5W/SjzpnKx7hYsWrOLixen468NkUPPagBHvoTEMBJJcbw36cn9jLdanWxVandWnVdLfTBEbTH5dv8cjQoT0cJj+sFbghbzE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523949; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ulZT3AyR9KxLxXeHp9mtF2udKofNN1JfLOpr3f1NM0c=; b=gB5m5agDxF3v/tNfjHxmpk4TO7xCq+Z16STaEiRtRilnqfaD36pk71uyZm0dMxJXxrCx5s0A98t7Zr0Zf3fZz80u8BvEYhh91HbIQrC2MGJu8Z/rbCd3/VISDP63qqqkvIp8cP0GX9cvy4xWQ4qQrbzcIsQLWOuKuE9yt4LZU1E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523949472458.5372299628905; Mon, 11 May 2026 11:25:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI7-0005O7-Dw; Mon, 11 May 2026 14:23:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHc-0004lK-Uq for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:14 -0400 Received: from mail-ot1-x331.google.com ([2607:f8b0:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHb-0002tQ-F7 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:12 -0400 Received: by mail-ot1-x331.google.com with SMTP id 46e09a7af769-7dca00c1591so1572353a34.3 for ; Mon, 11 May 2026 11:23:11 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523790; x=1779128590; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ulZT3AyR9KxLxXeHp9mtF2udKofNN1JfLOpr3f1NM0c=; b=Jc9td46aeoYk0Qckgb9BNYCcj4x14tEkL8Sa0aAaYSp8je4HCOMPssoSgJMzzQIJPP +xPvxQfqDspP2E2HBhMHpk2IdFPvFsR/45xAAeuYqsvBMTm4zWJlaVhQYSZgqEDjATZ4 r7mQT8jivwh9JMxpP/7pKNg9C9BilJaLwTN3GC09p6jDpBq/Ip/VQU2ykrNRgcjCTDec 89ebM7TIQxY2ZsqITKEABVFCOtDH5hI54B4dfnh66FQclSPd9sLiBHGMVXAm0PwwCf/7 8h3vnwMjZUa+BWJUEdeeKlBL+vB+aAfQyvSG0VVzXwz5jw5nFYkmEJdlnp/USapHHbLn u9Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523790; x=1779128590; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ulZT3AyR9KxLxXeHp9mtF2udKofNN1JfLOpr3f1NM0c=; b=Bd8SNdoVEefB0Tow8Nqj6EAvoBDpjJmlrhszcIm3sDCUStsejG+ZHceEmHNUpFbySH sKbpShm44FC9wjLC/ztaQaWJJaIEM5ZHaMV/iSEhb01C1SNcWt8ounyu01v45gMdjRX/ htePaLlOOsHLVcxD011Sv/jbb8ulSelrih1/+mGIuflsRrD0R1l7VzTnf1+dEw5wynou HlSOmFHYZ8rxm7lxayDHGMe2ci3i9TnFwcHqg7Py+JJza8CyDvyRRg7d774w0MPFjACV Fk5u5nHxa3x/35Nqmt8gBapfQxNAATsr6Y6EzXYsTuXaMgWiWIOKLzg5y0tcQVZFgmQ2 emLQ== X-Gm-Message-State: AOJu0YyKMZoCsUOWGyiDWiaD+6xLFjqCt6OsSFAxgrMEg65JXuC5yFPV gT++P74L2yevUQasB8drl/lodNpLmhiWIXaQRcwbkYuARuZTXTrES5Ez X-Gm-Gg: Acq92OHSR4WlBckWRbbyrVEqF7091UEec6CKEM59C3Aqruc80SckGvlfbG5jhbkDp59 +jbYhGimckqynz09aXdvwvVSDYkt0cc1/Uvabful2AJerSRz5/6v+13YfS3VzJ+OhJ9t/XveSvS YiQ8322hi2wpolvWV17AWFQ97on80dowzfvYwCbZ0+0o7oFrYHEr+9IJE0MPl5t3d0E39ZA+kUM RdvShlaDyl/DnPGw/ak0mFRQcs456XGm7Ik3pFOVEjyP+AoWLe/nq76pLzJGDAw5h8eFKdecXrz 6ejxGWICa263sRmy2CpXqEidzDoFywj42x7uhfeqKywRYEnBQDeuFAHEbZ/3DoaaOshLLqOA1Mk QqBuc57htA8IfWH8D7hHSuG2nwtPyRcPTp65muq6WIJFdOXycXQ5+Yk+eb4PcMxmEQMNUI/sN1+ ylBWAzvCJR48JbvtehXe+w9MJvfL0rKJ46pIDfToZVuYwxx7r69pPxlbOqvJvJxwWQ+srQuChOz /QRZW0ENrjzs5oAa2E9TvP24PAH0WDSMQw30yKaUCRyL1KZPgkuTbNxLuatPwIH1uX3 X-Received: by 2002:a05:6830:82cf:b0:7dc:e6e8:62b with SMTP id 46e09a7af769-7e1defeb3b2mr16842077a34.13.1778523790155; Mon, 11 May 2026 11:23:10 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:51 -0600 Subject: [PATCH v6 20/35] target/mips: add Octeon MTM2 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-20-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::331; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x331.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523950826154100 MTM2 loads the high Octeon3 multiplier operand pair from rs/rt into MPL[2] and MPL[5]. This supplies the final operand pair consumed by the V3MULU multiplier helper. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split MTM2 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Describe the Octeon3 rs/rt MPL[2]/MPL[5] pair handled by the shared MTM translator. --- target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + 2 files changed, 2 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index c85199ae32..682473b011 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -49,6 +49,7 @@ MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 MTP1 011100 rs:5 rt:5 00000 00000 001010 &r2 MTP2 011100 rs:5 rt:5 00000 00000 001011 &r2 MTM1 011100 rs:5 rt:5 00000 00000 001100 &r2 +MTM2 011100 rs:5 rt:5 00000 00000 001101 &r2 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index c9ea72d832..86b384d312 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -292,6 +292,7 @@ TRANS(LWUX, trans_lx, MO_UL); TRANS(LDX, trans_lx, MO_UQ); TRANS(MTM0, trans_mtm, 0); TRANS(MTM1, trans_mtm, 1); +TRANS(MTM2, trans_mtm, 2); TRANS(MTP0, trans_mtp, 0); TRANS(MTP1, trans_mtp, 1); TRANS(MTP2, trans_mtp, 2); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523945; cv=none; d=zohomail.com; s=zohoarc; b=H1s2sxYAbshgs04Y35+S4YrHCYv3ghsYi7+UMMUmq1f7GB81tE0kBc9mJyDnZ3otlrp4BwTOax1HaTGIhd+GEyp3zXBytn/1g72ICFQLJ789pG5KpxFL4oEn61J9ey8Sij91wQJJZNVgP5dSDqbT8Bc7xzXGNQTEx9lL+1g1BRo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523945; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=CEEItvUilyM0OA/gn/Z4vxfHoYkKWNdO1AU0kB4UrfI=; b=KG9DbU/Yw/Zd2IehxVDTTmXzWVw2FJOmf8RbPHg4lgJsiXfgcPwJU3HQ6XCEtqyHZfPjsJAwbJ2QPqfu6kTypzsKAdsm0tT7KS2CNWluXErCgm3t2MHeBhU+uQxcrcMTACAjwcP+2U7ExN1U+4v6hM50K2olk2bJof0TWh9nNzY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523944870450.13177497991614; Mon, 11 May 2026 11:25:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI8-0005RN-2e; Mon, 11 May 2026 14:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHe-0004lL-03 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:16 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHc-0002ta-Am for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:13 -0400 Received: by mail-ot1-x333.google.com with SMTP id 46e09a7af769-7dea20cf21aso4304738a34.1 for ; Mon, 11 May 2026 11:23:11 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523791; x=1779128591; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CEEItvUilyM0OA/gn/Z4vxfHoYkKWNdO1AU0kB4UrfI=; b=iTWvcrt7rmA9c2iqkDkZbygG8kYuIuA2ImcFRmy4vnepycAVBahVLV2SYDshvN5/Lx o9TCnMX5GA7Gey0eTvFHV0I9Z2+dzavh04RE45DzBQ+I/nakR0GEQkg80ZAtDOs+oUlH ZrPJMosAGJvfbq8OBP6/55UaojLPL+wC0oxgg+FW6CD1MsBK/eEkw32KxFLJD4ZiQBSU ZpNDxmDSu+wsHlaLw54X0aJCiy87fK2xtz9Dlocqx/U3A20VHxc6TXDqfGyGcRczT6JP rCknvWhXs+IJifOdaIrCUjsnqULhT8oLdNFHZ9WmjLV68ohG7iciEFKYBfV2iBPmL8fe mu0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523791; x=1779128591; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=CEEItvUilyM0OA/gn/Z4vxfHoYkKWNdO1AU0kB4UrfI=; b=egMdNG4V5ocwSsbAZCPlj7t2i8uen1EksQEZBYqdI/vmXpG5hwtg6uBy2S/rTq2oli D3StwsX8z0dKHi6n5dxJBqXMtAIe0b21yMMpelWzIt5+pAwULxEq5SHfVeKND/Nmp+71 x7jceXFonLxFtLDqaUeFXvGV+AZl6IVE4fttAqIqiCm5QY6FR+gzoUOHyIgwOXqXWVRd uR1eGPUcdbnWqJkD2K5IqIo4CbIKvjjLWZ5j3/gdoONKfkuCsnAdFvW0n1XiKv704AjF eLSohV3HB1TgQaot7L3YC2EW8ylyufqXMdBFQOp7IGp3i7LIsbR5c07nxOn22VEjOkdY LtjA== X-Gm-Message-State: AOJu0Yz3RHO1TvzsTuoFiJ0y+LKmclseKzmNk3lO4Thvt/jndcpyyVX4 Pq5H8RJR/jDrpRYgPFr1zUKyrGP7FYrgJuQKyS+UKwHiyXAy1nwq60UP X-Gm-Gg: Acq92OEksbGhUNJwXP7iMtIXMeek+6yvNbTvKJp9WCr611LXnu/xzaYNL99Z7zbNJe+ RqoGNs46HdiHrw4uDmquEh2WCXV9yeItpKQX4T421y1/pdk0N+a48cuxecW4y8FhEjLcBwRi97Q tvjJFeLCDXKZPlMQ+34RqF0IP+jjv5qADhCG5Mn/2T5skf+0WwDgYOtArGl1OYbd021hg/yxOyT W18ciog865kAIsE5Mu5cAQrFiQ49VMPXCoHhN0DjvJ2uLuPjYR5945dUfM4bWREWAbUAMfppJMs JdcxXkmYNz2RFrUGCde1Wc0nUjTwbq4CPDk/Gf0HbiyfRvsXU2P6CrbujpYwRAj595xu9Vg2fht 5sDBkNajVw0/PgzmRPprvjsVm12dv21V508S1TjzOuVP/H0AIEXgnjj5u2bdCb4Kdq2/wudkmOi GIA74Sthh9+H4Mqggg2xsWvxGPjtciLJpP3T6PoFhntUUH8wX7o97D2P61jotpADTIgfYFSbta1 /x56ryFJLC55036y94/PmZEe0rkYA1B3k3hVSuoEcLnIE6XjFdT3Vlb96x7xXTxmvkmVqdwD9k9 IU0= X-Received: by 2002:a05:6830:3369:b0:7e3:6b8f:1e93 with SMTP id 46e09a7af769-7e36b8f5869mr6888156a34.5.1778523791173; Mon, 11 May 2026 11:23:11 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:52 -0600 Subject: [PATCH v6 21/35] target/mips: add Octeon VMULU instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-21-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::333; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x333.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523946403158500 VMULU multiplies the active Octeon multiplier state by rs, adds rt and queued partial products, returns the low result, and advances P[0]/P[1] with carry limbs. Add helper and translator support for the two-limb accumulator operation. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split VMULU out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) - Use uadd64_overflow() for multiplier limb carry accumulation. (suggested by Richard Henderson) Changes v5 -> v6: - Rename the translator helper callback typedef for clarity. --- target/mips/helper.h | 1 + target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 17 +++++++++++++++++ target/mips/tcg/op_helper.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/target/mips/helper.h b/target/mips/helper.h index e2b83a1d19..f1e78ae329 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -24,6 +24,7 @@ DEF_HELPER_FLAGS_1(dbitswap, TCG_CALL_NO_RWG_SE, tl, tl) DEF_HELPER_3(crc32, tl, tl, tl, i32) DEF_HELPER_3(crc32c, tl, tl, tl, i32) DEF_HELPER_FLAGS_4(rotx, TCG_CALL_NO_RWG_SE, tl, tl, i32, i32, i32) +DEF_HELPER_3(octeon_vmulu, i64, env, i64, i64) =20 /* microMIPS functions */ DEF_HELPER_4(lwm, void, env, tl, tl, i32) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 682473b011..75834afc6c 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -50,6 +50,7 @@ MTP1 011100 rs:5 rt:5 00000 00000 001010 &r2 MTP2 011100 rs:5 rt:5 00000 00000 001011 &r2 MTM1 011100 rs:5 rt:5 00000 00000 001100 &r2 MTM2 011100 rs:5 rt:5 00000 00000 001101 &r2 +VMULU 011100 ..... ..... ..... 00000 001111 @r3 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 86b384d312..348d0d8601 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -13,6 +13,8 @@ /* Include the auto-generated decoder. */ #include "decode-octeon.c.inc" =20 +typedef void gen_helper_octeon_vmul(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64= ); + static bool trans_BBIT(DisasContext *ctx, arg_BBIT *a) { TCGv_i64 p; @@ -281,6 +283,20 @@ static bool trans_mtp(DisasContext *ctx, arg_r2 *a, un= signed int index) return true; } =20 +static bool trans_vmul(DisasContext *ctx, arg_decode_ext_octeon1 *a, + gen_helper_octeon_vmul *helper) +{ + TCGv_i64 rs =3D tcg_temp_new_i64(); + TCGv_i64 rt =3D tcg_temp_new_i64(); + TCGv_i64 rd =3D tcg_temp_new_i64(); + + gen_load_gpr(rs, a->rs); + gen_load_gpr(rt, a->rt); + helper(rd, tcg_env, rs, rt); + gen_store_gpr(rd, a->rd); + return true; +} + TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); TRANS(LBX, trans_lx, MO_SB); @@ -296,3 +312,4 @@ TRANS(MTM2, trans_mtm, 2); TRANS(MTP0, trans_mtp, 0); TRANS(MTP1, trans_mtp, 1); TRANS(MTP2, trans_mtp, 2); +TRANS(VMULU, trans_vmul, gen_helper_octeon_vmulu); diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index 4502ae2b5b..ab3fb06a16 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -144,6 +144,38 @@ target_ulong helper_rotx(target_ulong rs, uint32_t shi= ft, uint32_t shiftx, return (int64_t)(int32_t)(uint32_t)tmp5; } =20 +static void octeon_add_limb(uint64_t *sum, int limb_count, + uint64_t value, int limb) +{ + while (limb < limb_count && + uadd64_overflow(sum[limb], value, &sum[limb])) { + value =3D 1; + limb++; + } +} + +uint64_t helper_octeon_vmulu(CPUMIPSState *env, uint64_t rs, uint64_t rt) +{ + uint64_t lo, hi; + uint64_t sum[3] =3D {}; + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[0], rs); + sum[0] =3D lo; + sum[1] =3D hi; + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[1], rs); + octeon_add_limb(sum, 3, lo, 1); + octeon_add_limb(sum, 3, hi, 2); + + octeon_add_limb(sum, 3, rt, 0); + octeon_add_limb(sum, 3, env->active_tc.octeon.P[0], 0); + octeon_add_limb(sum, 3, env->active_tc.octeon.P[1], 1); + + env->active_tc.octeon.P[0] =3D sum[1]; + env->active_tc.octeon.P[1] =3D sum[2]; + return sum[0]; +} + /* these crc32 functions are based on target/loongarch/tcg/op_helper.c */ target_ulong helper_crc32(target_ulong val, target_ulong m, uint32_t sz) { --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523927; cv=none; d=zohomail.com; s=zohoarc; b=RlPX3gVycGk/IJBphAupnX/L5MtfMYvH3gUZSRbWvvc02AKxyHVdHncUY64XSjbR2qZynl9+/fmW74UK27OpxYM1Ra2/gWf+H9SdOYB0s6HmK2SQ8VlTVK6r3A3Gnm3WzzsRY+3gI2UlcFjAUiOXJb+snqKaQ80BgaX00wobtvM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523927; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=VYzrL4rdP1K5g7jmbB/XNJrOB5204yKt0KXsRVorpVo=; b=FEO2ou+7MoEw1aXNK+84aDq52sQVBm1yLkyLxieodfMUXu3r/lPmVsr84ae2DVwl+H1c1AEl8XkUt4Yp6SxK8xHWJea++96hUiKwi7nGIrgLd1PhfVfFgw1uAdCSz0ZoCg28fSwgpjgalHoU0Eg2+dNM2FE9qUDhm5xgyWNlrUM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523927133615.4701477231908; Mon, 11 May 2026 11:25:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVIB-0005fB-7P; Mon, 11 May 2026 14:23:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHf-0004lO-2v for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:16 -0400 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHd-0002to-4P for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:14 -0400 Received: by mail-ot1-x334.google.com with SMTP id 46e09a7af769-7dca4debedaso4600531a34.2 for ; Mon, 11 May 2026 11:23:12 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523792; x=1779128592; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=VYzrL4rdP1K5g7jmbB/XNJrOB5204yKt0KXsRVorpVo=; b=b5uDXO6K4UzHrLcNtnhWC/7hXjW+JLttGWxdmiuNjyQXOagA+DXY1ffUNT8NRhqLTr E9sEMQLmlvHXGD8ewafvLQPZRgtYHP4b+rXCw97LP4s/zvN1aBnHHM3YiYFzlQIB/j/x yEODP9nIzoY6Ukyj6W09thVBUlWKAOkt6kec/KOzLjWsOlbBH+KsZSdAV9UaBdiE36tA LkB5LbvuU6VCHaM+X9sYrJm2da7roKCJigg3KIql7Drnds/tof5pb4dfGZtLzPSEDU1N ksoWfe8GUv7WHbiQDQ34ylo3DO4f+AeJ8Out0b/5x4u/ehyP11xuUxy/wk0zIGEfERlO uOsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523792; x=1779128592; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=VYzrL4rdP1K5g7jmbB/XNJrOB5204yKt0KXsRVorpVo=; b=V055jys4gVpoig+P7j1k2bovQTEc5Siw7G0b1azvOItcmNFXmbBSMHwQb2DGqmbfEd 7peRe/pceuMMrvRjS/WRhzZNP1SiFTAyOJYxGuEe5O0lXTf/Sxf1EhgdI0TOEV2F0qUc gf4G5dSAc0z1CLCUuL0fzo20QVrIQOg6AHAElHa6BqHqk39WUJZwiGTsE+1I/nVRZPVB W7fDdzPwzuTn808FtQ652NeQfEEIHmV3EfM9FBxMGcKL6X02xqkAqvsAO4mFJpX/39JT LDOX85T/0Qij46JFqnKhIBicwfPsOeGJfeyqR2UnhJ+dcJ7d+rUA6wC/gj0DpzKhm+Yj pt+w== X-Gm-Message-State: AOJu0YzcUNj+kFMxgfibHpugld1myAZcoI6aSAdcRSLx1iN+2kV3mPB0 WTXfBq/9olxaZqCvJ5Gxph7s9Bv3n7YH4pZgKGyFomss3YFap3hBy165 X-Gm-Gg: Acq92OEyE5lUYPRnFXV4Rqk9N7TmuocPaDHOnSmBNMY7lUpUvw4WsHJrKsrXmJBSCR9 ++Xg3qPzh8TNDYNbfJS/MEzTVWVsxlyIcZCqGH/+vdlo0U2/StbObJ1qaKntAnZO5DR0thnsOjx 301xobAXI82wnyo8shDo+w8k+TIaDv/feCmHJrkk9w+DBv7QtYJaTlOxIJMod3PErNvRIIa90+m 0E7UrgymCvKu/gCQ5zhJ4V9FIEWi68CF84P2KEhmMAJPx917jvkmi+0dFyR685Koh0Y3gCsNuDF /miZ59mby2kXRYnMx2f053iIcE9MrN5/irNK1MWkL3JiTePNZBnHV9G4KjKH/PV+0UJWfliA8UZ PM09k/4vPT5zRI7t+n5x9sn7iNo6F6KQFDSZ8OcAXk8wwQ+bulIGZPEN1txh2NDAI5MEK4Ffc0m INSIq8mNWuz0ZYQz+JyOriVXD/OBr0u9UfChxC9MiwQZ1OHFo9cHsTb0mEd5y4S0KUuLoeRJ3Bk fal20GEy1ffCdwx1t7K2VMlzU/KX9LdcxqFDofHAVYcfivqpSld7+trQnSoYpYkiUIWFwJ+CkuC Gyc= X-Received: by 2002:a05:6830:6514:b0:7d7:f146:8738 with SMTP id 46e09a7af769-7e381f70e3emr7688101a34.12.1778523791957; Mon, 11 May 2026 11:23:11 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:53 -0600 Subject: [PATCH v6 22/35] target/mips: add Octeon VMM0 instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-22-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::334; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x334.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523928401154100 VMM0 performs the VMULU accumulation, returns the low result, then feeds that result back into the MTM0 multiplier state with a zero high operand. It sets MPL[1] to zero, clears partial products, and models the remaining architecturally unpredictable multiplier lanes as zero. Add helper and translator support for this multiplier chain-update operation. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split VMM0 out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Keep the Octeon3 MTM0-style high-lane update and set MPL[3] to zero when feeding the low result back. Changes v5 -> v6: - Zero MPL1 and deterministic-zero the remaining modeled MTM0 lanes after checking the CN71XX VMM0 definition. --- target/mips/helper.h | 1 + target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + target/mips/tcg/op_helper.c | 20 ++++++++++++++++++++ 4 files changed, 23 insertions(+) diff --git a/target/mips/helper.h b/target/mips/helper.h index f1e78ae329..46ccad95c3 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -25,6 +25,7 @@ DEF_HELPER_3(crc32, tl, tl, tl, i32) DEF_HELPER_3(crc32c, tl, tl, tl, i32) DEF_HELPER_FLAGS_4(rotx, TCG_CALL_NO_RWG_SE, tl, tl, i32, i32, i32) DEF_HELPER_3(octeon_vmulu, i64, env, i64, i64) +DEF_HELPER_3(octeon_vmm0, i64, env, i64, i64) =20 /* microMIPS functions */ DEF_HELPER_4(lwm, void, env, tl, tl, i32) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 75834afc6c..c60af2d39a 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -51,6 +51,7 @@ MTP2 011100 rs:5 rt:5 00000 00000 001011 &r2 MTM1 011100 rs:5 rt:5 00000 00000 001100 &r2 MTM2 011100 rs:5 rt:5 00000 00000 001101 &r2 VMULU 011100 ..... ..... ..... 00000 001111 @r3 +VMM0 011100 ..... ..... ..... 00000 010000 @r3 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 348d0d8601..75ab1daa70 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -313,3 +313,4 @@ TRANS(MTP0, trans_mtp, 0); TRANS(MTP1, trans_mtp, 1); TRANS(MTP2, trans_mtp, 2); TRANS(VMULU, trans_vmul, gen_helper_octeon_vmulu); +TRANS(VMM0, trans_vmul, gen_helper_octeon_vmm0); diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index ab3fb06a16..45e208ca43 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -176,6 +176,26 @@ uint64_t helper_octeon_vmulu(CPUMIPSState *env, uint64= _t rs, uint64_t rt) return sum[0]; } =20 +uint64_t helper_octeon_vmm0(CPUMIPSState *env, uint64_t rs, uint64_t rt) +{ + uint64_t lo =3D helper_octeon_vmulu(env, rs, rt); + + /* + * VMM0 is architecturally equivalent to VMULU followed by MTM0 with + * the low result and a zero high operand. + */ + env->active_tc.octeon.MPL[0] =3D lo; + env->active_tc.octeon.MPL[1] =3D 0; + env->active_tc.octeon.MPL[2] =3D 0; + env->active_tc.octeon.MPL[3] =3D 0; + env->active_tc.octeon.MPL[4] =3D 0; + env->active_tc.octeon.MPL[5] =3D 0; + for (int i =3D 0; i < ARRAY_SIZE(env->active_tc.octeon.P); i++) { + env->active_tc.octeon.P[i] =3D 0; + } + return lo; +} + /* these crc32 functions are based on target/loongarch/tcg/op_helper.c */ target_ulong helper_crc32(target_ulong val, target_ulong m, uint32_t sz) { --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524037; cv=none; d=zohomail.com; s=zohoarc; b=B0ItjMQxucNH3AyKt6BW1khu3Mt2RYjoeduLP05/KDNSHG0gOdR8i623FsadmjyWsEAgIx3hSwd0wPUOhTyeFHaGX9sDq3/FYv9A8QbePN81dNGosVknto8DZVtkr4vomMEYVyy6P6o1NfHEL07yBG1PQaIxMOIpee4fW4r36QQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524037; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rzcDF6ALX3wfuQ7nDVF3UwT8SdERlMMcisvRM0tvWNA=; b=RQxRMb2mLW3MTRpRbxkl6ibx5Vxm6rMigrtwAQviEJTE/mnnmwn6IT4Za9RJXw0ulqKOXQuwWKTW69p3AK6JyExoxXNiyXAq9YJ53og1V9+UzCgjEiPI9oOFtJfYjdte3oItlOMIpBwMxaHynfa4sJodgLRvBfNH8SD2s1Gaw1c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524037660198.47791530217773; Mon, 11 May 2026 11:27:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI7-0005R4-Vs; Mon, 11 May 2026 14:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHh-0004px-85 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:17 -0400 Received: from mail-ot1-x32e.google.com ([2607:f8b0:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHe-0002tw-8K for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:16 -0400 Received: by mail-ot1-x32e.google.com with SMTP id 46e09a7af769-7dbcb467f2bso4309101a34.3 for ; Mon, 11 May 2026 11:23:13 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523793; x=1779128593; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rzcDF6ALX3wfuQ7nDVF3UwT8SdERlMMcisvRM0tvWNA=; b=s/+Yf+gmW/GpZ3YnW/ncu7d8Yt7zk7M89W4ddoJT/KniXMuHKyvs+tOTJ2hXBNhuL0 7vqEg3SvGFB1mV6c/R5VfqGTk9q/YqvxeQjpf6hkN7tESrYThgcVjYTR2qheUYBAuqqR 6PpsNnEhP0KxFE/+/io6KE0zbqLujmwg5PnY+uk0aqEcE1eeSxs687WAf2yTlw5nGXpI GV3xJBX1T5H9cPvXDnFc275qZSE9RfcB9vxW9kB6HcjnpwJ2bhx6U8PHHpQQn6h7JXFY 7teYo1shA8KYpWhKLF/fg7MCLTTBZWUnB0a5CzNYZWAfWY+NUBto98MbKzdLADTwbTPU KIWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523793; x=1779128593; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=rzcDF6ALX3wfuQ7nDVF3UwT8SdERlMMcisvRM0tvWNA=; b=puBRuvtQY9rd+Ync9hP+s21DwREB/9NHVzefx1QAF+KsyQ/PPlS7AqXD5naoNolXNq h0ClU0UD0UR5jW/Kbc+7EyhuSwLmqjSllZ8Qiu+odb+878VI7lbqL9POGcifcnCCVOzO ZFl9m/+/c4PKCu/08oU/1KClavonzncTUeinw2wGZfrQQzB0jC2AipNm51FdcSIKQ5vs hkG0yPrExv+Q4IVXVR19P6LjdLmo60zrMLPDvfXLBjG+6bLV17CT1Hmwg5IcgJBkBaYI v6rU1FWvBonBjq1mRIwu3yaEht3D/N25rrpVF33xLtgHQOA2LRINXTKI2E4WS6eFVpjD Vr0g== X-Gm-Message-State: AOJu0Yy/ud6mELVrhcST57Kk6Px8HJtVi8Qxjsz4DXoXcc6VwIej4CuM n+bt2agDBGRtCBJ436/oxyhM1Gye00ko0R3jdSaqSX5VL7NDUlbhJ10P X-Gm-Gg: Acq92OGnRjsu54yN/qgQJ/wCOnozRUsDijJV4sSBCsCPMvCW/e43u7fFa+553nvGTm3 YmMFygvUVamCUlPgnUU9j4feSxRPlRf/yIRkVRn/EV5DyfoL1szVcKAFBgvGjETanaFTnn3vn5r wxaegOpHIWLpicJ3/fjpqEviMN4kw1RsfVs1XLN6dmEB5cpcOKeTGr28vvyQjn7R9LdU09baptZ nVqY2ShGM0Rsw6hW09z/ZVa321ctfG4JEU8tEoaU6Um/j528fbUXwSsYzAIOAS4sdZJYDfruojU FjWu3xt/CrmleRu8+exA683xPIopNN6Fz8rMnRj4Q/WgcE7vRPdF2Hgd/43uNLnbSRIDM1rQAcl WaNFbU0h7jY83mq1ftAcvOu1qg6FAgFko/8ZxdiJam45i0fOdyoIqnr27MvD+5jf1eVN4xXj9qt iG2f8e5Mzr9QMH9ncPrsVe2thGpzg4/h+EAKdrUhsHyyqD+ipkWzIb6kBGdNWand3l9OQMRppEV WwCWgD2ZOB81AKVfID38NKVbjXZLgpUSyespVqM+3ka4wsM7I/0bKMUhH4jB79zltXj X-Received: by 2002:a05:6830:6b05:b0:7d7:4002:1f21 with SMTP id 46e09a7af769-7e1df197a04mr14135336a34.20.1778523792895; Mon, 11 May 2026 11:23:12 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:54 -0600 Subject: [PATCH v6 23/35] target/mips: add Octeon V3MULU instruction MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-23-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32e; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32e.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524039505158500 V3MULU extends VMULU across the full Octeon3 multiplier state, adding rt and queued partial products. Return the low result while shifting the remaining accumulated limbs back into P[0] through P[5]. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split V3MULU out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v3 -> v4: - Keep the Octeon3 MPL3-MPL5/P3-P5 high lanes used by the two-source MTM/MTP forms and Cavium SDK/runtime code. --- target/mips/helper.h | 1 + target/mips/tcg/octeon.decode | 1 + target/mips/tcg/octeon_translate.c | 1 + target/mips/tcg/op_helper.c | 46 ++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 49 insertions(+) diff --git a/target/mips/helper.h b/target/mips/helper.h index 46ccad95c3..08fda55ae1 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -26,6 +26,7 @@ DEF_HELPER_3(crc32c, tl, tl, tl, i32) DEF_HELPER_FLAGS_4(rotx, TCG_CALL_NO_RWG_SE, tl, tl, i32, i32, i32) DEF_HELPER_3(octeon_vmulu, i64, env, i64, i64) DEF_HELPER_3(octeon_vmm0, i64, env, i64, i64) +DEF_HELPER_3(octeon_v3mulu, i64, env, i64, i64) =20 /* microMIPS functions */ DEF_HELPER_4(lwm, void, env, tl, tl, i32) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index c60af2d39a..9c1fe8f4f1 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -52,6 +52,7 @@ MTM1 011100 rs:5 rt:5 00000 00000 001100 &r2 MTM2 011100 rs:5 rt:5 00000 00000 001101 &r2 VMULU 011100 ..... ..... ..... 00000 001111 @r3 VMM0 011100 ..... ..... ..... 00000 010000 @r3 +V3MULU 011100 ..... ..... ..... 00000 010001 @r3 =20 &saa base rt @saa ...... base:5 rt:5 ................ &saa diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 75ab1daa70..2d836afddb 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -314,3 +314,4 @@ TRANS(MTP1, trans_mtp, 1); TRANS(MTP2, trans_mtp, 2); TRANS(VMULU, trans_vmul, gen_helper_octeon_vmulu); TRANS(VMM0, trans_vmul, gen_helper_octeon_vmm0); +TRANS(V3MULU, trans_vmul, gen_helper_octeon_v3mulu); diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index 45e208ca43..740c181d27 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -196,6 +196,52 @@ uint64_t helper_octeon_vmm0(CPUMIPSState *env, uint64_= t rs, uint64_t rt) return lo; } =20 +uint64_t helper_octeon_v3mulu(CPUMIPSState *env, uint64_t rs, uint64_t rt) +{ + uint64_t lo, hi; + uint64_t sum[OCTEON_MULTIPLIER_REGS + 1] =3D {}; + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[0], rs); + sum[0] =3D lo; + sum[1] =3D hi; + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[1], rs); + octeon_add_limb(sum, ARRAY_SIZE(sum), lo, 1); + octeon_add_limb(sum, ARRAY_SIZE(sum), hi, 2); + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[2], rs); + octeon_add_limb(sum, ARRAY_SIZE(sum), lo, 2); + octeon_add_limb(sum, ARRAY_SIZE(sum), hi, 3); + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[3], rs); + octeon_add_limb(sum, ARRAY_SIZE(sum), lo, 3); + octeon_add_limb(sum, ARRAY_SIZE(sum), hi, 4); + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[4], rs); + octeon_add_limb(sum, ARRAY_SIZE(sum), lo, 4); + octeon_add_limb(sum, ARRAY_SIZE(sum), hi, 5); + + mulu64(&lo, &hi, env->active_tc.octeon.MPL[5], rs); + octeon_add_limb(sum, ARRAY_SIZE(sum), lo, 5); + octeon_add_limb(sum, ARRAY_SIZE(sum), hi, 6); + + octeon_add_limb(sum, ARRAY_SIZE(sum), rt, 0); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[0], 0); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[1], 1); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[2], 2); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[3], 3); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[4], 4); + octeon_add_limb(sum, ARRAY_SIZE(sum), env->active_tc.octeon.P[5], 5); + + env->active_tc.octeon.P[0] =3D sum[1]; + env->active_tc.octeon.P[1] =3D sum[2]; + env->active_tc.octeon.P[2] =3D sum[3]; + env->active_tc.octeon.P[3] =3D sum[4]; + env->active_tc.octeon.P[4] =3D sum[5]; + env->active_tc.octeon.P[5] =3D sum[6]; + return sum[0]; +} + /* these crc32 functions are based on target/loongarch/tcg/op_helper.c */ target_ulong helper_crc32(target_ulong val, target_ulong m, uint32_t sz) { --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523838; cv=none; d=zohomail.com; s=zohoarc; b=XBLdxG7vJtjSrKWBP6toRNf4zFLzU6CrJmf5UTbPS3R3CsFyBZRJGiziXInX5iyJEjP697Aa7w34cU4Z+qv+YZl6+86GyD9Qi74SNf/Pihg1HgD7FTm2v7ynFOIfBRq5fTQRU5H0u2Nr++bD2cK4lhwVSDTrXg9LAWM/vxGMFWo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523838; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=l2xdv/V1omlS3DieDctnUu0Uqp28rBCjJPIXTe0N9uY=; b=jnExJ29AySON0wRR2SxAgImZ7u+LaksjChbCB/jJ9PBcHm0Y2CsAV8/2L1j6yhG7Xg3vkEs6pEY+0y5W6wDsx9TpM+sSqlnLAdgIIxGcD5VZVDOFAPPc2DGdXalDi4USE/rrMbf8NwkoApBhGXZBwf9aOq/ED5YMuuoAA8AMVuw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523838644660.9161021674084; Mon, 11 May 2026 11:23:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI5-0005IC-LR; Mon, 11 May 2026 14:23:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHh-0004q0-9c for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:18 -0400 Received: from mail-ot1-x32c.google.com ([2607:f8b0:4864:20::32c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHf-0002u7-BO for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:16 -0400 Received: by mail-ot1-x32c.google.com with SMTP id 46e09a7af769-7dbe437b072so2660690a34.2 for ; Mon, 11 May 2026 11:23:14 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523794; x=1779128594; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=l2xdv/V1omlS3DieDctnUu0Uqp28rBCjJPIXTe0N9uY=; b=ijIEYLWzfET8aen0OUEqU8vKnRr6MujHcbUMj6ZMf3H+UEOeTwW3d0SqcSxOMCxmXI LrR1KQeKHqXIx4NhLZ4yMwLipTSnBJ1+0u+0Ze+xdJV/9PugLgMB6NTW4BDkCD5z+b9D WCD+vc0snAtEb4ZCh/3tkLDtszl5zDyAyik572+j5azr27lR458ZztAIl/DRKLu3C4Q9 G7HBOI1fkGTE2d5ZHU3VXS1zFhg8hfJTijNalpA3zlPF4ts+ahr8tcoCqvtshh7QFeOJ vbfQocpC/jsJeGaskCsUFtzSQpLwv0eJIaBFS4Hm9off0BukzBvRuqvQcGxCdusFzpPD vybA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523794; x=1779128594; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=l2xdv/V1omlS3DieDctnUu0Uqp28rBCjJPIXTe0N9uY=; b=MJ/wWIi7LfjiPyK5L3/63lJYMM+I8Qdpojaudk/apxs+I3S6VHubjOxTNQ4INoN03P VeOTqDOG0hr6IWB0rVKYHM7674vOsqiHTY4Pdm00VrvWziWbUbJtlgFTu4agmUs4zwq3 nuyHAFbZ6nksJpTqrLAJL22y7lnesJEmiwwG4falB966vKOsEyXTRH2ldwPTvFjHPgOe RmXAlWohuuJdCG15W6BMAhwGDYN+SopUMc6uUpdkEQAhRsZwE/XSgVDwbYp7sGu6rUdF YrZQzj7Ber5g1fXi0Ehq2h5jELZVplEtueJIQfz5frHpKl7ji6hleT0zq0Sh6eUjgcyo IVcw== X-Gm-Message-State: AOJu0Yx8G/P68A+tTnWMNFKYy85plkofAD/hw5v5x6eVyiG9vT+et4Zu 4BcjnNY61gWu+2ev/cm2SCYH588TyX3/qkm1h0QKS76YbdLZ5rEaBGN3 X-Gm-Gg: Acq92OEEukBJVsuL+mFJruUI7XQWln42cJCn1E8fHJNVA8VUbHr96cN13JrGDNZ1uMs 10v/mEcH/p1REavX+RbDghBxuhzYScYY9zs6+7I20ymc7raWRqNCwbtaaWxLd0b2On+3t+HiBTJ OGYJZwdbxtoZJsttr17SRUHvhOvqCL7oRvVxBQvvKsKFYoGQUoNAnTpyp6DAsLA5YV03DJ3AG5+ e0PESRvoV5OTTCueqAl3usboGKcKsKtAbUhuOUlqTOUpxOozYx02/Fzel6Iwe9opwQu0bGwpKMy Zjl0HBCbDP/mSaWHbTDkE4Yk+0e8RTlm65XW0GBwvKxpgF2Tp76jhn0ahQ8Vt1oUcnsR2lk3o9v Cr0BMJfHAlwAW+AADM/zKfn5ao4+Fa9TMANsgaRx3sbiFfxi9Twfd9ETsNbS++napqOHUcntsui 3tJDIHF1JCqk1yiKdHlXd6io6l94xtLerQKFDV2+kuhmCVqfJUxzbRdH9TFO/5AIN88rWpN25/o 6zopLPlc+7WAzrMwIDw8vJaipjll73Ru6N+xLXmqWCPDGiYrj7ViMgakZjYQt3PVjgd X-Received: by 2002:a05:6830:378a:b0:7dc:cdea:7d9 with SMTP id 46e09a7af769-7e1df072f91mr14270527a34.22.1778523794165; Mon, 11 May 2026 11:23:14 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:55 -0600 Subject: [PATCH v6 24/35] target/mips: add Octeon QMAC instructions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-24-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32c; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32c.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523839238158500 QMAC.0x and QMACS.0x multiply the selected signed Q15 halfword lane from rs by rt<15:0> and accumulate the Q31 product into the Octeon HI/LO accumulator state. QMAC updates the full 64-bit HI/LO accumulator. QMACS saturates the 32-bit Q31 result in LO and keeps HI<0> as the sticky saturation flag. Signed-off-by: James Hilliard --- target/mips/helper.h | 2 ++ target/mips/tcg/octeon.decode | 5 ++++ target/mips/tcg/octeon_translate.c | 16 +++++++++++ target/mips/tcg/op_helper.c | 59 ++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 82 insertions(+) diff --git a/target/mips/helper.h b/target/mips/helper.h index 08fda55ae1..e93bc37903 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -27,6 +27,8 @@ DEF_HELPER_FLAGS_4(rotx, TCG_CALL_NO_RWG_SE, tl, tl, i32,= i32, i32) DEF_HELPER_3(octeon_vmulu, i64, env, i64, i64) DEF_HELPER_3(octeon_vmm0, i64, env, i64, i64) DEF_HELPER_3(octeon_v3mulu, i64, env, i64, i64) +DEF_HELPER_4(octeon_qmac, void, env, i64, i64, i32) +DEF_HELPER_4(octeon_qmacs, void, env, i64, i64, i32) =20 /* microMIPS functions */ DEF_HELPER_4(lwm, void, env, tl, tl, i32) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 9c1fe8f4f1..5edcd95884 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -28,9 +28,12 @@ BBIT 11 set:1 . 10 rs:5 ..... offset:s16 p=3D%bb= it_p # SEQI rt, rs, immediate # SNE rd, rs, rt # SNEI rt, rs, immediate +# QMAC.0x rs, rt +# QMACS.0x rs, rt =20 @r3 ...... rs:5 rt:5 rd:5 ..... ...... &cmpi rs rt imm +&qmac rs rt lane %bitfield_p 0:1 6:5 @bitfield ...... rs:5 rt:5 lenm1:5 ..... ..... . p=3D%bitfield_p =20 @@ -43,6 +46,8 @@ SEQ 011100 ..... ..... ..... 00000 101010 @r3 SNE 011100 ..... ..... ..... 00000 101011 @r3 SEQI 011100 rs:5 rt:5 imm:s10 101110 &cmpi SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi +QMACS 011100 rs:5 rt:5 00000 000 lane:2 010010 &qmac +QMAC 011100 rs:5 rt:5 00000 100 lane:2 010010 &qmac &r2 rs rt MTM0 011100 rs:5 rt:5 00000 00000 001000 &r2 MTP0 011100 rs:5 rt:5 00000 00000 001001 &r2 diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 2d836afddb..b41bc1f81e 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -14,6 +14,8 @@ #include "decode-octeon.c.inc" =20 typedef void gen_helper_octeon_vmul(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64= ); +typedef void gen_helper_octeon_qmac_fn(TCGv_ptr, TCGv_i64, TCGv_i64, + TCGv_i32); =20 static bool trans_BBIT(DisasContext *ctx, arg_BBIT *a) { @@ -156,6 +158,18 @@ static bool trans_SNEI(DisasContext *ctx, arg_SNEI *a) return do_seqi_snei(ctx, a, TCG_COND_NE); } =20 +static bool trans_qmac(DisasContext *ctx, arg_qmac *a, + gen_helper_octeon_qmac_fn *helper) +{ + TCGv_i64 rs =3D tcg_temp_new_i64(); + TCGv_i64 rt =3D tcg_temp_new_i64(); + + gen_load_gpr(rs, a->rs); + gen_load_gpr(rt, a->rt); + helper(tcg_env, rs, rt, tcg_constant_i32(a->lane)); + return true; +} + static bool trans_lx(DisasContext *ctx, arg_lx *a, MemOp mop) { gen_lx(ctx, a->rd, a->base, a->index, mop); @@ -299,6 +313,8 @@ static bool trans_vmul(DisasContext *ctx, arg_decode_ex= t_octeon1 *a, =20 TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); +TRANS(QMAC, trans_qmac, gen_helper_octeon_qmac); +TRANS(QMACS, trans_qmac, gen_helper_octeon_qmacs); TRANS(LBX, trans_lx, MO_SB); TRANS(LBUX, trans_lx, MO_UB); TRANS(LHX, trans_lx, MO_SW); diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index 740c181d27..0a892e31a8 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -144,6 +144,65 @@ target_ulong helper_rotx(target_ulong rs, uint32_t shi= ft, uint32_t shiftx, return (int64_t)(int32_t)(uint32_t)tmp5; } =20 +static int32_t octeon_mul_q15_q15(int16_t a, int16_t b, bool *overflow) +{ + if (a =3D=3D INT16_MIN && b =3D=3D INT16_MIN) { + *overflow =3D true; + return INT32_MAX; + } + return (int32_t)a * b * 2; +} + +static int32_t octeon_sat32_acc_q31(int32_t acc, int32_t value, + bool *overflow) +{ + int64_t sum =3D (int64_t)acc + value; + + if (sum > INT32_MAX) { + *overflow =3D true; + return INT32_MAX; + } + if (sum < INT32_MIN) { + *overflow =3D true; + return INT32_MIN; + } + return sum; +} + +static int16_t octeon_qmac_lane(uint64_t rs, uint32_t lane) +{ + return (int16_t)(uint16_t)extract64(rs, lane * 16, 16); +} + +void helper_octeon_qmac(CPUMIPSState *env, uint64_t rs, uint64_t rt, + uint32_t lane) +{ + bool overflow =3D false; + int32_t product; + int64_t acc; + + product =3D octeon_mul_q15_q15((int16_t)(uint16_t)rt, + octeon_qmac_lane(rs, lane), &overflow); + acc =3D deposit64(env->active_tc.LO[0], 32, 32, env->active_tc.HI[0]); + acc +=3D product; + + env->active_tc.LO[0] =3D (int64_t)(int32_t)acc; + env->active_tc.HI[0] =3D (int64_t)(int32_t)((uint64_t)acc >> 32); +} + +void helper_octeon_qmacs(CPUMIPSState *env, uint64_t rs, uint64_t rt, + uint32_t lane) +{ + bool overflow =3D env->active_tc.HI[0] & 1; + int32_t product; + + product =3D octeon_mul_q15_q15((int16_t)(uint16_t)rt, + octeon_qmac_lane(rs, lane), &overflow); + env->active_tc.LO[0] =3D octeon_sat32_acc_q31( + (int32_t)(uint32_t)env->active_tc.LO[0], product, &overflow); + env->active_tc.HI[0] =3D overflow; +} + static void octeon_add_limb(uint64_t *sum, int limb_count, uint64_t value, int limb) { --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524038; cv=none; d=zohomail.com; s=zohoarc; b=jyg9fJYKFca6P3K7GjpTPONrh8DFjwNct8OJIrWG+jcwBcX6xjKo1MZPLMFo6XDod32LrcIfLc813P+Flpu8s/BVPZvnYUzCnQ2Hurzo0S40KEnXlNEMYZXXu4drFQoonCNYGPGsDcUlz2P6Dv4Yn0Bvln5qDRU5sAEA9iuIllo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524038; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=iI+vqstRDBWkPzWzwr3hyNwcYeNootbB+JCYDl25hTc=; b=ZhvKtGFt2aDdMeclFMS1yBttcT/PC4pAWEFKrGw1rRxt4xcwm/cucnukdDDhXPtfUnfFazHAeVHTDTyxPgTQLgqSu/sXswptplq+kQxTevpc9bRnev/0cdTDGm4uQlyWKd+Pt+HoIYWAHUSd9kErWpgyYymdGojI+6w0TNbjXaQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524038044755.4012240063051; Mon, 11 May 2026 11:27:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI8-0005WY-RO; Mon, 11 May 2026 14:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHj-0004qI-23 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:19 -0400 Received: from mail-ot1-x331.google.com ([2607:f8b0:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHg-0002uK-Tz for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:18 -0400 Received: by mail-ot1-x331.google.com with SMTP id 46e09a7af769-7dccda31d3eso1200869a34.3 for ; Mon, 11 May 2026 11:23:16 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523795; x=1779128595; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=iI+vqstRDBWkPzWzwr3hyNwcYeNootbB+JCYDl25hTc=; b=GJVK9gUjedterqhWqbt6vlD7VCNge7rjWRrp7t0B75XsLi5IeCKNdcWkaAoYTYi0G5 Tp3WLQGw/j54+F16I2MkhfVPXdC+HfgYnIYRObIRfnrBa1iNYdGqj3/Z8MzDHKe8A44w WuJzirozmSKQRzoWrwt+tB5rML1pg1Dy78Dp/ym/rTSrNZ/EmdP4eUhh5OdxVqawQvYq /J/aJNXM/RnZAee0jJ0UisQ1dgTBOg7uNHmeMuvZPZsHdvUrEX0XwV2pqb8Wj1wkoBw6 oVj1cRPRJTWoHMQzXTiPDZH1cBtZNNw5JNIGFcXZ9PjVx7AhBOQ+PmLXaa0a6Jgab7g9 jRoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523795; x=1779128595; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=iI+vqstRDBWkPzWzwr3hyNwcYeNootbB+JCYDl25hTc=; b=JEoGWHUKZWU9qRrM8lfHTIKICJoO/ExNAc7PHgQDB73RhlxwYUAZy+8Xm7MLHtgq26 DIVdr/wkvFbih6Rlcl/PKN/qJ3Tdre55iMH6WioOZYo3x/CGjtCqp9pCQXCu4JI0ZThd LRV5Ok51JS3gBENwMM6OrAo2dQEQTxInuuOT/7bCRFA7ky1atVdGr4tXFv4mYaMkVlcy RC9YoYGabpuBOxom6Dy7uUcgi9B+kgJ4TN6ciSnpRFsYbdTrFPXFuhkMZ2yA3RltxgZk AUVAEECMmRTQl1A7dOjuDkq1zoCyr5S2rIhzDFdHFF7v3H9wNRnD4ocni6JoqoB0FVfJ ggmQ== X-Gm-Message-State: AOJu0YwUQSamZfH7Rz3NnAFTreEdcB6ENnYn4QWP/MVTmdArfQRqzRif 7LOFKvQRASpgDXT7vKCGdM83Dkscqooysv4zmA73uV8vevN8QYlwBvXE X-Gm-Gg: Acq92OHBV5mSxNCSHpCsMC+QezbEXeorQ0YewAZc0Oa6qgVmrBKz7/+wOhfjUo52e+B LFVe9VyTx3ozld/e4n3DK4GkNXMtLjeAHZqqjeyNLHcWUHPOFMBmEphyaLa0WFwYwJ9GG1XTPG5 lD9V5RGDSJJEhWuLmAjQw/4nis+Eq7ttKWfdQUqs5zadisaC5hxXont2Fganh/T/oSmpSH7Da2p WCyBLCTKM72OsVt5JNhKJTRupjUv6kxwun6EUPSUqt9pUuUA4LeFa70XBf+lkwLZD9w8HcYQpx0 RxEVacO2MNUb35qfvfEQSNZXnNu0hp2dhona99xK+D2S6rjPvw79RkpbTSf8OPjBR42TVo7LHzU qAt5XsNaTzJNlgMEOPoMkJmZylxt28xKAFQlGltVqvyjrk4PhcjkCR+mFW60xK0JaWnQV2a+ePD mbOztG7KTor8VySOUwtBKveBSuQ0gNCFYr3dr+pKi0r9s5dDjaRmsxc1t3TEBXnqFvlGQS4GF0L 0n58rFiyP7UfbWgmjdCwCELv/cEnjFnWsUyehq0C0SLQfQ+KY6UL3qRCGNZ/2TBPnd2OwvRgvtH hTs= X-Received: by 2002:a05:6830:61c5:b0:7dc:dd19:7f53 with SMTP id 46e09a7af769-7e382127bc5mr7521877a34.14.1778523795015; Mon, 11 May 2026 11:23:15 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:56 -0600 Subject: [PATCH v6 25/35] tests/tcg/mips: add Octeon instruction smoke test MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-25-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::331; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x331.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524039596158500 Add a mips64/mips64el linux-user TCG smoke test for representative Octeon integer, comparison, population count, and multiplier instruction paths. Include hardware-backed regression coverage for VMM0 MPL1 zeroing and MTP0 P1 zeroing. Run the test with -cpu Octeon68XX and share the source between the mips64 and mips64el target directories. Signed-off-by: James Hilliard --- Changes v2 -> v3: - Split the smoke test out of the combined Octeon arithmetic and memory instruction patch. (requested by Richard Henderson) Changes v5 -> v6: - Add VMM0/MPL1 and MTP0/P1 reset checks for the CN71XX-defined reset-state behavior. --- MAINTAINERS | 2 + tests/tcg/mips/Makefile.target | 11 ++ tests/tcg/mips/user/isa/octeon/octeon-insns.c | 204 ++++++++++++++++++++++= ++++ tests/tcg/mips64/Makefile.target | 20 +++ tests/tcg/mips64el/Makefile.target | 8 + 5 files changed, 245 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 93a1e4e482..f7e9c1b6b0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -311,6 +311,8 @@ F: target/mips/ F: disas/*mips.c F: docs/system/cpu-models-mips.rst.inc F: tests/tcg/mips/ +F: tests/tcg/mips64/ +F: tests/tcg/mips64el/ =20 OpenRISC TCG CPUs M: Stafford Horne diff --git a/tests/tcg/mips/Makefile.target b/tests/tcg/mips/Makefile.target index 5d17c1706e..d9dc16f8ec 100644 --- a/tests/tcg/mips/Makefile.target +++ b/tests/tcg/mips/Makefile.target @@ -8,6 +8,17 @@ MIPS_SRC=3D$(SRC_PATH)/tests/tcg/mips # Set search path for all sources VPATH +=3D $(MIPS_SRC) =20 +ifneq ($(findstring 64,$(TARGET_NAME)),) +VPATH +=3D $(MIPS_SRC)/user/isa/octeon + +MIPS64_TESTS=3Docteon-insns + +TESTS +=3D $(MIPS64_TESTS) + +octeon-insns: CFLAGS+=3D-mabi=3D64 +run-octeon-insns: QEMU_OPTS+=3D-cpu Octeon68XX +endif + # hello-mips is 32 bit only ifeq ($(findstring 64,$(TARGET_NAME)),) MIPS_TESTS=3Dhello-mips diff --git a/tests/tcg/mips/user/isa/octeon/octeon-insns.c b/tests/tcg/mips= /user/isa/octeon/octeon-insns.c new file mode 100644 index 0000000000..9153e37e9e --- /dev/null +++ b/tests/tcg/mips/user/isa/octeon/octeon-insns.c @@ -0,0 +1,204 @@ +/* + * Test Octeon-specific user-mode instructions. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include + +static uint64_t octeon_baddu(uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x71095028\n\t" /* baddu $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_dmul(uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x71095003\n\t" /* dmul $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_dpop(uint64_t rs) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + ".word 0x7100502d\n\t" /* dpop $10, $8 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs) + : "$8", "$10"); + + return rd; +} + +static uint64_t octeon_seq(uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x7109502a\n\t" /* seq $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_sne(uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x7109502b\n\t" /* sne $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_vmulu(uint64_t mpl0, uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[mpl0]\n\t" + "move $9, $0\n\t" + ".word 0x71090008\n\t" /* mtm0 $8, $9 */ + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [mpl0] "r" (mpl0), [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_vmm0(uint64_t mpl0, uint64_t p0, + uint64_t rs, uint64_t rt) +{ + uint64_t rd; + + asm volatile( + "move $8, %[mpl0]\n\t" + "move $9, $0\n\t" + ".word 0x71090008\n\t" /* mtm0 $8, $9 */ + "move $8, %[p0]\n\t" + "move $9, $0\n\t" + ".word 0x71090009\n\t" /* mtp0 $8, $9 */ + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + ".word 0x71095010\n\t" /* vmm0 $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [mpl0] "r" (mpl0), [p0] "r" (p0), + [rs] "r" (rs), [rt] "r" (rt) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_vmm0_zeroes_mpl1(void) +{ + uint64_t rd; + + asm volatile( + "move $8, %[mpl0]\n\t" + "move $9, $0\n\t" + ".word 0x71090008\n\t" /* mtm0 $8, $9 */ + "move $8, %[mpl1]\n\t" + "move $9, $0\n\t" + ".word 0x7109000c\n\t" /* mtm1 $8, $9 */ + "move $8, %[vmm0_rs]\n\t" + "move $9, $0\n\t" + ".word 0x71095010\n\t" /* vmm0 $10, $8, $9 */ + "move $8, %[vmulu_rs]\n\t" + "move $9, $0\n\t" + ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */ + "move $8, $0\n\t" + "move $9, $0\n\t" + ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [mpl0] "r" (1ULL), [mpl1] "r" (1ULL), + [vmm0_rs] "r" (2ULL), [vmulu_rs] "r" (1ULL) + : "$8", "$9", "$10"); + + return rd; +} + +static uint64_t octeon_mtp0_zeroes_p1(void) +{ + uint64_t rd; + + asm volatile( + "move $8, %[mpl0]\n\t" + "move $9, $0\n\t" + ".word 0x71090008\n\t" /* mtm0 $8, $9 */ + "move $8, %[p1]\n\t" + "move $9, $0\n\t" + ".word 0x7109000a\n\t" /* mtp1 $8, $9 */ + "move $8, $0\n\t" + "move $9, $0\n\t" + ".word 0x71090009\n\t" /* mtp0 $8, $9 */ + "move $8, $0\n\t" + "move $9, $0\n\t" + ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */ + "move $8, $0\n\t" + "move $9, $0\n\t" + ".word 0x7109500f\n\t" /* vmulu $10, $8, $9 */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [mpl0] "r" (0ULL), [p1] "r" (1ULL) + : "$8", "$9", "$10"); + + return rd; +} + +int main(void) +{ + assert(octeon_baddu(0x123, 0x0f0) =3D=3D 0x13); + assert(octeon_dmul(0x12345678, 0x10) =3D=3D 0x123456780); + assert(octeon_dpop(0xf0f0f0f0f0f0f0f0ULL) =3D=3D 32); + assert(octeon_seq(0xabc, 0xabc) =3D=3D 1); + assert(octeon_seq(0xabc, 0xdef) =3D=3D 0); + assert(octeon_sne(0xabc, 0xabc) =3D=3D 0); + assert(octeon_sne(0xabc, 0xdef) =3D=3D 1); + assert(octeon_vmulu(5, 7, 11) =3D=3D 46); + assert(octeon_vmm0(5, 13, 7, 11) =3D=3D 59); + assert(octeon_vmm0_zeroes_mpl1() =3D=3D 0); + assert(octeon_mtp0_zeroes_p1() =3D=3D 0); + + return 0; +} diff --git a/tests/tcg/mips64/Makefile.target b/tests/tcg/mips64/Makefile.t= arget new file mode 100644 index 0000000000..042855844a --- /dev/null +++ b/tests/tcg/mips64/Makefile.target @@ -0,0 +1,20 @@ +# -*- Mode: makefile -*- +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +# MIPS64 - included from tests/tcg/Makefile.target +# + +MIPS64_SRC=3D$(SRC_PATH)/tests/tcg/mips64 +MIPS_OCTEON_SRC=3D$(SRC_PATH)/tests/tcg/mips/user/isa/octeon + +# Set search path for all sources +VPATH +=3D $(MIPS64_SRC) $(MIPS_OCTEON_SRC) + +MIPS64_TESTS=3Docteon-insns + +TESTS +=3D $(MIPS64_TESTS) + +$(MIPS64_TESTS): CFLAGS+=3D-mabi=3D64 + +run-octeon-insns: QEMU_OPTS+=3D-cpu Octeon68XX diff --git a/tests/tcg/mips64el/Makefile.target b/tests/tcg/mips64el/Makefi= le.target new file mode 100644 index 0000000000..dbc5f8dc5f --- /dev/null +++ b/tests/tcg/mips64el/Makefile.target @@ -0,0 +1,8 @@ +# -*- Mode: makefile -*- +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +# MIPS64 little-endian - included from tests/tcg/Makefile.target +# + +include $(SRC_PATH)/tests/tcg/mips64/Makefile.target --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524006; cv=none; d=zohomail.com; s=zohoarc; b=n8m7gEFvkSEb9xxw246OJpWIdIYH7mEtC+XBTL15lbBTAeejYRWBsN0TyjGLVpabo+4k6q2+rUWo+66gVo/Sh518q08i6zunsan5QRDfPRNmvPewFY3ZcRKzndDLYd/0UdIvLA2HyFENq409dyhYP7s2QsGC5XnLGKZE9PtuQgU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524006; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=FlakYH7kx2XQcE7j7V6CqlqT/aTTxeKWnMexihxfdas=; b=PMifdW/1W4BadTszFdAiQQapXAW3Cu5llCRbiC9LmvUtDuTWKVZ6EY9TYYUSoerH3cyeL+ia2hxFC7D7exqdoYFpJI76JG27Qv8tNgrRdyUE6D48iLOT6r4mpZdEdjwju8m1SufeCNAzsY81qIH0VSGBdHMA7LD4ZEFd5S6Yds4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852400613654.848866421118146; Mon, 11 May 2026 11:26:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI2-00056B-Cx; Mon, 11 May 2026 14:23:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHl-0004r0-Dw for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:22 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHi-0002uh-9o for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:19 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7df05fc49e5so4527294a34.3 for ; Mon, 11 May 2026 11:23:17 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523796; x=1779128596; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=FlakYH7kx2XQcE7j7V6CqlqT/aTTxeKWnMexihxfdas=; b=S9s6Fw+2Yp7r00FjlfrLROtG2ob51GEhWlhwWu015eiv0Vxi1IfCzgdafJlmkV3Dna c8sdJdXsJtRpSKQpBuJCrbljm2XWM9hi5tGj0YIrg8lf/aQqGQZgoi+Q1d+IdopkwYx2 5WsJ3ADEdNHLwYWQVnOKgmfwuVhqwiUV+mQn5t1tEbWMNcakv9rw2qnhq4VGujl8Eajl HEJyWJNK+ekIrlIU5QrTMS8d9d25wsteFj0dIRkEfLBk8v1RdnBGt1T3WuJpT2ZxEhSd FrFBzXoAF1nO8q+0/SwTGgmjlw9KuVrhxpAU2vB0q2msDQ1sfR5A/X8wzyxkE4hfu5XX K4kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523796; x=1779128596; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=FlakYH7kx2XQcE7j7V6CqlqT/aTTxeKWnMexihxfdas=; b=ARebKZXz8eRdYYJ+R5kuWrC4KUzlgSupqKn8+2Cc/jO3jMHvA6LZRMqLV/RjvmSaqm tz5QUua7ykvhGrQOtIpDyBL89oBtyNlK5YqH00/a6qCSLo4de64C/H2QaMfSuNPY3rHj cpCyCKZZQUnbb7fMJkN5qf+siLimQbMerubytIltL8aXq2mWY7vBpG3nwBl/82vPqNHE F21gdxoxuKTo08JYtCnhnqWhCZAgLkXFSEUmDDW+XyK71VG5rPh87pvE0hWmonxjxr+W WPPYy8l3F17F8RCmP6B0W0BbhTzBFlUUkNV+/tHiy1JsERUc2+K+mJOB/ELmTzw5U6iK g8bQ== X-Gm-Message-State: AOJu0Yw1ihv2Ph7dR9mCpythrVP9Jg6HamDPBGfddqO8iKrYhuOvpru8 KEbuh8Oo5ZO2PrCRQv4LCZAWiwfg5KnOyZ5NrrEBSHogWViQsmxnZoqo X-Gm-Gg: Acq92OFmW82n403BRsi8zZIxcJawnwd4yI8+WZtyPj+sjY0XcyE0ZQolAih6bZd2vuo gC/rJd/FsdbFT6b2MjR4f3NpB8LNVLdRA0cQcjPEH0SwR1E5J/pX/Y1rACepLgSS3gNv92iRW35 KL5MtgLpjcX3m4pGEMdM2A6qDSWxRM6q7fRtsFO9EJA/6Rmib6L61tBhA9qgqyEf9mFBNU7/OUT IJSeq0Q48c5Ee5eIJ5KhyPoL/5vlBl7NBdAhVkEGcselb9CmAEV4gdrtJd45QXgWPSL3vV9z0oE NDdb2f/GpuC1CJ5icmnsHAwOoWZQU2zauH0r2hu66Y+QDjhkJti8HQ1DyDYO8MKkxYSKF6kZBSq CZW29cvj7jvGVYAt+Zl+OzIHQS2Tw4rmA4+q1bAfFF9Ztt91PFCoCjRGXO763/FqdUY8WGCiWmn O9jglfwjG/yCLxK0N9KfL7FdvS2XMwhoOc5mHYfbO3mpOzS/Ka8dg5x/rASAacdKKn/QE6cE8Rn KEkyA+RCPa8zBIh7qEvT3BRPv+4/AeFu9Y62n0fJ6Lvxsfom09qdSTooPhyvCI59nj2 X-Received: by 2002:a05:6830:4388:b0:7d7:cb13:3fef with SMTP id 46e09a7af769-7e382139708mr6839131a34.20.1778523795958; Mon, 11 May 2026 11:23:15 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:57 -0600 Subject: [PATCH v6 26/35] target/mips: add Octeon LA* atomic instructions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-26-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x332.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524007031158500 Implement the Octeon LA* read-modify-write atomic instruction family: LAI/LAID, LAD/LADD, LAA/LAAD, LAS/LASD, LAC/LACD, and LAW/LAWD. These operations are architecturally distinct from SAA/SAAD and are used by existing Octeon user-mode code for atomic counters, bit operations, and exchange-style updates. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Keep LA* atomics naturally aligned per Octeon L2 transaction semantics. - Use explicit i64 TCG ops in the LA* translator paths. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v2 -> v3: - Drop redundant TARGET_LONG_BITS guards from doubleword atomic paths. (suggested by Richard Henderson) - Group LA* translator wrappers by argument shape instead of adding one wrapper per instruction. (suggested by Richard Henderson) Changes v3 -> v4: - Use i64 atomic helpers for both word and doubleword paths and select word sign-extension through MO_SL. (suggested by Richard Henderson) Changes v5 -> v6: - Rename the shared translator helpers to distinguish fetch-add and exchange operations. --- target/mips/tcg/octeon.decode | 17 +++++++++ target/mips/tcg/octeon_translate.c | 74 ++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 91 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index 5edcd95884..801d35d680 100644 --- a/target/mips/tcg/octeon.decode +++ b/target/mips/tcg/octeon.decode @@ -64,6 +64,23 @@ V3MULU 011100 ..... ..... ..... 00000 010001 @r3 SAA 011100 ..... ..... 00000 00000 011000 @saa SAAD 011100 ..... ..... 00000 00000 011001 @saa =20 +&la base rd +&laa base add rd +@la ...... base:5 ..... rd:5 ........... &la +@laa ...... base:5 add:5 rd:5 ........... &laa +LAI 011100 ..... 00000 ..... 00010 011111 @la +LAID 011100 ..... 00000 ..... 00011 011111 @la +LAD 011100 ..... 00000 ..... 00110 011111 @la +LADD 011100 ..... 00000 ..... 00111 011111 @la +LAA 011100 ..... ..... ..... 10010 011111 @laa +LAAD 011100 ..... ..... ..... 10011 011111 @laa +LAS 011100 ..... 00000 ..... 01010 011111 @la +LASD 011100 ..... 00000 ..... 01011 011111 @la +LAC 011100 ..... 00000 ..... 01110 011111 @la +LACD 011100 ..... 00000 ..... 01111 011111 @la +LAW 011100 ..... ..... ..... 10110 011111 @laa +LAWD 011100 ..... ..... ..... 10111 011111 @laa + &zcb base ZCB 011100 base:5 00000 00000 11100 011111 &zcb ZCB 011100 base:5 00000 00000 11101 011111 &zcb # ZCBT diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index b41bc1f81e..07674f0d44 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -190,6 +190,68 @@ static bool trans_saa(DisasContext *ctx, arg_saa *a, M= emOp mop) return true; } =20 +static bool trans_la_fetch_add(DisasContext *ctx, int base, int add_reg, + int rd, int64_t imm, MemOp mop) +{ + TCGv_i64 addr =3D tcg_temp_new_i64(); + TCGv_i64 value =3D tcg_temp_new_i64(); + TCGv_i64 old =3D tcg_temp_new_i64(); + MemOp amo =3D mo_endian(ctx) | mop | MO_ALIGN; + + gen_base_offset_addr(ctx, addr, base, 0); + + if (add_reg >=3D 0) { + gen_load_gpr(value, add_reg); + } else { + tcg_gen_movi_i64(value, imm); + } + + tcg_gen_atomic_fetch_add_i64(old, addr, value, ctx->mem_idx, amo); + gen_store_gpr(old, rd); + return true; +} + +static bool trans_la_xchg(DisasContext *ctx, int base, int add_reg, int rd, + int64_t imm, MemOp mop) +{ + TCGv_i64 addr =3D tcg_temp_new_i64(); + TCGv_i64 value =3D tcg_temp_new_i64(); + TCGv_i64 old =3D tcg_temp_new_i64(); + MemOp amo =3D mo_endian(ctx) | mop | MO_ALIGN; + + gen_base_offset_addr(ctx, addr, base, 0); + + if (add_reg >=3D 0) { + gen_load_gpr(value, add_reg); + } else { + tcg_gen_movi_i64(value, imm); + } + + tcg_gen_atomic_xchg_i64(old, addr, value, ctx->mem_idx, amo); + gen_store_gpr(old, rd); + return true; +} + +static bool do_la_imm_add(DisasContext *ctx, arg_la *a, int64_t imm, MemOp= mop) +{ + return trans_la_fetch_add(ctx, a->base, -1, a->rd, imm, mop); +} + +static bool do_la_reg_add(DisasContext *ctx, arg_laa *a, MemOp mop) +{ + return trans_la_fetch_add(ctx, a->base, a->add, a->rd, 0, mop); +} + +static bool do_la_imm_xchg(DisasContext *ctx, arg_la *a, int64_t imm, MemO= p mop) +{ + return trans_la_xchg(ctx, a->base, -1, a->rd, imm, mop); +} + +static bool do_la_reg_xchg(DisasContext *ctx, arg_laa *a, MemOp mop) +{ + return trans_la_xchg(ctx, a->base, a->add, a->rd, 0, mop); +} + static bool trans_ZCB(DisasContext *ctx, arg_ZCB *a) { TCGv_i64 addr =3D tcg_temp_new_i64(); @@ -313,6 +375,18 @@ static bool trans_vmul(DisasContext *ctx, arg_decode_e= xt_octeon1 *a, =20 TRANS(SAA, trans_saa, MO_UL); TRANS(SAAD, trans_saa, MO_UQ); +TRANS(LAI, do_la_imm_add, 1, MO_SL); +TRANS(LAID, do_la_imm_add, 1, MO_UQ); +TRANS(LAD, do_la_imm_add, -1, MO_SL); +TRANS(LADD, do_la_imm_add, -1, MO_UQ); +TRANS(LAA, do_la_reg_add, MO_SL); +TRANS(LAAD, do_la_reg_add, MO_UQ); +TRANS(LAS, do_la_imm_xchg, -1, MO_SL); +TRANS(LASD, do_la_imm_xchg, -1, MO_UQ); +TRANS(LAC, do_la_imm_xchg, 0, MO_SL); +TRANS(LACD, do_la_imm_xchg, 0, MO_UQ); +TRANS(LAW, do_la_reg_xchg, MO_SL); +TRANS(LAWD, do_la_reg_xchg, MO_UQ); TRANS(QMAC, trans_qmac, gen_helper_octeon_qmac); TRANS(QMACS, trans_qmac, gen_helper_octeon_qmacs); TRANS(LBX, trans_lx, MO_SB); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523933; cv=none; d=zohomail.com; s=zohoarc; b=mglH4i0T1utSktzWxOuqvwqpOf/+ZKCYyti01stRFSy4Zwh7xFnXRG1wuQ+3xtUT9VpQlmUT1G2Ye4s9oT+oodM61mBRDmBlCd6L9nt8XX9wkeFJ29Ayx61/D1BBfrLbvGsZlvdtKb+mtl09otjbOafxxLkrXszPcCJaalmhbVA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523933; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=T1+E6rXuPOy02Ub14LSNQM8VRMd9ryUPpmj7dwjkBeM=; b=F6p8v6/di07JtdBdHeNo2KzpQCbfhlU34IPasz+lui0D+ETG07tD39oqYCjMMgg/en7dtXttV0q2NdZHUSREpmEr6LhDXn2ewSXS4rDnNOBFvWiSdWwLbtdVViXgTeu9YmzC70O3crdgE2acvj8pMrCpSr5tNW9FoQ7oiQnKu6Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852393325733.8621354644132; Mon, 11 May 2026 11:25:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI6-0005LR-GW; Mon, 11 May 2026 14:23:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHo-0004s4-7h for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: from mail-ot1-x335.google.com ([2607:f8b0:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHi-0002um-P3 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:23 -0400 Received: by mail-ot1-x335.google.com with SMTP id 46e09a7af769-7dbec19732eso4288947a34.3 for ; Mon, 11 May 2026 11:23:18 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523797; x=1779128597; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=T1+E6rXuPOy02Ub14LSNQM8VRMd9ryUPpmj7dwjkBeM=; b=MY4WYDopixG+MycIiCQDyJby8/c2BuNGnmax9qlzLmCiAh6scilmf3/XbahoO5wJmm fF9ZODP+Hg3M06+uC/kRToDkQIDDRSMRvr9DnAIFl653y2Oasx/jxO2Pa+Ty81JT/RWk WMhMElRfxmSWfiQn9D1heEzwag6EAdPH26x4M0E8c5qD8xmIKUI6I1jqgEurMpxDmuma 4kgaa8zmv9F56BnBNAGHmHzia+OmL6hefP8WPJqQlPATQCTIPPVJhobjRmpZ+OYW2BGm gxI8a30WM2/lqZ8Hl4VIJINgkLiy2wX3aKg3vagJPX6D0ksxOhP6Eri4qMQSwqA+5pFk jpZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523797; x=1779128597; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=T1+E6rXuPOy02Ub14LSNQM8VRMd9ryUPpmj7dwjkBeM=; b=HLjz9hmIVRwDEs0OIqiYQM7Jm/p2+/TA//kA6IrTM869wDkbhHLQOu6XoktMMaQDdw yXYH6PmQ8rf/EMvMK0LfUvj73oEdV3GnQUTTYT9laK2aSScLufBN2l8265DMQgae7JYk d8SIQ1e/dhuY+kSiJYPxR4rjQSJAfMSKoOeGFodbp1zDQeqAUP6fWTuaOFBWDPq/Uqxi lflEpAfAO+kN2J2gGgk/9qCdkUQcllQID0yVGPDaMIPxkA+ig/ZsViC6818qBNmPXH87 +91B4znVHAVHtFQoUmgNz1LKDjNFRmL6INIw6oqIj6BA7xUAS3dIpJNMl9LewtWWNqNa grlw== X-Gm-Message-State: AOJu0YzuIaiuzj/elU6wIJOm9dEwjiPAP9T84B0UgSeu75qkBb+cxFxL GCCIB50vgub+ZVrglXhZYnCrcvEI4c4af6iWNy1tmGha9fKm/Qk9cxyw X-Gm-Gg: Acq92OFFTYlq67NIj2LS8UHXIMusuDzffc04qlwldnocEO+5sjwK6WvXF2P2Vp7S/th pKS/291tMgwOaLf9VxEfaubxWrTGytSzVlCaxv00hc2/SvkfoO8njrmzRstZOTSj1Y+n2xdcWLL YK6o0pEwRnssZPZCikE6CWDW9CGC5RtA7ferf3+KAydLJUd4PtkNc2ux1N5YhnE3XgIXVMPcL0F CJyqL4m5wBgCbC9Yg7NvRPhYq6FKt3TQ9VadIzB2w7FYy0MSDKRdfHEZZWCvFPuWCLUWuU20AdP k2K69o3DbX9Si/ROimLfvNMRUEj40zsIvOhlYSz8iqVC50ocqXT+/uPJGTG8h1HDzfkg+DhEWp0 uhlR5I6FUPGPdUFY6JJL+mNFks0FssUYYWaiKnQLpdD40EAz+hmHWHXe/7JbSosFJgJxhH6JFDl uM+C+pCdBIlGP/miZFBLCIk3Z8RO65qHE4q/OzTS20eMQw3GAQ37UiAgz7AQcQZpCzVvGdwTBZ3 IdWOpL8fIfekzJTgeYsv8+/qALCvXgFrtqv2ZGM4SZFf/C528BgwVIETt2NgY+9W77s X-Received: by 2002:a05:6830:6018:b0:7dc:d7e8:cb30 with SMTP id 46e09a7af769-7e1df137ec9mr15265453a34.26.1778523796938; Mon, 11 May 2026 11:23:16 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:58 -0600 Subject: [PATCH v6 27/35] target/mips: add Octeon COP2 crypto core support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-27-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::335; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x335.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523934305158500 Octeon processors expose their crypto engines through selector-driven DMFC2/DMTC2 accesses rather than architected standalone opcodes. Add the common COP2 state, selector decode, and helper plumbing for the base engine set. This covers the hash, AES, CRC, GFM, 3DES, KASUMI, and SNOW3G engines and moves the implementation into octeon_crypto.c to keep the MIPS helper layer manageable. Model the AES RESINP selector bank as writable as well as readable. Octeon COP2 engines use these slots as result-input staging registers, so the shared bank belongs with the base selector support. Extend the TCG smoke test with AES key-register readback checks for the selector window introduced here. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Fold the AES COP2 selector readback smoke coverage into this patch. - Move Octeon COP2 decode plumbing into octeon_translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) - Use uint64_t/i64 helper types for Octeon COP2 state transfers. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v2 -> v3: - Remove redundant MIPS64 checks from Octeon COP2 translation; the opcode path is already restricted to TARGET_MIPS64 Octeon CPUs. (suggested by Richard Henderson) Changes v5 -> v6: - Rename COP2 selector constants and comments to use RESINP/INP, HSH_STARTSHA, and MF/MT direction suffixes from the hardware selector naming. - Rename COP2 crypto state fields and shared-window helpers to use HSH_IV/HSH_DAT/HSH_IVW/HSH_DATW and GFM_RESINP hardware naming. - Rename HSH register word-packing helpers from octeon_hash_* to octeon_hsh_*. --- target/mips/cpu.h | 165 +++ target/mips/helper.h | 2 + target/mips/system/machine.c | 37 + target/mips/tcg/meson.build | 1 + target/mips/tcg/octeon_crypto.c | 1654 +++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 204 +++ target/mips/tcg/translate.c | 9 + target/mips/tcg/translate.h | 1 + tests/tcg/mips/user/isa/octeon/octeon-insns.c | 71 ++ 9 files changed, 2144 insertions(+) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index 346713705a..e16f0f6e98 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -537,6 +537,169 @@ struct TCState { }; =20 struct MIPSITUState; +typedef enum MIPSOcteonSharedMode { + OCTEON_SHARED_MODE_NONE =3D 0, + OCTEON_SHARED_MODE_SHA512, + OCTEON_SHARED_MODE_SNOW3G, +} MIPSOcteonSharedMode; + +typedef enum MIPSOcteonCop2Sel { + OCTEON_COP2_SEL_HSH_DAT0 =3D 0x0040, + OCTEON_COP2_SEL_HSH_DAT1, + OCTEON_COP2_SEL_HSH_DAT2, + OCTEON_COP2_SEL_HSH_DAT3, + OCTEON_COP2_SEL_HSH_DAT4, + OCTEON_COP2_SEL_HSH_DAT5, + OCTEON_COP2_SEL_HSH_DAT6, + OCTEON_COP2_SEL_HSH_IV0 =3D 0x0048, + OCTEON_COP2_SEL_HSH_IV1, + OCTEON_COP2_SEL_HSH_IV2, + OCTEON_COP2_SEL_HSH_IV3, + OCTEON_COP2_SEL_SHA3_DAT24 =3D 0x0050, + OCTEON_COP2_SEL_SHA3_DAT15_MT =3D 0x0051, + OCTEON_COP2_SEL_HSH_STARTSHA_COMPAT =3D 0x0057, + OCTEON_COP2_SEL_GFM_MUL_REFLECT0 =3D 0x0058, + OCTEON_COP2_SEL_GFM_MUL_REFLECT1, + OCTEON_COP2_SEL_GFM_RESINP_REFLECT0 =3D 0x005a, + OCTEON_COP2_SEL_GFM_RESINP_REFLECT1, + OCTEON_COP2_SEL_GFM_XOR0_REFLECT =3D 0x005c, + OCTEON_COP2_SEL_3DES_KEY0 =3D 0x0080, + OCTEON_COP2_SEL_3DES_KEY1, + OCTEON_COP2_SEL_3DES_KEY2, + OCTEON_COP2_SEL_3DES_IV =3D 0x0084, + OCTEON_COP2_SEL_3DES_RESULT_MF =3D 0x0088, + OCTEON_COP2_SEL_3DES_RESULT_MT =3D 0x0098, + OCTEON_COP2_SEL_3DES_ENC_CBC =3D 0x4088, + /* + * Octeon reuses the 3DES key/result bank for KASUMI and only adds + * KASUMI-specific operation selectors. + */ + OCTEON_COP2_SEL_KAS_ENC_CBC =3D 0x4089, + OCTEON_COP2_SEL_3DES_ENC =3D 0x408a, + OCTEON_COP2_SEL_KAS_ENC =3D 0x408b, + OCTEON_COP2_SEL_3DES_DEC_CBC =3D 0x408c, + OCTEON_COP2_SEL_3DES_DEC =3D 0x408e, + OCTEON_COP2_SEL_AES_RESINP0 =3D 0x0100, + OCTEON_COP2_SEL_AES_RESINP1, + OCTEON_COP2_SEL_AES_IV0, + OCTEON_COP2_SEL_AES_IV1, + OCTEON_COP2_SEL_AES_KEY0, + OCTEON_COP2_SEL_AES_KEY1, + OCTEON_COP2_SEL_AES_KEY2, + OCTEON_COP2_SEL_AES_KEY3, + OCTEON_COP2_SEL_AES_ENC_CBC0 =3D 0x0108, + OCTEON_COP2_SEL_AES_ENC0 =3D 0x010a, + OCTEON_COP2_SEL_AES_DEC_CBC0 =3D 0x010c, + OCTEON_COP2_SEL_AES_DEC0 =3D 0x010e, + OCTEON_COP2_SEL_AES_KEYLENGTH =3D 0x0110, + OCTEON_COP2_SEL_AES_INP0 =3D 0x0111, + OCTEON_COP2_SEL_CRC_POLYNOMIAL =3D 0x0200, + OCTEON_COP2_SEL_CRC_IV =3D 0x0201, + OCTEON_COP2_SEL_CRC_LEN =3D 0x0202, + OCTEON_COP2_SEL_CRC_IV_REFLECT =3D 0x0203, + OCTEON_COP2_SEL_CRC_WRITE_BYTE =3D 0x0204, + OCTEON_COP2_SEL_CRC_WRITE_HALF =3D 0x0205, + OCTEON_COP2_SEL_CRC_WRITE_WORD =3D 0x0206, + OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL =3D 0x4200, + OCTEON_COP2_SEL_CRC_WRITE_LEN =3D 0x1202, + OCTEON_COP2_SEL_CRC_WRITE_IV_REFLECT =3D 0x0211, + OCTEON_COP2_SEL_CRC_WRITE_BYTE_REFLECT =3D 0x0214, + OCTEON_COP2_SEL_CRC_WRITE_HALF_REFLECT =3D 0x0215, + OCTEON_COP2_SEL_CRC_WRITE_WORD_REFLECT =3D 0x0216, + OCTEON_COP2_SEL_CRC_WRITE_DWORD =3D 0x1207, + OCTEON_COP2_SEL_CRC_WRITE_VAR =3D 0x1208, + OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL_REFLECT =3D 0x4210, + OCTEON_COP2_SEL_CRC_WRITE_DWORD_REFLECT =3D 0x1217, + OCTEON_COP2_SEL_CRC_WRITE_VAR_REFLECT =3D 0x1218, + /* + * Octeon shares 0x0240..0x0257 between SHA512 state/data and the SNOW= 3G + * RESULT/FSM/LFSR window. + */ + OCTEON_COP2_SEL_HSH_DATW0 =3D 0x0240, + OCTEON_COP2_SEL_HSH_DATW1, + OCTEON_COP2_SEL_HSH_DATW2, + OCTEON_COP2_SEL_HSH_DATW3, + OCTEON_COP2_SEL_HSH_DATW4, + OCTEON_COP2_SEL_HSH_DATW5, + OCTEON_COP2_SEL_HSH_DATW6, + OCTEON_COP2_SEL_HSH_DATW7, + OCTEON_COP2_SEL_HSH_DATW8, + OCTEON_COP2_SEL_HSH_DATW9, + OCTEON_COP2_SEL_HSH_DATW10, + OCTEON_COP2_SEL_HSH_DATW11, + OCTEON_COP2_SEL_HSH_DATW12, + OCTEON_COP2_SEL_HSH_DATW13, + OCTEON_COP2_SEL_HSH_DATW14, + OCTEON_COP2_SEL_HSH_DATW15, + OCTEON_COP2_SEL_HSH_IVW0 =3D 0x0250, + OCTEON_COP2_SEL_HSH_IVW1, + OCTEON_COP2_SEL_HSH_IVW2, + OCTEON_COP2_SEL_HSH_IVW3, + OCTEON_COP2_SEL_HSH_IVW4, + OCTEON_COP2_SEL_HSH_IVW5, + OCTEON_COP2_SEL_HSH_IVW6, + OCTEON_COP2_SEL_HSH_IVW7, + OCTEON_COP2_SEL_SNOW3G_LFSR0 =3D 0x0240, + OCTEON_COP2_SEL_SNOW3G_LFSR1, + OCTEON_COP2_SEL_SNOW3G_LFSR2, + OCTEON_COP2_SEL_SNOW3G_LFSR3, + OCTEON_COP2_SEL_SNOW3G_LFSR4, + OCTEON_COP2_SEL_SNOW3G_LFSR5, + OCTEON_COP2_SEL_SNOW3G_LFSR6, + OCTEON_COP2_SEL_SNOW3G_LFSR7, + OCTEON_COP2_SEL_SNOW3G_RESULT =3D 0x0250, + OCTEON_COP2_SEL_SNOW3G_FSM0, + OCTEON_COP2_SEL_SNOW3G_FSM1, + OCTEON_COP2_SEL_SNOW3G_FSM2, + OCTEON_COP2_SEL_GFM_MUL0 =3D 0x0258, + OCTEON_COP2_SEL_GFM_MUL1, + OCTEON_COP2_SEL_GFM_RESINP0, + OCTEON_COP2_SEL_GFM_RESINP1, + OCTEON_COP2_SEL_GFM_XOR0, + OCTEON_COP2_SEL_GFM_POLY =3D 0x025e, + OCTEON_COP2_SEL_AES_ENC_CBC1 =3D 0x3109, + OCTEON_COP2_SEL_AES_ENC1 =3D 0x310b, + OCTEON_COP2_SEL_AES_DEC_CBC1 =3D 0x310d, + OCTEON_COP2_SEL_AES_DEC1 =3D 0x310f, + OCTEON_COP2_SEL_HSH_STARTMD5 =3D 0x4047, + OCTEON_COP2_SEL_SNOW3G_START =3D 0x404d, + OCTEON_COP2_SEL_SNOW3G_MORE =3D 0x404e, + OCTEON_COP2_SEL_HSH_STARTSHA256 =3D 0x404f, + OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT =3D 0x405d, + OCTEON_COP2_SEL_HSH_STARTSHA =3D 0x4057, + OCTEON_COP2_SEL_HSH_STARTSHA512 =3D 0x424f, + OCTEON_COP2_SEL_GFM_XORMUL1 =3D 0x425d, +} MIPSOcteonCop2Sel; + +typedef struct MIPSOcteonCryptoState { + uint64_t des3_key[3]; + uint64_t des3_iv; + uint64_t des3_result; + uint64_t hsh_iv[4]; + uint64_t hsh_dat[8]; + uint64_t hsh_ivw[8]; + uint64_t hsh_datw[16]; + uint64_t aes_iv[2]; + uint64_t aes_key[4]; + uint64_t aes_result[2]; + uint64_t aes_input[2]; + uint64_t gfm_mul[2]; + uint64_t gfm_resinp[2]; + uint64_t gfm_xor0; + uint64_t gfm_reflect_mul[2]; + uint64_t gfm_reflect_resinp[2]; + uint64_t gfm_reflect_xor0; + uint16_t gfm_poly; + uint8_t aes_keylen; + uint32_t shared_mode; + uint32_t crc_poly; + uint32_t crc_iv; + uint32_t crc_len; + uint32_t snow3g_fsm[3]; + uint32_t snow3g_lfsr[16]; + uint64_t snow3g_result; +} MIPSOcteonCryptoState; + typedef struct CPUArchState { TCState active_tc; CPUMIPSFPUContext active_fpu; @@ -558,6 +721,8 @@ typedef struct CPUArchState { #define MSAIR_ProcID 8 #define MSAIR_Rev 0 =20 + MIPSOcteonCryptoState octeon_crypto; + /* * CP0 Register 0 */ diff --git a/target/mips/helper.h b/target/mips/helper.h index e93bc37903..52fe18a8f8 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -29,6 +29,8 @@ DEF_HELPER_3(octeon_vmm0, i64, env, i64, i64) DEF_HELPER_3(octeon_v3mulu, i64, env, i64, i64) DEF_HELPER_4(octeon_qmac, void, env, i64, i64, i32) DEF_HELPER_4(octeon_qmacs, void, env, i64, i64, i32) +DEF_HELPER_2(octeon_cop2_dmfc2, i64, env, i32) +DEF_HELPER_3(octeon_cop2_dmtc2, void, env, i64, i32) =20 /* microMIPS functions */ DEF_HELPER_4(lwm, void, env, tl, tl, i32) diff --git a/target/mips/system/machine.c b/target/mips/system/machine.c index f988b3695b..ebfa0a9eb0 100644 --- a/target/mips/system/machine.c +++ b/target/mips/system/machine.c @@ -279,6 +279,42 @@ static const VMStateDescription mips_vmstate_octeon_mu= ltiplier =3D { } }; =20 +static const VMStateDescription mips_vmstate_octeon_crypto =3D { + .name =3D "cpu/octeon_crypto", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D mips_octeon_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT64_ARRAY(env.octeon_crypto.des3_key, MIPSCPU, 3), + VMSTATE_UINT64(env.octeon_crypto.des3_iv, MIPSCPU), + VMSTATE_UINT64(env.octeon_crypto.des3_result, MIPSCPU), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_iv, MIPSCPU, 4), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_dat, MIPSCPU, 8), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_ivw, MIPSCPU, 8), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_datw, MIPSCPU, 16), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_iv, MIPSCPU, 2), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_key, MIPSCPU, 4), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_result, MIPSCPU, 2), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_input, MIPSCPU, 2), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.gfm_mul, MIPSCPU, 2), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.gfm_resinp, MIPSCPU, 2), + VMSTATE_UINT64(env.octeon_crypto.gfm_xor0, MIPSCPU), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.gfm_reflect_mul, MIPSCPU, 2= ), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.gfm_reflect_resinp, MIPSCPU= , 2), + VMSTATE_UINT64(env.octeon_crypto.gfm_reflect_xor0, MIPSCPU), + VMSTATE_UINT16(env.octeon_crypto.gfm_poly, MIPSCPU), + VMSTATE_UINT8(env.octeon_crypto.aes_keylen, MIPSCPU), + VMSTATE_UINT32(env.octeon_crypto.shared_mode, MIPSCPU), + VMSTATE_UINT32(env.octeon_crypto.crc_poly, MIPSCPU), + VMSTATE_UINT32(env.octeon_crypto.crc_iv, MIPSCPU), + VMSTATE_UINT32(env.octeon_crypto.crc_len, MIPSCPU), + VMSTATE_UINT32_ARRAY(env.octeon_crypto.snow3g_fsm, MIPSCPU, 3), + VMSTATE_UINT32_ARRAY(env.octeon_crypto.snow3g_lfsr, MIPSCPU, 16), + VMSTATE_UINT64(env.octeon_crypto.snow3g_result, MIPSCPU), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_mips_cpu =3D { .name =3D "cpu", .version_id =3D 21, @@ -396,6 +432,7 @@ const VMStateDescription vmstate_mips_cpu =3D { .subsections =3D (const VMStateDescription * const []) { &mips_vmstate_timer, &mips_vmstate_octeon_multiplier, + &mips_vmstate_octeon_crypto, NULL } }; diff --git a/target/mips/tcg/meson.build b/target/mips/tcg/meson.build index fff9cd6c7f..4ee359874a 100644 --- a/target/mips/tcg/meson.build +++ b/target/mips/tcg/meson.build @@ -18,6 +18,7 @@ mips_ss.add(files( 'lmmi_helper.c', 'msa_helper.c', 'msa_translate.c', + 'octeon_crypto.c', 'op_helper.c', 'rel6_translate.c', 'translate.c', diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c new file mode 100644 index 0000000000..8b3260c4d6 --- /dev/null +++ b/target/mips/tcg/octeon_crypto.c @@ -0,0 +1,1654 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * MIPS Octeon crypto emulation helpers. + * + * Copyright (c) 2026 James Hilliard + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "internal.h" +#include "exec/helper-proto.h" +#include "crypto/aes.h" +#include "crypto/clmul.h" +#include "qemu/bitops.h" +#include "qemu/host-utils.h" + +static inline void octeon_set_shared_mode(MIPSOcteonCryptoState *crypto, + MIPSOcteonSharedMode mode) +{ + crypto->shared_mode =3D mode; +} + +static inline uint32_t octeon_crc_reflect32_by_byte(uint32_t v) +{ + return bswap32(revbit32(v)); +} + +static uint32_t octeon_crc_state_reflect(const MIPSOcteonCryptoState *cryp= to) +{ + return octeon_crc_reflect32_by_byte(crypto->crc_iv); +} + +static void octeon_crc_set_state_reflect(MIPSOcteonCryptoState *crypto, + uint32_t state) +{ + crypto->crc_iv =3D octeon_crc_reflect32_by_byte(state); +} + +static void octeon_crc_update_normal(MIPSOcteonCryptoState *crypto, + uint64_t value, unsigned int bytes) +{ + uint32_t crc =3D crypto->crc_iv; + uint32_t poly =3D crypto->crc_poly; + + for (unsigned int i =3D 0; i < bytes; i++) { + uint8_t byte =3D value >> ((bytes - 1 - i) * 8); + + crc ^=3D (uint32_t)byte << 24; + for (int bit =3D 0; bit < 8; bit++) { + if (crc & 0x80000000U) { + crc =3D (crc << 1) ^ poly; + } else { + crc <<=3D 1; + } + } + } + + crypto->crc_iv =3D crc; +} + +static void octeon_crc_update_reflect(MIPSOcteonCryptoState *crypto, + uint64_t value, unsigned int bytes) +{ + uint32_t crc =3D octeon_crc_state_reflect(crypto); + uint32_t poly =3D bswap32(crypto->crc_poly); + + for (unsigned int i =3D 0; i < bytes; i++) { + uint8_t byte =3D value >> ((bytes - 1 - i) * 8); + + crc ^=3D byte; + for (int bit =3D 0; bit < 8; bit++) { + if (crc & 1U) { + crc =3D (crc >> 1) ^ poly; + } else { + crc >>=3D 1; + } + } + } + + octeon_crc_set_state_reflect(crypto, crc); +} + +static uint64_t octeon_gfm_reduce64(Int128 product, uint8_t poly) +{ + uint64_t lo =3D int128_getlo(product); + uint64_t hi =3D int128_gethi(product); + + while (hi) { + int bit =3D 63 - clz64(hi); + uint64_t shifted_poly =3D (uint64_t)poly << bit; + + hi ^=3D 1ULL << bit; + lo ^=3D shifted_poly; + if (bit > 56) { + hi ^=3D (uint64_t)poly >> (64 - bit); + } + } + + return lo; +} + +static void octeon_gfm_mul64_uia2(const uint64_t x[2], const uint64_t y[2], + uint8_t poly, uint64_t out[2]) +{ + uint64_t vx =3D revbit64(x[1]); + uint64_t vy =3D revbit64(y[0]); + Int128 product =3D clmul_64(vx, vy); + uint64_t res =3D octeon_gfm_reduce64(product, revbit32(poly) >> 24); + + out[0] =3D 0; + out[1] =3D revbit64(res); +} + +static void octeon_gfm_mul_reflect(MIPSOcteonCryptoState *crypto, uint64_t= data) +{ + uint64_t in[2] =3D { + crypto->gfm_reflect_resinp[0] ^ crypto->gfm_reflect_xor0, + crypto->gfm_reflect_resinp[1] ^ data, + }; + + octeon_gfm_mul64_uia2(in, crypto->gfm_reflect_mul, + crypto->gfm_poly, crypto->gfm_reflect_resinp); + crypto->gfm_reflect_xor0 =3D 0; +} + +static inline void octeon_hsh_load_reg_words_be(uint64_t reg, + uint32_t *hi, uint32_t *l= o) +{ + uint8_t buf[8]; + + stq_be_p(buf, reg); + *hi =3D ldl_be_p(buf); + *lo =3D ldl_be_p(buf + 4); +} + +static inline void octeon_hsh_load_reg_words_le(uint64_t reg, + uint32_t *lo0, uint32_t *= lo1) +{ + uint8_t buf[8]; + + stq_be_p(buf, reg); + *lo0 =3D ldl_le_p(buf); + *lo1 =3D ldl_le_p(buf + 4); +} + +static inline uint64_t octeon_hsh_store_reg_words_be(uint32_t hi, uint32_t= lo) +{ + uint8_t buf[8]; + + stl_be_p(buf, hi); + stl_be_p(buf + 4, lo); + return ldq_be_p(buf); +} + +static inline uint64_t octeon_hsh_store_reg_words_le(uint32_t lo0, + uint32_t lo1) +{ + uint8_t buf[8]; + + stl_le_p(buf, lo0); + stl_le_p(buf + 4, lo1); + return ldq_be_p(buf); +} + +static void octeon_md5_transform(MIPSOcteonCryptoState *crypto) +{ + static const uint32_t k[64] =3D { + 0xd76aa478U, 0xe8c7b756U, 0x242070dbU, 0xc1bdceeeU, + 0xf57c0fafU, 0x4787c62aU, 0xa8304613U, 0xfd469501U, + 0x698098d8U, 0x8b44f7afU, 0xffff5bb1U, 0x895cd7beU, + 0x6b901122U, 0xfd987193U, 0xa679438eU, 0x49b40821U, + 0xf61e2562U, 0xc040b340U, 0x265e5a51U, 0xe9b6c7aaU, + 0xd62f105dU, 0x02441453U, 0xd8a1e681U, 0xe7d3fbc8U, + 0x21e1cde6U, 0xc33707d6U, 0xf4d50d87U, 0x455a14edU, + 0xa9e3e905U, 0xfcefa3f8U, 0x676f02d9U, 0x8d2a4c8aU, + 0xfffa3942U, 0x8771f681U, 0x6d9d6122U, 0xfde5380cU, + 0xa4beea44U, 0x4bdecfa9U, 0xf6bb4b60U, 0xbebfbc70U, + 0x289b7ec6U, 0xeaa127faU, 0xd4ef3085U, 0x04881d05U, + 0xd9d4d039U, 0xe6db99e5U, 0x1fa27cf8U, 0xc4ac5665U, + 0xf4292244U, 0x432aff97U, 0xab9423a7U, 0xfc93a039U, + 0x655b59c3U, 0x8f0ccc92U, 0xffeff47dU, 0x85845dd1U, + 0x6fa87e4fU, 0xfe2ce6e0U, 0xa3014314U, 0x4e0811a1U, + 0xf7537e82U, 0xbd3af235U, 0x2ad7d2bbU, 0xeb86d391U, + }; + static const uint8_t s[64] =3D { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, + }; + uint8_t block_bytes[64]; + uint32_t m[16]; + uint32_t a, b, c, d; + uint32_t aa, bb, cc, dd; + int i; + + for (i =3D 0; i < 8; i++) { + stq_be_p(block_bytes + (i * 8), crypto->hsh_dat[i]); + m[i * 2] =3D ldl_le_p(block_bytes + (i * 8)); + m[i * 2 + 1] =3D ldl_le_p(block_bytes + (i * 8) + 4); + } + + octeon_hsh_load_reg_words_le(crypto->hsh_iv[0], &a, &b); + octeon_hsh_load_reg_words_le(crypto->hsh_iv[1], &c, &d); + aa =3D a; + bb =3D b; + cc =3D c; + dd =3D d; + + for (i =3D 0; i < 64; i++) { + uint32_t f, g, tmp; + + if (i < 16) { + f =3D (b & c) | ((~b) & d); + g =3D i; + } else if (i < 32) { + f =3D (d & b) | ((~d) & c); + g =3D (5 * i + 1) & 0xf; + } else if (i < 48) { + f =3D b ^ c ^ d; + g =3D (3 * i + 5) & 0xf; + } else { + f =3D c ^ (b | (~d)); + g =3D (7 * i) & 0xf; + } + + tmp =3D d; + d =3D c; + c =3D b; + b =3D b + rol32(a + f + k[i] + m[g], s[i]); + a =3D tmp; + } + + a +=3D aa; + b +=3D bb; + c +=3D cc; + d +=3D dd; + crypto->hsh_iv[0] =3D octeon_hsh_store_reg_words_le(a, b); + crypto->hsh_iv[1] =3D octeon_hsh_store_reg_words_le(c, d); +} + +static void octeon_sha1_transform(MIPSOcteonCryptoState *crypto) +{ + uint32_t w[80]; + uint32_t a, b, c, d, e; + int i; + + for (i =3D 0; i < 8; i++) { + octeon_hsh_load_reg_words_be(crypto->hsh_dat[i], + &w[i * 2], &w[i * 2 + 1]); + } + for (i =3D 16; i < 80; i++) { + w[i] =3D rol32(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1); + } + + octeon_hsh_load_reg_words_be(crypto->hsh_iv[0], &a, &b); + octeon_hsh_load_reg_words_be(crypto->hsh_iv[1], &c, &d); + e =3D crypto->hsh_iv[2] >> 32; + + for (i =3D 0; i < 80; i++) { + uint32_t f, k, temp; + + if (i < 20) { + f =3D (b & c) | ((~b) & d); + k =3D 0x5a827999; + } else if (i < 40) { + f =3D b ^ c ^ d; + k =3D 0x6ed9eba1; + } else if (i < 60) { + f =3D (b & c) | (b & d) | (c & d); + k =3D 0x8f1bbcdc; + } else { + f =3D b ^ c ^ d; + k =3D 0xca62c1d6; + } + + temp =3D rol32(a, 5) + f + e + k + w[i]; + e =3D d; + d =3D c; + c =3D rol32(b, 30); + b =3D a; + a =3D temp; + } + + octeon_hsh_load_reg_words_be(crypto->hsh_iv[0], &w[0], &w[1]); + octeon_hsh_load_reg_words_be(crypto->hsh_iv[1], &w[2], &w[3]); + w[4] =3D crypto->hsh_iv[2] >> 32; + w[0] +=3D a; + w[1] +=3D b; + w[2] +=3D c; + w[3] +=3D d; + w[4] +=3D e; + crypto->hsh_iv[0] =3D octeon_hsh_store_reg_words_be(w[0], w[1]); + crypto->hsh_iv[1] =3D octeon_hsh_store_reg_words_be(w[2], w[3]); + crypto->hsh_iv[2] =3D (uint64_t)w[4] << 32; +} + +static void octeon_sha256_transform(MIPSOcteonCryptoState *crypto) +{ + static const uint32_t k[64] =3D { + 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, + 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, + 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, + 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, + 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, + 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, + 0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, + 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U, + 0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, + 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, + 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, + 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U, + 0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, + 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U, + 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, + 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U, + }; + uint32_t w[64]; + uint32_t a, b, c, d, e, f, g, h; + uint32_t orig[8]; + int i; + + for (i =3D 0; i < 8; i++) { + octeon_hsh_load_reg_words_be(crypto->hsh_dat[i], + &w[i * 2], &w[i * 2 + 1]); + } + for (i =3D 16; i < 64; i++) { + uint32_t s0 =3D ror32(w[i - 15], 7) ^ + ror32(w[i - 15], 18) ^ + (w[i - 15] >> 3); + uint32_t s1 =3D ror32(w[i - 2], 17) ^ + ror32(w[i - 2], 19) ^ + (w[i - 2] >> 10); + w[i] =3D w[i - 16] + s0 + w[i - 7] + s1; + } + + for (i =3D 0; i < 4; i++) { + octeon_hsh_load_reg_words_be(crypto->hsh_iv[i], + &orig[i * 2], &orig[i * 2 + 1]); + } + a =3D orig[0]; + b =3D orig[1]; + c =3D orig[2]; + d =3D orig[3]; + e =3D orig[4]; + f =3D orig[5]; + g =3D orig[6]; + h =3D orig[7]; + + for (i =3D 0; i < 64; i++) { + uint32_t s1 =3D ror32(e, 6) ^ + ror32(e, 11) ^ + ror32(e, 25); + uint32_t ch =3D (e & f) ^ ((~e) & g); + uint32_t temp1 =3D h + s1 + ch + k[i] + w[i]; + uint32_t s0 =3D ror32(a, 2) ^ + ror32(a, 13) ^ + ror32(a, 22); + uint32_t maj =3D (a & b) ^ (a & c) ^ (b & c); + uint32_t temp2 =3D s0 + maj; + + h =3D g; + g =3D f; + f =3D e; + e =3D d + temp1; + d =3D c; + c =3D b; + b =3D a; + a =3D temp1 + temp2; + } + + orig[0] +=3D a; + orig[1] +=3D b; + orig[2] +=3D c; + orig[3] +=3D d; + orig[4] +=3D e; + orig[5] +=3D f; + orig[6] +=3D g; + orig[7] +=3D h; + for (i =3D 0; i < 4; i++) { + crypto->hsh_iv[i] =3D + octeon_hsh_store_reg_words_be(orig[i * 2], orig[i * 2 + 1]); + } +} + +static void octeon_sha512_transform(MIPSOcteonCryptoState *crypto) +{ + static const uint64_t k[80] =3D { + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, + }; + uint64_t w[80]; + uint64_t a, b, c, d, e, f, g, h; + int i; + + for (i =3D 0; i < 16; i++) { + w[i] =3D crypto->hsh_datw[i]; + } + for (i =3D 16; i < 80; i++) { + uint64_t s0 =3D ror64(w[i - 15], 1) ^ + ror64(w[i - 15], 8) ^ + (w[i - 15] >> 7); + uint64_t s1 =3D ror64(w[i - 2], 19) ^ + ror64(w[i - 2], 61) ^ + (w[i - 2] >> 6); + w[i] =3D w[i - 16] + s0 + w[i - 7] + s1; + } + + a =3D crypto->hsh_ivw[0]; + b =3D crypto->hsh_ivw[1]; + c =3D crypto->hsh_ivw[2]; + d =3D crypto->hsh_ivw[3]; + e =3D crypto->hsh_ivw[4]; + f =3D crypto->hsh_ivw[5]; + g =3D crypto->hsh_ivw[6]; + h =3D crypto->hsh_ivw[7]; + + for (i =3D 0; i < 80; i++) { + uint64_t s0 =3D ror64(a, 28) ^ + ror64(a, 34) ^ + ror64(a, 39); + uint64_t s1 =3D ror64(e, 14) ^ + ror64(e, 18) ^ + ror64(e, 41); + uint64_t ch =3D (e & f) ^ ((~e) & g); + uint64_t maj =3D (a & b) ^ (a & c) ^ (b & c); + uint64_t temp1 =3D h + s1 + ch + k[i] + w[i]; + uint64_t temp2 =3D s0 + maj; + + h =3D g; + g =3D f; + f =3D e; + e =3D d + temp1; + d =3D c; + c =3D b; + b =3D a; + a =3D temp1 + temp2; + } + + crypto->hsh_ivw[0] +=3D a; + crypto->hsh_ivw[1] +=3D b; + crypto->hsh_ivw[2] +=3D c; + crypto->hsh_ivw[3] +=3D d; + crypto->hsh_ivw[4] +=3D e; + crypto->hsh_ivw[5] +=3D f; + crypto->hsh_ivw[6] +=3D g; + crypto->hsh_ivw[7] +=3D h; +} + +static void octeon_store_shared_hsh_window(MIPSOcteonCryptoState *crypto, + uint32_t sel, uint64_t value) +{ + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW14: + crypto->hsh_datw[sel - OCTEON_COP2_SEL_HSH_DATW0] =3D value; + break; + case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7: + crypto->hsh_ivw[sel - OCTEON_COP2_SEL_HSH_IVW0] =3D value; + break; + default: + g_assert_not_reached(); + } +} + +static const uint8_t octeon_snow3g_sr[256] =3D { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, +}; + +static const uint8_t octeon_snow3g_sq[256] =3D { + 0x25, 0x24, 0x73, 0x67, 0xd7, 0xae, 0x5c, 0x30, + 0xa4, 0xee, 0x6e, 0xcb, 0x7d, 0xb5, 0x82, 0xdb, + 0xe4, 0x8e, 0x48, 0x49, 0x4f, 0x5d, 0x6a, 0x78, + 0x70, 0x88, 0xe8, 0x5f, 0x5e, 0x84, 0x65, 0xe2, + 0xd8, 0xe9, 0xcc, 0xed, 0x40, 0x2f, 0x11, 0x28, + 0x57, 0xd2, 0xac, 0xe3, 0x4a, 0x15, 0x1b, 0xb9, + 0xb2, 0x80, 0x85, 0xa6, 0x2e, 0x02, 0x47, 0x29, + 0x07, 0x4b, 0x0e, 0xc1, 0x51, 0xaa, 0x89, 0xd4, + 0xca, 0x01, 0x46, 0xb3, 0xef, 0xdd, 0x44, 0x7b, + 0xc2, 0x7f, 0xbe, 0xc3, 0x9f, 0x20, 0x4c, 0x64, + 0x83, 0xa2, 0x68, 0x42, 0x13, 0xb4, 0x41, 0xcd, + 0xba, 0xc6, 0xbb, 0x6d, 0x4d, 0x71, 0x21, 0xf4, + 0x8d, 0xb0, 0xe5, 0x93, 0xfe, 0x8f, 0xe6, 0xcf, + 0x43, 0x45, 0x31, 0x22, 0x37, 0x36, 0x96, 0xfa, + 0xbc, 0x0f, 0x08, 0x52, 0x1d, 0x55, 0x1a, 0xc5, + 0x4e, 0x23, 0x69, 0x7a, 0x92, 0xff, 0x5b, 0x5a, + 0xeb, 0x9a, 0x1c, 0xa9, 0xd1, 0x7e, 0x0d, 0xfc, + 0x50, 0x8a, 0xb6, 0x62, 0xf5, 0x0a, 0xf8, 0xdc, + 0x03, 0x3c, 0x0c, 0x39, 0xf1, 0xb8, 0xf3, 0x3d, + 0xf2, 0xd5, 0x97, 0x66, 0x81, 0x32, 0xa0, 0x00, + 0x06, 0xce, 0xf6, 0xea, 0xb7, 0x17, 0xf7, 0x8c, + 0x79, 0xd6, 0xa7, 0xbf, 0x8b, 0x3f, 0x1f, 0x53, + 0x63, 0x75, 0x35, 0x2c, 0x60, 0xfd, 0x27, 0xd3, + 0x94, 0xa5, 0x7c, 0xa1, 0x05, 0x58, 0x2d, 0xbd, + 0xd9, 0xc7, 0xaf, 0x6b, 0x54, 0x0b, 0xe0, 0x38, + 0x04, 0xc8, 0x9d, 0xe7, 0x14, 0xb1, 0x87, 0x9c, + 0xdf, 0x6f, 0xf9, 0xda, 0x2a, 0xc4, 0x59, 0x16, + 0x74, 0x91, 0xab, 0x26, 0x61, 0x76, 0x34, 0x2b, + 0xad, 0x99, 0xfb, 0x72, 0xec, 0x33, 0x12, 0xde, + 0x98, 0x3b, 0xc0, 0x9b, 0x3e, 0x18, 0x10, 0x3a, + 0x56, 0xe1, 0x77, 0xc9, 0x1e, 0x9e, 0x95, 0xa3, + 0x90, 0x19, 0xa8, 0x6c, 0x09, 0xd0, 0xf0, 0x86, +}; + +static inline uint8_t octeon_snow3g_mulx(uint8_t v, uint8_t c) +{ + return (v & 0x80) ? ((v << 1) ^ c) : (v << 1); +} + +static uint8_t octeon_snow3g_mulxpow(uint8_t v, unsigned int n, uint8_t c) +{ + while (n-- > 0) { + v =3D octeon_snow3g_mulx(v, c); + } + return v; +} + +static inline uint32_t octeon_snow3g_pack32(uint8_t b0, uint8_t b1, + uint8_t b2, uint8_t b3) +{ + return ((uint32_t)b0 << 24) | ((uint32_t)b1 << 16) | + ((uint32_t)b2 << 8) | b3; +} + +static uint32_t octeon_snow3g_mulalpha(uint8_t c) +{ + return octeon_snow3g_pack32(octeon_snow3g_mulxpow(c, 23, 0xa9), + octeon_snow3g_mulxpow(c, 245, 0xa9), + octeon_snow3g_mulxpow(c, 48, 0xa9), + octeon_snow3g_mulxpow(c, 239, 0xa9)); +} + +static uint32_t octeon_snow3g_divalpha(uint8_t c) +{ + return octeon_snow3g_pack32(octeon_snow3g_mulxpow(c, 16, 0xa9), + octeon_snow3g_mulxpow(c, 39, 0xa9), + octeon_snow3g_mulxpow(c, 6, 0xa9), + octeon_snow3g_mulxpow(c, 64, 0xa9)); +} + +static uint32_t octeon_snow3g_s1(uint32_t w) +{ + uint8_t x0 =3D octeon_snow3g_sr[w >> 24]; + uint8_t x1 =3D octeon_snow3g_sr[(uint8_t)(w >> 16)]; + uint8_t x2 =3D octeon_snow3g_sr[(uint8_t)(w >> 8)]; + uint8_t x3 =3D octeon_snow3g_sr[(uint8_t)w]; + uint8_t r0 =3D octeon_snow3g_mulx(x0, 0x1b) ^ x1 ^ x2 ^ + octeon_snow3g_mulx(x3, 0x1b) ^ x3; + uint8_t r1 =3D octeon_snow3g_mulx(x0, 0x1b) ^ x0 ^ + octeon_snow3g_mulx(x1, 0x1b) ^ x2 ^ x3; + uint8_t r2 =3D x0 ^ octeon_snow3g_mulx(x1, 0x1b) ^ x1 ^ + octeon_snow3g_mulx(x2, 0x1b) ^ x3; + uint8_t r3 =3D x0 ^ x1 ^ octeon_snow3g_mulx(x2, 0x1b) ^ x2 ^ + octeon_snow3g_mulx(x3, 0x1b); + + return octeon_snow3g_pack32(r0, r1, r2, r3); +} + +static uint32_t octeon_snow3g_s2(uint32_t w) +{ + uint8_t x0 =3D octeon_snow3g_sq[w >> 24]; + uint8_t x1 =3D octeon_snow3g_sq[(uint8_t)(w >> 16)]; + uint8_t x2 =3D octeon_snow3g_sq[(uint8_t)(w >> 8)]; + uint8_t x3 =3D octeon_snow3g_sq[(uint8_t)w]; + uint8_t r0 =3D octeon_snow3g_mulx(x0, 0x69) ^ x1 ^ x2 ^ + octeon_snow3g_mulx(x3, 0x69) ^ x3; + uint8_t r1 =3D octeon_snow3g_mulx(x0, 0x69) ^ x0 ^ + octeon_snow3g_mulx(x1, 0x69) ^ x2 ^ x3; + uint8_t r2 =3D x0 ^ octeon_snow3g_mulx(x1, 0x69) ^ x1 ^ + octeon_snow3g_mulx(x2, 0x69) ^ x3; + uint8_t r3 =3D x0 ^ x1 ^ octeon_snow3g_mulx(x2, 0x69) ^ x2 ^ + octeon_snow3g_mulx(x3, 0x69); + + return octeon_snow3g_pack32(r0, r1, r2, r3); +} + +static uint32_t octeon_snow3g_clock_fsm(MIPSOcteonCryptoState *crypto) +{ + uint32_t f =3D (uint32_t)(crypto->snow3g_lfsr[15] + crypto->snow3g_fsm= [0]) ^ + crypto->snow3g_fsm[1]; + uint32_t r =3D (uint32_t)(crypto->snow3g_fsm[1] + + (crypto->snow3g_fsm[2] ^ crypto->snow3g_lfsr[5= ])); + + crypto->snow3g_fsm[2] =3D octeon_snow3g_s2(crypto->snow3g_fsm[1]); + crypto->snow3g_fsm[1] =3D octeon_snow3g_s1(crypto->snow3g_fsm[0]); + crypto->snow3g_fsm[0] =3D r; + return f; +} + +static void octeon_snow3g_clock_lfsr(MIPSOcteonCryptoState *crypto, + bool init_mode, uint32_t f) +{ + uint32_t s0 =3D crypto->snow3g_lfsr[0]; + uint32_t s11 =3D crypto->snow3g_lfsr[11]; + uint32_t v =3D (s0 << 8) ^ octeon_snow3g_mulalpha(s0 >> 24) ^ + crypto->snow3g_lfsr[2] ^ (s11 >> 8) ^ + octeon_snow3g_divalpha((uint8_t)s11); + int i; + + if (init_mode) { + v ^=3D f; + } + + for (i =3D 0; i < 15; i++) { + crypto->snow3g_lfsr[i] =3D crypto->snow3g_lfsr[i + 1]; + } + crypto->snow3g_lfsr[15] =3D v; +} + +static uint32_t octeon_snow3g_generate_word(MIPSOcteonCryptoState *crypto) +{ + uint32_t f =3D octeon_snow3g_clock_fsm(crypto); + uint32_t z =3D f ^ crypto->snow3g_lfsr[0]; + + octeon_snow3g_clock_lfsr(crypto, false, 0); + return z; +} + +static void octeon_snow3g_queue_result(MIPSOcteonCryptoState *crypto) +{ + uint32_t z0 =3D octeon_snow3g_generate_word(crypto); + uint32_t z1 =3D octeon_snow3g_generate_word(crypto); + + crypto->snow3g_result =3D ((uint64_t)z0 << 32) | z1; +} + +static void octeon_snow3g_start(MIPSOcteonCryptoState *crypto, uint64_t da= ta) +{ + int i; + + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SNOW3G); + for (i =3D 0; i < 7; i++) { + uint64_t pair =3D crypto->hsh_datw[i]; + + crypto->snow3g_lfsr[i * 2] =3D pair >> 32; + crypto->snow3g_lfsr[i * 2 + 1] =3D pair; + } + crypto->snow3g_lfsr[14] =3D data >> 32; + crypto->snow3g_lfsr[15] =3D data; + memset(crypto->snow3g_fsm, 0, sizeof(crypto->snow3g_fsm)); + + for (i =3D 0; i < 32; i++) { + uint32_t f =3D octeon_snow3g_clock_fsm(crypto); + + octeon_snow3g_clock_lfsr(crypto, true, f); + } + + (void)octeon_snow3g_clock_fsm(crypto); + octeon_snow3g_clock_lfsr(crypto, false, 0); + octeon_snow3g_queue_result(crypto); +} + +static void octeon_snow3g_more(MIPSOcteonCryptoState *crypto) +{ + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SNOW3G); + octeon_snow3g_queue_result(crypto); +} + +static int octeon_aes_key_bits(const MIPSOcteonCryptoState *crypto) +{ + enum { + OCTEON_AES_KEYLEN_128 =3D 1, + OCTEON_AES_KEYLEN_192 =3D 2, + OCTEON_AES_KEYLEN_256 =3D 3, + }; + + switch (crypto->aes_keylen) { + case OCTEON_AES_KEYLEN_128: + return 128; + case OCTEON_AES_KEYLEN_192: + return 192; + case OCTEON_AES_KEYLEN_256: + return 256; + default: + return 0; + } +} + +static const uint8_t octeon_des_ip[64] =3D { + 58, 50, 42, 34, 26, 18, 10, 2, + 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6, + 64, 56, 48, 40, 32, 24, 16, 8, + 57, 49, 41, 33, 25, 17, 9, 1, + 59, 51, 43, 35, 27, 19, 11, 3, + 61, 53, 45, 37, 29, 21, 13, 5, + 63, 55, 47, 39, 31, 23, 15, 7, +}; + +static const uint8_t octeon_des_fp[64] =3D { + 40, 8, 48, 16, 56, 24, 64, 32, + 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, + 37, 5, 45, 13, 53, 21, 61, 29, + 36, 4, 44, 12, 52, 20, 60, 28, + 35, 3, 43, 11, 51, 19, 59, 27, + 34, 2, 42, 10, 50, 18, 58, 26, + 33, 1, 41, 9, 49, 17, 57, 25, +}; + +static const uint8_t octeon_des_e[48] =3D { + 32, 1, 2, 3, 4, 5, + 4, 5, 6, 7, 8, 9, + 8, 9, 10, 11, 12, 13, + 12, 13, 14, 15, 16, 17, + 16, 17, 18, 19, 20, 21, + 20, 21, 22, 23, 24, 25, + 24, 25, 26, 27, 28, 29, + 28, 29, 30, 31, 32, 1, +}; + +static const uint8_t octeon_des_p[32] =3D { + 16, 7, 20, 21, 29, 12, 28, 17, + 1, 15, 23, 26, 5, 18, 31, 10, + 2, 8, 24, 14, 32, 27, 3, 9, + 19, 13, 30, 6, 22, 11, 4, 25, +}; + +static const uint8_t octeon_des_pc1[56] =3D { + 57, 49, 41, 33, 25, 17, 9, + 1, 58, 50, 42, 34, 26, 18, + 10, 2, 59, 51, 43, 35, 27, + 19, 11, 3, 60, 52, 44, 36, + 63, 55, 47, 39, 31, 23, 15, + 7, 62, 54, 46, 38, 30, 22, + 14, 6, 61, 53, 45, 37, 29, + 21, 13, 5, 28, 20, 12, 4, +}; + +static const uint8_t octeon_des_pc2[48] =3D { + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32, +}; + +static const uint8_t octeon_des_rotations[16] =3D { + 1, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 1, +}; + +static const uint8_t octeon_des_sboxes[8][64] =3D { + { + 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, + 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, + 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, + 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, + }, + { + 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, + 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, + 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, + 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, + }, + { + 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, + 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, + 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, + 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, + }, + { + 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, + 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, + 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, + 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, + }, + { + 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, + 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, + 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, + 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, + }, + { + 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, + 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, + 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, + 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, + }, + { + 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, + 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, + 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, + 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, + }, + { + 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, + 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, + 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, + 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11, + }, +}; + +static const uint8_t octeon_kasumi_s7[128] =3D { + 54, 50, 62, 56, 22, 34, 94, 96, 38, 6, 63, 93, 2, 18, + 123, 33, 55, 113, 39, 114, 21, 67, 65, 12, 47, 73, 46, 27, + 25, 111, 124, 81, 53, 9, 121, 79, 52, 60, 58, 48, 101, 127, + 40, 120, 104, 70, 71, 43, 20, 122, 72, 61, 23, 109, 13, 100, + 77, 1, 16, 7, 82, 10, 105, 98, 117, 116, 76, 11, 89, 106, + 0, 125, 118, 99, 86, 69, 30, 57, 126, 87, 112, 51, 17, 5, + 95, 14, 90, 84, 91, 8, 35, 103, 32, 97, 28, 66, 102, 31, + 26, 45, 75, 4, 85, 92, 37, 74, 80, 49, 68, 29, 115, 44, + 64, 107, 108, 24, 110, 83, 36, 78, 42, 19, 15, 41, 88, 119, + 59, 3, +}; + +static const uint16_t octeon_kasumi_s9[512] =3D { + 167, 239, 161, 379, 391, 334, 9, 338, 38, 226, 48, 358, 452, 385, + 90, 397, 183, 253, 147, 331, 415, 340, 51, 362, 306, 500, 262, 82, + 216, 159, 356, 177, 175, 241, 489, 37, 206, 17, 0, 333, 44, 254, + 378, 58, 143, 220, 81, 400, 95, 3, 315, 245, 54, 235, 218, 405, + 472, 264, 172, 494, 371, 290, 399, 76, 165, 197, 395, 121, 257, 480, + 423, 212, 240, 28, 462, 176, 406, 507, 288, 223, 501, 407, 249, 265, + 89, 186, 221, 428, 164, 74, 440, 196, 458, 421, 350, 163, 232, 158, + 134, 354, 13, 250, 491, 142, 191, 69, 193, 425, 152, 227, 366, 135, + 344, 300, 276, 242, 437, 320, 113, 278, 11, 243, 87, 317, 36, 93, + 496, 27, 487, 446, 482, 41, 68, 156, 457, 131, 326, 403, 339, 20, + 39, 115, 442, 124, 475, 384, 508, 53, 112, 170, 479, 151, 126, 169, + 73, 268, 279, 321, 168, 364, 363, 292, 46, 499, 393, 327, 324, 24, + 456, 267, 157, 460, 488, 426, 309, 229, 439, 506, 208, 271, 349, 401, + 434, 236, 16, 209, 359, 52, 56, 120, 199, 277, 465, 416, 252, 287, + 246, 6, 83, 305, 420, 345, 153, 502, 65, 61, 244, 282, 173, 222, + 418, 67, 386, 368, 261, 101, 476, 291, 195, 430, 49, 79, 166, 330, + 280, 383, 373, 128, 382, 408, 155, 495, 367, 388, 274, 107, 459, 417, + 62, 454, 132, 225, 203, 316, 234, 14, 301, 91, 503, 286, 424, 211, + 347, 307, 140, 374, 35, 103, 125, 427, 19, 214, 453, 146, 498, 314, + 444, 230, 256, 329, 198, 285, 50, 116, 78, 410, 10, 205, 510, 171, + 231, 45, 139, 467, 29, 86, 505, 32, 72, 26, 342, 150, 313, 490, + 431, 238, 411, 325, 149, 473, 40, 119, 174, 355, 185, 233, 389, 71, + 448, 273, 372, 55, 110, 178, 322, 12, 469, 392, 369, 190, 1, 109, + 375, 137, 181, 88, 75, 308, 260, 484, 98, 272, 370, 275, 412, 111, + 336, 318, 4, 504, 492, 259, 304, 77, 337, 435, 21, 357, 303, 332, + 483, 18, 47, 85, 25, 497, 474, 289, 100, 269, 296, 478, 270, 106, + 31, 104, 433, 84, 414, 486, 394, 96, 99, 154, 511, 148, 413, 361, + 409, 255, 162, 215, 302, 201, 266, 351, 343, 144, 441, 365, 108, 298, + 251, 34, 182, 509, 138, 210, 335, 133, 311, 352, 328, 141, 396, 346, + 123, 319, 450, 281, 429, 228, 443, 481, 92, 404, 485, 422, 248, 297, + 23, 213, 130, 466, 22, 217, 283, 70, 294, 360, 419, 127, 312, 377, + 7, 468, 194, 2, 117, 295, 463, 258, 224, 447, 247, 187, 80, 398, + 284, 353, 105, 390, 299, 471, 470, 184, 57, 200, 348, 63, 204, 188, + 33, 451, 97, 30, 310, 219, 94, 160, 129, 493, 64, 179, 263, 102, + 189, 207, 114, 402, 438, 477, 387, 122, 192, 42, 381, 5, 145, 118, + 180, 449, 293, 323, 136, 380, 43, 66, 60, 455, 341, 445, 202, 432, + 8, 237, 15, 376, 436, 464, 59, 461, +}; + +static const uint16_t octeon_kasumi_constants[8] =3D { + 0x0123, 0x4567, 0x89ab, 0xcdef, 0xfedc, 0xba98, 0x7654, 0x3210, +}; + +typedef struct OcteonKasumiSubkeys { + uint16_t kli1[8]; + uint16_t kli2[8]; + uint16_t koi1[8]; + uint16_t koi2[8]; + uint16_t koi3[8]; + uint16_t kii1[8]; + uint16_t kii2[8]; + uint16_t kii3[8]; +} OcteonKasumiSubkeys; + +static uint64_t octeon_des_permute(uint64_t input, const uint8_t *table, + size_t output_bits, size_t input_bits) +{ + uint64_t out =3D 0; + + for (size_t i =3D 0; i < output_bits; i++) { + unsigned src =3D table[i] - 1; + + out =3D (out << 1) | ((input >> (input_bits - 1 - src)) & 1); + } + return out; +} + +static uint32_t octeon_des_rotate28(uint32_t v, unsigned shift) +{ + return ((v << shift) | (v >> (28 - shift))) & 0x0fffffffU; +} + +static void octeon_des_expand_subkeys(uint64_t key, uint64_t subkeys[16]) +{ + uint64_t permuted =3D octeon_des_permute(key, octeon_des_pc1, + ARRAY_SIZE(octeon_des_pc1), 64); + uint32_t c =3D (permuted >> 28) & 0x0fffffffU; + uint32_t d =3D permuted & 0x0fffffffU; + + for (int i =3D 0; i < 16; i++) { + c =3D octeon_des_rotate28(c, octeon_des_rotations[i]); + d =3D octeon_des_rotate28(d, octeon_des_rotations[i]); + subkeys[i] =3D octeon_des_permute(((uint64_t)c << 28) | d, + octeon_des_pc2, + ARRAY_SIZE(octeon_des_pc2), 56); + } +} + +static uint32_t octeon_des_f(uint32_t r, uint64_t subkey) +{ + uint64_t expanded =3D octeon_des_permute(r, octeon_des_e, + ARRAY_SIZE(octeon_des_e), 32); + uint32_t out =3D 0; + + expanded ^=3D subkey; + for (int i =3D 0; i < 8; i++) { + uint8_t sextet =3D (expanded >> (42 - i * 6)) & 0x3f; + uint8_t row =3D ((sextet & 0x20) >> 4) | (sextet & 0x01); + uint8_t col =3D (sextet >> 1) & 0x0f; + + out =3D (out << 4) | octeon_des_sboxes[i][row * 16 + col]; + } + + return octeon_des_permute(out, octeon_des_p, ARRAY_SIZE(octeon_des_p),= 32); +} + +static uint64_t octeon_des_block_crypt(uint64_t block, uint64_t key, + bool encrypt) +{ + uint64_t subkeys[16]; + uint64_t permuted =3D octeon_des_permute(block, octeon_des_ip, + ARRAY_SIZE(octeon_des_ip), 64); + uint32_t l =3D permuted >> 32; + uint32_t r =3D permuted; + + octeon_des_expand_subkeys(key, subkeys); + + for (int i =3D 0; i < 16; i++) { + uint32_t next =3D l ^ octeon_des_f(r, subkeys[encrypt ? i : 15 - i= ]); + + l =3D r; + r =3D next; + } + + return octeon_des_permute(((uint64_t)r << 32) | l, + octeon_des_fp, ARRAY_SIZE(octeon_des_fp), 64= ); +} + +static uint64_t octeon_3des_block_crypt(uint64_t block, const uint64_t key= s[3], + bool encrypt) +{ + if (encrypt) { + block =3D octeon_des_block_crypt(block, keys[0], true); + block =3D octeon_des_block_crypt(block, keys[1], false); + block =3D octeon_des_block_crypt(block, keys[2], true); + } else { + block =3D octeon_des_block_crypt(block, keys[2], false); + block =3D octeon_des_block_crypt(block, keys[1], true); + block =3D octeon_des_block_crypt(block, keys[0], false); + } + return block; +} + +static void octeon_3des_crypt_common(MIPSOcteonCryptoState *crypto, + uint64_t input_reg, + bool encrypt, bool cbc) +{ + const uint64_t keys[3] =3D { + crypto->des3_key[0], + crypto->des3_key[1], + crypto->des3_key[2], + }; + uint64_t block =3D input_reg; + + if (cbc) { + if (encrypt) { + block ^=3D crypto->des3_iv; + block =3D octeon_3des_block_crypt(block, keys, true); + crypto->des3_iv =3D block; + } else { + block =3D octeon_3des_block_crypt(block, keys, false); + block ^=3D crypto->des3_iv; + crypto->des3_iv =3D input_reg; + } + } else { + block =3D octeon_3des_block_crypt(block, keys, encrypt); + } + + crypto->des3_result =3D block; +} + +static inline uint16_t octeon_rol16(uint16_t value, unsigned int bits) +{ + return (value << bits) | (value >> (16 - bits)); +} + +static void octeon_kasumi_key_schedule(const uint64_t key_regs[2], + OcteonKasumiSubkeys *subkeys) +{ + uint16_t key[8]; + uint16_t key_prime[8]; + + key[0] =3D key_regs[0] >> 48; + key[1] =3D key_regs[0] >> 32; + key[2] =3D key_regs[0] >> 16; + key[3] =3D key_regs[0]; + key[4] =3D key_regs[1] >> 48; + key[5] =3D key_regs[1] >> 32; + key[6] =3D key_regs[1] >> 16; + key[7] =3D key_regs[1]; + + for (int i =3D 0; i < 8; i++) { + key_prime[i] =3D key[i] ^ octeon_kasumi_constants[i]; + } + + for (int i =3D 0; i < 8; i++) { + subkeys->kli1[i] =3D octeon_rol16(key[i], 1); + subkeys->kli2[i] =3D key_prime[(i + 2) & 7]; + subkeys->koi1[i] =3D octeon_rol16(key[(i + 1) & 7], 5); + subkeys->koi2[i] =3D octeon_rol16(key[(i + 5) & 7], 8); + subkeys->koi3[i] =3D octeon_rol16(key[(i + 6) & 7], 13); + subkeys->kii1[i] =3D key_prime[(i + 4) & 7]; + subkeys->kii2[i] =3D key_prime[(i + 3) & 7]; + subkeys->kii3[i] =3D key_prime[(i + 7) & 7]; + } +} + +static uint16_t octeon_kasumi_fi(uint16_t in, uint16_t subkey) +{ + uint16_t nine =3D in >> 7; + uint16_t seven =3D in & 0x7f; + + nine =3D octeon_kasumi_s9[nine] ^ seven; + seven =3D octeon_kasumi_s7[seven] ^ (nine & 0x7f); + seven ^=3D subkey >> 9; + nine ^=3D subkey & 0x1ff; + nine =3D octeon_kasumi_s9[nine] ^ seven; + seven =3D octeon_kasumi_s7[seven] ^ (nine & 0x7f); + return (seven << 9) | nine; +} + +static uint32_t octeon_kasumi_fo(uint32_t in, int index, + const OcteonKasumiSubkeys *subkeys) +{ + uint16_t left =3D in >> 16; + uint16_t right =3D in; + + left ^=3D subkeys->koi1[index]; + left =3D octeon_kasumi_fi(left, subkeys->kii1[index]); + left ^=3D right; + right ^=3D subkeys->koi2[index]; + right =3D octeon_kasumi_fi(right, subkeys->kii2[index]); + right ^=3D left; + left ^=3D subkeys->koi3[index]; + left =3D octeon_kasumi_fi(left, subkeys->kii3[index]); + left ^=3D right; + + return ((uint32_t)right << 16) | left; +} + +static uint32_t octeon_kasumi_fl(uint32_t in, int index, + const OcteonKasumiSubkeys *subkeys) +{ + uint16_t left =3D in >> 16; + uint16_t right =3D in; + uint16_t a =3D left & subkeys->kli1[index]; + uint16_t b; + + right ^=3D octeon_rol16(a, 1); + b =3D right | subkeys->kli2[index]; + left ^=3D octeon_rol16(b, 1); + return ((uint32_t)left << 16) | right; +} + +static uint64_t octeon_kasumi_block_encrypt(uint64_t block, + const uint64_t key_regs[2]) +{ + OcteonKasumiSubkeys subkeys; + uint32_t left =3D block >> 32; + uint32_t right =3D block; + + octeon_kasumi_key_schedule(key_regs, &subkeys); + + for (int i =3D 0; i < 8; ) { + uint32_t temp =3D octeon_kasumi_fl(left, i, &subkeys); + + temp =3D octeon_kasumi_fo(temp, i++, &subkeys); + right ^=3D temp; + temp =3D octeon_kasumi_fo(right, i, &subkeys); + temp =3D octeon_kasumi_fl(temp, i++, &subkeys); + left ^=3D temp; + } + + return ((uint64_t)left << 32) | right; +} + +static void octeon_kasumi_crypt_common(MIPSOcteonCryptoState *crypto, + uint64_t input_reg, bool cbc) +{ + const uint64_t key_regs[2] =3D { + crypto->des3_key[0], + crypto->des3_key[1], + }; + uint64_t block =3D input_reg; + + if (cbc) { + block ^=3D crypto->des3_iv; + } + + block =3D octeon_kasumi_block_encrypt(block, key_regs); + if (cbc) { + crypto->des3_iv =3D block; + } + crypto->des3_result =3D block; +} + +static void octeon_aes_load_key(const MIPSOcteonCryptoState *crypto, + uint8_t *key, size_t keylen) +{ + stq_be_p(key, crypto->aes_key[0]); + stq_be_p(key + 8, crypto->aes_key[1]); + if (keylen > 16) { + stq_be_p(key + 16, crypto->aes_key[2]); + } + if (keylen > 24) { + stq_be_p(key + 24, crypto->aes_key[3]); + } +} + +static void octeon_aes_load_block(const uint64_t regs[2], uint8_t *block) +{ + stq_be_p(block, regs[0]); + stq_be_p(block + 8, regs[1]); +} + +static void octeon_aes_store_block(uint64_t regs[2], const uint8_t *block) +{ + regs[0] =3D ldq_be_p(block); + regs[1] =3D ldq_be_p(block + 8); +} + +static void octeon_aes_encrypt_common(MIPSOcteonCryptoState *crypto, bool = cbc) +{ + AES_KEY key; + uint8_t in[16]; + uint8_t out[16]; + uint8_t iv[16]; + uint8_t raw_key[32] =3D {}; + int bits =3D octeon_aes_key_bits(crypto); + + if (!bits) { + return; + } + + octeon_aes_load_key(crypto, raw_key, bits / 8); + octeon_aes_load_block(crypto->aes_input, in); + if (cbc) { + int i; + + octeon_aes_load_block(crypto->aes_iv, iv); + for (i =3D 0; i < sizeof(in); i++) { + in[i] ^=3D iv[i]; + } + } + + AES_set_encrypt_key(raw_key, bits, &key); + AES_encrypt(in, out, &key); + octeon_aes_store_block(crypto->aes_result, out); + if (cbc) { + octeon_aes_store_block(crypto->aes_iv, out); + } +} + +static void octeon_aes_decrypt_common(MIPSOcteonCryptoState *crypto, bool = cbc) +{ + AES_KEY key; + uint8_t in[16]; + uint8_t out[16]; + uint8_t iv[16]; + uint8_t next_iv[16]; + uint8_t raw_key[32] =3D {}; + int bits =3D octeon_aes_key_bits(crypto); + int i; + + if (!bits) { + return; + } + + octeon_aes_load_key(crypto, raw_key, bits / 8); + octeon_aes_load_block(crypto->aes_input, in); + if (cbc) { + memcpy(next_iv, in, sizeof(next_iv)); + octeon_aes_load_block(crypto->aes_iv, iv); + } + + AES_set_decrypt_key(raw_key, bits, &key); + AES_decrypt(in, out, &key); + if (cbc) { + for (i =3D 0; i < sizeof(out); i++) { + out[i] ^=3D iv[i]; + } + } + + octeon_aes_store_block(crypto->aes_result, out); + if (cbc) { + octeon_aes_store_block(crypto->aes_iv, next_iv); + } +} + +static void octeon_gfm_mul(const uint64_t x[2], const uint64_t y[2], + uint16_t poly, uint64_t out[2]) +{ + uint64_t zh =3D 0, zl =3D 0; + uint64_t vh =3D y[0], vl =3D y[1]; + uint64_t rh =3D (uint64_t)poly << 48; + int i; + + for (i =3D 0; i < 128; i++) { + bool bit; + bool lsb; + + if (i < 64) { + bit =3D (x[0] >> (63 - i)) & 1; + } else { + bit =3D (x[1] >> (127 - i)) & 1; + } + if (bit) { + zh ^=3D vh; + zl ^=3D vl; + } + + lsb =3D vl & 1; + vl =3D (vh << 63) | (vl >> 1); + vh >>=3D 1; + if (lsb) { + vh ^=3D rh; + } + } + + out[0] =3D zh; + out[1] =3D zl; +} + +uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env, uint32_t sel) +{ + MIPSOcteonCryptoState *crypto =3D &env->octeon_crypto; + + if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_SNOW3G) { + if (sel >=3D OCTEON_COP2_SEL_SNOW3G_LFSR0 && + sel <=3D OCTEON_COP2_SEL_SNOW3G_LFSR7) { + unsigned int idx =3D sel - OCTEON_COP2_SEL_SNOW3G_LFSR0; + + return ((uint64_t)crypto->snow3g_lfsr[idx * 2] << 32) | + crypto->snow3g_lfsr[idx * 2 + 1]; + } + switch (sel) { + case OCTEON_COP2_SEL_SNOW3G_RESULT: + return crypto->snow3g_result; + case OCTEON_COP2_SEL_SNOW3G_FSM0: + case OCTEON_COP2_SEL_SNOW3G_FSM1: + case OCTEON_COP2_SEL_SNOW3G_FSM2: + return crypto->snow3g_fsm[sel - OCTEON_COP2_SEL_SNOW3G_FSM0]; + default: + break; + } + } + + switch (sel) { + case OCTEON_COP2_SEL_3DES_KEY0: + case OCTEON_COP2_SEL_3DES_KEY1: + case OCTEON_COP2_SEL_3DES_KEY2: + return crypto->des3_key[sel - OCTEON_COP2_SEL_3DES_KEY0]; + case OCTEON_COP2_SEL_3DES_IV: + return crypto->des3_iv; + case OCTEON_COP2_SEL_3DES_RESULT_MF: + case OCTEON_COP2_SEL_3DES_RESULT_MT: + return crypto->des3_result; + case OCTEON_COP2_SEL_AES_RESINP0: + case OCTEON_COP2_SEL_AES_RESINP1: + return crypto->aes_result[sel - OCTEON_COP2_SEL_AES_RESINP0]; + case OCTEON_COP2_SEL_AES_KEY0: + case OCTEON_COP2_SEL_AES_KEY1: + case OCTEON_COP2_SEL_AES_KEY2: + case OCTEON_COP2_SEL_AES_KEY3: + return crypto->aes_key[sel - OCTEON_COP2_SEL_AES_KEY0]; + case OCTEON_COP2_SEL_AES_KEYLENGTH: + return crypto->aes_keylen; + case OCTEON_COP2_SEL_AES_INP0: + return crypto->aes_input[0]; + case OCTEON_COP2_SEL_AES_IV0: + case OCTEON_COP2_SEL_AES_IV1: + return crypto->aes_iv[sel - OCTEON_COP2_SEL_AES_IV0]; + case OCTEON_COP2_SEL_CRC_POLYNOMIAL: + return crypto->crc_poly; + case OCTEON_COP2_SEL_CRC_IV: + return crypto->crc_iv; + case OCTEON_COP2_SEL_CRC_LEN: + return crypto->crc_len; + case OCTEON_COP2_SEL_CRC_IV_REFLECT: + return octeon_crc_reflect32_by_byte(crypto->crc_iv); + case OCTEON_COP2_SEL_HSH_DATW0: + case OCTEON_COP2_SEL_HSH_DATW1: + case OCTEON_COP2_SEL_HSH_DATW2: + case OCTEON_COP2_SEL_HSH_DATW3: + case OCTEON_COP2_SEL_HSH_DATW4: + case OCTEON_COP2_SEL_HSH_DATW5: + case OCTEON_COP2_SEL_HSH_DATW6: + case OCTEON_COP2_SEL_HSH_DATW7: + case OCTEON_COP2_SEL_HSH_DATW8: + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_DATW10: + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_DATW12: + case OCTEON_COP2_SEL_HSH_DATW13: + case OCTEON_COP2_SEL_HSH_DATW14: + return crypto->hsh_datw[sel - OCTEON_COP2_SEL_HSH_DATW0]; + case OCTEON_COP2_SEL_HSH_DATW15: + return crypto->hsh_datw[15]; + case OCTEON_COP2_SEL_HSH_IVW0: + case OCTEON_COP2_SEL_HSH_IVW1: + case OCTEON_COP2_SEL_HSH_IVW2: + case OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_HSH_IVW4: + case OCTEON_COP2_SEL_HSH_IVW5: + case OCTEON_COP2_SEL_HSH_IVW6: + case OCTEON_COP2_SEL_HSH_IVW7: + return crypto->hsh_ivw[sel - OCTEON_COP2_SEL_HSH_IVW0]; + case OCTEON_COP2_SEL_HSH_IV0: + case OCTEON_COP2_SEL_HSH_IV1: + case OCTEON_COP2_SEL_HSH_IV2: + case OCTEON_COP2_SEL_HSH_IV3: + return crypto->hsh_iv[sel - OCTEON_COP2_SEL_HSH_IV0]; + case OCTEON_COP2_SEL_GFM_MUL_REFLECT0: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT1: + return crypto->gfm_reflect_mul[sel - OCTEON_COP2_SEL_GFM_MUL_REFLE= CT0]; + case OCTEON_COP2_SEL_GFM_RESINP_REFLECT0: + case OCTEON_COP2_SEL_GFM_RESINP_REFLECT1: + return crypto->gfm_reflect_resinp[ + sel - OCTEON_COP2_SEL_GFM_RESINP_REFLECT0]; + case OCTEON_COP2_SEL_GFM_MUL0: + case OCTEON_COP2_SEL_GFM_MUL1: + return crypto->gfm_mul[sel - OCTEON_COP2_SEL_GFM_MUL0]; + case OCTEON_COP2_SEL_GFM_RESINP0: + case OCTEON_COP2_SEL_GFM_RESINP1: + return crypto->gfm_resinp[sel - OCTEON_COP2_SEL_GFM_RESINP0]; + case OCTEON_COP2_SEL_GFM_POLY: + return crypto->gfm_poly; + default: + return 0; + } +} + +void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint64_t value, + uint32_t sel) +{ + MIPSOcteonCryptoState *crypto =3D &env->octeon_crypto; + uint64_t data =3D value; + + switch (sel) { + case OCTEON_COP2_SEL_3DES_KEY0: + case OCTEON_COP2_SEL_3DES_KEY1: + case OCTEON_COP2_SEL_3DES_KEY2: + crypto->des3_key[sel - OCTEON_COP2_SEL_3DES_KEY0] =3D data; + break; + case OCTEON_COP2_SEL_3DES_IV: + crypto->des3_iv =3D data; + break; + case OCTEON_COP2_SEL_3DES_RESULT_MT: + crypto->des3_result =3D data; + break; + case OCTEON_COP2_SEL_3DES_ENC_CBC: + octeon_3des_crypt_common(crypto, data, true, true); + break; + case OCTEON_COP2_SEL_KAS_ENC_CBC: + octeon_kasumi_crypt_common(crypto, data, true); + break; + case OCTEON_COP2_SEL_3DES_ENC: + octeon_3des_crypt_common(crypto, data, true, false); + break; + case OCTEON_COP2_SEL_KAS_ENC: + octeon_kasumi_crypt_common(crypto, data, false); + break; + case OCTEON_COP2_SEL_3DES_DEC_CBC: + octeon_3des_crypt_common(crypto, data, false, true); + break; + case OCTEON_COP2_SEL_3DES_DEC: + octeon_3des_crypt_common(crypto, data, false, false); + break; + case OCTEON_COP2_SEL_AES_RESINP0: + case OCTEON_COP2_SEL_AES_RESINP1: + crypto->aes_input[sel - OCTEON_COP2_SEL_AES_RESINP0] =3D data; + crypto->aes_result[sel - OCTEON_COP2_SEL_AES_RESINP0] =3D data; + break; + case OCTEON_COP2_SEL_AES_IV0: + case OCTEON_COP2_SEL_AES_IV1: + crypto->aes_iv[sel - OCTEON_COP2_SEL_AES_IV0] =3D data; + break; + case OCTEON_COP2_SEL_AES_KEY0: + case OCTEON_COP2_SEL_AES_KEY1: + case OCTEON_COP2_SEL_AES_KEY2: + case OCTEON_COP2_SEL_AES_KEY3: + crypto->aes_key[sel - OCTEON_COP2_SEL_AES_KEY0] =3D data; + break; + case OCTEON_COP2_SEL_AES_ENC_CBC0: + case OCTEON_COP2_SEL_AES_ENC0: + case OCTEON_COP2_SEL_AES_DEC_CBC0: + case OCTEON_COP2_SEL_AES_DEC0: + crypto->aes_input[0] =3D data; + break; + case OCTEON_COP2_SEL_AES_KEYLENGTH: + crypto->aes_keylen =3D data; + break; + case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL: + case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL_REFLECT: + crypto->crc_poly =3D data; + break; + case OCTEON_COP2_SEL_CRC_IV: + crypto->crc_iv =3D data; + break; + case OCTEON_COP2_SEL_CRC_WRITE_LEN: + crypto->crc_len =3D data; + break; + case OCTEON_COP2_SEL_CRC_WRITE_IV_REFLECT: + crypto->crc_iv =3D octeon_crc_reflect32_by_byte((uint32_t)data); + break; + case OCTEON_COP2_SEL_CRC_WRITE_BYTE: + octeon_crc_update_normal(crypto, data, 1); + break; + case OCTEON_COP2_SEL_CRC_WRITE_HALF: + octeon_crc_update_normal(crypto, data, 2); + break; + case OCTEON_COP2_SEL_CRC_WRITE_WORD: + octeon_crc_update_normal(crypto, data, 4); + break; + case OCTEON_COP2_SEL_CRC_WRITE_DWORD: + octeon_crc_update_normal(crypto, data, 8); + break; + case OCTEON_COP2_SEL_CRC_WRITE_VAR: + octeon_crc_update_normal(crypto, data, MIN(8U, crypto->crc_len)); + break; + case OCTEON_COP2_SEL_CRC_WRITE_BYTE_REFLECT: + octeon_crc_update_reflect(crypto, data, 1); + break; + case OCTEON_COP2_SEL_CRC_WRITE_HALF_REFLECT: + octeon_crc_update_reflect(crypto, data, 2); + break; + case OCTEON_COP2_SEL_CRC_WRITE_WORD_REFLECT: + octeon_crc_update_reflect(crypto, data, 4); + break; + case OCTEON_COP2_SEL_CRC_WRITE_DWORD_REFLECT: + octeon_crc_update_reflect(crypto, data, 8); + break; + case OCTEON_COP2_SEL_CRC_WRITE_VAR_REFLECT: + octeon_crc_update_reflect(crypto, data, MIN(8U, crypto->crc_len)); + break; + case OCTEON_COP2_SEL_HSH_DATW0: + case OCTEON_COP2_SEL_HSH_DATW1: + case OCTEON_COP2_SEL_HSH_DATW2: + case OCTEON_COP2_SEL_HSH_DATW3: + case OCTEON_COP2_SEL_HSH_DATW4: + case OCTEON_COP2_SEL_HSH_DATW5: + case OCTEON_COP2_SEL_HSH_DATW6: + case OCTEON_COP2_SEL_HSH_DATW7: + case OCTEON_COP2_SEL_HSH_DATW8: + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_DATW10: + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_DATW12: + case OCTEON_COP2_SEL_HSH_DATW13: + case OCTEON_COP2_SEL_HSH_DATW14: + octeon_store_shared_hsh_window(crypto, sel, data); + break; + case OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_HSH_STARTSHA512: + crypto->hsh_datw[15] =3D data; + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA512); + octeon_sha512_transform(crypto); + break; + case OCTEON_COP2_SEL_HSH_IVW0: + case OCTEON_COP2_SEL_HSH_IVW1: + case OCTEON_COP2_SEL_HSH_IVW2: + case OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_HSH_IVW4: + case OCTEON_COP2_SEL_HSH_IVW5: + case OCTEON_COP2_SEL_HSH_IVW6: + case OCTEON_COP2_SEL_HSH_IVW7: + octeon_store_shared_hsh_window(crypto, sel, data); + break; + case OCTEON_COP2_SEL_GFM_MUL_REFLECT0: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT1: + crypto->gfm_reflect_mul[ + sel - OCTEON_COP2_SEL_GFM_MUL_REFLECT0] =3D data; + break; + case OCTEON_COP2_SEL_GFM_XOR0_REFLECT: + crypto->gfm_reflect_xor0 =3D data; + break; + case OCTEON_COP2_SEL_GFM_MUL0: + case OCTEON_COP2_SEL_GFM_MUL1: + crypto->gfm_mul[sel - OCTEON_COP2_SEL_GFM_MUL0] =3D data; + break; + case OCTEON_COP2_SEL_GFM_RESINP0: + case OCTEON_COP2_SEL_GFM_RESINP1: + crypto->gfm_resinp[sel - OCTEON_COP2_SEL_GFM_RESINP0] =3D data; + break; + case OCTEON_COP2_SEL_GFM_XOR0: + crypto->gfm_xor0 =3D data; + break; + case OCTEON_COP2_SEL_GFM_POLY: + crypto->gfm_poly =3D data; + break; + case OCTEON_COP2_SEL_HSH_DAT0: + case OCTEON_COP2_SEL_HSH_DAT1: + case OCTEON_COP2_SEL_HSH_DAT2: + case OCTEON_COP2_SEL_HSH_DAT3: + case OCTEON_COP2_SEL_HSH_DAT4: + case OCTEON_COP2_SEL_HSH_DAT5: + case OCTEON_COP2_SEL_HSH_DAT6: + crypto->hsh_dat[sel - OCTEON_COP2_SEL_HSH_DAT0] =3D data; + break; + case OCTEON_COP2_SEL_HSH_IV0: + case OCTEON_COP2_SEL_HSH_IV1: + case OCTEON_COP2_SEL_HSH_IV2: + case OCTEON_COP2_SEL_HSH_IV3: + crypto->hsh_iv[sel - OCTEON_COP2_SEL_HSH_IV0] =3D data; + break; + case OCTEON_COP2_SEL_HSH_STARTMD5: + crypto->hsh_dat[7] =3D data; + octeon_md5_transform(crypto); + break; + case OCTEON_COP2_SEL_HSH_STARTSHA256: + crypto->hsh_dat[7] =3D data; + octeon_sha256_transform(crypto); + break; + case OCTEON_COP2_SEL_HSH_STARTSHA_COMPAT: + case OCTEON_COP2_SEL_HSH_STARTSHA: + crypto->hsh_dat[7] =3D data; + octeon_sha1_transform(crypto); + break; + case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: + octeon_gfm_mul_reflect(crypto, data); + break; + case OCTEON_COP2_SEL_AES_ENC_CBC1: + crypto->aes_input[1] =3D data; + octeon_aes_encrypt_common(crypto, true); + break; + case OCTEON_COP2_SEL_AES_ENC1: + crypto->aes_input[1] =3D data; + octeon_aes_encrypt_common(crypto, false); + break; + case OCTEON_COP2_SEL_AES_DEC_CBC1: + crypto->aes_input[1] =3D data; + octeon_aes_decrypt_common(crypto, true); + break; + case OCTEON_COP2_SEL_AES_DEC1: + crypto->aes_input[1] =3D data; + octeon_aes_decrypt_common(crypto, false); + break; + case OCTEON_COP2_SEL_GFM_XORMUL1: { + uint64_t in[2] =3D { + crypto->gfm_resinp[0] ^ crypto->gfm_xor0, + crypto->gfm_resinp[1] ^ data, + }; + + /* + * A 64-bit reflected GFM operation uses this XORMUL1 path when the + * block is programmed with only MUL0, an 8-bit polynomial, and a = zero + * high input half. Detect that shape and use the reflected helper + * instead of the normal GHASH-style multiplier. + */ + if (crypto->gfm_poly <=3D 0xff && + crypto->gfm_mul[1] =3D=3D 0 && + in[0] =3D=3D 0) { + octeon_gfm_mul64_uia2(in, crypto->gfm_mul, + crypto->gfm_poly, crypto->gfm_resinp); + } else { + octeon_gfm_mul(in, crypto->gfm_mul, crypto->gfm_poly, + crypto->gfm_resinp); + } + /* + * GFM_XOR0 is a write-only staging half consumed by the next XORM= UL1 + * operation, so clear it once the combined multiply has been issu= ed. + */ + crypto->gfm_xor0 =3D 0; + break; + } + case OCTEON_COP2_SEL_SNOW3G_START: + octeon_snow3g_start(crypto, data); + break; + case OCTEON_COP2_SEL_SNOW3G_MORE: + octeon_snow3g_more(crypto); + break; + default: + break; + } +} diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 07674f0d44..86e8c4b93d 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -17,6 +17,210 @@ typedef void gen_helper_octeon_vmul(TCGv_i64, TCGv_ptr,= TCGv_i64, TCGv_i64); typedef void gen_helper_octeon_qmac_fn(TCGv_ptr, TCGv_i64, TCGv_i64, TCGv_i32); =20 +static bool octeon_cop2_is_supported_dmfc2(uint16_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_3DES_KEY0: + case OCTEON_COP2_SEL_3DES_KEY1: + case OCTEON_COP2_SEL_3DES_KEY2: + case OCTEON_COP2_SEL_3DES_IV: + case OCTEON_COP2_SEL_3DES_RESULT_MF: + case OCTEON_COP2_SEL_3DES_RESULT_MT: + case OCTEON_COP2_SEL_AES_RESINP0: + case OCTEON_COP2_SEL_AES_RESINP1: + case OCTEON_COP2_SEL_AES_KEY0: + case OCTEON_COP2_SEL_AES_KEY1: + case OCTEON_COP2_SEL_AES_KEY2: + case OCTEON_COP2_SEL_AES_KEY3: + case OCTEON_COP2_SEL_AES_KEYLENGTH: + case OCTEON_COP2_SEL_CRC_POLYNOMIAL: + case OCTEON_COP2_SEL_AES_IV0: + case OCTEON_COP2_SEL_AES_IV1: + case OCTEON_COP2_SEL_CRC_IV: + case OCTEON_COP2_SEL_CRC_LEN: + case OCTEON_COP2_SEL_CRC_IV_REFLECT: + case OCTEON_COP2_SEL_HSH_DATW0: + case OCTEON_COP2_SEL_HSH_DATW1: + case OCTEON_COP2_SEL_HSH_DATW2: + case OCTEON_COP2_SEL_HSH_DATW3: + case OCTEON_COP2_SEL_HSH_DATW4: + case OCTEON_COP2_SEL_HSH_DATW5: + case OCTEON_COP2_SEL_HSH_DATW6: + case OCTEON_COP2_SEL_HSH_DATW7: + case OCTEON_COP2_SEL_HSH_DATW8: + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_DATW10: + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_DATW12: + case OCTEON_COP2_SEL_HSH_DATW13: + case OCTEON_COP2_SEL_HSH_DATW14: + case OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_HSH_IV0: + case OCTEON_COP2_SEL_HSH_IV1: + case OCTEON_COP2_SEL_HSH_IV2: + case OCTEON_COP2_SEL_HSH_IV3: + case OCTEON_COP2_SEL_HSH_IVW0: + case OCTEON_COP2_SEL_HSH_IVW1: + case OCTEON_COP2_SEL_HSH_IVW2: + case OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_HSH_IVW4: + case OCTEON_COP2_SEL_HSH_IVW5: + case OCTEON_COP2_SEL_HSH_IVW6: + case OCTEON_COP2_SEL_HSH_IVW7: + case OCTEON_COP2_SEL_AES_INP0: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT0: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT1: + case OCTEON_COP2_SEL_GFM_RESINP_REFLECT0: + case OCTEON_COP2_SEL_GFM_RESINP_REFLECT1: + case OCTEON_COP2_SEL_GFM_MUL0: + case OCTEON_COP2_SEL_GFM_MUL1: + case OCTEON_COP2_SEL_GFM_RESINP0: + case OCTEON_COP2_SEL_GFM_RESINP1: + case OCTEON_COP2_SEL_GFM_POLY: + return true; + default: + return false; + } +} + +static bool octeon_cop2_is_supported_dmtc2(uint16_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_3DES_KEY0: + case OCTEON_COP2_SEL_3DES_KEY1: + case OCTEON_COP2_SEL_3DES_KEY2: + case OCTEON_COP2_SEL_3DES_IV: + case OCTEON_COP2_SEL_3DES_RESULT_MT: + case OCTEON_COP2_SEL_3DES_ENC_CBC: + case OCTEON_COP2_SEL_KAS_ENC_CBC: + case OCTEON_COP2_SEL_3DES_ENC: + case OCTEON_COP2_SEL_KAS_ENC: + case OCTEON_COP2_SEL_3DES_DEC_CBC: + case OCTEON_COP2_SEL_3DES_DEC: + case OCTEON_COP2_SEL_AES_RESINP0: + case OCTEON_COP2_SEL_AES_RESINP1: + case OCTEON_COP2_SEL_AES_IV0: + case OCTEON_COP2_SEL_AES_IV1: + case OCTEON_COP2_SEL_AES_KEY0: + case OCTEON_COP2_SEL_AES_KEY1: + case OCTEON_COP2_SEL_AES_KEY2: + case OCTEON_COP2_SEL_AES_KEY3: + case OCTEON_COP2_SEL_AES_ENC_CBC0: + case OCTEON_COP2_SEL_AES_ENC0: + case OCTEON_COP2_SEL_AES_DEC_CBC0: + case OCTEON_COP2_SEL_AES_DEC0: + case OCTEON_COP2_SEL_AES_KEYLENGTH: + case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL: + case OCTEON_COP2_SEL_CRC_IV: + case OCTEON_COP2_SEL_CRC_WRITE_LEN: + case OCTEON_COP2_SEL_CRC_WRITE_IV_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_BYTE: + case OCTEON_COP2_SEL_CRC_WRITE_HALF: + case OCTEON_COP2_SEL_CRC_WRITE_WORD: + case OCTEON_COP2_SEL_CRC_WRITE_DWORD: + case OCTEON_COP2_SEL_CRC_WRITE_VAR: + case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_BYTE_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_HALF_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_WORD_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_DWORD_REFLECT: + case OCTEON_COP2_SEL_CRC_WRITE_VAR_REFLECT: + case OCTEON_COP2_SEL_HSH_DAT0: + case OCTEON_COP2_SEL_HSH_DAT1: + case OCTEON_COP2_SEL_HSH_DAT2: + case OCTEON_COP2_SEL_HSH_DAT3: + case OCTEON_COP2_SEL_HSH_DAT4: + case OCTEON_COP2_SEL_HSH_DAT5: + case OCTEON_COP2_SEL_HSH_DAT6: + case OCTEON_COP2_SEL_HSH_IV0: + case OCTEON_COP2_SEL_HSH_IV1: + case OCTEON_COP2_SEL_HSH_IV2: + case OCTEON_COP2_SEL_HSH_IV3: + case OCTEON_COP2_SEL_HSH_DATW0: + case OCTEON_COP2_SEL_HSH_DATW1: + case OCTEON_COP2_SEL_HSH_DATW2: + case OCTEON_COP2_SEL_HSH_DATW3: + case OCTEON_COP2_SEL_HSH_DATW4: + case OCTEON_COP2_SEL_HSH_DATW5: + case OCTEON_COP2_SEL_HSH_DATW6: + case OCTEON_COP2_SEL_HSH_DATW7: + case OCTEON_COP2_SEL_HSH_DATW8: + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_DATW10: + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_DATW12: + case OCTEON_COP2_SEL_HSH_DATW13: + case OCTEON_COP2_SEL_HSH_DATW14: + case OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_HSH_IVW0: + case OCTEON_COP2_SEL_HSH_IVW1: + case OCTEON_COP2_SEL_HSH_IVW2: + case OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_HSH_IVW4: + case OCTEON_COP2_SEL_HSH_IVW5: + case OCTEON_COP2_SEL_HSH_IVW6: + case OCTEON_COP2_SEL_HSH_IVW7: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT0: + case OCTEON_COP2_SEL_GFM_MUL_REFLECT1: + case OCTEON_COP2_SEL_GFM_XOR0_REFLECT: + case OCTEON_COP2_SEL_GFM_MUL0: + case OCTEON_COP2_SEL_GFM_MUL1: + case OCTEON_COP2_SEL_GFM_RESINP0: + case OCTEON_COP2_SEL_GFM_RESINP1: + case OCTEON_COP2_SEL_GFM_XOR0: + case OCTEON_COP2_SEL_GFM_POLY: + case OCTEON_COP2_SEL_HSH_STARTSHA_COMPAT: + case OCTEON_COP2_SEL_HSH_STARTMD5: + case OCTEON_COP2_SEL_SNOW3G_START: + case OCTEON_COP2_SEL_SNOW3G_MORE: + case OCTEON_COP2_SEL_HSH_STARTSHA256: + case OCTEON_COP2_SEL_HSH_STARTSHA: + case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: + case OCTEON_COP2_SEL_HSH_STARTSHA512: + case OCTEON_COP2_SEL_GFM_XORMUL1: + case OCTEON_COP2_SEL_AES_ENC_CBC1: + case OCTEON_COP2_SEL_AES_ENC1: + case OCTEON_COP2_SEL_AES_DEC_CBC1: + case OCTEON_COP2_SEL_AES_DEC1: + return true; + default: + return false; + } +} + +bool gen_octeon_cop2(DisasContext *ctx) +{ + enum { + OCTEON_CP2_RS_DMFC2 =3D 0x01, + OCTEON_CP2_RS_DMTC2 =3D 0x05, + }; + int rs =3D extract32(ctx->opcode, 21, 5); + int rt =3D extract32(ctx->opcode, 16, 5); + uint16_t sel =3D ctx->opcode; + TCGv_i64 t0; + + switch (rs) { + case OCTEON_CP2_RS_DMFC2: + if (!octeon_cop2_is_supported_dmfc2(sel)) { + return false; + } + t0 =3D tcg_temp_new_i64(); + gen_helper_octeon_cop2_dmfc2(t0, tcg_env, tcg_constant_i32(sel)); + gen_store_gpr(t0, rt); + return true; + case OCTEON_CP2_RS_DMTC2: + if (!octeon_cop2_is_supported_dmtc2(sel)) { + return false; + } + t0 =3D tcg_temp_new_i64(); + gen_load_gpr(t0, rt); + gen_helper_octeon_cop2_dmtc2(tcg_env, t0, tcg_constant_i32(sel)); + return true; + default: + return false; + } +} + static bool trans_BBIT(DisasContext *ctx, arg_BBIT *a) { TCGv_i64 p; diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index dac30aff8d..767d64718a 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -14863,6 +14863,15 @@ static bool decode_opc_legacy(CPUMIPSState *env, D= isasContext *ctx) } break; case OPC_CP2: +#if defined(TARGET_MIPS64) + if (ctx->insn_flags & INSN_OCTEON) { + if (gen_octeon_cop2(ctx)) { + break; + } + generate_exception_err(ctx, EXCP_CpU, 2); + break; + } +#endif check_insn(ctx, ASE_LMMI); /* Note that these instructions use different fields. */ gen_loongson_multimedia(ctx, sa, rd, rt); diff --git a/target/mips/tcg/translate.h b/target/mips/tcg/translate.h index 89dde1e712..feb3c47c44 100644 --- a/target/mips/tcg/translate.h +++ b/target/mips/tcg/translate.h @@ -232,6 +232,7 @@ bool decode_ext_loongson(DisasContext *ctx, uint32_t in= sn); bool decode_ase_lcsr(DisasContext *ctx, uint32_t insn); bool decode_ext_tx79(DisasContext *ctx, uint32_t insn); bool decode_ext_octeon(DisasContext *ctx, uint32_t insn); +bool gen_octeon_cop2(DisasContext *ctx); #endif bool decode_ext_vr54xx(DisasContext *ctx, uint32_t insn); =20 diff --git a/tests/tcg/mips/user/isa/octeon/octeon-insns.c b/tests/tcg/mips= /user/isa/octeon/octeon-insns.c index 9153e37e9e..435ccfa347 100644 --- a/tests/tcg/mips/user/isa/octeon/octeon-insns.c +++ b/tests/tcg/mips/user/isa/octeon/octeon-insns.c @@ -186,6 +186,70 @@ static uint64_t octeon_mtp0_zeroes_p1(void) return rd; } =20 +static uint64_t octeon_cop2_key0_readback(uint64_t value) +{ + uint64_t rd; + + asm volatile( + "move $8, %[value]\n\t" + ".word 0x48a80104\n\t" /* dmtc2 $8, AES_KEY0 selector */ + ".word 0x482a0104\n\t" /* dmfc2 $10, AES_KEY0 selector */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [value] "r" (value) + : "$8", "$10"); + + return rd; +} + +static uint64_t octeon_cop2_key2_readback(uint64_t value) +{ + uint64_t rd; + + asm volatile( + "move $8, %[value]\n\t" + ".word 0x48a80106\n\t" /* dmtc2 $8, AES_KEY2 selector */ + ".word 0x482a0106\n\t" /* dmfc2 $10, AES_KEY2 selector */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [value] "r" (value) + : "$8", "$10"); + + return rd; +} + +static uint64_t octeon_cop2_key3_readback(uint64_t value) +{ + uint64_t rd; + + asm volatile( + "move $8, %[value]\n\t" + ".word 0x48a80107\n\t" /* dmtc2 $8, AES_KEY3 selector */ + ".word 0x482a0107\n\t" /* dmfc2 $10, AES_KEY3 selector */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [value] "r" (value) + : "$8", "$10"); + + return rd; +} + +static uint64_t octeon_cop2_keylength_readback(uint64_t value) +{ + uint64_t rd; + + asm volatile( + "move $8, %[value]\n\t" + ".word 0x48a80110\n\t" /* dmtc2 $8, AES_KEYLENGTH selector */ + ".word 0x482a0110\n\t" /* dmfc2 $10, AES_KEYLENGTH selector */ + "move %[rd], $10\n\t" + : [rd] "=3Dr" (rd) + : [value] "r" (value) + : "$8", "$10"); + + return rd; +} + int main(void) { assert(octeon_baddu(0x123, 0x0f0) =3D=3D 0x13); @@ -199,6 +263,13 @@ int main(void) assert(octeon_vmm0(5, 13, 7, 11) =3D=3D 59); assert(octeon_vmm0_zeroes_mpl1() =3D=3D 0); assert(octeon_mtp0_zeroes_p1() =3D=3D 0); + assert(octeon_cop2_key0_readback(0x1122334455667788ULL) =3D=3D + 0x1122334455667788ULL); + assert(octeon_cop2_key2_readback(0x8877665544332211ULL) =3D=3D + 0x8877665544332211ULL); + assert(octeon_cop2_key3_readback(0x0102030405060708ULL) =3D=3D + 0x0102030405060708ULL); + assert(octeon_cop2_keylength_readback(0xa5) =3D=3D 0xa5); =20 return 0; } --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524037; cv=none; d=zohomail.com; s=zohoarc; b=Pt8k1dtNckwBzJkmEUdyOD4iN3qvqRNwkQrVg/aYOXpNZtykaqTegreRjsZPUlYbM9QhoNgnLNKS9o4vdF4bNiKyLD+AUWNqxGrXYs24LSfnv/MNxBJpFDDkf740wLjSde2APjBbVXv4O2j/gNiL0dCwpKZCsITx2sUzazk+BFI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524037; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0/032vP99ATvHkoU5QiV4MqnvzFbStDIRBlCxBkHCSo=; b=Y6T15RwrV/DhUuCZ3WxtlXXge/pPSYxjtLwv+t3RwpH+BTG+JEeAxICOh8nBAG8kECW8NCwpAjGYSJ8xmYXj1QE/lunknRClHCqdrYrfUCub03cbEi7F1VULJTfWcr0GNyv4p4Xu2TYvDWqOBW7kaT4q84PDdDI+co20n+7XHyM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524037689582.71694615467; Mon, 11 May 2026 11:27:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI4-0005Ef-R0; Mon, 11 May 2026 14:23:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHo-0004re-1Q for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: from mail-ot1-x330.google.com ([2607:f8b0:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHj-0002ur-04 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:21 -0400 Received: by mail-ot1-x330.google.com with SMTP id 46e09a7af769-7df05fc49e5so4527323a34.3 for ; Mon, 11 May 2026 11:23:18 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523798; x=1779128598; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=0/032vP99ATvHkoU5QiV4MqnvzFbStDIRBlCxBkHCSo=; b=A9seZpXJvVpokoMD8o2DYLGwwUYiXkB1De+OBs94/lZmqRTw38KyNesST12PqvDKHr R/MZuATsb6ZhQuEJH1MWlWTpgN0j+0bxPLyA+xLLCm6Tden5XZVJkKt7ArRedVNrPdnW GJ9+Fi6WfSNakMeuE7MZuQaumwTpgmI5gSIP2ZWbME5Nubgt3nH7LLaI5VOYvLFlxYWI rDk1EviCFw8/DK1hfWf29hjfX3OFlz1paiP37hwa/5wQ4w658JFFqZejdPoQfpmNJSSf bvDEsTfTldnPsXdVVq6PksGLDyu/Wh6oni23Fh2H7wU/EJEuY8LEXCV68WU/ZqZWaDsS guZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523798; x=1779128598; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=0/032vP99ATvHkoU5QiV4MqnvzFbStDIRBlCxBkHCSo=; b=r+mzTZ82p7vHvmqKdiy0LHSV6ZHFq26mm39kKqI5ra5GDUSQAfffqOfBj2lbnyMKxC q9MDb1t3Ehnp3H6NXzsa5IfEEHQ3CYeGkcz/9/9zK1R7/XaOLOe27rKNLcLyqZIGHx4C 9kKcyXwcwDm7GFyeoJzDbEiv6B/03MG3lFiVbui5D3r+d0E5hD7oFcE3/BCR3DcM2NbF Nne5TfA6I88xT2VhOJUV9Utmtg0Ym/iVKAfRjUjx7KAr6wG7/vNShUXqpeRDNx7gAF8U E4XE0zGmjOqSRqPehIXfdFirdteUFBkqkqrzBo+8fcNakbncdGXVQ0r6sVKLjk3XPN+f xTDw== X-Gm-Message-State: AOJu0YwcK8BFIw/T4TZzKAmW0GfCCYPmDb1vT7JiOWsg5h4mLRxISRuK t9Bl0h+ej1yAEYLLFlcfcEq8vhlNyhmcJWGTVWvFNxLWTLBC9PFyaKhd X-Gm-Gg: Acq92OFOY/4JscAb5J3+n71LWOpwK0gZ1kZMM8GjRgm27f6VbiEJIFenMUoKfraWL1P EoHJ3mLdxgYW2NXO9CfyiTjVYXaPP2Mu2dqz84iQ+wGcbR3XNTmirhw8dRax0u8TI/YluBYgKNA McEk+bS9masofHHUnIMqW9OyV/SmTATXJBoHRkG0yP68HZEncgv2fgrXh3L07B92aJ7qLGdkwcF c5efYNsn4qn2gDN6SV+2JtudtjuPfR2hIDgW+U9g77IAM4S1PgpIIY5DkkadAWqMLLG1JJqvmhe 4mLlg+cGjqNowlN8C9hO0lLS2p9quWpDf+nsFihPOWkU/pJ+o8vAwDtsSccALo1U/BzpU76doto Ogs6Q6q+Cgd9fIVUxY3HV6D6IBLNPa7WT2AadKDZ2tMB9tMatto8TEGK4X/NKZvTxkEgTqOZjM/ GqrBmdscYLEyZnd5OHoJJITaTK7CxVnrilTPOIN31BeNOAzr6VpxMU+2Os2CxEi2Fsfrw5zcAhb +Ou6f3fhnJ3P+cZhvIPiJdPCxpa6kKyUcTtzgTapASLh06EGqBZXZZ+1fXOWWfa/XuvfAf0J6TQ 188= X-Received: by 2002:a05:6830:6218:b0:7dd:e032:3ce5 with SMTP id 46e09a7af769-7e3820e2712mr7224927a34.17.1778523797868; Mon, 11 May 2026 11:23:17 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:22:59 -0600 Subject: [PATCH v6 28/35] target/mips: add Octeon SMS4 crypto support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-28-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::330; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x330.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524038594154100 On Octeon, the SMS4 engine is exposed through selectors that alias the AES register bank. Add the missing selectors and model the shared RESINP, IV, and key state so the hardware interface matches the processor behaviour. Use the in-tree SM4 tables to implement the block operation without adding a host crypto dependency. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Add selector dispatch updates in octeon_translate.c after moving COP2 decode out of translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v5 -> v6: - Use RESINP wording for the SMS4 shared selector aliases. --- target/mips/cpu.h | 18 ++++++ target/mips/tcg/octeon_crypto.c | 109 +++++++++++++++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 4 ++ 3 files changed, 131 insertions(+) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index e16f0f6e98..dc883bfb4a 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -593,6 +593,20 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_AES_DEC0 =3D 0x010e, OCTEON_COP2_SEL_AES_KEYLENGTH =3D 0x0110, OCTEON_COP2_SEL_AES_INP0 =3D 0x0111, + /* + * SMS4 reuses the AES RESINP, IV, and key banks and only adds + * operation selectors for ECB/CBC encrypt/decrypt. + */ + OCTEON_COP2_SEL_SMS4_RESINP0 =3D OCTEON_COP2_SEL_AES_RESINP0, + OCTEON_COP2_SEL_SMS4_RESINP1 =3D OCTEON_COP2_SEL_AES_RESINP1, + OCTEON_COP2_SEL_SMS4_IV0 =3D OCTEON_COP2_SEL_AES_IV0, + OCTEON_COP2_SEL_SMS4_IV1 =3D OCTEON_COP2_SEL_AES_IV1, + OCTEON_COP2_SEL_SMS4_KEY0 =3D OCTEON_COP2_SEL_AES_KEY0, + OCTEON_COP2_SEL_SMS4_KEY1 =3D OCTEON_COP2_SEL_AES_KEY1, + OCTEON_COP2_SEL_SMS4_ENC_CBC0 =3D OCTEON_COP2_SEL_AES_ENC_CBC0, + OCTEON_COP2_SEL_SMS4_ENC0 =3D OCTEON_COP2_SEL_AES_ENC0, + OCTEON_COP2_SEL_SMS4_DEC_CBC0 =3D OCTEON_COP2_SEL_AES_DEC_CBC0, + OCTEON_COP2_SEL_SMS4_DEC0 =3D OCTEON_COP2_SEL_AES_DEC0, OCTEON_COP2_SEL_CRC_POLYNOMIAL =3D 0x0200, OCTEON_COP2_SEL_CRC_IV =3D 0x0201, OCTEON_COP2_SEL_CRC_LEN =3D 0x0202, @@ -661,6 +675,10 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_AES_ENC1 =3D 0x310b, OCTEON_COP2_SEL_AES_DEC_CBC1 =3D 0x310d, OCTEON_COP2_SEL_AES_DEC1 =3D 0x310f, + OCTEON_COP2_SEL_SMS4_ENC_CBC1 =3D 0x3119, + OCTEON_COP2_SEL_SMS4_ENC1 =3D 0x311b, + OCTEON_COP2_SEL_SMS4_DEC_CBC1 =3D 0x311d, + OCTEON_COP2_SEL_SMS4_DEC1 =3D 0x311f, OCTEON_COP2_SEL_HSH_STARTMD5 =3D 0x4047, OCTEON_COP2_SEL_SNOW3G_START =3D 0x404d, OCTEON_COP2_SEL_SNOW3G_MORE =3D 0x404e, diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c index 8b3260c4d6..2d2b19ad30 100644 --- a/target/mips/tcg/octeon_crypto.c +++ b/target/mips/tcg/octeon_crypto.c @@ -12,6 +12,7 @@ #include "exec/helper-proto.h" #include "crypto/aes.h" #include "crypto/clmul.h" +#include "crypto/sm4.h" #include "qemu/bitops.h" #include "qemu/host-utils.h" =20 @@ -745,6 +746,57 @@ static int octeon_aes_key_bits(const MIPSOcteonCryptoS= tate *crypto) } } =20 +static inline uint32_t octeon_sms4_t(uint32_t x) +{ + x =3D sm4_subword(x); + return x ^ rol32(x, 2) ^ rol32(x, 10) ^ + rol32(x, 18) ^ rol32(x, 24); +} + +static inline uint32_t octeon_sms4_t_key(uint32_t x) +{ + x =3D sm4_subword(x); + return x ^ rol32(x, 13) ^ rol32(x, 23); +} + +static void octeon_sms4_expand_key(const uint8_t *key, uint32_t round_keys= [32]) +{ + static const uint32_t fk[4] =3D { + 0xa3b1bac6U, 0x56aa3350U, 0x677d9197U, 0xb27022dcU, + }; + uint32_t k[36]; + + for (int i =3D 0; i < 4; i++) { + k[i] =3D ldl_be_p(key + i * 4) ^ fk[i]; + } + for (int i =3D 0; i < 32; i++) { + k[i + 4] =3D k[i] ^ octeon_sms4_t_key(k[i + 1] ^ k[i + 2] ^ + k[i + 3] ^ sm4_ck[i]); + round_keys[i] =3D k[i + 4]; + } +} + +static void octeon_sms4_crypt_block(const uint8_t *in, uint8_t *out, + const uint32_t round_keys[32], + bool encrypt) +{ + uint32_t x[36]; + + for (int i =3D 0; i < 4; i++) { + x[i] =3D ldl_be_p(in + i * 4); + } + for (int i =3D 0; i < 32; i++) { + uint32_t rk =3D round_keys[encrypt ? i : 31 - i]; + + x[i + 4] =3D x[i] ^ octeon_sms4_t(x[i + 1] ^ x[i + 2] ^ + x[i + 3] ^ rk); + } + stl_be_p(out, x[35]); + stl_be_p(out + 4, x[34]); + stl_be_p(out + 8, x[33]); + stl_be_p(out + 12, x[32]); +} + static const uint8_t octeon_des_ip[64] =3D { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, @@ -1198,6 +1250,47 @@ static void octeon_aes_store_block(uint64_t regs[2],= const uint8_t *block) regs[1] =3D ldq_be_p(block + 8); } =20 +static void octeon_sms4_crypt_common(MIPSOcteonCryptoState *crypto, + bool encrypt, bool cbc) +{ + uint8_t key[16]; + uint8_t in[16]; + uint8_t out[16]; + uint8_t iv[16]; + uint8_t next_iv[16]; + uint32_t round_keys[32]; + + /* + * SMS4 aliases the AES state onto the RESINP, IV, and KEY banks, + * with only the operation selectors remaining distinct. + */ + octeon_aes_load_key(crypto, key, sizeof(key)); + octeon_aes_load_block(crypto->aes_input, in); + if (cbc) { + octeon_aes_load_block(crypto->aes_iv, iv); + if (encrypt) { + for (int i =3D 0; i < sizeof(in); i++) { + in[i] ^=3D iv[i]; + } + } else { + memcpy(next_iv, in, sizeof(next_iv)); + } + } + + octeon_sms4_expand_key(key, round_keys); + octeon_sms4_crypt_block(in, out, round_keys, encrypt); + if (cbc && !encrypt) { + for (int i =3D 0; i < sizeof(out); i++) { + out[i] ^=3D iv[i]; + } + } + + octeon_aes_store_block(crypto->aes_result, out); + if (cbc) { + octeon_aes_store_block(crypto->aes_iv, encrypt ? out : next_iv); + } +} + static void octeon_aes_encrypt_common(MIPSOcteonCryptoState *crypto, bool = cbc) { AES_KEY key; @@ -1614,6 +1707,22 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, crypto->aes_input[1] =3D data; octeon_aes_decrypt_common(crypto, false); break; + case OCTEON_COP2_SEL_SMS4_ENC_CBC1: + crypto->aes_input[1] =3D data; + octeon_sms4_crypt_common(crypto, true, true); + break; + case OCTEON_COP2_SEL_SMS4_ENC1: + crypto->aes_input[1] =3D data; + octeon_sms4_crypt_common(crypto, true, false); + break; + case OCTEON_COP2_SEL_SMS4_DEC_CBC1: + crypto->aes_input[1] =3D data; + octeon_sms4_crypt_common(crypto, false, true); + break; + case OCTEON_COP2_SEL_SMS4_DEC1: + crypto->aes_input[1] =3D data; + octeon_sms4_crypt_common(crypto, false, false); + break; case OCTEON_COP2_SEL_GFM_XORMUL1: { uint64_t in[2] =3D { crypto->gfm_resinp[0] ^ crypto->gfm_xor0, diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 86e8c4b93d..fac7b8fa2e 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -182,6 +182,10 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t se= l) case OCTEON_COP2_SEL_AES_ENC1: case OCTEON_COP2_SEL_AES_DEC_CBC1: case OCTEON_COP2_SEL_AES_DEC1: + case OCTEON_COP2_SEL_SMS4_ENC_CBC1: + case OCTEON_COP2_SEL_SMS4_ENC1: + case OCTEON_COP2_SEL_SMS4_DEC_CBC1: + case OCTEON_COP2_SEL_SMS4_DEC1: return true; default: return false; --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524064; cv=none; d=zohomail.com; s=zohoarc; b=nh3ARCjgn16wNBhouXmq7g7j84923lDo6/sqb5JKkYTPzEmhs2td7ebFNykF/7Y7/xZRMBC1QxJw1JE3HNGBHWF7vGBGpbs0awYIvTcUpk/EeZ2AdWx4EnI5ZDSvhV6pWaurQBbE9xotxEPwdixwn35DEzaummbkuAedtRzQ8sk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524064; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=2mDXfiI6vTFk1Nn7f3Jp1htp9eXh0i4alNjvCchTraA=; b=OjkgV13HKJmCkg7ZzVOM1F616heqT+ExvjldC/eoNASPRKgAsu6zR6M9syj3MGpVhGABlOLXMafGzNTNZK0yCLcEimDJlAQvrfY6z5/K743oX/n1RSm/Mh6n2uJH3EQOa4N06i64JTOqR6kRqZNON9gfapljkQq5/XB2yG5khU4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524064803985.7899707137879; Mon, 11 May 2026 11:27:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI5-0005IE-Ka; Mon, 11 May 2026 14:23:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHo-0004s7-7e for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHk-0002v4-Er for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:23 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7de46b8e432so4458169a34.1 for ; Mon, 11 May 2026 11:23:19 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523799; x=1779128599; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2mDXfiI6vTFk1Nn7f3Jp1htp9eXh0i4alNjvCchTraA=; b=ocPFmpOzPh7tQVwkZTkTji2rFRsiu8A27Ja4iyjYpWHILXZp46uukuYUio9oQwPWji ZROkTDqVwGIJA09bWR8i+vdWTXDS+H+0aEa7bJ66czANvdOHG5g4nfpfGvHRyaNCQhQo Y5E786xYa1ZZyM6ConZpmGG5jl+RQ+1zrdAdcgqUPW3SvFEd5imN5EMpP3CMZqIVNP88 J2YTpnlYiyGlX8zzjIxC1k2Rtfc28Dm+GWcAV2jrINiDmm7Nt9u7YE1sPsH1TkAPdDAI z5++lWs85/Pd+EbyAHr8742VFKApELbrH7z8GMPkhOaA/PSpteZIkKgyG21MAVYS0vTo VV5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523799; x=1779128599; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=2mDXfiI6vTFk1Nn7f3Jp1htp9eXh0i4alNjvCchTraA=; b=muHWKRqESb76tgCFHn4tpPdX/fR7rkaWsdodzvZ0DnDqkq/Z1YBXFXKj53eZQGCRgK f3HbcqWwypynITh3wfvKQ3UyQMiwIso1Af9FoqbaWUGVzlRj4q8mwM30Iuuc9hI9UzMq SyOAJyx0nu+gXV3YBie1Jv02yi9bFUwM+riHbic8rs24gSx6ItEWhWg0s6eHPc9B0Xrn 68W/Lihz22VS8s+i5r2LrQBkEGSnhrz205IL/c1b3PH9YzXgvSjQoN5CMsbawC/vhWO4 /6Z1m9XLz7OEfxGxou6k60pQ2sC6SCGIwXGsUoK/kpJeFJC7vvGOtUP0+3gjH+Xu+/HF 7NQA== X-Gm-Message-State: AOJu0YwBzugKsrKqDLYqD4qbuBSrqoSkY3gDk26Liwql1YWA5b0zhm/k zinGO+D1+rjQVnArdpF+/No+YqkiUO0wLAmywhTpTAqMBHUqJcjxlDpB X-Gm-Gg: Acq92OHDGks6CObVkacDBbb59Wq7qtR8MkDUyCZLhS3f4WKBbZwQQlZQUiGfiUNwg+k jNoHl10sYXKz83HEURSuphDlAQojf5tCzqPorp2X1AqjUHA5kURBFOYbpd8rYPxkPm+Lp/aJLv7 eTbDmKmnEg2/UaiHGVRToyn8TxOMpbne4pM5od1Zc3hzl6OXMCpE2GBk/3NuLWeNO9/6+dab2WX fYUR1TbOdB2Igkd7XcOIAv7G7YspQCzYI7e5aKGpz8s8QQ5nmBMVo/LEPNGzS6Uv7248o95h2Hx dlwmwGf7tYTHpNCsyB75IbmI3x6OKayxrDZYBP08nhSgi3DN/8mSh3XX4a6tpPNJMeDjSyBq9xW Whd4M3CEsBBunqJz47DwBXL83ZV6ssWdxsCrj5GxlK/0wgpdC/NdDaWVLeNx7mmvOrQgqxFbocZ Npd5IjklG/I6iFKXStIJmPn+fIr/7WF5kwMcp5i4qrhCp5QA2eOkShVl5sKHs2WsJTmBjJsAuJa 8q1J0svzQVYSV8FjNkSB6dnAVe789NMeCAJdv/5jSW4LLGACzk0ZnpZ0Ni47VkSNL9I X-Received: by 2002:a05:6830:3697:b0:7db:b7ae:ef0b with SMTP id 46e09a7af769-7e1df16f04bmr15875744a34.24.1778523799022; Mon, 11 May 2026 11:23:19 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:00 -0600 Subject: [PATCH v6 29/35] target/mips: add Octeon SHA3 crypto support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-29-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x332.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524067157154100 Add the Octeon SHA3 register window and STARTOP selector. Keep the shared HSH/SHA3/SHA512 write path coherent, then model the dedicated 25-lane Keccak state and the Keccak-f[1600] permutation so the COP2 SHA3 interface follows the hardware behaviour. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Use switch ranges and g_assert_not_reached() for SHA3 selector position decoding. (suggested by Philippe Mathieu-Daud=C3=A9) - Add selector dispatch updates in octeon_translate.c after moving COP2 decode out of translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v5 -> v6: - Rename SHA3 DAT15 selector aliases with MF/MT direction suffixes. --- target/mips/cpu.h | 22 +++++ target/mips/system/machine.c | 1 + target/mips/tcg/octeon_crypto.c | 171 +++++++++++++++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 22 +++++ 4 files changed, 216 insertions(+) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index dc883bfb4a..258db2babe 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -541,6 +541,7 @@ typedef enum MIPSOcteonSharedMode { OCTEON_SHARED_MODE_NONE =3D 0, OCTEON_SHARED_MODE_SHA512, OCTEON_SHARED_MODE_SNOW3G, + OCTEON_SHARED_MODE_SHA3, } MIPSOcteonSharedMode; =20 typedef enum MIPSOcteonCop2Sel { @@ -645,6 +646,7 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_HSH_DATW13, OCTEON_COP2_SEL_HSH_DATW14, OCTEON_COP2_SEL_HSH_DATW15, + OCTEON_COP2_SEL_SHA3_DAT15_MF =3D 0x024f, OCTEON_COP2_SEL_HSH_IVW0 =3D 0x0250, OCTEON_COP2_SEL_HSH_IVW1, OCTEON_COP2_SEL_HSH_IVW2, @@ -671,6 +673,24 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_GFM_RESINP1, OCTEON_COP2_SEL_GFM_XOR0, OCTEON_COP2_SEL_GFM_POLY =3D 0x025e, + OCTEON_COP2_SEL_SHA3_XORDAT0 =3D 0x02c0, + OCTEON_COP2_SEL_SHA3_XORDAT1, + OCTEON_COP2_SEL_SHA3_XORDAT2, + OCTEON_COP2_SEL_SHA3_XORDAT3, + OCTEON_COP2_SEL_SHA3_XORDAT4, + OCTEON_COP2_SEL_SHA3_XORDAT5, + OCTEON_COP2_SEL_SHA3_XORDAT6, + OCTEON_COP2_SEL_SHA3_XORDAT7, + OCTEON_COP2_SEL_SHA3_XORDAT8, + OCTEON_COP2_SEL_SHA3_XORDAT9, + OCTEON_COP2_SEL_SHA3_XORDAT10, + OCTEON_COP2_SEL_SHA3_XORDAT11, + OCTEON_COP2_SEL_SHA3_XORDAT12, + OCTEON_COP2_SEL_SHA3_XORDAT13, + OCTEON_COP2_SEL_SHA3_XORDAT14, + OCTEON_COP2_SEL_SHA3_XORDAT15, + OCTEON_COP2_SEL_SHA3_XORDAT16, + OCTEON_COP2_SEL_SHA3_XORDAT17, OCTEON_COP2_SEL_AES_ENC_CBC1 =3D 0x3109, OCTEON_COP2_SEL_AES_ENC1 =3D 0x310b, OCTEON_COP2_SEL_AES_DEC_CBC1 =3D 0x310d, @@ -683,6 +703,7 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_SNOW3G_START =3D 0x404d, OCTEON_COP2_SEL_SNOW3G_MORE =3D 0x404e, OCTEON_COP2_SEL_HSH_STARTSHA256 =3D 0x404f, + OCTEON_COP2_SEL_SHA3_STARTOP =3D 0x4052, OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT =3D 0x405d, OCTEON_COP2_SEL_HSH_STARTSHA =3D 0x4057, OCTEON_COP2_SEL_HSH_STARTSHA512 =3D 0x424f, @@ -697,6 +718,7 @@ typedef struct MIPSOcteonCryptoState { uint64_t hsh_dat[8]; uint64_t hsh_ivw[8]; uint64_t hsh_datw[16]; + uint64_t sha3_state[25]; uint64_t aes_iv[2]; uint64_t aes_key[4]; uint64_t aes_result[2]; diff --git a/target/mips/system/machine.c b/target/mips/system/machine.c index ebfa0a9eb0..e6336534f4 100644 --- a/target/mips/system/machine.c +++ b/target/mips/system/machine.c @@ -292,6 +292,7 @@ static const VMStateDescription mips_vmstate_octeon_cry= pto =3D { VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_dat, MIPSCPU, 8), VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_ivw, MIPSCPU, 8), VMSTATE_UINT64_ARRAY(env.octeon_crypto.hsh_datw, MIPSCPU, 16), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.sha3_state, MIPSCPU, 25), VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_iv, MIPSCPU, 2), VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_key, MIPSCPU, 4), VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_result, MIPSCPU, 2), diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c index 2d2b19ad30..42e68f4205 100644 --- a/target/mips/tcg/octeon_crypto.c +++ b/target/mips/tcg/octeon_crypto.c @@ -487,21 +487,150 @@ static void octeon_sha512_transform(MIPSOcteonCrypto= State *crypto) crypto->hsh_ivw[7] +=3D h; } =20 +static const uint64_t octeon_sha3_round_constants[24] =3D { + 0x0000000000000001ULL, 0x0000000000008082ULL, + 0x800000000000808aULL, 0x8000000080008000ULL, + 0x000000000000808bULL, 0x0000000080000001ULL, + 0x8000000080008081ULL, 0x8000000000008009ULL, + 0x000000000000008aULL, 0x0000000000000088ULL, + 0x0000000080008009ULL, 0x000000008000000aULL, + 0x000000008000808bULL, 0x800000000000008bULL, + 0x8000000000008089ULL, 0x8000000000008003ULL, + 0x8000000000008002ULL, 0x8000000000000080ULL, + 0x000000000000800aULL, 0x800000008000000aULL, + 0x8000000080008081ULL, 0x8000000000008080ULL, + 0x0000000080000001ULL, 0x8000000080008008ULL, +}; + +static const uint8_t octeon_sha3_rotation_constants[24] =3D { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44, +}; + +static const uint8_t octeon_sha3_pi_lanes[24] =3D { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1, +}; + +static void octeon_sha3_permute(MIPSOcteonCryptoState *crypto) +{ + uint64_t *state =3D crypto->sha3_state; + + for (int round =3D 0; round < 24; round++) { + uint64_t bc[5]; + uint64_t temp; + + for (int x =3D 0; x < 5; x++) { + bc[x] =3D state[x] ^ state[5 + x] ^ state[10 + x] ^ + state[15 + x] ^ state[20 + x]; + } + for (int x =3D 0; x < 5; x++) { + temp =3D bc[(x + 4) % 5] ^ rol64(bc[(x + 1) % 5], 1); + for (int y =3D 0; y < 25; y +=3D 5) { + state[y + x] ^=3D temp; + } + } + + temp =3D state[1]; + for (int i =3D 0; i < 24; i++) { + uint64_t next =3D state[octeon_sha3_pi_lanes[i]]; + + state[octeon_sha3_pi_lanes[i]] =3D + rol64(temp, octeon_sha3_rotation_constants[i]); + temp =3D next; + } + + for (int y =3D 0; y < 25; y +=3D 5) { + for (int x =3D 0; x < 5; x++) { + bc[x] =3D state[y + x]; + } + for (int x =3D 0; x < 5; x++) { + state[y + x] =3D bc[x] ^ ((~bc[(x + 1) % 5]) & bc[(x + 2) = % 5]); + } + } + + state[0] ^=3D octeon_sha3_round_constants[round]; + } +} + +static bool octeon_sha3_is_dat_sel(uint32_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7: + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + case OCTEON_COP2_SEL_SHA3_DAT24: + return true; + default: + return false; + } +} + +static int octeon_sha3_dat_pos_from_sel(uint32_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW14: + return sel - OCTEON_COP2_SEL_HSH_DATW0; + case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7: + return 16 + (sel - OCTEON_COP2_SEL_HSH_IVW0); + case OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + return 15; + case OCTEON_COP2_SEL_SHA3_DAT24: + return 24; + default: + g_assert_not_reached(); + } +} + +static uint64_t octeon_sha3_reg_to_lane(uint64_t value) +{ + /* + * The COP2 register interface is consumed by big-endian MIPS code as + * 64-bit register values, while Keccak lanes are byte-little-endian. + */ + return bswap64(value); +} + +static uint64_t octeon_sha3_lane_to_reg(uint64_t value) +{ + return bswap64(value); +} + static void octeon_store_shared_hsh_window(MIPSOcteonCryptoState *crypto, uint32_t sel, uint64_t value) { switch (sel) { case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW14: crypto->hsh_datw[sel - OCTEON_COP2_SEL_HSH_DATW0] =3D value; + crypto->sha3_state[sel - OCTEON_COP2_SEL_HSH_DATW0] =3D + octeon_sha3_reg_to_lane(value); break; case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7: crypto->hsh_ivw[sel - OCTEON_COP2_SEL_HSH_IVW0] =3D value; + crypto->sha3_state[16 + (sel - OCTEON_COP2_SEL_HSH_IVW0)] =3D + octeon_sha3_reg_to_lane(value); + break; + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + crypto->sha3_state[15] =3D octeon_sha3_reg_to_lane(value); + break; + case OCTEON_COP2_SEL_SHA3_DAT24: + crypto->sha3_state[24] =3D octeon_sha3_reg_to_lane(value); break; default: g_assert_not_reached(); } } =20 +static int octeon_sha3_xordat_pos_from_sel(uint32_t sel) +{ + if (sel >=3D OCTEON_COP2_SEL_SHA3_XORDAT0 && + sel <=3D OCTEON_COP2_SEL_SHA3_XORDAT17) { + return sel - OCTEON_COP2_SEL_SHA3_XORDAT0; + } + return -1; +} + static const uint8_t octeon_snow3g_sr[256] =3D { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, @@ -1396,6 +1525,7 @@ static void octeon_gfm_mul(const uint64_t x[2], const= uint64_t y[2], uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env, uint32_t sel) { MIPSOcteonCryptoState *crypto =3D &env->octeon_crypto; + int sha3_pos; =20 if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_SNOW3G) { if (sel >=3D OCTEON_COP2_SEL_SNOW3G_LFSR0 && @@ -1417,6 +1547,12 @@ uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env,= uint32_t sel) } } =20 + if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_SHA3 && + octeon_sha3_is_dat_sel(sel)) { + sha3_pos =3D octeon_sha3_dat_pos_from_sel(sel); + return octeon_sha3_lane_to_reg(crypto->sha3_state[sha3_pos]); + } + switch (sel) { case OCTEON_COP2_SEL_3DES_KEY0: case OCTEON_COP2_SEL_3DES_KEY1: @@ -1507,6 +1643,7 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint= 64_t value, { MIPSOcteonCryptoState *crypto =3D &env->octeon_crypto; uint64_t data =3D value; + int sha3_pos; =20 switch (sel) { case OCTEON_COP2_SEL_3DES_KEY0: @@ -1628,6 +1765,14 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA512); octeon_sha512_transform(crypto); break; + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3); + octeon_store_shared_hsh_window(crypto, sel, data); + break; + case OCTEON_COP2_SEL_SHA3_DAT24: + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3); + octeon_store_shared_hsh_window(crypto, sel, data); + break; case OCTEON_COP2_SEL_HSH_IVW0: case OCTEON_COP2_SEL_HSH_IVW1: case OCTEON_COP2_SEL_HSH_IVW2: @@ -1688,6 +1833,32 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, crypto->hsh_dat[7] =3D data; octeon_sha1_transform(crypto); break; + case OCTEON_COP2_SEL_SHA3_XORDAT0: + case OCTEON_COP2_SEL_SHA3_XORDAT1: + case OCTEON_COP2_SEL_SHA3_XORDAT2: + case OCTEON_COP2_SEL_SHA3_XORDAT3: + case OCTEON_COP2_SEL_SHA3_XORDAT4: + case OCTEON_COP2_SEL_SHA3_XORDAT5: + case OCTEON_COP2_SEL_SHA3_XORDAT6: + case OCTEON_COP2_SEL_SHA3_XORDAT7: + case OCTEON_COP2_SEL_SHA3_XORDAT8: + case OCTEON_COP2_SEL_SHA3_XORDAT9: + case OCTEON_COP2_SEL_SHA3_XORDAT10: + case OCTEON_COP2_SEL_SHA3_XORDAT11: + case OCTEON_COP2_SEL_SHA3_XORDAT12: + case OCTEON_COP2_SEL_SHA3_XORDAT13: + case OCTEON_COP2_SEL_SHA3_XORDAT14: + case OCTEON_COP2_SEL_SHA3_XORDAT15: + case OCTEON_COP2_SEL_SHA3_XORDAT16: + case OCTEON_COP2_SEL_SHA3_XORDAT17: + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3); + sha3_pos =3D octeon_sha3_xordat_pos_from_sel(sel); + crypto->sha3_state[sha3_pos] ^=3D octeon_sha3_reg_to_lane(data); + break; + case OCTEON_COP2_SEL_SHA3_STARTOP: + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3); + octeon_sha3_permute(crypto); + break; case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: octeon_gfm_mul_reflect(crypto, data); break; diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index fac7b8fa2e..5bb638147d 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -68,6 +68,7 @@ static bool octeon_cop2_is_supported_dmfc2(uint16_t sel) case OCTEON_COP2_SEL_HSH_IVW6: case OCTEON_COP2_SEL_HSH_IVW7: case OCTEON_COP2_SEL_AES_INP0: + case OCTEON_COP2_SEL_SHA3_DAT24: case OCTEON_COP2_SEL_GFM_MUL_REFLECT0: case OCTEON_COP2_SEL_GFM_MUL_REFLECT1: case OCTEON_COP2_SEL_GFM_RESINP_REFLECT0: @@ -152,6 +153,8 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel) case OCTEON_COP2_SEL_HSH_DATW13: case OCTEON_COP2_SEL_HSH_DATW14: case OCTEON_COP2_SEL_HSH_DATW15: + case OCTEON_COP2_SEL_SHA3_DAT24: + case OCTEON_COP2_SEL_SHA3_DAT15_MT: case OCTEON_COP2_SEL_HSH_IVW0: case OCTEON_COP2_SEL_HSH_IVW1: case OCTEON_COP2_SEL_HSH_IVW2: @@ -169,11 +172,30 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t s= el) case OCTEON_COP2_SEL_GFM_RESINP1: case OCTEON_COP2_SEL_GFM_XOR0: case OCTEON_COP2_SEL_GFM_POLY: + case OCTEON_COP2_SEL_SHA3_XORDAT0: + case OCTEON_COP2_SEL_SHA3_XORDAT1: + case OCTEON_COP2_SEL_SHA3_XORDAT2: + case OCTEON_COP2_SEL_SHA3_XORDAT3: + case OCTEON_COP2_SEL_SHA3_XORDAT4: + case OCTEON_COP2_SEL_SHA3_XORDAT5: + case OCTEON_COP2_SEL_SHA3_XORDAT6: + case OCTEON_COP2_SEL_SHA3_XORDAT7: + case OCTEON_COP2_SEL_SHA3_XORDAT8: + case OCTEON_COP2_SEL_SHA3_XORDAT9: + case OCTEON_COP2_SEL_SHA3_XORDAT10: + case OCTEON_COP2_SEL_SHA3_XORDAT11: + case OCTEON_COP2_SEL_SHA3_XORDAT12: + case OCTEON_COP2_SEL_SHA3_XORDAT13: + case OCTEON_COP2_SEL_SHA3_XORDAT14: + case OCTEON_COP2_SEL_SHA3_XORDAT15: + case OCTEON_COP2_SEL_SHA3_XORDAT16: + case OCTEON_COP2_SEL_SHA3_XORDAT17: case OCTEON_COP2_SEL_HSH_STARTSHA_COMPAT: case OCTEON_COP2_SEL_HSH_STARTMD5: case OCTEON_COP2_SEL_SNOW3G_START: case OCTEON_COP2_SEL_SNOW3G_MORE: case OCTEON_COP2_SEL_HSH_STARTSHA256: + case OCTEON_COP2_SEL_SHA3_STARTOP: case OCTEON_COP2_SEL_HSH_STARTSHA: case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: case OCTEON_COP2_SEL_HSH_STARTSHA512: --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778524010; cv=none; d=zohomail.com; s=zohoarc; b=npXXmLWZau8mMmkPRGpyF5Rey3OdBVESyJnUo5kBVCViUFuMKf936Op+WEnUHwqJghNHk8XdJR9lfv1U5CYFS8fL8NbelEMMkN/ESsTUUI7Cc2xMVC1wuqs1uQE7PclkIOZYmLUIlms+Jz9m/zhTrzU7KDphf61Txyf10EZGSXc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778524010; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vHzjLsa4rAXrf4vPUqAGW32XzmB8TiNPRT6JnJYPAzU=; b=ZjhYDeFGIwsOeKfG8gSeM9HcCNfI+XLJvk7xC2Fc6Nqj5Vrqlt7SIIG7a0iVQX/YMFSDw3hrBvMIViX3/IptsF1/OVS+B9KaYQWR0+ORMQGN4gL3ZzXuT2u4TmpF0jXLt49gzlSoNcGOGCGEabIyWa4stkl5kZ7qDCrB+NxUJFM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778524010029960.2675725037086; Mon, 11 May 2026 11:26:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI4-0005ED-PA; Mon, 11 May 2026 14:23:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHp-0004sG-NJ for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: from mail-ot1-x32c.google.com ([2607:f8b0:4864:20::32c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHl-0002vA-Bx for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: by mail-ot1-x32c.google.com with SMTP id 46e09a7af769-7dca4debedaso4600622a34.2 for ; Mon, 11 May 2026 11:23:20 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523800; x=1779128600; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=vHzjLsa4rAXrf4vPUqAGW32XzmB8TiNPRT6JnJYPAzU=; b=T1UtpMskX8lL8S8jFUunDSMXZO4BMQW+Fufaq/Lh6bghkfOyTTt9yJImr584e3Thpj SzL4ZJf7lDMe6nNvwBJMA0Onath4QYiV704x8pLtS21SpqVYsGDNWhqa5gmcBixA+ZsP l0g8c8bwzqPFelOMgT4A2X5X55Xh73YXGm1EpIaQTKOmfBVRfms69XdFPG7w7uOjbrKU ZfKMtzVUwEA7GWlM8nB2eC4wR92H5lSk7Nw35vIkLjgiDsXHfLpw/V7uafa246gztOlq OrKD3CQRfUiSDDSUk87CUG5/70QLqXZfwWNtOKwM+KN2OPn5sUfJnMvYepTz1rpkk097 eDdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523800; x=1779128600; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=vHzjLsa4rAXrf4vPUqAGW32XzmB8TiNPRT6JnJYPAzU=; b=Uvfrix6xnmQSkMpd+kJmGHEyqC1RSUpGZqeasBr3kH9o2A5CX/QM7RN+wFJfVn57RA uW9+CMVPHpm/tgo4Iy6pbD1cU7UDH6dx+8stP3v7sH8Q8bJ4EXmLWYEPfJUA0+ygzEY9 bsRlNz27awmFtfkifMkc1vI+2v/SEgxribe05OupnHVbv79kvMfvYdqYp/p7IotjGuJs XvVaXUJUC1tVRN1kaN3DFxbOzaTfxz9udigR/XJ90iIFCo7RyOnRpRF4dfqhmx5QGHDM lv4qZDD4Pvx0jeV6KsoW/Z423rTSfZuRtrHnvIZIWuaNuJumckUEBE45G0pHmP0huFzg uS7w== X-Gm-Message-State: AOJu0YyqhOB+r1nKhzaPVtXfemWiw1g2VqON1Mofj1QTiWFcGfSlBHns HKJAk5rGC+bcflS83bYYi/6FZKDFeyHurcSrhm3fPYs3XvMJIuuOetxc X-Gm-Gg: Acq92OGE6cyuxzKGbExhIABrBIu/kBnrmPLPc/Sfgxnb0Qvss3XgelvdejrgqUVdf92 U06/QbBDdtbHyYAeSWPFZ1784S0yjwhmlDFSCfd8Gy8ViIrQKvRxVfj/Ij80/3woytMq332r5zb Ny/Ng7y183b/jaHdHOFjr4wCct9SDQgrzevb8Vy/2KKduokvQwH8w4ljFlS/K94P3c0iLscnaL1 z6lYFKp9MdQe4aSRvKAxbVdw/xuDOTHJpJv9YLo+gseACIyztYjDTSc4YLfDIs+JtDwCcoF4mSk FccqHgD1EgfzxVeMOPiwGgQfweJPRFXgfiSJ/JBzYGQZIRHQRQPc6XZFgyEMVOllkwEX8SF5IUX XPx9DlIkMVid5G8zI14bhDUUyr0Hcbccp//fuFcJbktO6859jyVXZPlXtPYsOkdZTaY1co9akkj ZjbRUVj4HpxOXA15uYe/3g4EQ9bYwq9zxs86TPaiCtbpQgvHfLCuIeg6U0bvOHnPqqJSCJCu8xq ALpoMjblqoPTZE7BhOif9g2gl2HqBXTqNL1YmpN2p5e3A/kJGAUxIdwkDyWL88lCP34 X-Received: by 2002:a05:6830:660a:b0:7dc:de0f:b640 with SMTP id 46e09a7af769-7e381f11dfemr6959895a34.6.1778523799935; Mon, 11 May 2026 11:23:19 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:01 -0600 Subject: [PATCH v6 30/35] target/mips: add Octeon ZUC crypto support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-30-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32c; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32c.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524011981154100 Add the Octeon ZUC START and MORE selectors and model the shared state window used by the hardware interface. This covers the keystream and MAC engine state, including the save-and-restore view that overlaps the HSH/SHA3 bank. Shared-window writes also update the SHA512/SHA3 backing state so guests can switch between engines without stale register contents. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Add shared-window selector predicates and assert on unreachable ZUC selector switches. (suggested by Philippe Mathieu-Daud=C3=A9) - Preserve aliased HSH/SHA3/SHA512 backing state during ZUC shared-window writes. - Add selector dispatch updates in octeon_translate.c after moving COP2 decode out of translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v5 -> v6: - Use the manual-aligned HSH_DATW field and shared HSH window helper names introduced by the COP2 crypto core patch. --- target/mips/cpu.h | 11 +- target/mips/system/machine.c | 4 + target/mips/tcg/octeon_crypto.c | 353 +++++++++++++++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 2 + 4 files changed, 368 insertions(+), 2 deletions(-) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index 258db2babe..0b16382dd3 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -541,6 +541,7 @@ typedef enum MIPSOcteonSharedMode { OCTEON_SHARED_MODE_NONE =3D 0, OCTEON_SHARED_MODE_SHA512, OCTEON_SHARED_MODE_SNOW3G, + OCTEON_SHARED_MODE_ZUC, OCTEON_SHARED_MODE_SHA3, } MIPSOcteonSharedMode; =20 @@ -627,8 +628,8 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_CRC_WRITE_DWORD_REFLECT =3D 0x1217, OCTEON_COP2_SEL_CRC_WRITE_VAR_REFLECT =3D 0x1218, /* - * Octeon shares 0x0240..0x0257 between SHA512 state/data and the SNOW= 3G - * RESULT/FSM/LFSR window. + * Octeon shares 0x0240..0x0257 across the HSH/SHA512, SHA3, SNOW3G, + * and ZUC selector windows. */ OCTEON_COP2_SEL_HSH_DATW0 =3D 0x0240, OCTEON_COP2_SEL_HSH_DATW1, @@ -704,6 +705,8 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_SNOW3G_MORE =3D 0x404e, OCTEON_COP2_SEL_HSH_STARTSHA256 =3D 0x404f, OCTEON_COP2_SEL_SHA3_STARTOP =3D 0x4052, + OCTEON_COP2_SEL_ZUC_START =3D 0x4055, + OCTEON_COP2_SEL_ZUC_MORE =3D 0x4056, OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT =3D 0x405d, OCTEON_COP2_SEL_HSH_STARTSHA =3D 0x4057, OCTEON_COP2_SEL_HSH_STARTSHA512 =3D 0x424f, @@ -738,6 +741,10 @@ typedef struct MIPSOcteonCryptoState { uint32_t snow3g_fsm[3]; uint32_t snow3g_lfsr[16]; uint64_t snow3g_result; + uint32_t zuc_fsm[2]; + uint32_t zuc_lfsr[16]; + uint32_t zuc_window[3]; + uint32_t zuc_tresult; } MIPSOcteonCryptoState; =20 typedef struct CPUArchState { diff --git a/target/mips/system/machine.c b/target/mips/system/machine.c index e6336534f4..9bcb066245 100644 --- a/target/mips/system/machine.c +++ b/target/mips/system/machine.c @@ -312,6 +312,10 @@ static const VMStateDescription mips_vmstate_octeon_cr= ypto =3D { VMSTATE_UINT32_ARRAY(env.octeon_crypto.snow3g_fsm, MIPSCPU, 3), VMSTATE_UINT32_ARRAY(env.octeon_crypto.snow3g_lfsr, MIPSCPU, 16), VMSTATE_UINT64(env.octeon_crypto.snow3g_result, MIPSCPU), + VMSTATE_UINT32_ARRAY(env.octeon_crypto.zuc_fsm, MIPSCPU, 2), + VMSTATE_UINT32_ARRAY(env.octeon_crypto.zuc_lfsr, MIPSCPU, 16), + VMSTATE_UINT32_ARRAY(env.octeon_crypto.zuc_window, MIPSCPU, 3), + VMSTATE_UINT32(env.octeon_crypto.zuc_tresult, MIPSCPU), VMSTATE_END_OF_LIST() } }; diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c index 42e68f4205..30df901e6b 100644 --- a/target/mips/tcg/octeon_crypto.c +++ b/target/mips/tcg/octeon_crypto.c @@ -631,6 +631,277 @@ static int octeon_sha3_xordat_pos_from_sel(uint32_t s= el) return -1; } =20 +static const uint8_t octeon_zuc_s0[256] =3D { + 0x3e, 0x72, 0x5b, 0x47, 0xca, 0xe0, 0x00, 0x33, + 0x04, 0xd1, 0x54, 0x98, 0x09, 0xb9, 0x6d, 0xcb, + 0x7b, 0x1b, 0xf9, 0x32, 0xaf, 0x9d, 0x6a, 0xa5, + 0xb8, 0x2d, 0xfc, 0x1d, 0x08, 0x53, 0x03, 0x90, + 0x4d, 0x4e, 0x84, 0x99, 0xe4, 0xce, 0xd9, 0x91, + 0xdd, 0xb6, 0x85, 0x48, 0x8b, 0x29, 0x6e, 0xac, + 0xcd, 0xc1, 0xf8, 0x1e, 0x73, 0x43, 0x69, 0xc6, + 0xb5, 0xbd, 0xfd, 0x39, 0x63, 0x20, 0xd4, 0x38, + 0x76, 0x7d, 0xb2, 0xa7, 0xcf, 0xed, 0x57, 0xc5, + 0xf3, 0x2c, 0xbb, 0x14, 0x21, 0x06, 0x55, 0x9b, + 0xe3, 0xef, 0x5e, 0x31, 0x4f, 0x7f, 0x5a, 0xa4, + 0x0d, 0x82, 0x51, 0x49, 0x5f, 0xba, 0x58, 0x1c, + 0x4a, 0x16, 0xd5, 0x17, 0xa8, 0x92, 0x24, 0x1f, + 0x8c, 0xff, 0xd8, 0xae, 0x2e, 0x01, 0xd3, 0xad, + 0x3b, 0x4b, 0xda, 0x46, 0xeb, 0xc9, 0xde, 0x9a, + 0x8f, 0x87, 0xd7, 0x3a, 0x80, 0x6f, 0x2f, 0xc8, + 0xb1, 0xb4, 0x37, 0xf7, 0x0a, 0x22, 0x13, 0x28, + 0x7c, 0xcc, 0x3c, 0x89, 0xc7, 0xc3, 0x96, 0x56, + 0x07, 0xbf, 0x7e, 0xf0, 0x0b, 0x2b, 0x97, 0x52, + 0x35, 0x41, 0x79, 0x61, 0xa6, 0x4c, 0x10, 0xfe, + 0xbc, 0x26, 0x95, 0x88, 0x8a, 0xb0, 0xa3, 0xfb, + 0xc0, 0x18, 0x94, 0xf2, 0xe1, 0xe5, 0xe9, 0x5d, + 0xd0, 0xdc, 0x11, 0x66, 0x64, 0x5c, 0xec, 0x59, + 0x42, 0x75, 0x12, 0xf5, 0x74, 0x9c, 0xaa, 0x23, + 0x0e, 0x86, 0xab, 0xbe, 0x2a, 0x02, 0xe7, 0x67, + 0xe6, 0x44, 0xa2, 0x6c, 0xc2, 0x93, 0x9f, 0xf1, + 0xf6, 0xfa, 0x36, 0xd2, 0x50, 0x68, 0x9e, 0x62, + 0x71, 0x15, 0x3d, 0xd6, 0x40, 0xc4, 0xe2, 0x0f, + 0x8e, 0x83, 0x77, 0x6b, 0x25, 0x05, 0x3f, 0x0c, + 0x30, 0xea, 0x70, 0xb7, 0xa1, 0xe8, 0xa9, 0x65, + 0x8d, 0x27, 0x1a, 0xdb, 0x81, 0xb3, 0xa0, 0xf4, + 0x45, 0x7a, 0x19, 0xdf, 0xee, 0x78, 0x34, 0x60, +}; + +static const uint8_t octeon_zuc_s1[256] =3D { + 0x55, 0xc2, 0x63, 0x71, 0x3b, 0xc8, 0x47, 0x86, + 0x9f, 0x3c, 0xda, 0x5b, 0x29, 0xaa, 0xfd, 0x77, + 0x8c, 0xc5, 0x94, 0x0c, 0xa6, 0x1a, 0x13, 0x00, + 0xe3, 0xa8, 0x16, 0x72, 0x40, 0xf9, 0xf8, 0x42, + 0x44, 0x26, 0x68, 0x96, 0x81, 0xd9, 0x45, 0x3e, + 0x10, 0x76, 0xc6, 0xa7, 0x8b, 0x39, 0x43, 0xe1, + 0x3a, 0xb5, 0x56, 0x2a, 0xc0, 0x6d, 0xb3, 0x05, + 0x22, 0x66, 0xbf, 0xdc, 0x0b, 0xfa, 0x62, 0x48, + 0xdd, 0x20, 0x11, 0x06, 0x36, 0xc9, 0xc1, 0xcf, + 0xf6, 0x27, 0x52, 0xbb, 0x69, 0xf5, 0xd4, 0x87, + 0x7f, 0x84, 0x4c, 0xd2, 0x9c, 0x57, 0xa4, 0xbc, + 0x4f, 0x9a, 0xdf, 0xfe, 0xd6, 0x8d, 0x7a, 0xeb, + 0x2b, 0x53, 0xd8, 0x5c, 0xa1, 0x14, 0x17, 0xfb, + 0x23, 0xd5, 0x7d, 0x30, 0x67, 0x73, 0x08, 0x09, + 0xee, 0xb7, 0x70, 0x3f, 0x61, 0xb2, 0x19, 0x8e, + 0x4e, 0xe5, 0x4b, 0x93, 0x8f, 0x5d, 0xdb, 0xa9, + 0xad, 0xf1, 0xae, 0x2e, 0xcb, 0x0d, 0xfc, 0xf4, + 0x2d, 0x46, 0x6e, 0x1d, 0x97, 0xe8, 0xd1, 0xe9, + 0x4d, 0x37, 0xa5, 0x75, 0x5e, 0x83, 0x9e, 0xab, + 0x82, 0x9d, 0xb9, 0x1c, 0xe0, 0xcd, 0x49, 0x89, + 0x01, 0xb6, 0xbd, 0x58, 0x24, 0xa2, 0x5f, 0x38, + 0x78, 0x99, 0x15, 0x90, 0x50, 0xb8, 0x95, 0xe4, + 0xd0, 0x91, 0xc7, 0xce, 0xed, 0x0f, 0xb4, 0x6f, + 0xa0, 0xcc, 0xf0, 0x02, 0x4a, 0x79, 0xc3, 0xde, + 0xa3, 0xef, 0xea, 0x51, 0xe6, 0x6b, 0x18, 0xec, + 0x1b, 0x2c, 0x80, 0xf7, 0x74, 0xe7, 0xff, 0x21, + 0x5a, 0x6a, 0x54, 0x1e, 0x41, 0x31, 0x92, 0x35, + 0xc4, 0x33, 0x07, 0x0a, 0xba, 0x7e, 0x0e, 0x34, + 0x88, 0xb1, 0x98, 0x7c, 0xf3, 0x3d, 0x60, 0x6c, + 0x7b, 0xca, 0xd3, 0x1f, 0x32, 0x65, 0x04, 0x28, + 0x64, 0xbe, 0x85, 0x9b, 0x2f, 0x59, 0x8a, 0xd7, + 0xb0, 0x25, 0xac, 0xaf, 0x12, 0x03, 0xe2, 0xf2, +}; + +static inline uint32_t octeon_zuc_addm(uint32_t a, uint32_t b) +{ + uint32_t c =3D a + b; + + c =3D (c & 0x7fffffffU) + (c >> 31); + return c ? c : 0x7fffffffU; +} + +static inline uint32_t octeon_zuc_mul_by_pow2(uint32_t v, unsigned int shi= ft) +{ + return ((v << shift) | (v >> (31 - shift))) & 0x7fffffffU; +} + +static inline uint32_t octeon_zuc_make_u32(uint8_t a, uint8_t b, + uint8_t c, uint8_t d) +{ + return ((uint32_t)a << 24) | ((uint32_t)b << 16) | + ((uint32_t)c << 8) | d; +} + +static inline uint64_t octeon_zuc_pack_pair(uint32_t hi, uint32_t lo) +{ + return ((uint64_t)hi << 32) | lo; +} + +static void octeon_zuc_bit_reorganization(const MIPSOcteonCryptoState *cry= pto, + uint32_t x[4]) +{ + x[0] =3D ((crypto->zuc_lfsr[15] & 0x7fff8000U) << 1) | + (crypto->zuc_lfsr[14] & 0xffffU); + x[1] =3D ((crypto->zuc_lfsr[11] & 0xffffU) << 16) | + (crypto->zuc_lfsr[9] >> 15); + x[2] =3D ((crypto->zuc_lfsr[7] & 0xffffU) << 16) | + (crypto->zuc_lfsr[5] >> 15); + x[3] =3D ((crypto->zuc_lfsr[2] & 0xffffU) << 16) | + (crypto->zuc_lfsr[0] >> 15); +} + +static inline uint32_t octeon_zuc_l1(uint32_t x) +{ + return x ^ rol32(x, 2) ^ rol32(x, 10) ^ + rol32(x, 18) ^ rol32(x, 24); +} + +static inline uint32_t octeon_zuc_l2(uint32_t x) +{ + return x ^ rol32(x, 8) ^ rol32(x, 14) ^ + rol32(x, 22) ^ rol32(x, 30); +} + +static uint32_t octeon_zuc_f(MIPSOcteonCryptoState *crypto, const uint32_t= x[4]) +{ + uint32_t w =3D (x[0] ^ crypto->zuc_fsm[0]) + crypto->zuc_fsm[1]; + uint32_t w1 =3D crypto->zuc_fsm[0] + x[1]; + uint32_t w2 =3D crypto->zuc_fsm[1] ^ x[2]; + uint32_t u =3D octeon_zuc_l1((w1 << 16) | (w2 >> 16)); + uint32_t v =3D octeon_zuc_l2((w2 << 16) | (w1 >> 16)); + + crypto->zuc_fsm[0] =3D octeon_zuc_make_u32(octeon_zuc_s0[u >> 24], + octeon_zuc_s1[(uint8_t)(u >> = 16)], + octeon_zuc_s0[(uint8_t)(u >> = 8)], + octeon_zuc_s1[(uint8_t)u]); + crypto->zuc_fsm[1] =3D octeon_zuc_make_u32(octeon_zuc_s0[v >> 24], + octeon_zuc_s1[(uint8_t)(v >> = 16)], + octeon_zuc_s0[(uint8_t)(v >> = 8)], + octeon_zuc_s1[(uint8_t)v]); + return w; +} + +static void octeon_zuc_lfsr_step(MIPSOcteonCryptoState *crypto, + bool init_mode, uint32_t u) +{ + uint32_t f =3D crypto->zuc_lfsr[0]; + + f =3D octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(crypto->zuc_lfsr[0], 8= )); + f =3D octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(crypto->zuc_lfsr[4], 2= 0)); + f =3D octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(crypto->zuc_lfsr[10], = 21)); + f =3D octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(crypto->zuc_lfsr[13], = 17)); + f =3D octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(crypto->zuc_lfsr[15], = 15)); + if (init_mode) { + f =3D octeon_zuc_addm(f, u); + } + + memmove(&crypto->zuc_lfsr[0], &crypto->zuc_lfsr[1], + 15 * sizeof(crypto->zuc_lfsr[0])); + crypto->zuc_lfsr[15] =3D f; +} + +static uint32_t octeon_zuc_generate_word(MIPSOcteonCryptoState *crypto) +{ + uint32_t x[4]; + uint32_t z; + + octeon_zuc_bit_reorganization(crypto, x); + z =3D octeon_zuc_f(crypto, x) ^ x[3]; + octeon_zuc_lfsr_step(crypto, false, 0); + return z; +} + +static void octeon_zuc_fill_window(MIPSOcteonCryptoState *crypto) +{ + crypto->zuc_window[0] =3D octeon_zuc_generate_word(crypto); + crypto->zuc_window[1] =3D octeon_zuc_generate_word(crypto); + crypto->zuc_window[2] =3D octeon_zuc_generate_word(crypto); +} + +static inline uint32_t +octeon_zuc_window_word(const MIPSOcteonCryptoState *crypto, unsigned int b= it) +{ + if (bit =3D=3D 0) { + return crypto->zuc_window[0]; + } + if (bit < 32) { + return (crypto->zuc_window[0] << bit) | + (crypto->zuc_window[1] >> (32 - bit)); + } + if (bit =3D=3D 32) { + return crypto->zuc_window[1]; + } + return (crypto->zuc_window[1] << (bit - 32)) | + (crypto->zuc_window[2] >> (64 - bit)); +} + +static void octeon_zuc_advance_window(MIPSOcteonCryptoState *crypto) +{ + crypto->zuc_window[0] =3D crypto->zuc_window[2]; + crypto->zuc_window[1] =3D octeon_zuc_generate_word(crypto); + crypto->zuc_window[2] =3D octeon_zuc_generate_word(crypto); +} + +static void octeon_zuc_start(MIPSOcteonCryptoState *crypto, uint64_t data) +{ + uint32_t x[4]; + bool restore_active =3D crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_= ZUC; + + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_ZUC); + if (!restore_active) { + for (int i =3D 0; i < 7; i++) { + uint64_t pair =3D crypto->hsh_datw[i]; + + crypto->zuc_lfsr[i * 2] =3D (pair >> 32) & 0x7fffffffU; + crypto->zuc_lfsr[i * 2 + 1] =3D pair & 0x7fffffffU; + } + } + crypto->zuc_lfsr[14] =3D (data >> 32) & 0x7fffffffU; + crypto->zuc_lfsr[15] =3D data & 0x7fffffffU; + crypto->zuc_fsm[0] =3D 0; + crypto->zuc_fsm[1] =3D 0; + crypto->zuc_tresult =3D 0; + + for (int i =3D 0; i < 32; i++) { + octeon_zuc_bit_reorganization(crypto, x); + octeon_zuc_lfsr_step(crypto, true, octeon_zuc_f(crypto, x) >> 1); + } + + octeon_zuc_bit_reorganization(crypto, x); + (void)octeon_zuc_f(crypto, x); + octeon_zuc_lfsr_step(crypto, false, 0); + octeon_zuc_fill_window(crypto); +} + +static void octeon_zuc_more(MIPSOcteonCryptoState *crypto, uint64_t data) +{ + uint32_t t =3D crypto->zuc_tresult; + + octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_ZUC); + for (unsigned int bit =3D 0; bit < 64; bit++) { + if ((data >> (63 - bit)) & 1) { + t ^=3D octeon_zuc_window_word(crypto, bit); + } + } + crypto->zuc_tresult =3D t; + octeon_zuc_advance_window(crypto); +} + +static bool octeon_zuc_is_shared_dmfc2_sel(uint32_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_SHA3_DAT15_MF: + case OCTEON_COP2_SEL_SHA3_DAT24: + return true; + default: + return false; + } +} + +static bool octeon_zuc_is_shared_dmtc2_sel(uint32_t sel) +{ + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW3: + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + case OCTEON_COP2_SEL_SHA3_DAT24: + return true; + default: + return false; + } +} + static const uint8_t octeon_snow3g_sr[256] =3D { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, @@ -1527,6 +1798,39 @@ uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env,= uint32_t sel) MIPSOcteonCryptoState *crypto =3D &env->octeon_crypto; int sha3_pos; =20 + if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_ZUC && + octeon_zuc_is_shared_dmfc2_sel(sel)) { + if (sel >=3D OCTEON_COP2_SEL_HSH_DATW0 && + sel <=3D OCTEON_COP2_SEL_HSH_DATW7) { + unsigned int idx =3D sel - OCTEON_COP2_SEL_HSH_DATW0; + + return octeon_zuc_pack_pair(crypto->zuc_lfsr[idx * 2], + crypto->zuc_lfsr[idx * 2 + 1]); + } + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW8: + return octeon_zuc_pack_pair(crypto->zuc_fsm[0], crypto->zuc_fs= m[1]); + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_IVW0: + return octeon_zuc_pack_pair(crypto->zuc_window[0], + crypto->zuc_window[1]); + case OCTEON_COP2_SEL_HSH_DATW10: + return crypto->zuc_window[2]; + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_IVW3: + return crypto->zuc_tresult; + case OCTEON_COP2_SEL_SHA3_DAT15_MF: + case OCTEON_COP2_SEL_SHA3_DAT24: + return 0; + case OCTEON_COP2_SEL_HSH_IVW1: + return crypto->zuc_fsm[0]; + case OCTEON_COP2_SEL_HSH_IVW2: + return crypto->zuc_fsm[1]; + default: + g_assert_not_reached(); + } + } + if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_SNOW3G) { if (sel >=3D OCTEON_COP2_SEL_SNOW3G_LFSR0 && sel <=3D OCTEON_COP2_SEL_SNOW3G_LFSR7) { @@ -1645,6 +1949,49 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, uint64_t data =3D value; int sha3_pos; =20 + if (crypto->shared_mode =3D=3D OCTEON_SHARED_MODE_ZUC && + octeon_zuc_is_shared_dmtc2_sel(sel)) { + octeon_store_shared_hsh_window(crypto, sel, data); + + if (sel >=3D OCTEON_COP2_SEL_HSH_DATW0 && + sel <=3D OCTEON_COP2_SEL_HSH_DATW7) { + unsigned int idx =3D sel - OCTEON_COP2_SEL_HSH_DATW0; + + crypto->zuc_lfsr[idx * 2] =3D (data >> 32) & 0x7fffffffU; + crypto->zuc_lfsr[idx * 2 + 1] =3D data & 0x7fffffffU; + return; + } + switch (sel) { + case OCTEON_COP2_SEL_HSH_DATW8: + crypto->zuc_fsm[0] =3D data >> 32; + crypto->zuc_fsm[1] =3D data; + return; + case OCTEON_COP2_SEL_HSH_DATW9: + case OCTEON_COP2_SEL_HSH_IVW0: + crypto->zuc_window[0] =3D data >> 32; + crypto->zuc_window[1] =3D data; + return; + case OCTEON_COP2_SEL_HSH_DATW10: + crypto->zuc_window[2] =3D data; + return; + case OCTEON_COP2_SEL_HSH_DATW11: + case OCTEON_COP2_SEL_HSH_IVW3: + crypto->zuc_tresult =3D data; + return; + case OCTEON_COP2_SEL_SHA3_DAT15_MT: + case OCTEON_COP2_SEL_SHA3_DAT24: + return; + case OCTEON_COP2_SEL_HSH_IVW1: + crypto->zuc_fsm[0] =3D data; + return; + case OCTEON_COP2_SEL_HSH_IVW2: + crypto->zuc_fsm[1] =3D data; + return; + default: + g_assert_not_reached(); + } + } + switch (sel) { case OCTEON_COP2_SEL_3DES_KEY0: case OCTEON_COP2_SEL_3DES_KEY1: @@ -1859,6 +2206,12 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3); octeon_sha3_permute(crypto); break; + case OCTEON_COP2_SEL_ZUC_START: + octeon_zuc_start(crypto, data); + break; + case OCTEON_COP2_SEL_ZUC_MORE: + octeon_zuc_more(crypto, data); + break; case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: octeon_gfm_mul_reflect(crypto, data); break; diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index 5bb638147d..b4aa4917fd 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -196,6 +196,8 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel) case OCTEON_COP2_SEL_SNOW3G_MORE: case OCTEON_COP2_SEL_HSH_STARTSHA256: case OCTEON_COP2_SEL_SHA3_STARTOP: + case OCTEON_COP2_SEL_ZUC_START: + case OCTEON_COP2_SEL_ZUC_MORE: case OCTEON_COP2_SEL_HSH_STARTSHA: case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT: case OCTEON_COP2_SEL_HSH_STARTSHA512: --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523997; cv=none; d=zohomail.com; s=zohoarc; b=HonICE8no1/GXUNYp5VKPNnnbnTZhcdZuV3wMjHEUNP2FnBjteKa+3Pb28B8YXM8Z9KKVO8FeF7ZLxdTKb/hZtq0sQgeqT5tJZ7xB6J4/BrLwxdYA4zXDWKkdh97ZqZCMrJQLvAAhgrpxFYMoPorarUCTRQl3nwObSlh0IawSQU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523997; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=r4mGLdPrc9J5jGD77L+CWXpD/OwC7TX7tgfJYIt5EIc=; b=UxUagK1txDjLyIfX0ZtU8s8bZ9ByKiBmTlShGMtoIajAxAhLqQOsc2Na0oLGbHI4uT+hhMYg13/Ma3sme+xjKvBIqUNpXKhXHu+w0+UAKfch7R4psQosA95kiwqJp/xTJRUFMndVlkEqiTN49JHhaNvH6I6nsO6M5Mi651ojXac= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17785239977521002.7327421038589; Mon, 11 May 2026 11:26:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVIC-0005jZ-93; Mon, 11 May 2026 14:23:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHp-0004sH-Pf for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHm-0002vS-Sr for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:25 -0400 Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-7dbca22dbfeso2729550a34.1 for ; Mon, 11 May 2026 11:23:21 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523801; x=1779128601; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=r4mGLdPrc9J5jGD77L+CWXpD/OwC7TX7tgfJYIt5EIc=; b=k+jRJARQYkOis1YOwqKO+7FJ8h8j+jwGFFz0Xbl/xSzp1y060pH2jMrycjm0jB65qx cQfPP5dLvXrzdN1Sxn0rj/EJZqFKTJhkRQLDyPjv9pMQFX/qkYciao1xxzAOKwaUfNE9 EfS+rS23Ew+PeKo7uwvhNUmN46GPbSD5Q/sU6PPBFWgYadzydZEE/WjIU0EFrcEkJwH5 v/7FxOm94zu7mKuNLGiGHguPlt6SrjC7iCORYIM4HAAIvsPEHOSAoeBgQXd6NUNxFIjL VYPgBw2f5dGvp7vvG9YALXlAETFg5O09tFbtHxpK1UJBFmfFpc3d6gCBIO+VxxMgfhF4 XU6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523801; x=1779128601; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=r4mGLdPrc9J5jGD77L+CWXpD/OwC7TX7tgfJYIt5EIc=; b=rQhoYD7Cl/BuiLdBKD7/sRPPLWqnvcLltfixw0cWiD+mqa78gWLbAcYXEq+AE/Tnb1 lviSDJUm96zeOe8RnRGWt8x7qnEMMtS0/xMB7Wm89wQkWPqC6stRQvvYPD6yTmrXHKK0 z/yM1DfOmxzVCA7v0A51X3LNQamzdQCJcwCTI3i8Jzl0xnRwNPOKVAsILGn3suy6wsrW UslzwpDI8DoTET+SR0omG/M7poi5018J3V6cORGg7f0p75xOkq+LrM4WLhKM74Lvckz+ 1XQQK5l5VIeQxZ3pmQM1MyKnRX5tFW0y+g62bjUwoVNhYynI9NtRNbpsHIHEnQQcuKG7 6Smw== X-Gm-Message-State: AOJu0YwxVxZKbWWrSwlkCQD7YsHd+nspk/ZBbRaEnGouTE6OdztWdcoq bvKv8mh4KjkIPbMMFGemSdtaf5FjMIrJrGn3HoO3IP5qzUKpV24knWmK X-Gm-Gg: Acq92OFk9BbuBv2m8Tva2D9cn3qwgDDZ/WJ70ylDS3kaEYP4CjDSGx44390hwXg8+cc oU8qYXoANqcvdQIpgvJb9aI3S7pWSmnaIMaIt+bxcRGNbKAlQB9lYKLH6nHDofGLT+YHcICn1ey DiZL3NWNq1ptmBD5NTzCdiusABnKezxkQqwwncEH+pjby3lOfXY7aKvgqbwXrrtz8TKAPZy7Zqy Dmg1mx/5YxJfy4RB7A2BVItojpLYolZl+WIDaibKBmj9DkslRQz+sADSFQmjS6V1ZTSLLrRXGue NG7EtzmjaN0k25mbWUjYoiknLwakjyWWiymlp4+bHwRnJKrQBI17hKiKcRtLFWo8EZQmgJl0k6D TFdl5qO+YlFX9vjjNYa825FEBS/wbKwdBVeUrWkSuqnLMMzaMDOtCRn9nyaD7kMVx4W5IQA950O oj5JxU2QTryLDUea6IC5N6BEATDe5JR7t1GNxcFbyovT9fVbNxTQGFcQQRymt8yY7ACPPl5Fbbi we0AzZiJERIHT08bNbIpDLepXsehRgehTIf7FYuALM6CVwB0UXRRYbTckYS5a4q1Jk7fI26wdwd 2OQ= X-Received: by 2002:a05:6830:82ea:b0:7de:5133:90df with SMTP id 46e09a7af769-7e1defc946cmr15271505a34.14.1778523800948; Mon, 11 May 2026 11:23:20 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:02 -0600 Subject: [PATCH v6 31/35] target/mips: add Octeon Camellia crypto support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-31-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32a; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32a.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523999799154100 Add the Octeon Camellia ROUND, FL, and FLINV selectors and model the round engine that reuses the AES RESINP bank. Implement the Camellia F-function and FL layers directly from RFC 3713 so guest-managed key schedules can drive the engine through the hardware interface. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Drop the Octeon prefix from generic Camellia helper routines. (suggested by Philippe Mathieu-Daud=C3=A9) - Add selector dispatch updates in octeon_translate.c after moving COP2 decode out of translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v5 -> v6: - Use RESINP wording for the Camellia shared selector aliases. --- target/mips/cpu.h | 9 +++ target/mips/tcg/octeon_crypto.c | 120 +++++++++++++++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 3 + 3 files changed, 132 insertions(+) diff --git a/target/mips/cpu.h b/target/mips/cpu.h index 0b16382dd3..ba886735d5 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -595,6 +595,14 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_AES_DEC0 =3D 0x010e, OCTEON_COP2_SEL_AES_KEYLENGTH =3D 0x0110, OCTEON_COP2_SEL_AES_INP0 =3D 0x0111, + /* + * Camellia reuses the AES RESINP bank and adds per-round and + * diffusion-layer selectors for the guest-managed key schedule. + */ + OCTEON_COP2_SEL_CAMELLIA_RESINP0 =3D OCTEON_COP2_SEL_AES_RESINP0, + OCTEON_COP2_SEL_CAMELLIA_RESINP1 =3D OCTEON_COP2_SEL_AES_RESINP1, + OCTEON_COP2_SEL_CAMELLIA_FL =3D 0x0115, + OCTEON_COP2_SEL_CAMELLIA_FLINV =3D 0x0116, /* * SMS4 reuses the AES RESINP, IV, and key banks and only adds * operation selectors for ECB/CBC encrypt/decrypt. @@ -696,6 +704,7 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_AES_ENC1 =3D 0x310b, OCTEON_COP2_SEL_AES_DEC_CBC1 =3D 0x310d, OCTEON_COP2_SEL_AES_DEC1 =3D 0x310f, + OCTEON_COP2_SEL_CAMELLIA_ROUND =3D 0x3114, OCTEON_COP2_SEL_SMS4_ENC_CBC1 =3D 0x3119, OCTEON_COP2_SEL_SMS4_ENC1 =3D 0x311b, OCTEON_COP2_SEL_SMS4_DEC_CBC1 =3D 0x311d, diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c index 30df901e6b..27e34b7f43 100644 --- a/target/mips/tcg/octeon_crypto.c +++ b/target/mips/tcg/octeon_crypto.c @@ -1650,6 +1650,117 @@ static void octeon_aes_store_block(uint64_t regs[2]= , const uint8_t *block) regs[1] =3D ldq_be_p(block + 8); } =20 +static const uint8_t camellia_sbox1[256] =3D { + 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, + 174, 65, 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, + 29, 101, 146, 189, 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, + 220, 95, 94, 197, 11, 26, 166, 225, 57, 202, 213, 71, 93, 61, + 217, 1, 90, 214, 81, 86, 108, 77, 139, 13, 154, 102, 251, 204, + 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, 223, 76, 203, 194, + 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, 20, 88, + 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, + 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, + 105, 80, 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, + 224, 255, 100, 210, 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, + 230, 218, 9, 63, 221, 148, 135, 92, 131, 2, 205, 74, 144, 51, + 115, 103, 246, 243, 157, 127, 191, 226, 82, 155, 216, 38, 200, 55, + 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, 233, 121, 167, 140, + 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, 120, 152, + 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, + 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, + 241, 164, 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, + 119, 199, 128, 158, +}; + +static inline uint8_t camellia_rotl8(uint8_t v, unsigned int shift) +{ + return (v << shift) | (v >> (8 - shift)); +} + +static inline uint8_t camellia_sbox2(uint8_t x) +{ + return camellia_rotl8(camellia_sbox1[x], 1); +} + +static inline uint8_t camellia_sbox3(uint8_t x) +{ + return camellia_rotl8(camellia_sbox1[x], 7); +} + +static inline uint8_t camellia_sbox4(uint8_t x) +{ + return camellia_sbox1[camellia_rotl8(x, 1)]; +} + +static uint64_t camellia_f(uint64_t input, uint64_t key) +{ + uint64_t x =3D input ^ key; + uint8_t t1 =3D camellia_sbox1[x >> 56]; + uint8_t t2 =3D camellia_sbox2((x >> 48) & 0xff); + uint8_t t3 =3D camellia_sbox3((x >> 40) & 0xff); + uint8_t t4 =3D camellia_sbox4((x >> 32) & 0xff); + uint8_t t5 =3D camellia_sbox2((x >> 24) & 0xff); + uint8_t t6 =3D camellia_sbox3((x >> 16) & 0xff); + uint8_t t7 =3D camellia_sbox4((x >> 8) & 0xff); + uint8_t t8 =3D camellia_sbox1[x & 0xff]; + uint8_t y1 =3D t1 ^ t3 ^ t4 ^ t6 ^ t7 ^ t8; + uint8_t y2 =3D t1 ^ t2 ^ t4 ^ t5 ^ t7 ^ t8; + uint8_t y3 =3D t1 ^ t2 ^ t3 ^ t5 ^ t6 ^ t8; + uint8_t y4 =3D t2 ^ t3 ^ t4 ^ t5 ^ t6 ^ t7; + uint8_t y5 =3D t1 ^ t2 ^ t6 ^ t7 ^ t8; + uint8_t y6 =3D t2 ^ t3 ^ t5 ^ t7 ^ t8; + uint8_t y7 =3D t3 ^ t4 ^ t5 ^ t6 ^ t8; + uint8_t y8 =3D t1 ^ t4 ^ t5 ^ t6 ^ t7; + + return ((uint64_t)y1 << 56) | ((uint64_t)y2 << 48) | + ((uint64_t)y3 << 40) | ((uint64_t)y4 << 32) | + ((uint64_t)y5 << 24) | ((uint64_t)y6 << 16) | + ((uint64_t)y7 << 8) | y8; +} + +static uint64_t camellia_fl(uint64_t input, uint64_t key) +{ + uint32_t x1 =3D input >> 32; + uint32_t x2 =3D input; + uint32_t k1 =3D key >> 32; + uint32_t k2 =3D key; + + x2 ^=3D rol32(x1 & k1, 1); + x1 ^=3D x2 | k2; + return ((uint64_t)x1 << 32) | x2; +} + +static uint64_t camellia_flinv(uint64_t input, uint64_t key) +{ + uint32_t y1 =3D input >> 32; + uint32_t y2 =3D input; + uint32_t k1 =3D key >> 32; + uint32_t k2 =3D key; + + y1 ^=3D y2 | k2; + y2 ^=3D rol32(y1 & k1, 1); + return ((uint64_t)y1 << 32) | y2; +} + +static void octeon_camellia_round(MIPSOcteonCryptoState *crypto, uint64_t = key) +{ + uint64_t left =3D crypto->aes_result[0]; + uint64_t right =3D crypto->aes_result[1]; + + crypto->aes_result[0] =3D right ^ camellia_f(left, key); + crypto->aes_result[1] =3D left; +} + +static void octeon_camellia_fl_layer(MIPSOcteonCryptoState *crypto, + uint64_t key, bool inverse) +{ + uint64_t state =3D crypto->aes_result[inverse ? 1 : 0]; + + crypto->aes_result[inverse ? 1 : 0] =3D inverse ? + camellia_flinv(state, key) : + camellia_fl(state, key); +} + static void octeon_sms4_crypt_common(MIPSOcteonCryptoState *crypto, bool encrypt, bool cbc) { @@ -2046,6 +2157,12 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, case OCTEON_COP2_SEL_AES_KEYLENGTH: crypto->aes_keylen =3D data; break; + case OCTEON_COP2_SEL_CAMELLIA_FL: + octeon_camellia_fl_layer(crypto, data, false); + break; + case OCTEON_COP2_SEL_CAMELLIA_FLINV: + octeon_camellia_fl_layer(crypto, data, true); + break; case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL: case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL_REFLECT: crypto->crc_poly =3D data; @@ -2231,6 +2348,9 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint= 64_t value, crypto->aes_input[1] =3D data; octeon_aes_decrypt_common(crypto, false); break; + case OCTEON_COP2_SEL_CAMELLIA_ROUND: + octeon_camellia_round(crypto, data); + break; case OCTEON_COP2_SEL_SMS4_ENC_CBC1: crypto->aes_input[1] =3D data; octeon_sms4_crypt_common(crypto, true, true); diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index b4aa4917fd..ad8a38f927 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -111,6 +111,8 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel) case OCTEON_COP2_SEL_AES_DEC_CBC0: case OCTEON_COP2_SEL_AES_DEC0: case OCTEON_COP2_SEL_AES_KEYLENGTH: + case OCTEON_COP2_SEL_CAMELLIA_FL: + case OCTEON_COP2_SEL_CAMELLIA_FLINV: case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL: case OCTEON_COP2_SEL_CRC_IV: case OCTEON_COP2_SEL_CRC_WRITE_LEN: @@ -206,6 +208,7 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel) case OCTEON_COP2_SEL_AES_ENC1: case OCTEON_COP2_SEL_AES_DEC_CBC1: case OCTEON_COP2_SEL_AES_DEC1: + case OCTEON_COP2_SEL_CAMELLIA_ROUND: case OCTEON_COP2_SEL_SMS4_ENC_CBC1: case OCTEON_COP2_SEL_SMS4_ENC1: case OCTEON_COP2_SEL_SMS4_DEC_CBC1: --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523920; cv=none; d=zohomail.com; s=zohoarc; b=gWboJ+L2y5GZ3XmnlJPeLL/le8uIlLobPGUSAn6tnAmmAHsG8wRsx73PmD4RN/YonYx7BnbLJVMDOvWm0zvW09DxToSqQ4X7+ow2u+TSYPonTTz/R+Adeuab/VOIAXDN5Prquu5+6yP7l9Hi9eN+hxisgqiHE1SMUBgiDIBPwN0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523920; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=SF46Ie01DLslR/zPpTrDVLJ05rXRIvlLY6V2tFlAdCY=; b=mWkfFSrabcT1TdxIRLQbWI4pZ9aaeGNsO6ZqUk5f9c8ct/qe8limS7/j9qtW7ESwPoj3q1XiVvcC7/T/dNRAy5v6nXm8DsQUdDjVwQJcqOM6qSaIDlyRg8SL/wGfEXXI20mG4keMCXG/r/UATJNb9XC7apjqlRiVlxhOv4SUw6c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17785239209501009.8448527226521; Mon, 11 May 2026 11:25:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI8-0005V4-Jm; Mon, 11 May 2026 14:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHs-0004vn-Dl for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:29 -0400 Received: from mail-oi1-x229.google.com ([2607:f8b0:4864:20::229]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHn-0002vX-V5 for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:27 -0400 Received: by mail-oi1-x229.google.com with SMTP id 5614622812f47-479e4835e26so2728430b6e.3 for ; Mon, 11 May 2026 11:23:22 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523802; x=1779128602; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=SF46Ie01DLslR/zPpTrDVLJ05rXRIvlLY6V2tFlAdCY=; b=PqZFDQ7gf1D4kAqNCJpJmtn138h603q6VdwV5QDTd9c49WUr3KTe8fjKBDE3ek/bJB vbGq8FtBjI+4dP7JhrBlxR7jqufTzeroepv0YCoPiuBDhxc9jxw/GcuoiddY9TzGQxdw SNn+nWjwu86N2TCjbjStfrr7+qC1sMWEWf5TZ2MQxdvuV5we2fwLROo4p9TZmrlpQJNh v1gPaqX0EO+0rYvo5WPJTWExSHbFQSxB2WWNxXqopfbKtCGbUpqwW9vN01A80uF8VoQL /0xOOob+6w92tb77YYBXo+S7KzKchPsk9QO+1Bl4P45+NueYcKCMJq9iWc6Ri4bHb/jm CTPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523802; x=1779128602; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=SF46Ie01DLslR/zPpTrDVLJ05rXRIvlLY6V2tFlAdCY=; b=qqOrfFe459Vqz1cKMAclxSftcxVhOb0gKxIwr56YWASi1Vr1hXIj5g3FBeBfEBGmQL 3oM0GKLaEWOW2hWgPqI8lElTkCMh1Kj4EI12dEtasTydKhiKsRzZBZxZcOr+GMrTzYTr PJd52AtBPEPJ1w0tVpgRgAxCDd3P5L7bGvcatBE9Nmr0biMJv5ZbZGb3UdPbLjJorpS9 jMsyrz5sXila7UVDqM323BVwn3Uutng5ACsYqsBRTsT8QK6kUCdos3dkirKTzdZ0Whhq keraPFw8vywTOJQwnu35KocwZFSkctWGB8LapPVsdh9PSscA9x8Wuemr0jToeNnHch+I tyJA== X-Gm-Message-State: AOJu0YwzeB4vABPYrseEWPHEW5hifdVWcjbwzC5R9n+nLRtB+SNLq/1s Vznh1zROyIC8gtjMy8PXz3m971LauNjsoVz1zcU3DElSuRtKe+oU68SK X-Gm-Gg: Acq92OHYeWzeDxg4TmiZsnBXCOIsWIG69GkCIGfwrZ5tR/fv+pqIiix7hN3Ge413UeT rZRykX8ARBWhPM782zuRPxrDbFO98Ho55MF9VyB7T7UweNq1FfyQ7cIR91DES9Qi7BFlcDvLPab vV4FQPwfdfYMdWfqMfCk0mYb7XdpvUVIvKiXpRXQo4ZIiw8RXmhqeASYQVBOjpYix1b4B3CAkNR Tmb7ebJ2A4dqAwxeT7OGW4Q9o5/p1J9KnqqHNBHn/NbyX2EVGQfTQIrMb9+b/15rbotjkkedxef k0C28KsOTzDvl1D3lI7pv2Jfh2z88vtUnnQbuGWG47mYUfXDhUKmlOhe2SO0DUSuAHzq+xjq6C1 /8shkMXFDesHuiFiHGsQlJBuhUct6DhKGs99GeXc4GYxUKtkEp59QepfGd4Vn64uwsm6spajp8s KJprUHDWjNEEErJFhfgIzDyADTFUXE75H/KfWKAl6/TeY5NCjUJnF4159AU8DGSRjROrTRn6VoI E5svhwqWOeYEq25vjwCEC4npptzlxxzdBsIqS71U+Kt6Zo+ZbF+edNAwPFM5PWpiB8k X-Received: by 2002:a05:6808:302b:b0:47b:d07b:ec96 with SMTP id 5614622812f47-4804252ae05mr13856474b6e.40.1778523801915; Mon, 11 May 2026 11:23:21 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:03 -0600 Subject: [PATCH v6 32/35] target/mips: add Octeon CHORD and LLM COP2 support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-32-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::229; envelope-from=james.hilliard1@gmail.com; helo=mail-oi1-x229.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523922382158500 Add the Octeon CHORD hardware register access path and the LLM 36-bit and 64-bit read and write windows. Model both CHORD access forms, including the rdhwr $30 path and the legacy dmfc2 alias, and implement sparse backing storage for the two LLM sets so user-mode code can save, restore, and probe the architectural state. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Use neutral selector-slot wording for the LLM/CHORD alias comment. - Add selector dispatch updates in octeon_translate.c after moving COP2 decode out of translate.c. (suggested by Philippe Mathieu-Daud=C3=A9) Changes v5 -> v6: - Rename sparse LLM backing fields from llm_narrow/llm_wide to llm36/llm64 to match the 36-bit and 64-bit selector windows. --- target/mips/cpu.c | 67 +++++++++++++++++++++++++++++++++++ target/mips/cpu.h | 20 +++++++++++ target/mips/helper.h | 1 + target/mips/internal.h | 3 ++ target/mips/system/machine.c | 67 +++++++++++++++++++++++++++++++++++ target/mips/tcg/octeon_crypto.c | 72 ++++++++++++++++++++++++++++++++++= ++++ target/mips/tcg/octeon_translate.c | 13 +++++++ target/mips/tcg/op_helper.c | 6 ++++ target/mips/tcg/translate.c | 8 +++++ 9 files changed, 257 insertions(+) diff --git a/target/mips/cpu.c b/target/mips/cpu.c index 6e827c72de..9bf9b67202 100644 --- a/target/mips/cpu.c +++ b/target/mips/cpu.c @@ -27,6 +27,7 @@ #include "internal.h" #include "kvm_mips.h" #include "qemu/module.h" +#include "qemu/qtree.h" #include "system/kvm.h" #include "system/qtest.h" #include "hw/core/qdev-properties.h" @@ -183,6 +184,57 @@ static bool mips_cpu_has_work(CPUState *cs) =20 #include "cpu-defs.c.inc" =20 +static gint mips_octeon_u64_tree_compare(gconstpointer a, gconstpointer b, + gpointer user_data) +{ + uint64_t av =3D *(const uint64_t *)a; + uint64_t bv =3D *(const uint64_t *)b; + + return (av > bv) - (av < bv); +} + +QTree *mips_octeon_llm_tree_new(void) +{ + return q_tree_new_full(mips_octeon_u64_tree_compare, + NULL, g_free, g_free); +} + +uint64_t mips_octeon_llm_load(QTree *tree, uint64_t addr) +{ + uint64_t key =3D addr; + uint64_t *value =3D tree ? q_tree_lookup(tree, &key) : NULL; + + return value ? *value : 0; +} + +void mips_octeon_llm_store(QTree **treep, uint64_t addr, uint64_t value) +{ + uint64_t *key; + uint64_t *stored; + + if (!*treep) { + *treep =3D mips_octeon_llm_tree_new(); + } + + key =3D g_new(uint64_t, 1); + stored =3D g_new(uint64_t, 1); + *key =3D addr; + *stored =3D value; + q_tree_replace(*treep, key, stored); +} + +static void mips_octeon_destroy_llm_state(MIPSOcteonCryptoState *crypto) +{ + if (crypto->llm36) { + q_tree_destroy(crypto->llm36); + crypto->llm36 =3D NULL; + } + if (crypto->llm64) { + q_tree_destroy(crypto->llm64); + crypto->llm64 =3D NULL; + } +} + static void mips_cpu_reset_hold(Object *obj, ResetType type) { CPUState *cs =3D CPU(obj); @@ -194,6 +246,7 @@ static void mips_cpu_reset_hold(Object *obj, ResetType = type) mcc->parent_phases.hold(obj, type); } =20 + mips_octeon_destroy_llm_state(&env->octeon_crypto); memset(env, 0, offsetof(CPUMIPSState, end_reset_fields)); =20 /* Reset registers to their default values */ @@ -248,6 +301,9 @@ static void mips_cpu_reset_hold(Object *obj, ResetType = type) env->active_fpu.fcr31 =3D env->cpu_model->CP1_fcr31; env->msair =3D env->cpu_model->MSAIR; env->insn_flags =3D env->cpu_model->insn_flags; + if (env->insn_flags & INSN_OCTEON) { + env->octeon_crypto.chord =3D 1; + } =20 #if defined(CONFIG_USER_ONLY) env->CP0_Status =3D (MIPS_HFLAG_UM << CP0St_KSU); @@ -264,6 +320,9 @@ static void mips_cpu_reset_hold(Object *obj, ResetType = type) * hardware registers. */ env->CP0_HWREna |=3D 0x0000000F; + if (env->insn_flags & INSN_OCTEON) { + env->CP0_HWREna |=3D 0x40000000u; + } if (env->CP0_Config1 & (1 << CP0C1_FP)) { env->CP0_Status |=3D (1 << CP0St_CU1); } @@ -422,6 +481,13 @@ static void mips_cpu_reset_hold(Object *obj, ResetType= type) #endif } =20 +static void mips_cpu_finalize(Object *obj) +{ + MIPSCPU *cpu =3D MIPS_CPU(obj); + + mips_octeon_destroy_llm_state(&cpu->env.octeon_crypto); +} + static void mips_cpu_disas_set_info(const CPUState *cs, disassemble_info *= info) { const MIPSCPU *cpu =3D MIPS_CPU(cs); @@ -648,6 +714,7 @@ static const TypeInfo mips_cpu_type_info =3D { .instance_size =3D sizeof(MIPSCPU), .instance_align =3D __alignof(MIPSCPU), .instance_init =3D mips_cpu_initfn, + .instance_finalize =3D mips_cpu_finalize, .abstract =3D true, .class_size =3D sizeof(MIPSCPUClass), .class_init =3D mips_cpu_class_init, diff --git a/target/mips/cpu.h b/target/mips/cpu.h index ba886735d5..b1974c367f 100644 --- a/target/mips/cpu.h +++ b/target/mips/cpu.h @@ -11,6 +11,7 @@ #include "fpu/softfloat-types.h" #include "hw/core/clock.h" #include "mips-defs.h" +#include "qemu/qtree.h" =20 typedef struct CPUMIPSTLBContext CPUMIPSTLBContext; =20 @@ -617,6 +618,21 @@ typedef enum MIPSOcteonCop2Sel { OCTEON_COP2_SEL_SMS4_ENC0 =3D OCTEON_COP2_SEL_AES_ENC0, OCTEON_COP2_SEL_SMS4_DEC_CBC0 =3D OCTEON_COP2_SEL_AES_DEC_CBC0, OCTEON_COP2_SEL_SMS4_DEC0 =3D OCTEON_COP2_SEL_AES_DEC0, + /* + * Selector 0x0400 is the 36-bit LLM read selector and is also used as= a + * DMFC2 alias for the CHORD POW tag-switch completion bit. + */ + OCTEON_COP2_SEL_LLM_READ_ADDR0 =3D 0x0400, + OCTEON_COP2_SEL_CHORD =3D OCTEON_COP2_SEL_LLM_READ_ADDR0, + OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL0 =3D 0x0401, + OCTEON_COP2_SEL_LLM_DATA0 =3D 0x0402, + OCTEON_COP2_SEL_LLM_READ64_ADDR0 =3D 0x0404, + OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL0 =3D 0x0405, + OCTEON_COP2_SEL_LLM_READ_ADDR1 =3D 0x0408, + OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL1 =3D 0x0409, + OCTEON_COP2_SEL_LLM_DATA1 =3D 0x040a, + OCTEON_COP2_SEL_LLM_READ64_ADDR1 =3D 0x040c, + OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL1 =3D 0x040d, OCTEON_COP2_SEL_CRC_POLYNOMIAL =3D 0x0200, OCTEON_COP2_SEL_CRC_IV =3D 0x0201, OCTEON_COP2_SEL_CRC_LEN =3D 0x0202, @@ -754,6 +770,10 @@ typedef struct MIPSOcteonCryptoState { uint32_t zuc_lfsr[16]; uint32_t zuc_window[3]; uint32_t zuc_tresult; + uint64_t llm_data[2]; + uint64_t chord; + QTree *llm36; + QTree *llm64; } MIPSOcteonCryptoState; =20 typedef struct CPUArchState { diff --git a/target/mips/helper.h b/target/mips/helper.h index 52fe18a8f8..410a9b8090 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -202,6 +202,7 @@ DEF_HELPER_1(rdhwr_cc, tl, env) DEF_HELPER_1(rdhwr_ccres, tl, env) DEF_HELPER_1(rdhwr_performance, tl, env) DEF_HELPER_1(rdhwr_xnp, tl, env) +DEF_HELPER_1(rdhwr_chord, tl, env) DEF_HELPER_2(pmon, void, env, int) DEF_HELPER_1(wait, void, env) =20 diff --git a/target/mips/internal.h b/target/mips/internal.h index 23e1ada185..026dc0ea4f 100644 --- a/target/mips/internal.h +++ b/target/mips/internal.h @@ -93,6 +93,9 @@ extern const int mips_defs_number; =20 int mips_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int mips_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); +QTree *mips_octeon_llm_tree_new(void); +uint64_t mips_octeon_llm_load(QTree *tree, uint64_t addr); +void mips_octeon_llm_store(QTree **treep, uint64_t addr, uint64_t value); =20 #define USEG_LIMIT ((target_ulong)(int32_t)0x7FFFFFFFUL) #define KSEG0_BASE ((target_ulong)(int32_t)0x80000000UL) diff --git a/target/mips/system/machine.c b/target/mips/system/machine.c index 9bcb066245..1ec05f0600 100644 --- a/target/mips/system/machine.c +++ b/target/mips/system/machine.c @@ -131,6 +131,69 @@ static const VMStateDescription vmstate_octeon_multipl= ier_tc =3D { } }; =20 +typedef struct OcteonLLMTreePutData { + QEMUFile *f; +} OcteonLLMTreePutData; + +static gboolean put_octeon_llm_tree_entry(gpointer key, gpointer value, + gpointer user_data) +{ + OcteonLLMTreePutData *data =3D user_data; + + qemu_put_be64(data->f, *(uint64_t *)key); + qemu_put_be64(data->f, *(uint64_t *)value); + return false; +} + +static int put_octeon_llm_tree(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, JSONWriter *vmde= sc) +{ + QTree *tree =3D *(QTree **)pv; + OcteonLLMTreePutData data =3D { .f =3D f }; + uint32_t nnodes =3D tree ? q_tree_nnodes(tree) : 0; + + qemu_put_be32(f, nnodes); + if (tree) { + q_tree_foreach(tree, put_octeon_llm_tree_entry, &data); + } + + return 0; +} + +static int get_octeon_llm_tree(QEMUFile *f, void *pv, size_t size, + const VMStateField *field) +{ + QTree **treep =3D pv; + uint32_t nnodes =3D qemu_get_be32(f); + + if (*treep) { + q_tree_destroy(*treep); + } + *treep =3D mips_octeon_llm_tree_new(); + + for (uint32_t i =3D 0; i < nnodes; i++) { + uint64_t addr =3D qemu_get_be64(f); + uint64_t value =3D qemu_get_be64(f); + + mips_octeon_llm_store(treep, addr, value); + } + + return 0; +} + +static const VMStateInfo vmstate_info_octeon_llm_tree =3D { + .name =3D "octeon_llm_tree", + .get =3D get_octeon_llm_tree, + .put =3D put_octeon_llm_tree, +}; + +#define VMSTATE_OCTEON_LLM_TREE(_f, _s) { \ + .name =3D stringify(_f), \ + .version_id =3D 1, \ + .info =3D &vmstate_info_octeon_llm_tree, \ + .offset =3D vmstate_offset_pointer(_s, _f, QTree), \ +} + /* MVP state */ =20 static const VMStateDescription vmstate_mvp =3D { @@ -316,6 +379,10 @@ static const VMStateDescription mips_vmstate_octeon_cr= ypto =3D { VMSTATE_UINT32_ARRAY(env.octeon_crypto.zuc_lfsr, MIPSCPU, 16), VMSTATE_UINT32_ARRAY(env.octeon_crypto.zuc_window, MIPSCPU, 3), VMSTATE_UINT32(env.octeon_crypto.zuc_tresult, MIPSCPU), + VMSTATE_UINT64_ARRAY(env.octeon_crypto.llm_data, MIPSCPU, 2), + VMSTATE_UINT64(env.octeon_crypto.chord, MIPSCPU), + VMSTATE_OCTEON_LLM_TREE(env.octeon_crypto.llm36, MIPSCPU), + VMSTATE_OCTEON_LLM_TREE(env.octeon_crypto.llm64, MIPSCPU), VMSTATE_END_OF_LIST() } }; diff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypt= o.c index 27e34b7f43..b845bdff07 100644 --- a/target/mips/tcg/octeon_crypto.c +++ b/target/mips/tcg/octeon_crypto.c @@ -16,6 +16,42 @@ #include "qemu/bitops.h" #include "qemu/host-utils.h" =20 +#define OCTEON_LLM_NARROW_MASK ((1ULL << 36) - 1) + +static uint64_t octeon_llm_pack_narrow(uint64_t value) +{ + value &=3D OCTEON_LLM_NARROW_MASK; + return value | ((uint64_t)(ctpop64(value) & 1) << 36); +} + +static void octeon_llm_read(MIPSOcteonCryptoState *crypto, unsigned int se= t, + uint64_t addr, bool wide) +{ + uint64_t value; + + if (wide) { + value =3D mips_octeon_llm_load(crypto->llm64, addr); + } else { + value =3D octeon_llm_pack_narrow( + mips_octeon_llm_load(crypto->llm36, addr)); + } + + crypto->llm_data[set] =3D value; +} + +static void octeon_llm_write(MIPSOcteonCryptoState *crypto, unsigned int s= et, + uint64_t addr, bool wide) +{ + uint64_t value =3D crypto->llm_data[set]; + + if (wide) { + mips_octeon_llm_store(&crypto->llm64, addr, value); + } else { + mips_octeon_llm_store(&crypto->llm36, addr, + value & OCTEON_LLM_NARROW_MASK); + } +} + static inline void octeon_set_shared_mode(MIPSOcteonCryptoState *crypto, MIPSOcteonSharedMode mode) { @@ -2001,6 +2037,12 @@ uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env,= uint32_t sel) return crypto->crc_len; case OCTEON_COP2_SEL_CRC_IV_REFLECT: return octeon_crc_reflect32_by_byte(crypto->crc_iv); + case OCTEON_COP2_SEL_CHORD: + return crypto->chord; + case OCTEON_COP2_SEL_LLM_DATA0: + return crypto->llm_data[0]; + case OCTEON_COP2_SEL_LLM_DATA1: + return crypto->llm_data[1]; case OCTEON_COP2_SEL_HSH_DATW0: case OCTEON_COP2_SEL_HSH_DATW1: case OCTEON_COP2_SEL_HSH_DATW2: @@ -2157,6 +2199,36 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uin= t64_t value, case OCTEON_COP2_SEL_AES_KEYLENGTH: crypto->aes_keylen =3D data; break; + case OCTEON_COP2_SEL_LLM_READ_ADDR0: + octeon_llm_read(crypto, 0, data, false); + break; + case OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL0: + octeon_llm_write(crypto, 0, data, false); + break; + case OCTEON_COP2_SEL_LLM_DATA0: + crypto->llm_data[0] =3D data; + break; + case OCTEON_COP2_SEL_LLM_READ64_ADDR0: + octeon_llm_read(crypto, 0, data, true); + break; + case OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL0: + octeon_llm_write(crypto, 0, data, true); + break; + case OCTEON_COP2_SEL_LLM_READ_ADDR1: + octeon_llm_read(crypto, 1, data, false); + break; + case OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL1: + octeon_llm_write(crypto, 1, data, false); + break; + case OCTEON_COP2_SEL_LLM_DATA1: + crypto->llm_data[1] =3D data; + break; + case OCTEON_COP2_SEL_LLM_READ64_ADDR1: + octeon_llm_read(crypto, 1, data, true); + break; + case OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL1: + octeon_llm_write(crypto, 1, data, true); + break; case OCTEON_COP2_SEL_CAMELLIA_FL: octeon_camellia_fl_layer(crypto, data, false); break; diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_tr= anslate.c index ad8a38f927..b10886b199 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -78,6 +78,9 @@ static bool octeon_cop2_is_supported_dmfc2(uint16_t sel) case OCTEON_COP2_SEL_GFM_RESINP0: case OCTEON_COP2_SEL_GFM_RESINP1: case OCTEON_COP2_SEL_GFM_POLY: + case OCTEON_COP2_SEL_CHORD: + case OCTEON_COP2_SEL_LLM_DATA0: + case OCTEON_COP2_SEL_LLM_DATA1: return true; default: return false; @@ -113,6 +116,16 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t se= l) case OCTEON_COP2_SEL_AES_KEYLENGTH: case OCTEON_COP2_SEL_CAMELLIA_FL: case OCTEON_COP2_SEL_CAMELLIA_FLINV: + case OCTEON_COP2_SEL_LLM_READ_ADDR0: + case OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL0: + case OCTEON_COP2_SEL_LLM_DATA0: + case OCTEON_COP2_SEL_LLM_READ64_ADDR0: + case OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL0: + case OCTEON_COP2_SEL_LLM_READ_ADDR1: + case OCTEON_COP2_SEL_LLM_WRITE_ADDR_INTERNAL1: + case OCTEON_COP2_SEL_LLM_DATA1: + case OCTEON_COP2_SEL_LLM_READ64_ADDR1: + case OCTEON_COP2_SEL_LLM_WRITE64_ADDR_INTERNAL1: case OCTEON_COP2_SEL_CRC_WRITE_POLYNOMIAL: case OCTEON_COP2_SEL_CRC_IV: case OCTEON_COP2_SEL_CRC_WRITE_LEN: diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index 0a892e31a8..67854f08df 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -412,6 +412,12 @@ target_ulong helper_rdhwr_xnp(CPUMIPSState *env) return (env->CP0_Config5 >> CP0C5_XNP) & 1; } =20 +target_ulong helper_rdhwr_chord(CPUMIPSState *env) +{ + check_hwrena(env, 30, GETPC()); + return env->octeon_crypto.chord; +} + void helper_pmon(CPUMIPSState *env, int function) { function /=3D 2; diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index 767d64718a..3e39f3460a 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -10923,6 +10923,14 @@ void gen_rdhwr(DisasContext *ctx, int rt, int rd, = int sel) } break; #endif + case 30: + if (!(ctx->insn_flags & INSN_OCTEON)) { + gen_reserved_instruction(ctx); + break; + } + gen_helper_rdhwr_chord(t0, tcg_env); + gen_store_gpr(t0, rt); + break; default: /* Invalid */ MIPS_INVAL("rdhwr"); gen_reserved_instruction(ctx); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523998; cv=none; d=zohomail.com; s=zohoarc; b=eBNt2xrUY0zFjvcxmVhcnbPqyQNjSqxxnx1KAReBm/nSfMZ5ZnmxJKcKaMQiOkwWWoar5r4GAQK58yOj74z8I/4+91N9f9BkSIeQxVGl7zNmtup2s/SKOlO3jizlUSHdyeTLOA1rnCSh09kDI290TZA2H2xQWytf2WgsOwZCQ/k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523998; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zujAwh5N4GUQo31k1K/W8TQ2OGgta58CwyapwbEsYUA=; b=VYR6ICb1H89PiOMkeKPgmParjpywD+rrCZIWp305rh53/lTZukslASmKqhQxkLysVynil3+N+3I/f8+LhaOI85FD5yGTlMcPSWNciqaRnm+4Xb/b+sICELtRiaezHyy6ZhRwtasDkkVhbm0M1PnzZvySlWJSiegJB2h3bUtZY0Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852399886252.142519062544466; Mon, 11 May 2026 11:26:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVIC-0005l6-Uz; Mon, 11 May 2026 14:23:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHq-0004uG-Py for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:29 -0400 Received: from mail-oi1-x22a.google.com ([2607:f8b0:4864:20::22a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHo-0002vf-1v for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:26 -0400 Received: by mail-oi1-x22a.google.com with SMTP id 5614622812f47-479d68a9063so1708429b6e.0 for ; Mon, 11 May 2026 11:23:23 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523803; x=1779128603; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=zujAwh5N4GUQo31k1K/W8TQ2OGgta58CwyapwbEsYUA=; b=Yp4mJ3egeAAsxwmbRq2lM9MlR7F13jxaNLBJbW3HjonP/reiTj3qUF3z02hvG5+0NY V953rPY9bhI6mNisGqodzSu9hsFQaJTwhI0fOCUyLJ+8YDzJVA4V9zWvJcQ05y4eVDJc MM+J0HrTZhX50D4Fce5wHOt6zpRLXTX62h3RMCh2e2OEm3Go+mPS8qaB1fwhnmnQ76rt tdBb7LwIvOnmFx1D7kj2eOWfI+XiaXQsVBTEnQTVFMrh4nMlUGYRlHr8m3/zyWrZC0iI P56vK8xnMBrntp0jbJddNaMlFMEZMEKkEcwVN++loC8idOcEVIKTCkz2JVxxPIXg90mD xv9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523803; x=1779128603; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=zujAwh5N4GUQo31k1K/W8TQ2OGgta58CwyapwbEsYUA=; b=AGyIAv4T/Fzh+leCV7G5RQCM6oB6g+PGEMwURBrXsDaUMsliOyXzBU5TDH4RArt3wo hrfpMttQXWBk0Q5ETyW822Uqm/biDimPPSeE+xk0NlsHdN1rRPFTvNkicMCyVXEg9S7y HtelvlzHQtd8udyCDNtVk+dCQpAbdTbZYePCXqmCE7SLlLbasvup+sl8dLb6EKIAjwll YcU1B4/AauI27tRkq3++u0FfR+wu/tQE+mtE8fvtMqR5tA0/zZQcipeqnGFJn15tVm9c rY2vccIIvI7RrhvxdpcK7FTB6cPUM1gz3zb/k8sfeJxhf32CrMQwsWj3xBoa4gQ+qhZI ytoA== X-Gm-Message-State: AOJu0YwHvW+i0k6o9AwT3ZHGJIqj4YG8xGT3zRCvv40wthTOVJhMbgzK xjyVqs+eh4o3pH+71S/SFb+uSnvLRJTCJ4EvNbY2kKPCsMffw/6xWEfT X-Gm-Gg: Acq92OHNKYx5qIdHqjRQF2+xeQLv+A5zZUZQD53Dbe1aksp06tt4HvbbRnJWwPWgxdo P9jLjTOiLbNM60xHniky71KKP2xp4fmYQjRYPbOIPJHpBXCY9wtJkEZAZHemTwr9yPL/XEL+EET lQrq3kaWacJ/UhyHszhtRCRFAmnXkXNgR5fcvjAyt1zd4sPz2+Zn60ZeXX/fjF6TNj9fwDxPHhr xyX20fclzVPESQCRJqw57lMMoAq/xjFlsc2CIGCQH1Oygw/dzlq6NTv+zR6G2VcKGnE55MhUzM3 Q8UUGAtvRHBUSF+9rHzALhRGZABtMNtc6Co0igdKbd9Ngdo9xHMEEqTNcPL3NZjEFz9eyxWnn1p LpnFG+l4kJ7gCoeKTW+dDQQSDtxT1Nf/G18PtXNrEu7NjAEPMGGCU6cH8vZ2xY2o4+skYqnpE1e N7BL3jvOIJrHuc/p3mhOv970yzY3JmPFqjNey534Mqe9aiKMr927ECnJaSpf3R7SSIdyWLUA+WM wT2/cNosh6P/pVuIeaTDh1jKHBsZz69KjKM7P8hmBjiFgWbwZMZtdDTIfDZFAZMQr/5 X-Received: by 2002:a54:4e95:0:b0:467:2509:c207 with SMTP id 5614622812f47-4824a6d54a9mr4534021b6e.17.1778523802791; Mon, 11 May 2026 11:23:22 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:04 -0600 Subject: [PATCH v6 33/35] target/mips: add Octeon CvmCount RDHWR support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-33-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::22a; envelope-from=james.hilliard1@gmail.com; helo=mail-oi1-x22a.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778524001752154100 Octeon exposes CvmCount through RDHWR register 31. Add the Octeon-only decode path, enable the corresponding HWREna bit for linux-user, and use an unsigned mask when checking HWREna so bit 31 is handled safely. For user-mode emulation, return host ticks as a monotonic counter source suitable for existing Octeon userspace code. In system mode, fall back to the existing CP0 Count value. Signed-off-by: James Hilliard --- target/mips/cpu.c | 2 +- target/mips/helper.h | 1 + target/mips/tcg/op_helper.c | 13 ++++++++++++- target/mips/tcg/translate.c | 11 +++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/target/mips/cpu.c b/target/mips/cpu.c index 9bf9b67202..639ffa77cd 100644 --- a/target/mips/cpu.c +++ b/target/mips/cpu.c @@ -321,7 +321,7 @@ static void mips_cpu_reset_hold(Object *obj, ResetType = type) */ env->CP0_HWREna |=3D 0x0000000F; if (env->insn_flags & INSN_OCTEON) { - env->CP0_HWREna |=3D 0x40000000u; + env->CP0_HWREna |=3D 0xc0000000u; } if (env->CP0_Config1 & (1 << CP0C1_FP)) { env->CP0_Status |=3D (1 << CP0St_CU1); diff --git a/target/mips/helper.h b/target/mips/helper.h index 410a9b8090..d7a0feb673 100644 --- a/target/mips/helper.h +++ b/target/mips/helper.h @@ -203,6 +203,7 @@ DEF_HELPER_1(rdhwr_ccres, tl, env) DEF_HELPER_1(rdhwr_performance, tl, env) DEF_HELPER_1(rdhwr_xnp, tl, env) DEF_HELPER_1(rdhwr_chord, tl, env) +DEF_HELPER_1(rdhwr_cvmcount, tl, env) DEF_HELPER_2(pmon, void, env, int) DEF_HELPER_1(wait, void, env) =20 diff --git a/target/mips/tcg/op_helper.c b/target/mips/tcg/op_helper.c index 67854f08df..55ac877506 100644 --- a/target/mips/tcg/op_helper.c +++ b/target/mips/tcg/op_helper.c @@ -25,6 +25,7 @@ #include "exec/memop.h" #include "fpu_helper.h" #include "qemu/crc32c.h" +#include "qemu/timer.h" #include =20 static inline target_ulong bitswap(target_ulong v) @@ -366,7 +367,7 @@ target_ulong helper_yield(CPUMIPSState *env, target_ulo= ng arg) =20 static inline void check_hwrena(CPUMIPSState *env, int reg, uintptr_t pc) { - if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << reg))) { + if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1u << reg)))= { return; } do_raise_exception(env, EXCP_RI, pc); @@ -418,6 +419,16 @@ target_ulong helper_rdhwr_chord(CPUMIPSState *env) return env->octeon_crypto.chord; } =20 +target_ulong helper_rdhwr_cvmcount(CPUMIPSState *env) +{ + check_hwrena(env, 31, GETPC()); +#ifdef CONFIG_USER_ONLY + return cpu_get_host_ticks(); +#else + return (uint32_t)cpu_mips_get_count(env); +#endif +} + void helper_pmon(CPUMIPSState *env, int function) { function /=3D 2; diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index 3e39f3460a..7627a4ffb4 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -10931,6 +10931,17 @@ void gen_rdhwr(DisasContext *ctx, int rt, int rd, = int sel) gen_helper_rdhwr_chord(t0, tcg_env); gen_store_gpr(t0, rt); break; + case 31: + if (!(ctx->insn_flags & INSN_OCTEON)) { + gen_reserved_instruction(ctx); + break; + } + translator_io_start(&ctx->base); + gen_helper_rdhwr_cvmcount(t0, tcg_env); + gen_store_gpr(t0, rt); + gen_save_pc(ctx->base.pc_next + 4); + ctx->base.is_jmp =3D DISAS_EXIT; + break; default: /* Invalid */ MIPS_INVAL("rdhwr"); gen_reserved_instruction(ctx); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523920; cv=none; d=zohomail.com; s=zohoarc; b=Ziw8mxv+Sv9nq6b7ilUxpqVh9m4Pf+V1sC01rDJT+sgm7wGkCSO/TJ/laKLo0dyxAvkIqxYDa+bCcEP27Rv/sCEZfKywvOmO/4z/PuYVuh3DhspQPTj0iqz2TkCLw4mll5KVLu3QqOFr69QV7ouhx0bOhEiylaw0Knk+bdwCZnY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523920; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OI7Nnr0/XFDg2DGEIke6C43YaOPcPxGOk89iy/MfMjE=; b=lRaTY+rNnfzHGtERynesNc5d6NJoVI05bzYac5VzZUvIGwk2df//tLv34GcXdRI8WNit5+ECSvXmkhPFbW92rLiLFn5sWzuik/8zuEjLpBu03kwkPXWD94NWIWBtEt7c/8qMyk+ihSVO8NXT4wUUDA+489To5rd2jTL1dHCLWs8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778523920720954.5872810244348; Mon, 11 May 2026 11:25:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI8-0005Rj-6q; Mon, 11 May 2026 14:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHq-0004uH-VF for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:29 -0400 Received: from mail-ot1-x32f.google.com ([2607:f8b0:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHp-0002we-1Y for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:26 -0400 Received: by mail-ot1-x32f.google.com with SMTP id 46e09a7af769-7dbe437b072so2660856a34.2 for ; Mon, 11 May 2026 11:23:24 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523804; x=1779128604; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=OI7Nnr0/XFDg2DGEIke6C43YaOPcPxGOk89iy/MfMjE=; b=cO/P5JRwlaSPyhBYOMdiKjt3oULLGWU7I6VLbihDbuQncXMoU0ucR64kDmVM3VQQon EQIFov/DWfkvz8kipEsgKJaTas1wbd8io+if2drswRIm+hWxf6XOW2rIlZvnd7vsk8Am W1ewY8o4foc2e7lubxrePTOiC7S15Y+3dN24XiuhImF5yB194qTPCxND82j0YpCZexBW jwZ/aIbfWdywHOxnSre0TtX2GtiRkvslLYt4kxSZ/l0Hyod+ZVFtvhGRNvHoQ6B78T1e BfviWYOobE1IT43Gs9wjCrrp03AbGuFZY2dNjhZwD38taC2O7bRe2AwS8BpNbJDar86W dOBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523804; x=1779128604; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=OI7Nnr0/XFDg2DGEIke6C43YaOPcPxGOk89iy/MfMjE=; b=tYQiH5H/gTQS4fGyNaw2+SNHhwoYfKojzf2WyyHDP7UHSfu9qHBapGrFps/YnlizP7 7WFXFRiPXM+Uy4rHFmbODaV/yumwZOcDkI2sRDnsSzj1vtQvJ0SozA/hILN3l6sOAVVt eVtOTuxIwyuov98u8BwUjhadp5oUmHzjbq9/8Seue0PAMmkHheIQkBCeJ1HCaCoiM41i nTXUbgFXkJFOqj6vSXtEIymZF/zEmQCKUsO4VSRh0yzJl/IZ5EvjuW32VlpIRF2fQfHz oHkLSfR3HS5uosBDtxbn/+u4z/80SGFnrPxIhhKLkKq6rEBcIg6l3ihbMqXAhYEsHRVf YChQ== X-Gm-Message-State: AOJu0YzED0X3cR/i3uC8hTcRulhp08W3qhJXAHIy0ZAWJaV/SVy+bx6s QrUNTbUIXtMAfcb+Wqcd8IKo9q6jo7pQCzLnyCgLxa7ZdtClv+zuOygZ X-Gm-Gg: Acq92OHcAgsUi0VhA1+38YdjqI8cHPxXdZ+DRWGuHBjZO7OtIrEZnszctIxntvmXEEj IlakPgsHAJuzCOfTjuNStagjeuOkOLxqAWQJT88j8iYpGHL1txYY9+IZdeSCpZ0O8Wr1IFyQL0a whmOjye9bC5M8Woaf8b9BkNEYa0OtVZadhIfOkPT7FY1WxtgaWfzygGcRQ7enpHjcuM2l5EY6Ox GZgYi9BYu3NGcWeGldtgsya+N2wy4lR+4c+BMX0JyKIOKq304fhH+LRYcBkPlHOHskp6eEddnTh LG1TeFurbpK7AZQKeTrOFuFOO/BJ0EmHegtreeO/mUbsUwDGDh1EiR3iX99oI1trLOz55UVC+OE bKzaIzGhQZajoeiVIT4ozDBZ5iEp31dTkqWIyu8Xa1RWYnSzBeRs1ByeR8trB5XRZDnQkGZx/WA owQ32x9G3oQo5i1mTaEApVkqS3LQ0b4hhtYLMO+ccFe9Dqpg76MqepxEzDTMO5PgHFkv0Me5o4n M7IegVvlWHeH1yyyUt1oajfRMYNLcz+hOfRxleoWU06G9cgzVWH60fg9+xOsAUc8+wY0J4AxQ4U 8vQ= X-Received: by 2002:a05:6830:3905:b0:7dc:cd0b:58b0 with SMTP id 46e09a7af769-7e1ded2b16fmr15493680a34.3.1778523803897; Mon, 11 May 2026 11:23:23 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:05 -0600 Subject: [PATCH v6 34/35] tests/tcg/mips: cover Octeon QMAC and CvmCount MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-34-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32f; envelope-from=james.hilliard1@gmail.com; helo=mail-ot1-x32f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523922197154100 Extend the Octeon linux-user smoke test with QMAC/QMACS fixed-point accumulator checks and an RDHWR $31 monotonicity check. Signed-off-by: James Hilliard --- tests/tcg/mips/user/isa/octeon/octeon-insns.c | 57 +++++++++++++++++++++++= ++++ 1 file changed, 57 insertions(+) diff --git a/tests/tcg/mips/user/isa/octeon/octeon-insns.c b/tests/tcg/mips= /user/isa/octeon/octeon-insns.c index 435ccfa347..1dbdd9f52a 100644 --- a/tests/tcg/mips/user/isa/octeon/octeon-insns.c +++ b/tests/tcg/mips/user/isa/octeon/octeon-insns.c @@ -129,6 +129,59 @@ static uint64_t octeon_vmm0(uint64_t mpl0, uint64_t p0, return rd; } =20 +static uint64_t octeon_qmac_lo(uint64_t rs, uint64_t rt, uint64_t lo) +{ + uint64_t rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + "mtlo %[lo]\n\t" + "mthi $0\n\t" + ".word 0x710904d2\n\t" /* qmac.03 $8, $9 */ + "mflo %[rd]\n\t" + : [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt), [lo] "r" (lo) + : "$8", "$9"); + + return rd; +} + +static uint64_t octeon_qmacs_state(uint64_t rs, uint64_t rt, uint64_t lo) +{ + uint64_t hi, rd; + + asm volatile( + "move $8, %[rs]\n\t" + "move $9, %[rt]\n\t" + "mtlo %[lo]\n\t" + "mthi $0\n\t" + ".word 0x71090012\n\t" /* qmacs.00 $8, $9 */ + "mfhi %[hi]\n\t" + "mflo %[rd]\n\t" + : [hi] "=3Dr" (hi), [rd] "=3Dr" (rd) + : [rs] "r" (rs), [rt] "r" (rt), [lo] "r" (lo) + : "$8", "$9"); + + return ((hi & 1) << 32) | (rd & 0xffffffff); +} + +static uint64_t octeon_rdhwr31_non_decreasing(void) +{ + uint64_t first, second; + + asm volatile( + ".word 0x7c08f83b\n\t" /* rdhwr $8, $31 */ + ".word 0x7c09f83b\n\t" /* rdhwr $9, $31 */ + "move %[first], $8\n\t" + "move %[second], $9\n\t" + : [first] "=3Dr" (first), [second] "=3Dr" (second) + : + : "$8", "$9"); + + return second >=3D first; +} + static uint64_t octeon_vmm0_zeroes_mpl1(void) { uint64_t rd; @@ -259,6 +312,10 @@ int main(void) assert(octeon_seq(0xabc, 0xdef) =3D=3D 0); assert(octeon_sne(0xabc, 0xabc) =3D=3D 0); assert(octeon_sne(0xabc, 0xdef) =3D=3D 1); + assert(octeon_qmac_lo(0x0003000000000000ULL, 2, 1) =3D=3D 13); + assert(octeon_qmacs_state(1, 1, 0x7ffffffe) =3D=3D 0x17fffffffULL); + assert(octeon_qmacs_state(0x8000, 0x8000, 0) =3D=3D 0x17fffffffULL); + assert(octeon_rdhwr31_non_decreasing()); assert(octeon_vmulu(5, 7, 11) =3D=3D 46); assert(octeon_vmm0(5, 13, 7, 11) =3D=3D 59); assert(octeon_vmm0_zeroes_mpl1() =3D=3D 0); --=20 2.54.0 From nobody Mon May 25 20:33:08 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1778523847; cv=none; d=zohomail.com; s=zohoarc; b=GW74dn4dW7qLdNsG8HUv2f5p9T2dXcK5FTvfFYXLE7dG/ad0/SZsJCjjvIKOVHptO0vEVWxRWlLD/RMcZbffRyjPWB8k6PjRIkofaV2mGqDQZLdL9PciERKVm6JM4rgMfDeNProN9ExGiwNEc6THEyn2CNTEMeZH2SKnpLPJgVo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778523847; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=hJekX8dH52yMvYykB5HOFELCbhNNSoNRaiTZ7e0Y8tM=; b=kvmfp0W+4tChmSsmxPm+g8vE4rQYp1zQbhJvS6XbjUt3xBfUxMWYs4LFQlYwkVm5lhe5nzcncOsIKo7qumYBjCOfOuF+CyzU/FgnezMwFQ/YgX5ZVGVmGKawbvNxia9kA47uJmSwB8L0k3FvTl8ldME3ursEBNzw3QH+XLB/9ac= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177852384717868.99713135162096; Mon, 11 May 2026 11:24:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMVI9-0005YX-Nc; Mon, 11 May 2026 14:23:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMVHs-0004vo-Dt for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:29 -0400 Received: from mail-oi1-x234.google.com ([2607:f8b0:4864:20::234]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wMVHq-0002ya-8O for qemu-devel@nongnu.org; Mon, 11 May 2026 14:23:27 -0400 Received: by mail-oi1-x234.google.com with SMTP id 5614622812f47-479d9b155deso1649100b6e.3 for ; Mon, 11 May 2026 11:23:25 -0700 (PDT) Received: from mac.localdomain (71-218-106-55.hlrn.qwest.net. [71.218.106.55]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e367d90148sm7504871a34.20.2026.05.11.11.23.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 11:23:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778523805; x=1779128605; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=hJekX8dH52yMvYykB5HOFELCbhNNSoNRaiTZ7e0Y8tM=; b=OsrWuSW7MX+XFOu2rUa0WSTmVObn/NAFuCzWb8Hqv3sxZLA/HhJbzHFCmCtJL57rkg W5h8lq1vX1NI/jLZalgk09Y13zWmSvhuys1ExjoI871htt7D6DSDZhSGZVHnBfY2tLsp lvRAu85yrL2VLyAeD+HHRRVei2uCtvE1KmoqjQBVmDkpQK6sq93M7vATavFY9Kz4LnTD c/ob1/HvUw9N1llfmQ1FZ04T/UcVJShxXWmXBlC/0Ce4vj7mKBM1IeMHE+z6dYEiyDUl cpE7Qh9y0AX1jbW/q90yp1cQd5Cpysurk00ImrePsTvRmGF9I1xCGGP7sH4gsLg3bKTk 2W3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778523805; x=1779128605; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=hJekX8dH52yMvYykB5HOFELCbhNNSoNRaiTZ7e0Y8tM=; b=a8xNK+NNgLtxVrfgIizcXWgOQ91A7NqxWIgO35qFYsB417n3akSee02KtuyaOh9nQM qcvi9lM7IgPJ+RE1wO1TE0DrRIUjQXABy8jvhtrAGOxpSYdZuzxbX2eMemeaeD5zQr4W 7Ffkismwjt+we8VE0IgtiT13DIMzDP3BMq3UQUarqAkW2D0zr62hrXJE+tbVDQaeNWsc +9cLBBqanU1WxXIFn/YO7Oi2IiO4oVnTip5lBlAxglQQx5O7mqarYyOTW7VvqnfOpo6D BQrBKMrooZnLeXnlheNcYQHSDPU5TFncb/L8FNFACv8tHBogjQcWsrfjFW1r7TJeDOdk DsWA== X-Gm-Message-State: AOJu0YxDhHWsK4lptysnkpnTQ4LFalyuZlEGyXObK2RSHjP+Wxp5YonR xWPu8ikEgT3zZZJWFmaMoGywxjLwzbD8I7v8AM9m45K2qow0/NoWPh4R X-Gm-Gg: Acq92OGJnCiWdgDk6Yzqq6O+GlodYnW0v3IvvdtIKrVbM+VXZqf/ftxFKDJPCVyhOfd 4KKP6gz2WK/zaJmzxP7TLJKGyfqP+Ku2sSaB2wSWQRt1ArGDTd5sLEekrySgexjA6/guDD/OUwQ U1/9nV0vnjqwkeBTFZS44AWhaTaMrEzi1QbG7xgTfK4G+z1AylfRL60/5Y5xb2HXpYC/iPyJ+Jz pRWF0jb7LXjzXxTdMjKuOeObga/GIO0zFvFoR1yi/NH7wxBwW17URic4Llw3VN4FQB1QfjmRyUB zlfI022Yts9bMHsi7z6SEdSykJVJpFaV8J17ye2mJ9rDqwrRR9vJy0zKw/BjOQ+6VbtGvVKwXzI IHKAqF+yPesVuvF/DbqcpsoR+gfNG1qEwh+OhFXK3oHzKs71psKLRxtn+bc6M8Zsj0e1mWPmk+Y UINS4XHnhw9LT6SKokTPmi11VZ+P+Q0iRg/EMtCWSRNBVIFH7H3Z5GRu8w6sf2M3OzFKX4h2C0i HTiDZZbYdyfeUgWzPcMG8ii8zga6dkabqgjS2602jUhi60Y25dqNKqXuTPFmXNU/ea7 X-Received: by 2002:a05:6808:1481:b0:467:a44:dddd with SMTP id 5614622812f47-480425a7060mr14459220b6e.47.1778523804709; Mon, 11 May 2026 11:23:24 -0700 (PDT) From: James Hilliard Date: Mon, 11 May 2026 12:23:06 -0600 Subject: [PATCH v6 35/35] target/mips: expose Octeon68XX floating-point support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260511-mips-octeon-missing-insns-v2-v6-35-5062889c4d3c@gmail.com> References: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> In-Reply-To: <20260511-mips-octeon-missing-insns-v2-v6-0-5062889c4d3c@gmail.com> To: qemu-devel@nongnu.org Cc: Laurent Vivier , Helge Deller , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Huacai Chen , James Hilliard X-Mailer: b4 0.15.2 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::234; envelope-from=james.hilliard1@gmail.com; helo=mail-oi1-x234.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1778523848726154100 Octeon68XX cores implement CP1. Advertise that in the CPU definition by setting Config1.FP, enabling the writable Status bits, and providing the FCR0/FCR31 defaults used by this CPU model. This lets guests observe the expected floating-point feature bits and use CP1 with -cpu Octeon68XX. Signed-off-by: James Hilliard --- Changes v1 -> v2: - Move this CPU-model correction into a separate final patch. (suggested by Philippe Mathieu-Daud=C3=A9) --- target/mips/cpu-defs.c.inc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/target/mips/cpu-defs.c.inc b/target/mips/cpu-defs.c.inc index faefab0473..cc1916232f 100644 --- a/target/mips/cpu-defs.c.inc +++ b/target/mips/cpu-defs.c.inc @@ -997,7 +997,8 @@ const mips_def_t mips_defs[] =3D .CP0_PRid =3D 0x000D9100, .CP0_Config0 =3D MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_= AT) | (MMU_TYPE_R4000 << CP0C0_MT), - .CP0_Config1 =3D MIPS_CONFIG1 | (0x3F << CP0C1_MMU) | + .CP0_Config1 =3D MIPS_CONFIG1 | (1 << CP0C1_FP) | + (0x3F << CP0C1_MMU) | (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA)= | (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA)= | (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), @@ -1011,7 +1012,12 @@ const mips_def_t mips_defs[] =3D .CP0_PageGrain =3D (1 << CP0PG_ELPA), .SYNCI_Step =3D 32, .CCRes =3D 2, - .CP0_Status_rw_bitmask =3D 0x12F8FFFF, + .CP0_Status_rw_bitmask =3D 0x36F8FFFF, + .CP1_fcr0 =3D (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) | + (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | + (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV= ), + .CP1_fcr31 =3D 0, + .CP1_fcr31_rw_bitmask =3D 0xFF83FFFF, .SEGBITS =3D 42, .PABITS =3D 49, .insn_flags =3D CPU_MIPS64R2 | INSN_OCTEON, --=20 2.54.0