Page MenuHomeFreeBSD

D21837.1789840621.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D21837.1789840621.diff

Index: usr.sbin/bhyve/pci_nvme.c
===================================================================
--- usr.sbin/bhyve/pci_nvme.c
+++ usr.sbin/bhyve/pci_nvme.c
@@ -139,6 +139,11 @@
NVME_CMD_CDW11_IV = 0xFFFF0000,
};
+enum nvme_copy_dir {
+ NVME_COPY_TO_PRP,
+ NVME_COPY_FROM_PRP,
+};
+
#define NVME_CQ_INTEN 0x01
#define NVME_CQ_INTCOAL 0x02
@@ -544,10 +549,10 @@
}
static int
-nvme_prp_memcpy(struct vmctx *ctx, uint64_t prp1, uint64_t prp2, uint8_t *src,
- size_t len)
+nvme_prp_memcpy(struct vmctx *ctx, uint64_t prp1, uint64_t prp2, uint8_t *b,
+ size_t len, enum nvme_copy_dir dir)
{
- uint8_t *dst;
+ uint8_t *p;
size_t bytes;
if (len > (8 * 1024)) {
@@ -558,14 +563,17 @@
bytes = PAGE_SIZE - (prp1 & PAGE_MASK);
bytes = MIN(bytes, len);
- dst = vm_map_gpa(ctx, prp1, bytes);
- if (dst == NULL) {
+ p = vm_map_gpa(ctx, prp1, bytes);
+ if (p == NULL) {
return (-1);
}
- memcpy(dst, src, bytes);
+ if (dir == NVME_COPY_TO_PRP)
+ memcpy(p, b, bytes);
+ else
+ memcpy(b, p, bytes);
- src += bytes;
+ b += bytes;
len -= bytes;
if (len == 0) {
@@ -574,12 +582,15 @@
len = MIN(len, PAGE_SIZE);
- dst = vm_map_gpa(ctx, prp2, len);
- if (dst == NULL) {
+ p = vm_map_gpa(ctx, prp2, len);
+ if (p == NULL) {
return (-1);
}
- memcpy(dst, src, len);
+ if (dir == NVME_COPY_TO_PRP)
+ memcpy(p, b, len);
+ else
+ memcpy(b, p, len);
return (0);
}
@@ -725,16 +736,19 @@
switch (logpage) {
case NVME_LOG_ERROR:
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
- command->prp2, (uint8_t *)&sc->err_log, logsize);
+ command->prp2, (uint8_t *)&sc->err_log, logsize,
+ NVME_COPY_TO_PRP);
break;
case NVME_LOG_HEALTH_INFORMATION:
/* TODO: present some smart info */
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
- command->prp2, (uint8_t *)&sc->health_log, logsize);
+ command->prp2, (uint8_t *)&sc->health_log, logsize,
+ NVME_COPY_TO_PRP);
break;
case NVME_LOG_FIRMWARE_SLOT:
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
- command->prp2, (uint8_t *)&sc->fw_log, logsize);
+ command->prp2, (uint8_t *)&sc->fw_log, logsize,
+ NVME_COPY_TO_PRP);
break;
default:
WPRINTF(("%s get log page %x command not supported\r\n",
@@ -759,12 +773,14 @@
switch (command->cdw10 & 0xFF) {
case 0x00: /* return Identify Namespace data structure */
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
- command->prp2, (uint8_t *)&sc->nsdata, sizeof(sc->nsdata));
+ command->prp2, (uint8_t *)&sc->nsdata, sizeof(sc->nsdata),
+ NVME_COPY_TO_PRP);
break;
case 0x01: /* return Identify Controller data structure */
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
command->prp2, (uint8_t *)&sc->ctrldata,
- sizeof(sc->ctrldata));
+ sizeof(sc->ctrldata),
+ NVME_COPY_TO_PRP);
break;
case 0x02: /* list of 1024 active NSIDs > CDW1.NSID */
dest = vm_map_gpa(sc->nsc_pi->pi_vmctx, command->prp1,

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 19, 5:57 PM (19 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29787395
Default Alt Text
D21837.1789840621.diff (2 KB)

Event Timeline