get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2225872/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}