qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH FYI 09/13] hw/acpi: expose more parameters for aml_m


From: Laszlo Ersek
Subject: [Qemu-devel] [PATCH FYI 09/13] hw/acpi: expose more parameters for aml_method()
Date: Sun, 13 Sep 2015 14:43:43 +0200

ACPI 1.0b defines the SerializeFlag in MethodFlags. We have not exposed
this until now, but serializing methods that create named objects is
warmly recommended by (recent versions of) the ACPI spec, and recent iasl
actually warns about it. Therefore expose SerializeFlag in a new function.
The old aml_method() function is preserved for old callers' sake.

While at it, expose the SyncLevel bitfield of MethodFlags as well. Because
that was introduced in ACPI 2.0, add a separate function for it. This
allows us to provide one comprehensive DefMethod implementation.

Cc: Paolo Bonzini <address@hidden>
Cc: Gal Hammer <address@hidden>
Cc: Igor Mammedov <address@hidden>
Cc: "Michael S. Tsirkin" <address@hidden>
Signed-off-by: Laszlo Ersek <address@hidden>
---
 include/hw/acpi/aml-build.h |  3 +++
 hw/acpi/aml-build.c         | 26 +++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index ee54242..f8f96ec 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -266,6 +266,9 @@ Aml *aml_qword_memory(AmlDecode dec, AmlMinFixed min_fixed,
 Aml *aml_scope(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
 Aml *aml_device(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
 Aml *aml_method(const char *name, int arg_count);
+Aml *aml_method_serialized(const char *name, int arg_count, bool serialized);
+Aml *aml_method_flags(const char *name, int arg_count, bool serialized,
+                      int sync_level);
 Aml *aml_if(Aml *predicate);
 Aml *aml_else(void);
 Aml *aml_while(Aml *predicate);
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 7d58483..a0f187e 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -698,9 +698,33 @@ Aml *aml_while(Aml *predicate)
 /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMethod */
 Aml *aml_method(const char *name, int arg_count)
 {
+    return aml_method_serialized(name, arg_count, false);
+}
+
+/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMethod */
+Aml *aml_method_serialized(const char *name, int arg_count, bool serialized)
+{
+    return aml_method_flags(name, arg_count, serialized, 0);
+}
+
+/* ACPI 2.0: 17.2.4.2 Named Objects Encoding: DefMethod */
+Aml *aml_method_flags(const char *name, int arg_count, bool serialized,
+                      int sync_level)
+{
     Aml *var = aml_bundle(0x14 /* MethodOp */, AML_PACKAGE);
     build_append_namestring(var->buf, "%s", name);
-    build_append_byte(var->buf, arg_count); /* MethodFlags: ArgCount */
+
+    assert(arg_count >= 0);
+    assert(arg_count <= 7);
+    if (serialized) {
+        assert(sync_level >= 0x00);
+        assert(sync_level <= 0x0f);
+    } else {
+        assert(sync_level == 0);
+    }
+
+    build_append_byte(var->buf,
+                      arg_count | (serialized << 3) | (sync_level << 4));
     return var;
 }
 
-- 
1.8.3.1





reply via email to

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