+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.
#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>
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:
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'))
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)
ptr += decode_length (ptr, 0);
break;
}
+ default:
+ grub_printf ("Unknown opcode 0x%x\n", *ptr);
+ return -1;
}
}
{
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