qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v3 26/32] nvdimm: save arg3 for NVDIMM device _DSM m


From: Xiao Guangrong
Subject: [Qemu-devel] [PATCH v3 26/32] nvdimm: save arg3 for NVDIMM device _DSM method
Date: Sun, 11 Oct 2015 11:52:58 +0800

Check if the input Arg3 is valid then store it into dsm_in if needed

We only do the save on NVDIMM device since we are not going to support any
function on root device

Signed-off-by: Xiao Guangrong <address@hidden>
---
 hw/mem/nvdimm/acpi.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/hw/mem/nvdimm/acpi.c b/hw/mem/nvdimm/acpi.c
index d9fa0fd..3b9399c 100644
--- a/hw/mem/nvdimm/acpi.c
+++ b/hw/mem/nvdimm/acpi.c
@@ -442,7 +442,7 @@ static void build_nvdimm_devices(NVDIMMState *state, GSList 
*device_list,
         int slot = object_property_get_int(OBJECT(nvdimm), DIMM_SLOT_PROP,
                                            NULL);
         uint32_t handle = nvdimm_slot_to_handle(slot);
-        Aml *dev, *method;
+        Aml *dev, *method, *ifctx;
 
         dev = aml_device("NV%02X", slot);
         aml_append(dev, aml_name_decl("_ADR", aml_int(handle)));
@@ -452,6 +452,24 @@ static void build_nvdimm_devices(NVDIMMState *state, 
GSList *device_list,
         method = aml_method("_DSM", 4);
         {
             SAVE_ARG012_HANDLE_LOCK(method, aml_int(handle));
+
+            /* Arg3 is passed as Package and it has one element? */
+            ifctx = aml_if(aml_and(aml_equal(aml_object_type(aml_arg(3)),
+                                             aml_int(4)),
+                                   aml_equal(aml_sizeof(aml_arg(3)),
+                                             aml_int(1))));
+            {
+                /* Local0 = Index(Arg3, 0) */
+                aml_append(ifctx, aml_store(aml_index(aml_arg(3), aml_int(0)),
+                                            aml_local(0)));
+                /* Local3 = DeRefOf(Local0) */
+                aml_append(ifctx, aml_store(aml_derefof(aml_local(0)),
+                                            aml_local(3)));
+                /* ARG3 = Local3 */
+                aml_append(ifctx, aml_store(aml_local(3), aml_name("ARG3")));
+            }
+            aml_append(method, ifctx);
+
             NOTIFY_AND_RETURN_UNLOCK(method);
         }
         aml_append(dev, method);
@@ -534,6 +552,7 @@ static void nvdimm_build_acpi_devices(NVDIMMState *state, 
GSList *device_list,
     method = aml_method("_DSM", 4);
     {
         SAVE_ARG012_HANDLE_LOCK(method, aml_int(0));
+        /* no command we support on ROOT device has Arg3. */
         NOTIFY_AND_RETURN_UNLOCK(method);
     }
     aml_append(dev, method);
-- 
1.8.3.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]