From nobody Tue Nov 15 07:26:06 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NBHlz1JVxz4hBbb; Tue, 15 Nov 2022 07:26:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NBHlz0CNHz3RLm; Tue, 15 Nov 2022 07:26:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668497167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jW9jIZPdPOooufgsyR79dJdremSDp+qMTQLI46Q6CIg=; b=S8p+S/GMas7GIY1yDf2ZGsLGR4UHTpYSmuVGscHnIqBB28QrLHBHfR2TYt05P5rQAzy/F6 NJe2ctkF+QfLN/mfUz3JyFy9vyyGCGZhA1cGxAH/Sl9tcYZoagDvss4kfw0ZxeYE6+ebr+ QZUVDAX/4ZK0SztZzBOHiMJg9ODPrfDKOzJkIxE1yviXMuYzFEsvr4sNXqcL15cvgnfIqH hkQLQ7WKFfEdmRYbJVAekh5A4t4r3ESFifq1oYUccMjaostPJcahwZcfR02Y4COA+liSFY u5Zwe9tLXgyCRT4dD27BQjwRnLUwAdglsJLV4kuv2nQ+XlpMo5BBqZ+ppp54hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668497167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jW9jIZPdPOooufgsyR79dJdremSDp+qMTQLI46Q6CIg=; b=twucF+N3zFUUjVMdl5hoZ3YP1tLiDvsErEiqx/q9VsLqfiv25aPRA4UcyUdINcV9XWan81 KWuFAnCKK/CBF+uKwD9KvrpEl4DQzg9q3MwwB162ByQVEd5pGMtQQ1hYIs/lu71430ec8Q bIvdOzRSbDkkbF1qmWKiQngUGtuRMYnWIndNBLCEOYSCaRRXBsteBBD3K9O+crYSl/TXEP ZGccHs+nmbUiWmanxHBiD64wR5nakS/UufUhWLP+vgg8g2LH94E2rIj8+OAia5UprPN2kA cTVWtXT4pEL5KluNyarunwNmixQ2YuiG+LDeV5gIhEsYQQMEVZAhuAIak93ZWA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1668497167; a=rsa-sha256; cv=none; b=wbpLti4YE1uqae0/y/s0u1gdDapivM9F73/GmKtQye6RplQHmFew4Jy5w/Ktt/4wkfgyOU V2ZX/rIB4FbxiH4ywBiWWlaYcnfyj4WfS3ZUaagXlFE4quzcj0+LEL2OpMb9SPVcZFGCGt hbfsTLUgIumTN8uwhUq7uZ82EZoxSg6JFbhPmRJPE2Gl9GN9X4aektOI7oXh7SFMOqBtmv +B1yEOeJ7kHJI1ndVdTRuJN88FWCee8EEH5uIQN/JHDQG0hUJQINvsxZPQchTFkhrxe2Us H1xiFxfRlx0ZtxgbRaYnMrg6EsvewIqYlViFmL6c2iHc/HakMGsgJxQdHjLmpA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4NBHly6Pytz1CqY; Tue, 15 Nov 2022 07:26:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2AF7Q6Af046091; Tue, 15 Nov 2022 07:26:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2AF7Q6MQ046090; Tue, 15 Nov 2022 07:26:06 GMT (envelope-from git) Date: Tue, 15 Nov 2022 07:26:06 GMT Message-Id: <202211150726.2AF7Q6MQ046090@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Corvin=20K=C3=B6hne?= Subject: git: 8ab99dbea167 - main - bhyve: abort and return FEATURE_NOT_SAVEABLE while set feature with a save flag for NVMe controller. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8ab99dbea16728f3e34137310587a6aeb3f3d317 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=8ab99dbea16728f3e34137310587a6aeb3f3d317 commit 8ab99dbea16728f3e34137310587a6aeb3f3d317 Author: Wanpeng Qian AuthorDate: 2022-11-14 13:02:44 +0000 Commit: Corvin Köhne CommitDate: 2022-11-15 06:48:24 +0000 bhyve: abort and return FEATURE_NOT_SAVEABLE while set feature with a save flag for NVMe controller. Currently bhyve's NVMe controller cannot save feature values cross reboot. It should return a FEATURE_NOT_SAVEABLE error when the command specifies a save flag. Quote from NVMe specification, page 205: https://nvmexpress.org/wp-content/uploads/NVM-Express-1_4-2019.06.10-Ratified.pdf If the Feature Identifier specified in the Set Features command is not saveable by the controller and the controller receives a Set Features command with the Save bit set to one, then the command shall be aborted with a status of Feature Identifier Not Saveable. Reviewed by: chuck (older version) Approved by: manu (mentor) MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D32767 --- sys/dev/nvme/nvme.h | 16 ++++++++++++++++ usr.sbin/bhyve/pci_nvme.c | 10 +++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h index 94b20069c12e..ccc980a7c6ec 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -566,9 +566,25 @@ enum nvme_critical_warning_state { #define NVME_SS_PAGE_SSTAT_GDE_SHIFT (8) #define NVME_SS_PAGE_SSTAT_GDE_MASK (0x1) +/* Features */ +/* Get Features */ +#define NVME_FEAT_GET_SEL_SHIFT (8) +#define NVME_FEAT_GET_SEL_MASK (0x7) +#define NVME_FEAT_GET_FID_SHIFT (0) +#define NVME_FEAT_GET_FID_MASK (0xff) + +/* Set Features */ +#define NVME_FEAT_SET_SV_SHIFT (31) +#define NVME_FEAT_SET_SV_MASK (0x1) +#define NVME_FEAT_SET_FID_SHIFT (0) +#define NVME_FEAT_SET_FID_MASK (0xff) + /* Helper macro to combine *_MASK and *_SHIFT defines */ #define NVMEB(name) (name##_MASK << name##_SHIFT) +/* Helper macro to extract value from x */ +#define NVMEV(name, x) (((x) >> name##_SHIFT) & name##_MASK) + /* CC register SHN field values */ enum shn_value { NVME_SHN_NORMAL = 0x1, diff --git a/usr.sbin/bhyve/pci_nvme.c b/usr.sbin/bhyve/pci_nvme.c index b341b70f4e48..1cc9838c112f 100644 --- a/usr.sbin/bhyve/pci_nvme.c +++ b/usr.sbin/bhyve/pci_nvme.c @@ -1849,7 +1849,8 @@ nvme_opc_set_features(struct pci_nvme_softc *sc, struct nvme_command *command, { struct nvme_feature_obj *feat; uint32_t nsid = command->nsid; - uint8_t fid = command->cdw10 & 0xFF; + uint8_t fid = NVMEV(NVME_FEAT_SET_FID, command->cdw10); + bool sv = NVMEV(NVME_FEAT_SET_SV, command->cdw10); DPRINTF("%s: Feature ID 0x%x (%s)", __func__, fid, nvme_fid_to_name(fid)); @@ -1858,6 +1859,13 @@ nvme_opc_set_features(struct pci_nvme_softc *sc, struct nvme_command *command, pci_nvme_status_genc(&compl->status, NVME_SC_INVALID_FIELD); return (1); } + + if (sv) { + pci_nvme_status_tc(&compl->status, NVME_SCT_COMMAND_SPECIFIC, + NVME_SC_FEATURE_NOT_SAVEABLE); + return (1); + } + feat = &sc->feat[fid]; if (feat->namespace_specific && (nsid == NVME_GLOBAL_NAMESPACE_TAG)) {