Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2225872/?format=api
{ "id": 2225872, "url": "http://patchwork.ozlabs.org/api/patches/2225872/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260421-mips-octeon-missing-insns-v2-v2-9-a0791df188c9@gmail.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260421-mips-octeon-missing-insns-v2-v2-9-a0791df188c9@gmail.com>", "list_archive_url": null, "date": "2026-04-21T17:27:36", "name": "[v2,09/13] target/mips: add Octeon SHA3 crypto support", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "776b6b342bd2309b81b97ffda71028147822a0f7", "submitter": { "id": 66301, "url": "http://patchwork.ozlabs.org/api/people/66301/?format=api", "name": "James Hilliard", "email": "james.hilliard1@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260421-mips-octeon-missing-insns-v2-v2-9-a0791df188c9@gmail.com/mbox/", "series": [ { "id": 500858, "url": "http://patchwork.ozlabs.org/api/series/500858/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500858", "date": "2026-04-21T17:27:27", "name": "target/mips: add missing Octeon user-mode support", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/500858/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2225872/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2225872/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=UbxClxG4;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0Tqv0SG4z1yHB\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 03:29:31 +1000 (AEST)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wFEtP-00040V-MC; Tue, 21 Apr 2026 13:28:11 -0400", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <james.hilliard1@gmail.com>)\n id 1wFEtB-0003nb-Vt\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 13:28:01 -0400", "from mail-oa1-x2a.google.com ([2001:4860:4864:20::2a])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <james.hilliard1@gmail.com>)\n id 1wFEt6-0006i4-Gv\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 13:27:56 -0400", "by mail-oa1-x2a.google.com with SMTP id\n 586e51a60fabf-4042905015cso2777194fac.0\n for <qemu-devel@nongnu.org>; Tue, 21 Apr 2026 10:27:48 -0700 (PDT)", "from mac.localdomain (97-118-149-104.hlrn.qwest.net.\n [97.118.149.104]) by smtp.gmail.com with ESMTPSA id\n 586e51a60fabf-42b8fe2c52bsm12209290fac.0.2026.04.21.10.27.46\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 21 Apr 2026 10:27:47 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1776792468; x=1777397268; darn=nongnu.org;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=qysWhW4sZ2k4fvCSAIQwvHK+YYsE649PPxBVUHi+4QU=;\n b=UbxClxG44gRSTWTFqqFK8jBPaLlNuMLdDDXimOHIjPhWM6FoA7ct8dC1CtbAqImx9r\n gnCR4KUSBGXx9ejyKImVfEMsRuOp7aqIUU8um7fhoCET/A/b2AJcTZq39XpmHU2sRwq7\n H9q3S45HPcxCOzuQqIUHmYnG+yvQOeefaF3GKP1d9/85LzPxg9/Vtqb8s4fxJDU+BNM7\n WnCMIx1IINpSYUnTt9ASDGdyhFDQ4DDpvQ8eKrGsXYxUWHi42TkvxZq6CosLimfIrZPm\n vzgMq3XIn8wb6bMgz2g3g8EKsN7i33I5sCOtI/mvmWOYUXCHONDsJSniCHNnReXh1O7l\n BBQA==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776792468; x=1777397268;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=qysWhW4sZ2k4fvCSAIQwvHK+YYsE649PPxBVUHi+4QU=;\n b=ZakpLLy2dZC1ddyPIeIYXC0Z/0xyCcSFRDMaDlaIYht0aJtKql4H0qGQ9KLeliJzLn\n 4l9aA665gaR20YCrG0Zn/xxRSwAURg3dy/KRl6sSgYuunMC2uoz2hyicdAVWSv/i5AtV\n DnHEsI8EabT2f7vQxVyrtvOonfkh2bRAS5LY6hfTWOjbxM8yzwPEULUmDQcUhyq/2+P8\n t+7loQqWeL1SR0skhYkRE63lxOEP0UyTfsda/XsIDrfECL2Cohu+6xEu9FB2EIW5jnou\n OWlqWEvpti61kDMg9saNh3jFrQEUYQ8yYzWntBS5vRrn6UcYyhbGoMsSFNCgRLl99Uoh\n nwjQ==", "X-Gm-Message-State": "AOJu0Yyn+Qdp9MQjuu+09KgBNr5+BypsQ+ewBU/2a8sc3xK1Onq8mMmg\n /4KddW/h/nzdiaMmeqilZQFksBI5qUUZtDswDqaj+VnmS5xShLolMn8kFQex5A==", "X-Gm-Gg": "AeBDieutWJbVcYG2beoqMintEWzNzubYVxFEFiwE9VIyFQQoaF+m4wzX/apOSylkJZH\n cwHDNAzQbkbn3deeXTI+L0qnJYfEJqaSI4qM2upS+95KMIUv1y04Mrh8n3r+aIWmwyOzR24L++R\n 7sN5BGFOsBv2wh+8OToJNeiPjgcNYaycKu7m7+KY6K5Ak1S7zzgJ3O1PzuaxFihZQ18OwVLPWiV\n umfnICB1GurNh5hs+52yPKzU2EgxHErFz2z2qgISzn5eO0fMjV61WCpWVkH4s/p0drTVdOoKXhd\n IXfGo5Y8urJgl5dZ0NRg5uSGfx/BOoS7zuASPU4eGLF0d2nQ715zn3j0witqDl+C/TdkrbE7uNd\n nQ5C0yVxdawLGNGkrmwXjsrPaEgyQN98PtHq8n/LLj+ASW8SnlMeLbFOGL0qtoJaCDPNSWjDtqQ\n IVO9jyTeCWPykYxFr592QwVeI286smM+mUBlIfAJLKofcxMMu5UCUw4Am29F3K6Np/328wJEZzI\n i7VSjRiHLBOZAd8Doqm95OCcH9D1Mf8TdoNsrt055xL9+qAlNwET7tvb5k/8Oyc7/m+m2U3P3E1\n oSIQTg==", "X-Received": "by 2002:a05:6870:968d:b0:409:81eb:cf56 with SMTP id\n 586e51a60fabf-42aded2a4e3mr11684930fac.27.1776792467541;\n Tue, 21 Apr 2026 10:27:47 -0700 (PDT)", "From": "James Hilliard <james.hilliard1@gmail.com>", "Date": "Tue, 21 Apr 2026 11:27:36 -0600", "Subject": "[PATCH v2 09/13] target/mips: add Octeon SHA3 crypto support", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "8bit", "Message-Id": "\n <20260421-mips-octeon-missing-insns-v2-v2-9-a0791df188c9@gmail.com>", "References": "\n <20260421-mips-octeon-missing-insns-v2-v2-0-a0791df188c9@gmail.com>", "In-Reply-To": "\n <20260421-mips-octeon-missing-insns-v2-v2-0-a0791df188c9@gmail.com>", "To": "qemu-devel@nongnu.org", "Cc": "Laurent Vivier <laurent@vivier.eu>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>, =?utf-8?q?Philippe_Mathieu?=\n\t=?utf-8?q?-Daud=C3=A9?= <philmd@linaro.org>,\n Aurelien Jarno <aurelien@aurel32.net>,\n Jiaxun Yang <jiaxun.yang@flygoat.com>,\n Aleksandar Rikalo <arikalo@gmail.com>, Huacai Chen <chenhuacai@kernel.org>,\n James Hilliard <james.hilliard1@gmail.com>", "X-Mailer": "b4 0.15.2", "Received-SPF": "pass client-ip=2001:4860:4864:20::2a;\n envelope-from=james.hilliard1@gmail.com; helo=mail-oa1-x2a.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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n 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 <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "Add the Octeon SHA3 register window and STARTOP selector.\n\nKeep the shared HSH/SHA3/SHA512 write path coherent, then model the\ndedicated 25-lane Keccak state and the Keccak-f[1600] permutation so the\nCOP2 SHA3 interface follows the hardware behaviour.\n\nSigned-off-by: James Hilliard <james.hilliard1@gmail.com>\n---\nChanges v1 -> v2:\n - Use switch ranges and g_assert_not_reached() for SHA3 selector\n position decoding. (suggested by Philippe Mathieu-Daudé)\n - Add selector dispatch updates in octeon_translate.c after moving\n COP2 decode out of translate.c. (suggested by Philippe\n Mathieu-Daudé)\n---\n target/mips/cpu.h | 22 +++++\n target/mips/system/machine.c | 1 +\n target/mips/tcg/octeon_crypto.c | 171 +++++++++++++++++++++++++++++++++++++\n target/mips/tcg/octeon_translate.c | 22 +++++\n 4 files changed, 216 insertions(+)", "diff": "diff --git a/target/mips/cpu.h b/target/mips/cpu.h\nindex 887aeff12d..34fe7e1285 100644\n--- a/target/mips/cpu.h\n+++ b/target/mips/cpu.h\n@@ -533,6 +533,7 @@ typedef enum MIPSOcteonSharedMode {\n OCTEON_SHARED_MODE_NONE = 0,\n OCTEON_SHARED_MODE_SHA512,\n OCTEON_SHARED_MODE_SNOW3G,\n+ OCTEON_SHARED_MODE_SHA3,\n } MIPSOcteonSharedMode;\n \n typedef enum MIPSOcteonCop2Sel {\n@@ -637,6 +638,7 @@ typedef enum MIPSOcteonCop2Sel {\n OCTEON_COP2_SEL_HSH_DATW13,\n OCTEON_COP2_SEL_HSH_DATW14,\n OCTEON_COP2_SEL_HSH_DATW15,\n+ OCTEON_COP2_SEL_SHA3_DAT15_READ = 0x024f,\n OCTEON_COP2_SEL_HSH_IVW0 = 0x0250,\n OCTEON_COP2_SEL_HSH_IVW1,\n OCTEON_COP2_SEL_HSH_IVW2,\n@@ -663,6 +665,24 @@ typedef enum MIPSOcteonCop2Sel {\n OCTEON_COP2_SEL_GFM_RESINP1,\n OCTEON_COP2_SEL_GFM_XOR0,\n OCTEON_COP2_SEL_GFM_POLY = 0x025e,\n+ OCTEON_COP2_SEL_SHA3_XORDAT0 = 0x02c0,\n+ OCTEON_COP2_SEL_SHA3_XORDAT1,\n+ OCTEON_COP2_SEL_SHA3_XORDAT2,\n+ OCTEON_COP2_SEL_SHA3_XORDAT3,\n+ OCTEON_COP2_SEL_SHA3_XORDAT4,\n+ OCTEON_COP2_SEL_SHA3_XORDAT5,\n+ OCTEON_COP2_SEL_SHA3_XORDAT6,\n+ OCTEON_COP2_SEL_SHA3_XORDAT7,\n+ OCTEON_COP2_SEL_SHA3_XORDAT8,\n+ OCTEON_COP2_SEL_SHA3_XORDAT9,\n+ OCTEON_COP2_SEL_SHA3_XORDAT10,\n+ OCTEON_COP2_SEL_SHA3_XORDAT11,\n+ OCTEON_COP2_SEL_SHA3_XORDAT12,\n+ OCTEON_COP2_SEL_SHA3_XORDAT13,\n+ OCTEON_COP2_SEL_SHA3_XORDAT14,\n+ OCTEON_COP2_SEL_SHA3_XORDAT15,\n+ OCTEON_COP2_SEL_SHA3_XORDAT16,\n+ OCTEON_COP2_SEL_SHA3_XORDAT17,\n OCTEON_COP2_SEL_AES_ENC_CBC1 = 0x3109,\n OCTEON_COP2_SEL_AES_ENC1 = 0x310b,\n OCTEON_COP2_SEL_AES_DEC_CBC1 = 0x310d,\n@@ -675,6 +695,7 @@ typedef enum MIPSOcteonCop2Sel {\n OCTEON_COP2_SEL_SNOW3G_START = 0x404d,\n OCTEON_COP2_SEL_SNOW3G_MORE = 0x404e,\n OCTEON_COP2_SEL_HSH_STARTSHA256 = 0x404f,\n+ OCTEON_COP2_SEL_SHA3_STARTOP = 0x4052,\n OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT = 0x405d,\n OCTEON_COP2_SEL_HSH_STARTSHA1 = 0x4057,\n OCTEON_COP2_SEL_HSH_STARTSHA512 = 0x424f,\n@@ -689,6 +710,7 @@ typedef struct MIPSOcteonCryptoState {\n uint64_t hash_block[8];\n uint64_t sha512_state[8];\n uint64_t sha512_block[16];\n+ uint64_t sha3_state[25];\n uint64_t aes_iv[2];\n uint64_t aes_key[4];\n uint64_t aes_result[2];\ndiff --git a/target/mips/system/machine.c b/target/mips/system/machine.c\nindex d5452a3157..c646e8b836 100644\n--- a/target/mips/system/machine.c\n+++ b/target/mips/system/machine.c\n@@ -282,6 +282,7 @@ static const VMStateDescription mips_vmstate_octeon_crypto = {\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.hash_block, MIPSCPU, 8),\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.sha512_state, MIPSCPU, 8),\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.sha512_block, MIPSCPU, 16),\n+ VMSTATE_UINT64_ARRAY(env.octeon_crypto.sha3_state, MIPSCPU, 25),\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_iv, MIPSCPU, 2),\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_key, MIPSCPU, 4),\n VMSTATE_UINT64_ARRAY(env.octeon_crypto.aes_result, MIPSCPU, 2),\ndiff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypto.c\nindex 177d112483..d9e66f3dc8 100644\n--- a/target/mips/tcg/octeon_crypto.c\n+++ b/target/mips/tcg/octeon_crypto.c\n@@ -487,21 +487,150 @@ static void octeon_sha512_transform(MIPSOcteonCryptoState *crypto)\n crypto->sha512_state[7] += h;\n }\n \n+static const uint64_t octeon_sha3_round_constants[24] = {\n+ 0x0000000000000001ULL, 0x0000000000008082ULL,\n+ 0x800000000000808aULL, 0x8000000080008000ULL,\n+ 0x000000000000808bULL, 0x0000000080000001ULL,\n+ 0x8000000080008081ULL, 0x8000000000008009ULL,\n+ 0x000000000000008aULL, 0x0000000000000088ULL,\n+ 0x0000000080008009ULL, 0x000000008000000aULL,\n+ 0x000000008000808bULL, 0x800000000000008bULL,\n+ 0x8000000000008089ULL, 0x8000000000008003ULL,\n+ 0x8000000000008002ULL, 0x8000000000000080ULL,\n+ 0x000000000000800aULL, 0x800000008000000aULL,\n+ 0x8000000080008081ULL, 0x8000000000008080ULL,\n+ 0x0000000080000001ULL, 0x8000000080008008ULL,\n+};\n+\n+static const uint8_t octeon_sha3_rotation_constants[24] = {\n+ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14,\n+ 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44,\n+};\n+\n+static const uint8_t octeon_sha3_pi_lanes[24] = {\n+ 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4,\n+ 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1,\n+};\n+\n+static void octeon_sha3_permute(MIPSOcteonCryptoState *crypto)\n+{\n+ uint64_t *state = crypto->sha3_state;\n+\n+ for (int round = 0; round < 24; round++) {\n+ uint64_t bc[5];\n+ uint64_t temp;\n+\n+ for (int x = 0; x < 5; x++) {\n+ bc[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^\n+ state[15 + x] ^ state[20 + x];\n+ }\n+ for (int x = 0; x < 5; x++) {\n+ temp = bc[(x + 4) % 5] ^ rol64(bc[(x + 1) % 5], 1);\n+ for (int y = 0; y < 25; y += 5) {\n+ state[y + x] ^= temp;\n+ }\n+ }\n+\n+ temp = state[1];\n+ for (int i = 0; i < 24; i++) {\n+ uint64_t next = state[octeon_sha3_pi_lanes[i]];\n+\n+ state[octeon_sha3_pi_lanes[i]] =\n+ rol64(temp, octeon_sha3_rotation_constants[i]);\n+ temp = next;\n+ }\n+\n+ for (int y = 0; y < 25; y += 5) {\n+ for (int x = 0; x < 5; x++) {\n+ bc[x] = state[y + x];\n+ }\n+ for (int x = 0; x < 5; x++) {\n+ state[y + x] = bc[x] ^ ((~bc[(x + 1) % 5]) & bc[(x + 2) % 5]);\n+ }\n+ }\n+\n+ state[0] ^= octeon_sha3_round_constants[round];\n+ }\n+}\n+\n+static bool octeon_sha3_is_dat_sel(uint32_t sel)\n+{\n+ switch (sel) {\n+ case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW15:\n+ case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7:\n+ case OCTEON_COP2_SEL_SHA3_DAT15_WRITE:\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n+ return true;\n+ default:\n+ return false;\n+ }\n+}\n+\n+static int octeon_sha3_dat_pos_from_sel(uint32_t sel)\n+{\n+ switch (sel) {\n+ case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW14:\n+ return sel - OCTEON_COP2_SEL_HSH_DATW0;\n+ case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7:\n+ return 16 + (sel - OCTEON_COP2_SEL_HSH_IVW0);\n+ case OCTEON_COP2_SEL_HSH_DATW15:\n+ case OCTEON_COP2_SEL_SHA3_DAT15_WRITE:\n+ return 15;\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n+ return 24;\n+ default:\n+ g_assert_not_reached();\n+ }\n+}\n+\n+static uint64_t octeon_sha3_reg_to_lane(uint64_t value)\n+{\n+ /*\n+ * The COP2 register interface is consumed by big-endian MIPS code as\n+ * 64-bit register values, while Keccak lanes are byte-little-endian.\n+ */\n+ return bswap64(value);\n+}\n+\n+static uint64_t octeon_sha3_lane_to_reg(uint64_t value)\n+{\n+ return bswap64(value);\n+}\n+\n static void octeon_store_shared_hash_dat(MIPSOcteonCryptoState *crypto,\n uint32_t sel, uint64_t value)\n {\n switch (sel) {\n case OCTEON_COP2_SEL_HSH_DATW0 ... OCTEON_COP2_SEL_HSH_DATW14:\n crypto->sha512_block[sel - OCTEON_COP2_SEL_HSH_DATW0] = value;\n+ crypto->sha3_state[sel - OCTEON_COP2_SEL_HSH_DATW0] =\n+ octeon_sha3_reg_to_lane(value);\n break;\n case OCTEON_COP2_SEL_HSH_IVW0 ... OCTEON_COP2_SEL_HSH_IVW7:\n crypto->sha512_state[sel - OCTEON_COP2_SEL_HSH_IVW0] = value;\n+ crypto->sha3_state[16 + (sel - OCTEON_COP2_SEL_HSH_IVW0)] =\n+ octeon_sha3_reg_to_lane(value);\n+ break;\n+ case OCTEON_COP2_SEL_SHA3_DAT15_WRITE:\n+ crypto->sha3_state[15] = octeon_sha3_reg_to_lane(value);\n+ break;\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n+ crypto->sha3_state[24] = octeon_sha3_reg_to_lane(value);\n break;\n default:\n g_assert_not_reached();\n }\n }\n \n+static int octeon_sha3_xordat_pos_from_sel(uint32_t sel)\n+{\n+ if (sel >= OCTEON_COP2_SEL_SHA3_XORDAT0 &&\n+ sel <= OCTEON_COP2_SEL_SHA3_XORDAT17) {\n+ return sel - OCTEON_COP2_SEL_SHA3_XORDAT0;\n+ }\n+ return -1;\n+}\n+\n static const uint8_t octeon_snow3g_sr[256] = {\n 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n@@ -1396,6 +1525,7 @@ static void octeon_gfm_mul(const uint64_t x[2], const uint64_t y[2],\n uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env, uint32_t sel)\n {\n MIPSOcteonCryptoState *crypto = &env->octeon_crypto;\n+ int sha3_pos;\n \n if (crypto->shared_mode == OCTEON_SHARED_MODE_SNOW3G) {\n if (sel >= OCTEON_COP2_SEL_SNOW3G_LFSR0 &&\n@@ -1417,6 +1547,12 @@ uint64_t helper_octeon_cop2_dmfc2(CPUMIPSState *env, uint32_t sel)\n }\n }\n \n+ if (crypto->shared_mode == OCTEON_SHARED_MODE_SHA3 &&\n+ octeon_sha3_is_dat_sel(sel)) {\n+ sha3_pos = octeon_sha3_dat_pos_from_sel(sel);\n+ return octeon_sha3_lane_to_reg(crypto->sha3_state[sha3_pos]);\n+ }\n+\n switch (sel) {\n case OCTEON_COP2_SEL_3DES_KEY0:\n case OCTEON_COP2_SEL_3DES_KEY1:\n@@ -1507,6 +1643,7 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint64_t value,\n {\n MIPSOcteonCryptoState *crypto = &env->octeon_crypto;\n uint64_t q = (uint64_t)value;\n+ int sha3_pos;\n \n switch (sel) {\n case OCTEON_COP2_SEL_3DES_KEY0:\n@@ -1628,6 +1765,14 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint64_t value,\n octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA512);\n octeon_sha512_transform(crypto);\n break;\n+ case OCTEON_COP2_SEL_SHA3_DAT15_WRITE:\n+ octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3);\n+ octeon_store_shared_hash_dat(crypto, sel, q);\n+ break;\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n+ octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3);\n+ octeon_store_shared_hash_dat(crypto, sel, q);\n+ break;\n case OCTEON_COP2_SEL_HSH_IVW0:\n case OCTEON_COP2_SEL_HSH_IVW1:\n case OCTEON_COP2_SEL_HSH_IVW2:\n@@ -1688,6 +1833,32 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint64_t value,\n crypto->hash_block[7] = q;\n octeon_sha1_transform(crypto);\n break;\n+ case OCTEON_COP2_SEL_SHA3_XORDAT0:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT1:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT2:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT3:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT4:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT5:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT6:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT7:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT8:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT9:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT10:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT11:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT12:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT13:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT14:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT15:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT16:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT17:\n+ octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3);\n+ sha3_pos = octeon_sha3_xordat_pos_from_sel(sel);\n+ crypto->sha3_state[sha3_pos] ^= octeon_sha3_reg_to_lane(q);\n+ break;\n+ case OCTEON_COP2_SEL_SHA3_STARTOP:\n+ octeon_set_shared_mode(crypto, OCTEON_SHARED_MODE_SHA3);\n+ octeon_sha3_permute(crypto);\n+ break;\n case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT:\n octeon_gfm_mul_reflect(crypto, q);\n break;\ndiff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_translate.c\nindex 84fe3b38d0..3f8c17678a 100644\n--- a/target/mips/tcg/octeon_translate.c\n+++ b/target/mips/tcg/octeon_translate.c\n@@ -72,6 +72,7 @@ static bool octeon_cop2_is_supported_dmfc2(uint16_t sel)\n case OCTEON_COP2_SEL_HSH_IVW6:\n case OCTEON_COP2_SEL_HSH_IVW7:\n case OCTEON_COP2_SEL_AES_DAT0:\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n case OCTEON_COP2_SEL_GFM_MUL_REFLECT0:\n case OCTEON_COP2_SEL_GFM_MUL_REFLECT1:\n case OCTEON_COP2_SEL_GFM_RESINP_REFLECT0:\n@@ -156,6 +157,8 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel)\n case OCTEON_COP2_SEL_HSH_DATW13:\n case OCTEON_COP2_SEL_HSH_DATW14:\n case OCTEON_COP2_SEL_HSH_DATW15:\n+ case OCTEON_COP2_SEL_SHA3_DAT24:\n+ case OCTEON_COP2_SEL_SHA3_DAT15_WRITE:\n case OCTEON_COP2_SEL_HSH_IVW0:\n case OCTEON_COP2_SEL_HSH_IVW1:\n case OCTEON_COP2_SEL_HSH_IVW2:\n@@ -173,11 +176,30 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel)\n case OCTEON_COP2_SEL_GFM_RESINP1:\n case OCTEON_COP2_SEL_GFM_XOR0:\n case OCTEON_COP2_SEL_GFM_POLY:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT0:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT1:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT2:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT3:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT4:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT5:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT6:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT7:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT8:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT9:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT10:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT11:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT12:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT13:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT14:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT15:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT16:\n+ case OCTEON_COP2_SEL_SHA3_XORDAT17:\n case OCTEON_COP2_SEL_HSH_STARTSHA1_COMPAT:\n case OCTEON_COP2_SEL_HSH_STARTMD5:\n case OCTEON_COP2_SEL_SNOW3G_START:\n case OCTEON_COP2_SEL_SNOW3G_MORE:\n case OCTEON_COP2_SEL_HSH_STARTSHA256:\n+ case OCTEON_COP2_SEL_SHA3_STARTOP:\n case OCTEON_COP2_SEL_HSH_STARTSHA1:\n case OCTEON_COP2_SEL_GFM_XORMUL1_REFLECT:\n case OCTEON_COP2_SEL_HSH_STARTSHA512:\n", "prefixes": [ "v2", "09/13" ] }