nvmf/vfio-user: disallow doorbell reads
NVMe over PCIe Transport Spec 3.1.2: The host should not read the doorbell registers. Explicitly refuse these reads. Co-authored-by: John Levon <john.levon@nutanix.com> Signed-off-by: John Levon <john.levon@nutanix.com> Change-Id: Ie64fd5ce7988ee86c612b3ef6046a57af467e266 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11787 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
797df3717e
commit
f25c4c822c
@ -1,7 +1,7 @@
|
|||||||
/*-
|
/*-
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
* Copyright (c) Intel Corporation. All rights reserved.
|
* Copyright (c) Intel Corporation. All rights reserved.
|
||||||
* Copyright (c) 2019, Nutanix Inc. All rights reserved.
|
* Copyright (c) 2019-2022, Nutanix Inc. All rights reserved.
|
||||||
* Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
* Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -2048,6 +2048,13 @@ handle_dbl_access(struct nvmf_vfio_user_ctrlr *ctrlr, uint32_t *buf,
|
|||||||
assert(ctrlr != NULL);
|
assert(ctrlr != NULL);
|
||||||
assert(buf != NULL);
|
assert(buf != NULL);
|
||||||
|
|
||||||
|
if (!is_write) {
|
||||||
|
SPDK_WARNLOG("%s: host tried to read BAR0 doorbell %#lx\n",
|
||||||
|
ctrlr_id(ctrlr), pos);
|
||||||
|
errno = EPERM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (count != sizeof(uint32_t)) {
|
if (count != sizeof(uint32_t)) {
|
||||||
SPDK_ERRLOG("%s: bad doorbell buffer size %ld\n",
|
SPDK_ERRLOG("%s: bad doorbell buffer size %ld\n",
|
||||||
ctrlr_id(ctrlr), count);
|
ctrlr_id(ctrlr), count);
|
||||||
@ -2073,13 +2080,9 @@ handle_dbl_access(struct nvmf_vfio_user_ctrlr *ctrlr, uint32_t *buf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_write) {
|
|
||||||
ctrlr->doorbells[pos] = *buf;
|
ctrlr->doorbells[pos] = *buf;
|
||||||
spdk_wmb();
|
spdk_wmb();
|
||||||
} else {
|
|
||||||
spdk_rmb();
|
|
||||||
*buf = ctrlr->doorbells[pos];
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user