From 8da4e5d3032192b8bc072ee94df46bae17744c34 Mon Sep 17 00:00:00 2001 From: Lorenz Brun Date: Wed, 2 May 2018 04:33:17 +0200 Subject: [PATCH] Enough GetLogCmd for macOS --- hw/block/nvme.c | 18 ++++++++++++++++++ include/block/nvme.h | 14 ++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 85d2406400..95ac5b8822 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -736,6 +736,21 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req) return NVME_SUCCESS; } +static uint16_t nvme_get_log_page(NvmeCtrl *n, NvmeCmd *cmd) { + NvmeGetLogCmd *c = (NvmeGetLogCmd *)cmd; + uint64_t prp1 = le64_to_cpu(c->prp1); + uint64_t prp2 = le64_to_cpu(c->prp2); + + uint8_t logbuf[512] = {0}; + if (c->numd > 512) { + c->numd = 512; + } + + return nvme_dma_read_prp(n, (uint8_t *)&logbuf, c->numd, + prp1, prp2); +} + + static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req) { switch (cmd->opcode) { @@ -743,6 +758,8 @@ static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req) return nvme_del_sq(n, cmd); case NVME_ADM_CMD_CREATE_SQ: return nvme_create_sq(n, cmd); + case NVME_ADM_CMD_GET_LOG_PAGE: + return nvme_get_log_page(n, cmd); case NVME_ADM_CMD_DELETE_CQ: return nvme_del_cq(n, cmd); case NVME_ADM_CMD_CREATE_CQ: @@ -759,6 +776,7 @@ static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req) } } + static void nvme_process_sq(void *opaque) { NvmeSQueue *sq = opaque; diff --git a/include/block/nvme.h b/include/block/nvme.h index 849a6f3fa3..8242e90b2b 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -314,6 +314,20 @@ typedef struct NvmeIdentify { uint32_t rsvd11[5]; } NvmeIdentify; + +typedef struct NvmeGetLogCmd { + uint8_t opcode; + uint8_t fuse; + uint16_t cid; + uint32_t nsid; + uint64_t rsvd2[2]; + uint64_t prp1; + uint64_t prp2; + uint16_t numd; + uint16_t lid; + uint32_t rsvd11[5]; +} NvmeGetLogCmd; + typedef struct NvmeRwCmd { uint8_t opcode; uint8_t flags; -- 2.17.1