ACPICA: Return object repair: Add string-to-unicode conversion
authorLv Zheng <lv.zheng@intel.com>
Fri, 8 Mar 2013 09:23:24 +0000 (09:23 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 11 Mar 2013 23:45:05 +0000 (00:45 +0100)
Used for the _STR and _MLS predefined names.  Lv Zheng.

Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/nsconvert.c
drivers/acpi/acpica/nsrepair.c

index 7156bc75ebe01ced1cbca5b859aebe946707903f..b6ee5192f2aec3ad5ff9f786f0ac2ddfb156e462 100644 (file)
@@ -181,6 +181,10 @@ acpi_status
 acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
                          union acpi_operand_object **return_object);
 
+acpi_status
+acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
+                          union acpi_operand_object **return_object);
+
 /*
  * nsdump - Namespace dump/print utilities
  */
index fcb7dfb494cdf2b71db43901f64aef0141a48ddd..84f66994256f488f3b9e79d871633f83804d5669 100644 (file)
@@ -300,3 +300,67 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
        *return_object = new_object;
        return (AE_OK);
 }
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ns_convert_to_unicode
+ *
+ * PARAMETERS:  original_object     - ASCII String Object to be converted
+ *              return_object       - Where the new converted object is returned
+ *
+ * RETURN:      Status. AE_OK if conversion was successful.
+ *
+ * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
+                          union acpi_operand_object **return_object)
+{
+       union acpi_operand_object *new_object;
+       char *ascii_string;
+       u16 *unicode_buffer;
+       u32 unicode_length;
+       u32 i;
+
+       if (!original_object) {
+               return (AE_OK);
+       }
+
+       /* If a Buffer was returned, it must be at least two bytes long */
+
+       if (original_object->common.type == ACPI_TYPE_BUFFER) {
+               if (original_object->buffer.length < 2) {
+                       return (AE_AML_OPERAND_VALUE);
+               }
+
+               *return_object = NULL;
+               return (AE_OK);
+       }
+
+       /*
+        * The original object is an ASCII string. Convert this string to
+        * a unicode buffer.
+        */
+       ascii_string = original_object->string.pointer;
+       unicode_length = (original_object->string.length * 2) + 2;
+
+       /* Create a new buffer object for the Unicode data */
+
+       new_object = acpi_ut_create_buffer_object(unicode_length);
+       if (!new_object) {
+               return (AE_NO_MEMORY);
+       }
+
+       unicode_buffer = ACPI_CAST_PTR(u16, new_object->buffer.pointer);
+
+       /* Convert ASCII to Unicode */
+
+       for (i = 0; i < original_object->string.length; i++) {
+               unicode_buffer[i] = (u16)ascii_string[i];
+       }
+
+       *return_object = new_object;
+       return (AE_OK);
+}
index c5e828f4ed0bdf09d523155fbc6c1c1183091791..a1918fdf92f21cf502c6290d095021be5513fc05 100644 (file)
@@ -98,6 +98,13 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
  * 2nd argument: Unexpected types that can be repaired
  */
 static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
+       /* Unicode conversions */
+
+       {"_MLS", ACPI_RTYPE_STRING, 1,
+        acpi_ns_convert_to_unicode},
+       {"_STR", ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER,
+        ACPI_NOT_PACKAGE_ELEMENT,
+        acpi_ns_convert_to_unicode},
        {{0, 0, 0, 0}, 0, 0, NULL}      /* Table terminator */
 };