]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* include/grub/acpi.h (GRUB_ASCII_OPCODE): Add
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 22 Feb 2012 15:02:03 +0000 (16:02 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 22 Feb 2012 15:02:03 +0000 (16:02 +0100)
GRUB_ACPI_OPCODE_STRING_CONST, GRUB_ACPI_OPCODE_BUFFER,
GRUB_ACPI_OPCODE_CREATE_WORD_FIELD
and GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD.
* grub-core/commands/acpihalt.c [GRUB_DSDT_TEST]: Replace include of
i18n with gettext no-op.
(skip_data_ref_object): Support GRUB_ACPI_OPCODE_BUFFER and
GRUB_ACPI_OPCODE_STRING_CONST.
(get_sleep_type): Support GRUB_ACPI_OPCODE_CREATE_WORD_FIELD and
GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD. Add handling of unknown opcodes.

ChangeLog
grub-core/commands/acpihalt.c
include/grub/acpi.h

index aaf2bf7b2a69ae9eed000162991b8fe53784b63b..2d2ee21aedfc7976596ab7b5ea75c9385be65ca0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-02-22  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * include/grub/acpi.h (GRUB_ASCII_OPCODE): Add
+       GRUB_ACPI_OPCODE_STRING_CONST, GRUB_ACPI_OPCODE_BUFFER,
+       GRUB_ACPI_OPCODE_CREATE_WORD_FIELD
+       and GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD.
+       * grub-core/commands/acpihalt.c [GRUB_DSDT_TEST]: Replace include of
+       i18n with gettext no-op.
+       (skip_data_ref_object): Support GRUB_ACPI_OPCODE_BUFFER and
+       GRUB_ACPI_OPCODE_STRING_CONST.
+       (get_sleep_type): Support GRUB_ACPI_OPCODE_CREATE_WORD_FIELD and
+       GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD. Add handling of unknown opcodes.
+
 2012-02-22  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * po/POTFILES.in: Regenerate.
index 177ec15f04c5cc742d48fb08f53e1606379663f9..66972d99b6423a29bd00608fa37e486d78b16982 100644 (file)
@@ -33,7 +33,12 @@ typedef uint8_t grub_uint8_t;
 #endif
 
 #include <grub/acpi.h>
+#ifndef GRUB_DSDT_TEST
 #include <grub/i18n.h>
+#else
+#define _(x) x
+#define N_(x) x
+#endif
 
 #ifndef GRUB_DSDT_TEST
 #include <grub/misc.h>
@@ -99,6 +104,7 @@ skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end)
   switch (*ptr)
     {
     case GRUB_ACPI_OPCODE_PACKAGE:
+    case GRUB_ACPI_OPCODE_BUFFER:
       return 1 + decode_length (ptr + 1, 0);
     case GRUB_ACPI_OPCODE_ZERO:
     case GRUB_ACPI_OPCODE_ONES:
@@ -110,6 +116,14 @@ skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end)
       return 3;
     case GRUB_ACPI_OPCODE_DWORD_CONST:
       return 5;
+    case GRUB_ACPI_OPCODE_STRING_CONST:
+      {
+       const grub_uint8_t *ptr0 = ptr;
+       for (ptr++; ptr < end && *ptr; ptr++);
+       if (ptr == end)
+         return 0;
+       return ptr - ptr0 + 1;
+      }
     default:
       if (*ptr == '^' || *ptr == '\\' || *ptr == '_'
          || (*ptr >= 'A' && *ptr <= 'Z'))
@@ -176,6 +190,17 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *end)
          if (!add)
            return -1;
          break;
+       case GRUB_ACPI_OPCODE_CREATE_WORD_FIELD:
+       case GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD:
+         {
+           int ll;
+           ptr += 5;
+           ptr += add = skip_data_ref_object (ptr, end);
+           if (!add)
+             return -1;
+           ptr += 4;
+           break;
+         }
        case GRUB_ACPI_OPCODE_NAME:
          ptr++;
          if (memcmp (ptr, "_S5_", 4) == 0 || memcmp (ptr, "\\_S5_", 4) == 0)
@@ -224,6 +249,9 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *end)
            ptr += decode_length (ptr, 0);
            break;
          }
+       default:
+         grub_printf ("Unknown opcode 0x%x\n", *ptr);
+         return -1;      
        }
     }
 
index c843a06216e49758058a0c9173070619859fa4b9..ee0a108f17984e30217fd355cbce4c8cd7fd4982 100644 (file)
@@ -160,9 +160,15 @@ enum
   {
     GRUB_ACPI_OPCODE_ZERO = 0, GRUB_ACPI_OPCODE_ONE = 1,
     GRUB_ACPI_OPCODE_NAME = 8, GRUB_ACPI_OPCODE_BYTE_CONST = 0x0a,
-    GRUB_ACPI_OPCODE_WORD_CONST = 0x0b, GRUB_ACPI_OPCODE_DWORD_CONST = 0x0c,
-    GRUB_ACPI_OPCODE_SCOPE = 0x10, GRUB_ACPI_OPCODE_PACKAGE = 0x12,
+    GRUB_ACPI_OPCODE_WORD_CONST = 0x0b,
+    GRUB_ACPI_OPCODE_DWORD_CONST = 0x0c,
+    GRUB_ACPI_OPCODE_STRING_CONST = 0x0d,
+    GRUB_ACPI_OPCODE_SCOPE = 0x10,
+    GRUB_ACPI_OPCODE_BUFFER = 0x11,
+    GRUB_ACPI_OPCODE_PACKAGE = 0x12,
     GRUB_ACPI_OPCODE_METHOD = 0x14, GRUB_ACPI_OPCODE_EXTOP = 0x5b,
+    GRUB_ACPI_OPCODE_CREATE_WORD_FIELD = 0x8b,
+    GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD = 0x8c,
     GRUB_ACPI_OPCODE_IF = 0xa0, GRUB_ACPI_OPCODE_ONES = 0xff
   };
 enum