* 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.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-02-22 16:02:03 +01:00
parent e5b90c82fe
commit 463dcadca3
3 changed files with 49 additions and 2 deletions

View file

@ -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> 2012-02-22 Vladimir Serbinenko <phcoder@gmail.com>
* po/POTFILES.in: Regenerate. * po/POTFILES.in: Regenerate.

View file

@ -33,7 +33,12 @@ typedef uint8_t grub_uint8_t;
#endif #endif
#include <grub/acpi.h> #include <grub/acpi.h>
#ifndef GRUB_DSDT_TEST
#include <grub/i18n.h> #include <grub/i18n.h>
#else
#define _(x) x
#define N_(x) x
#endif
#ifndef GRUB_DSDT_TEST #ifndef GRUB_DSDT_TEST
#include <grub/misc.h> #include <grub/misc.h>
@ -99,6 +104,7 @@ skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end)
switch (*ptr) switch (*ptr)
{ {
case GRUB_ACPI_OPCODE_PACKAGE: case GRUB_ACPI_OPCODE_PACKAGE:
case GRUB_ACPI_OPCODE_BUFFER:
return 1 + decode_length (ptr + 1, 0); return 1 + decode_length (ptr + 1, 0);
case GRUB_ACPI_OPCODE_ZERO: case GRUB_ACPI_OPCODE_ZERO:
case GRUB_ACPI_OPCODE_ONES: 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; return 3;
case GRUB_ACPI_OPCODE_DWORD_CONST: case GRUB_ACPI_OPCODE_DWORD_CONST:
return 5; 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: default:
if (*ptr == '^' || *ptr == '\\' || *ptr == '_' if (*ptr == '^' || *ptr == '\\' || *ptr == '_'
|| (*ptr >= 'A' && *ptr <= 'Z')) || (*ptr >= 'A' && *ptr <= 'Z'))
@ -176,6 +190,17 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *end)
if (!add) if (!add)
return -1; return -1;
break; 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: case GRUB_ACPI_OPCODE_NAME:
ptr++; ptr++;
if (memcmp (ptr, "_S5_", 4) == 0 || memcmp (ptr, "\\_S5_", 4) == 0) 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); ptr += decode_length (ptr, 0);
break; break;
} }
default:
grub_printf ("Unknown opcode 0x%x\n", *ptr);
return -1;
} }
} }

View file

@ -160,9 +160,15 @@ enum
{ {
GRUB_ACPI_OPCODE_ZERO = 0, GRUB_ACPI_OPCODE_ONE = 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_NAME = 8, GRUB_ACPI_OPCODE_BYTE_CONST = 0x0a,
GRUB_ACPI_OPCODE_WORD_CONST = 0x0b, GRUB_ACPI_OPCODE_DWORD_CONST = 0x0c, GRUB_ACPI_OPCODE_WORD_CONST = 0x0b,
GRUB_ACPI_OPCODE_SCOPE = 0x10, GRUB_ACPI_OPCODE_PACKAGE = 0x12, 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_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 GRUB_ACPI_OPCODE_IF = 0xa0, GRUB_ACPI_OPCODE_ONES = 0xff
}; };
enum enum