Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2225866/?format=api
{ "id": 2225866, "url": "http://patchwork.ozlabs.org/api/patches/2225866/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260421-mips-octeon-missing-insns-v2-v2-8-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-8-a0791df188c9@gmail.com>", "list_archive_url": null, "date": "2026-04-21T17:27:35", "name": "[v2,08/13] target/mips: add Octeon SMS4 crypto support", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "40ecb262563a8018c9b1eb609aa2343c2f46ffcb", "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-8-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/2225866/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2225866/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=VEoAT0og;\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 4g0Tpv42ggz1yJG\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 03:28:39 +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-00040Q-GR; 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 1wFEt8-0003mh-EB\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 13:27:56 -0400", "from mail-oa1-x32.google.com ([2001:4860:4864:20::32])\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 1wFEt5-0006hy-84\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 13:27:53 -0400", "by mail-oa1-x32.google.com with SMTP id\n 586e51a60fabf-40f1ffba6a0so3007810fac.0\n for <qemu-devel@nongnu.org>; Tue, 21 Apr 2026 10:27:47 -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.45\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 21 Apr 2026 10:27:46 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1776792467; x=1777397267; 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=ME6KoWLBE0ODBY+GKyHQ9Gtlam6/znsLV6zes+dXvhw=;\n b=VEoAT0og+jfMiX3JRX/S5JoT1y29FBpJ5UUfGZ68aMARqu19Joz3m8vhlj5DCvYoag\n jyDfpxbHxk2e1lNA2ycqjFDAnJby3mQevoDgs3ZpIpAr4E4izBQpYcnOLLsh9vGq3oee\n jgYdPWvXca3RhDidkcVlyr5Lo02pY1an7lw+BLmcTet66k2AIGw6eZaZTEr0j9rbID1F\n zkJSIWeCYl61Pdgwe0Iq7hRIJu4qgBpsCD7rpbvcREb72dhL/FcuSGfme1REKWf2BixS\n PAU04TSqoznPXMpfoKB4yLqR6yOrOqN7xem3mKnA1t4XzrVseX2INSb6rKSSEzMbdnHM\n b/IQ==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776792467; x=1777397267;\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=ME6KoWLBE0ODBY+GKyHQ9Gtlam6/znsLV6zes+dXvhw=;\n b=k+mRRn5OKF2tJZeBJWWk4b15iuYiB0b4Ft0ZSX333WIwSOn5Iu2y2Jiqv7xFpFmZ9L\n 0YKlQFkbXS1Ke9iqmbBeKlafjH0IQ1j+4Vna3bxjnhEwyYzP0Glah3DLgNzleTtx1/s1\n Sj94yVJeWlL+PHl20qo/a/+i+XLqJFv4txGg+RvKj3oDQXj9y+34Xg9pWW3nGC0dVQwR\n jKCVIoRxAPL2qa9yg/b6oLY5VgVjhrqulcKFNdlLAoSupIi2+vGj9hCFI908/4axjEoY\n nDhp41BwePXAS9aPcM/dakyq90Ovf6MmEZ+/VDeTucOJP1ParKmTUacRgenXwCr7UsWF\n IrUg==", "X-Gm-Message-State": "AOJu0Ywolkdjfgq73vBBR7vCTKx54E1AstRCUijme+7j2tUwj2F10ktZ\n mbNYAHESPw87XPY3XtdYnTQMkS+hCuVO9z0Lw56IURtGypAM0sa1F+nW", "X-Gm-Gg": "AeBDieukyWyPsNcIcNgB6J4kWuot9wkEk66dKRWFljOjPz9YwimaYmQlHmB4AE3BiZU\n eoopAAWgUBt3csez2uL078VJV4664OFjK+1PXJr6dIXOBS1MVj2I+B/XxQI1nTef/RxJPPkcYfh\n HdXTRXVlnw+YS/urvsndOVsPDSEWNhy2Mz6D4KrdtcaIC78pTl7VXhKNT1PfchuDedVGoB39NMc\n w3vzS6L0aywUgfh0xsXinEqyn0uJ5HErBJ0vL3ECI+iPa6PKNs2Rj/UW/5PzajI2xZM2AVfZeHA\n IzTkklCdLJN/GchxYcOXrqWny61rZ2D8XDQ+EvXOXUHax4GLmSQU9Tz5hxPvAkE7iAtGHkfZ26Y\n dgF1I9Q8ywDv4kqW910YaGflyz6KwovUSx5un4/hCghSnbTESLFWpGNdg2tS4npYS7zPV4dyyqX\n kNpVcisS3SQL4iWrnYxaW8/JM5khCVCcG8ajcyRjn9k7SnRT0LsHsYhNu3BDlq7IucCKnyZiJBb\n 7NLyJqdPzHVi4Pq6I36oibP87iRGc+uZ9rb6r9bnMhivBBfNV1nfrfXUXyfh3chllGoVJrnw7aq\n cNJOaQ==", "X-Received": "by 2002:a05:6870:e997:b0:42c:24f6:f190 with SMTP id\n 586e51a60fabf-42c24f724d4mr2765105fac.17.1776792466585;\n Tue, 21 Apr 2026 10:27:46 -0700 (PDT)", "From": "James Hilliard <james.hilliard1@gmail.com>", "Date": "Tue, 21 Apr 2026 11:27:35 -0600", "Subject": "[PATCH v2 08/13] target/mips: add Octeon SMS4 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-8-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::32;\n envelope-from=james.hilliard1@gmail.com; helo=mail-oa1-x32.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": "On Octeon, the SMS4 engine is exposed through selectors that alias the\nAES register bank. Add the missing selectors and model the shared\nRESULT, IV, and key state so the hardware interface matches the\nprocessor behaviour.\n\nUse the in-tree SM4 tables to implement the block operation without\nadding a host crypto dependency.\n\nSigned-off-by: James Hilliard <james.hilliard1@gmail.com>\n---\nChanges v1 -> v2:\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 | 18 ++++++\n target/mips/tcg/octeon_crypto.c | 109 +++++++++++++++++++++++++++++++++++++\n target/mips/tcg/octeon_translate.c | 4 ++\n 3 files changed, 131 insertions(+)", "diff": "diff --git a/target/mips/cpu.h b/target/mips/cpu.h\nindex 9e398e1ce5..887aeff12d 100644\n--- a/target/mips/cpu.h\n+++ b/target/mips/cpu.h\n@@ -585,6 +585,20 @@ typedef enum MIPSOcteonCop2Sel {\n OCTEON_COP2_SEL_AES_DEC0 = 0x010e,\n OCTEON_COP2_SEL_AES_KEYLENGTH = 0x0110,\n OCTEON_COP2_SEL_AES_DAT0 = 0x0111,\n+ /*\n+ * SMS4 reuses the AES result/input, IV, and key banks and only adds\n+ * operation selectors for ECB/CBC encrypt/decrypt.\n+ */\n+ OCTEON_COP2_SEL_SMS4_RESINP0 = OCTEON_COP2_SEL_AES_RESULT0,\n+ OCTEON_COP2_SEL_SMS4_RESINP1 = OCTEON_COP2_SEL_AES_RESULT1,\n+ OCTEON_COP2_SEL_SMS4_IV0 = OCTEON_COP2_SEL_AES_IV0,\n+ OCTEON_COP2_SEL_SMS4_IV1 = OCTEON_COP2_SEL_AES_IV1,\n+ OCTEON_COP2_SEL_SMS4_KEY0 = OCTEON_COP2_SEL_AES_KEY0,\n+ OCTEON_COP2_SEL_SMS4_KEY1 = OCTEON_COP2_SEL_AES_KEY1,\n+ OCTEON_COP2_SEL_SMS4_ENC_CBC0 = OCTEON_COP2_SEL_AES_ENC_CBC0,\n+ OCTEON_COP2_SEL_SMS4_ENC0 = OCTEON_COP2_SEL_AES_ENC0,\n+ OCTEON_COP2_SEL_SMS4_DEC_CBC0 = OCTEON_COP2_SEL_AES_DEC_CBC0,\n+ OCTEON_COP2_SEL_SMS4_DEC0 = OCTEON_COP2_SEL_AES_DEC0,\n OCTEON_COP2_SEL_CRC_POLYNOMIAL = 0x0200,\n OCTEON_COP2_SEL_CRC_IV = 0x0201,\n OCTEON_COP2_SEL_CRC_LEN = 0x0202,\n@@ -653,6 +667,10 @@ typedef enum MIPSOcteonCop2Sel {\n OCTEON_COP2_SEL_AES_ENC1 = 0x310b,\n OCTEON_COP2_SEL_AES_DEC_CBC1 = 0x310d,\n OCTEON_COP2_SEL_AES_DEC1 = 0x310f,\n+ OCTEON_COP2_SEL_SMS4_ENC_CBC1 = 0x3119,\n+ OCTEON_COP2_SEL_SMS4_ENC1 = 0x311b,\n+ OCTEON_COP2_SEL_SMS4_DEC_CBC1 = 0x311d,\n+ OCTEON_COP2_SEL_SMS4_DEC1 = 0x311f,\n OCTEON_COP2_SEL_HSH_STARTMD5 = 0x4047,\n OCTEON_COP2_SEL_SNOW3G_START = 0x404d,\n OCTEON_COP2_SEL_SNOW3G_MORE = 0x404e,\ndiff --git a/target/mips/tcg/octeon_crypto.c b/target/mips/tcg/octeon_crypto.c\nindex 43012ff027..177d112483 100644\n--- a/target/mips/tcg/octeon_crypto.c\n+++ b/target/mips/tcg/octeon_crypto.c\n@@ -12,6 +12,7 @@\n #include \"exec/helper-proto.h\"\n #include \"crypto/aes.h\"\n #include \"crypto/clmul.h\"\n+#include \"crypto/sm4.h\"\n #include \"qemu/bitops.h\"\n #include \"qemu/host-utils.h\"\n \n@@ -745,6 +746,57 @@ static int octeon_aes_key_bits(const MIPSOcteonCryptoState *crypto)\n }\n }\n \n+static inline uint32_t octeon_sms4_t(uint32_t x)\n+{\n+ x = sm4_subword(x);\n+ return x ^ rol32(x, 2) ^ rol32(x, 10) ^\n+ rol32(x, 18) ^ rol32(x, 24);\n+}\n+\n+static inline uint32_t octeon_sms4_t_key(uint32_t x)\n+{\n+ x = sm4_subword(x);\n+ return x ^ rol32(x, 13) ^ rol32(x, 23);\n+}\n+\n+static void octeon_sms4_expand_key(const uint8_t *key, uint32_t round_keys[32])\n+{\n+ static const uint32_t fk[4] = {\n+ 0xa3b1bac6U, 0x56aa3350U, 0x677d9197U, 0xb27022dcU,\n+ };\n+ uint32_t k[36];\n+\n+ for (int i = 0; i < 4; i++) {\n+ k[i] = ldl_be_p(key + i * 4) ^ fk[i];\n+ }\n+ for (int i = 0; i < 32; i++) {\n+ k[i + 4] = k[i] ^ octeon_sms4_t_key(k[i + 1] ^ k[i + 2] ^\n+ k[i + 3] ^ sm4_ck[i]);\n+ round_keys[i] = k[i + 4];\n+ }\n+}\n+\n+static void octeon_sms4_crypt_block(const uint8_t *in, uint8_t *out,\n+ const uint32_t round_keys[32],\n+ bool encrypt)\n+{\n+ uint32_t x[36];\n+\n+ for (int i = 0; i < 4; i++) {\n+ x[i] = ldl_be_p(in + i * 4);\n+ }\n+ for (int i = 0; i < 32; i++) {\n+ uint32_t rk = round_keys[encrypt ? i : 31 - i];\n+\n+ x[i + 4] = x[i] ^ octeon_sms4_t(x[i + 1] ^ x[i + 2] ^\n+ x[i + 3] ^ rk);\n+ }\n+ stl_be_p(out, x[35]);\n+ stl_be_p(out + 4, x[34]);\n+ stl_be_p(out + 8, x[33]);\n+ stl_be_p(out + 12, x[32]);\n+}\n+\n static const uint8_t octeon_des_ip[64] = {\n 58, 50, 42, 34, 26, 18, 10, 2,\n 60, 52, 44, 36, 28, 20, 12, 4,\n@@ -1198,6 +1250,47 @@ static void octeon_aes_store_block(uint64_t regs[2], const uint8_t *block)\n regs[1] = ldq_be_p(block + 8);\n }\n \n+static void octeon_sms4_crypt_common(MIPSOcteonCryptoState *crypto,\n+ bool encrypt, bool cbc)\n+{\n+ uint8_t key[16];\n+ uint8_t in[16];\n+ uint8_t out[16];\n+ uint8_t iv[16];\n+ uint8_t next_iv[16];\n+ uint32_t round_keys[32];\n+\n+ /*\n+ * SMS4 aliases the AES state onto the RESULT/RESINP, IV, and KEY banks,\n+ * with only the operation selectors remaining distinct.\n+ */\n+ octeon_aes_load_key(crypto, key, sizeof(key));\n+ octeon_aes_load_block(crypto->aes_input, in);\n+ if (cbc) {\n+ octeon_aes_load_block(crypto->aes_iv, iv);\n+ if (encrypt) {\n+ for (int i = 0; i < sizeof(in); i++) {\n+ in[i] ^= iv[i];\n+ }\n+ } else {\n+ memcpy(next_iv, in, sizeof(next_iv));\n+ }\n+ }\n+\n+ octeon_sms4_expand_key(key, round_keys);\n+ octeon_sms4_crypt_block(in, out, round_keys, encrypt);\n+ if (cbc && !encrypt) {\n+ for (int i = 0; i < sizeof(out); i++) {\n+ out[i] ^= iv[i];\n+ }\n+ }\n+\n+ octeon_aes_store_block(crypto->aes_result, out);\n+ if (cbc) {\n+ octeon_aes_store_block(crypto->aes_iv, encrypt ? out : next_iv);\n+ }\n+}\n+\n static void octeon_aes_encrypt_common(MIPSOcteonCryptoState *crypto, bool cbc)\n {\n AES_KEY key;\n@@ -1614,6 +1707,22 @@ void helper_octeon_cop2_dmtc2(CPUMIPSState *env, uint64_t value,\n crypto->aes_input[1] = q;\n octeon_aes_decrypt_common(crypto, false);\n break;\n+ case OCTEON_COP2_SEL_SMS4_ENC_CBC1:\n+ crypto->aes_input[1] = q;\n+ octeon_sms4_crypt_common(crypto, true, true);\n+ break;\n+ case OCTEON_COP2_SEL_SMS4_ENC1:\n+ crypto->aes_input[1] = q;\n+ octeon_sms4_crypt_common(crypto, true, false);\n+ break;\n+ case OCTEON_COP2_SEL_SMS4_DEC_CBC1:\n+ crypto->aes_input[1] = q;\n+ octeon_sms4_crypt_common(crypto, false, true);\n+ break;\n+ case OCTEON_COP2_SEL_SMS4_DEC1:\n+ crypto->aes_input[1] = q;\n+ octeon_sms4_crypt_common(crypto, false, false);\n+ break;\n case OCTEON_COP2_SEL_GFM_XORMUL1: {\n uint64_t in[2] = {\n crypto->gfm_result[0] ^ crypto->gfm_xor0,\ndiff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_translate.c\nindex ac5065398d..84fe3b38d0 100644\n--- a/target/mips/tcg/octeon_translate.c\n+++ b/target/mips/tcg/octeon_translate.c\n@@ -186,6 +186,10 @@ static bool octeon_cop2_is_supported_dmtc2(uint16_t sel)\n case OCTEON_COP2_SEL_AES_ENC1:\n case OCTEON_COP2_SEL_AES_DEC_CBC1:\n case OCTEON_COP2_SEL_AES_DEC1:\n+ case OCTEON_COP2_SEL_SMS4_ENC_CBC1:\n+ case OCTEON_COP2_SEL_SMS4_ENC1:\n+ case OCTEON_COP2_SEL_SMS4_DEC_CBC1:\n+ case OCTEON_COP2_SEL_SMS4_DEC1:\n return true;\n default:\n return false;\n", "prefixes": [ "v2", "08/13" ] }