From: Xiao Guangrong <guangrong.xiao@linux.intel.com> To: pbonzini@redhat.com, imammedo@redhat.com Cc: gleb@kernel.org, mtosatti@redhat.com, stefanha@redhat.com, mst@redhat.com, rth@twiddle.net, ehabkost@redhat.com, dan.j.williams@intel.com, kvm@vger.kernel.org, qemu-devel@nongnu.org, Xiao Guangrong <guangrong.xiao@linux.intel.com> Subject: [PATCH v5 4/5] nvdimm acpi: emulate dsm method Date: Wed, 2 Mar 2016 19:50:40 +0800 [thread overview] Message-ID: <1456919441-101204-5-git-send-email-guangrong.xiao@linux.intel.com> (raw) In-Reply-To: <1456919441-101204-1-git-send-email-guangrong.xiao@linux.intel.com> Emulate dsm method after IO VM-exit Currently, we only introduce the framework and no function is actually supported Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> --- hw/acpi/nvdimm.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/mem/nvdimm.h | 8 +++++++ 2 files changed, 64 insertions(+) diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index 781f6c1..5a17ee2 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -390,15 +390,71 @@ struct NvdimmDsmOut { } QEMU_PACKED; typedef struct NvdimmDsmOut NvdimmDsmOut; +struct NvdimmDsmFunc0Out { + /* the size of buffer filled by QEMU. */ + uint32_t len; + uint32_t supported_func; +} QEMU_PACKED; +typedef struct NvdimmDsmFunc0Out NvdimmDsmFunc0Out; + +struct NvdimmDsmFuncNoPayloadOut { + /* the size of buffer filled by QEMU. */ + uint32_t len; + uint32_t func_ret_status; +} QEMU_PACKED; +typedef struct NvdimmDsmFuncNoPayloadOut NvdimmDsmFuncNoPayloadOut; + static uint64_t nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) { + nvdimm_debug("BUG: we never read _DSM IO Port.\n"); return 0; } static void nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { + NvdimmDsmIn *in; + hwaddr dsm_mem_addr = val; + + nvdimm_debug("dsm memory address %#lx.\n", dsm_mem_addr); + + /* + * The DSM memory is mapped to guest address space so an evil guest + * can change its content while we are doing DSM emulation. Avoid + * this by copying DSM memory to QEMU local memory. + */ + in = g_malloc(TARGET_PAGE_SIZE); + cpu_physical_memory_read(dsm_mem_addr, in, TARGET_PAGE_SIZE); + + le32_to_cpus(&in->revision); + le32_to_cpus(&in->function); + le32_to_cpus(&in->handle); + + nvdimm_debug("Revision %#x Handler %#x Function %#x.\n", in->revision, + in->handle, in->function); + + /* + * function 0 is called to inquire what functions are supported by + * OSPM + */ + if (in->function == 0) { + NvdimmDsmFunc0Out func0 = { + .len = cpu_to_le32(sizeof(func0)), + /* No function supported other than function 0 */ + .supported_func = cpu_to_le32(0), + }; + cpu_physical_memory_write(dsm_mem_addr, &func0, sizeof func0); + } else { + /* No function except function 0 is supported yet. */ + NvdimmDsmFuncNoPayloadOut out = { + .len = cpu_to_le32(sizeof(out)), + .func_ret_status = cpu_to_le32(1) /* Not Supported */, + }; + cpu_physical_memory_write(dsm_mem_addr, &out, sizeof(out)); + } + + g_free(in); } static const MemoryRegionOps nvdimm_dsm_ops = { diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h index 634c60b..aaa2608 100644 --- a/include/hw/mem/nvdimm.h +++ b/include/hw/mem/nvdimm.h @@ -25,6 +25,14 @@ #include "hw/mem/pc-dimm.h" +#define NVDIMM_DEBUG 0 +#define nvdimm_debug(fmt, ...) \ + do { \ + if (NVDIMM_DEBUG) { \ + fprintf(stderr, "nvdimm: " fmt, ## __VA_ARGS__); \ + } \ + } while (0) + #define TYPE_NVDIMM "nvdimm" #define NVDIMM_DSM_MEM_FILE "etc/acpi/nvdimm-mem" -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Xiao Guangrong <guangrong.xiao@linux.intel.com> To: pbonzini@redhat.com, imammedo@redhat.com Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com>, ehabkost@redhat.com, kvm@vger.kernel.org, mst@redhat.com, gleb@kernel.org, mtosatti@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, dan.j.williams@intel.com, rth@twiddle.net Subject: [Qemu-devel] [PATCH v5 4/5] nvdimm acpi: emulate dsm method Date: Wed, 2 Mar 2016 19:50:40 +0800 [thread overview] Message-ID: <1456919441-101204-5-git-send-email-guangrong.xiao@linux.intel.com> (raw) In-Reply-To: <1456919441-101204-1-git-send-email-guangrong.xiao@linux.intel.com> Emulate dsm method after IO VM-exit Currently, we only introduce the framework and no function is actually supported Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> --- hw/acpi/nvdimm.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/mem/nvdimm.h | 8 +++++++ 2 files changed, 64 insertions(+) diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index 781f6c1..5a17ee2 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -390,15 +390,71 @@ struct NvdimmDsmOut { } QEMU_PACKED; typedef struct NvdimmDsmOut NvdimmDsmOut; +struct NvdimmDsmFunc0Out { + /* the size of buffer filled by QEMU. */ + uint32_t len; + uint32_t supported_func; +} QEMU_PACKED; +typedef struct NvdimmDsmFunc0Out NvdimmDsmFunc0Out; + +struct NvdimmDsmFuncNoPayloadOut { + /* the size of buffer filled by QEMU. */ + uint32_t len; + uint32_t func_ret_status; +} QEMU_PACKED; +typedef struct NvdimmDsmFuncNoPayloadOut NvdimmDsmFuncNoPayloadOut; + static uint64_t nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) { + nvdimm_debug("BUG: we never read _DSM IO Port.\n"); return 0; } static void nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { + NvdimmDsmIn *in; + hwaddr dsm_mem_addr = val; + + nvdimm_debug("dsm memory address %#lx.\n", dsm_mem_addr); + + /* + * The DSM memory is mapped to guest address space so an evil guest + * can change its content while we are doing DSM emulation. Avoid + * this by copying DSM memory to QEMU local memory. + */ + in = g_malloc(TARGET_PAGE_SIZE); + cpu_physical_memory_read(dsm_mem_addr, in, TARGET_PAGE_SIZE); + + le32_to_cpus(&in->revision); + le32_to_cpus(&in->function); + le32_to_cpus(&in->handle); + + nvdimm_debug("Revision %#x Handler %#x Function %#x.\n", in->revision, + in->handle, in->function); + + /* + * function 0 is called to inquire what functions are supported by + * OSPM + */ + if (in->function == 0) { + NvdimmDsmFunc0Out func0 = { + .len = cpu_to_le32(sizeof(func0)), + /* No function supported other than function 0 */ + .supported_func = cpu_to_le32(0), + }; + cpu_physical_memory_write(dsm_mem_addr, &func0, sizeof func0); + } else { + /* No function except function 0 is supported yet. */ + NvdimmDsmFuncNoPayloadOut out = { + .len = cpu_to_le32(sizeof(out)), + .func_ret_status = cpu_to_le32(1) /* Not Supported */, + }; + cpu_physical_memory_write(dsm_mem_addr, &out, sizeof(out)); + } + + g_free(in); } static const MemoryRegionOps nvdimm_dsm_ops = { diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h index 634c60b..aaa2608 100644 --- a/include/hw/mem/nvdimm.h +++ b/include/hw/mem/nvdimm.h @@ -25,6 +25,14 @@ #include "hw/mem/pc-dimm.h" +#define NVDIMM_DEBUG 0 +#define nvdimm_debug(fmt, ...) \ + do { \ + if (NVDIMM_DEBUG) { \ + fprintf(stderr, "nvdimm: " fmt, ## __VA_ARGS__); \ + } \ + } while (0) + #define TYPE_NVDIMM "nvdimm" #define NVDIMM_DSM_MEM_FILE "etc/acpi/nvdimm-mem" -- 1.8.3.1
next prev parent reply other threads:[~2016-03-02 11:50 UTC|newest] Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-03-02 11:50 [PATCH v5 0/5] NVDIMM ACPI: introduce the framework of QEMU emulated DSM Xiao Guangrong 2016-03-02 11:50 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:50 ` [PATCH v5 1/5] nvdimm acpi: initialize the resource used by NVDIMM ACPI Xiao Guangrong 2016-03-02 11:50 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:58 ` Michael S. Tsirkin 2016-03-02 11:58 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-02 16:10 ` Xiao Guangrong 2016-03-02 16:10 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:50 ` [PATCH v5 2/5] nvdimm acpi: introduce patched dsm memory Xiao Guangrong 2016-03-02 11:50 ` [Qemu-devel] " Xiao Guangrong 2016-03-03 13:12 ` Michael S. Tsirkin 2016-03-03 13:12 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-03 13:35 ` Xiao Guangrong 2016-03-03 13:35 ` [Qemu-devel] " Xiao Guangrong 2016-03-04 15:32 ` Xiao Guangrong 2016-03-04 15:32 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:50 ` [PATCH v5 3/5] nvdimm acpi: let qemu handle _DSM method Xiao Guangrong 2016-03-02 11:50 ` [Qemu-devel] " Xiao Guangrong 2016-03-03 13:23 ` Michael S. Tsirkin 2016-03-03 13:23 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-03 14:00 ` Xiao Guangrong 2016-03-03 14:00 ` [Qemu-devel] " Xiao Guangrong 2016-03-04 15:03 ` Xiao Guangrong 2016-03-04 15:03 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:50 ` Xiao Guangrong [this message] 2016-03-02 11:50 ` [Qemu-devel] [PATCH v5 4/5] nvdimm acpi: emulate dsm method Xiao Guangrong 2016-03-03 13:25 ` Michael S. Tsirkin 2016-03-03 13:25 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-03 14:01 ` Xiao Guangrong 2016-03-03 14:01 ` [Qemu-devel] " Xiao Guangrong 2016-03-02 11:50 ` [PATCH v5 5/5] nvdimm acpi: add _CRS Xiao Guangrong 2016-03-02 11:50 ` [Qemu-devel] " Xiao Guangrong 2016-03-03 13:29 ` Michael S. Tsirkin 2016-03-03 13:29 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-03 14:05 ` Xiao Guangrong 2016-03-03 14:05 ` [Qemu-devel] " Xiao Guangrong 2016-03-03 14:48 ` Michael S. Tsirkin 2016-03-03 14:48 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-07 12:16 ` Igor Mammedov 2016-03-07 12:16 ` [Qemu-devel] " Igor Mammedov 2016-03-07 12:22 ` Michael S. Tsirkin 2016-03-07 12:22 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-07 14:49 ` Igor Mammedov 2016-03-07 14:49 ` [Qemu-devel] " Igor Mammedov 2016-03-07 15:09 ` Michael S. Tsirkin 2016-03-07 15:09 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-07 16:17 ` Igor Mammedov 2016-03-07 16:17 ` [Qemu-devel] " Igor Mammedov 2016-03-07 16:19 ` Michael S. Tsirkin 2016-03-07 16:19 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-08 9:06 ` Igor Mammedov 2016-03-03 13:43 ` [PATCH v5 0/5] NVDIMM ACPI: introduce the framework of QEMU emulated DSM Michael S. Tsirkin 2016-03-03 13:43 ` [Qemu-devel] " Michael S. Tsirkin 2016-03-03 14:07 ` Xiao Guangrong 2016-03-03 14:07 ` [Qemu-devel] " Xiao Guangrong
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1456919441-101204-5-git-send-email-guangrong.xiao@linux.intel.com \ --to=guangrong.xiao@linux.intel.com \ --cc=dan.j.williams@intel.com \ --cc=ehabkost@redhat.com \ --cc=gleb@kernel.org \ --cc=imammedo@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=mst@redhat.com \ --cc=mtosatti@redhat.com \ --cc=pbonzini@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=rth@twiddle.net \ --cc=stefanha@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.