* 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:
parent
e5b90c82fe
commit
463dcadca3
3 changed files with 49 additions and 2 deletions
13
ChangeLog
13
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>
|
2012-02-22 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* po/POTFILES.in: Regenerate.
|
* po/POTFILES.in: Regenerate.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue