Commit 9bdc771f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpica-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPICA updates from Rafael Wysocki:
 "Additional ACPICA material for v4.2-rc1

  This will update the ACPICA code in the kernel to upstream revision
  20150619 (a bug-fix release mostly including stable-candidate fixes)
  and restore an earlier ACPICA commit that had to be reverted due to a
  regression introduced by it (the regression is addressed by
  blacklisting the only known system affected by it to date).

  The only new feature added by this update is the support for
  overriding objects in the ACPI namespace and a new ACPI table that can
  be used for that called the Override System Definition Table (OSDT).
  That should allow us to "patch" the ACPI namespace built from
  incomplete or incorrect ACPI System Definition tables (DSDT, SSDT)
  during system startup without the need to provide replacements for all
  of those tables in the future.

  Specifics:

   - Fix system resume problems related to 32-bit and 64-bit versions of
     the Firmware ACPI Control Structure (FACS) in the firmare (Lv
     Zheng)

   - Fix double initialization of the FACS (Lv Zheng)

   - Add _CLS object processing code to ACPICA (Suravee Suthikulpanit)

   - Add support for the (currently missing) new GIC version field in
     the Multiple APIC Description Table (MADT) (Hanjun Guo)

   - Add support for overriding objects in the ACPI namespace to ACPICA
     and OSDT support (Lv Zheng, Bob Moore, Zhang Rui)

   - Updates related to the TCPA and TPM2 ACPI tables (Bob Moore)

   - Restore the commit modifying _REV to always return "2" (as required
     by ACPI 6) and add a blacklisting mechanism for systems that may be
     affected by that change (Rafael J Wysocki)

   - Assorted fixes and cleanups (Bob Moore, Lv Zheng, Sascha Wildner)"

* tag 'acpica-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (28 commits)
  Revert 'Revert "ACPICA: Permanently set _REV to the value '2'."'
  ACPI / init: Make it possible to override _REV
  ACPICA: Update version to 20150619
  ACPICA: Comment update, no functional change
  ACPICA: Update TPM2 ACPI table
  ACPICA: Update definitions for the TCPA and TPM2 ACPI tables
  ACPICA: Split C library prototypes to new header
  ACPICA: De-macroize calls to standard C library functions
  ACPI / acpidump: Update acpidump manual
  ACPICA: acpidump: Convert the default behavior to dump from /sys/firmware/acpi/tables
  ACPICA: acpidump: Allow customized tables to be dumped without accessing /dev/mem
  ACPICA: Cleanup output for the ASL Debug object
  ACPICA: Update for acpi_install_table memory types
  ACPICA: Namespace: Change namespace override to avoid node deletion
  ACPICA: Namespace: Add support of OSDT table
  ACPICA: Namespace: Add support to allow overriding objects
  ACPICA: ACPI 6.0: Add values for MADT GIC version field
  ACPICA: Utilities: Add _CLS processing
  ACPICA: Add dragon_fly support to unix file mapping file
  ACPICA: EFI: Add EFI interface definitions to eliminate dependency of GNU EFI
  ...
parents 7df9ab84 ea7d5215
...@@ -293,6 +293,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -293,6 +293,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
Format: To spoof as Windows 98: ="Microsoft Windows" Format: To spoof as Windows 98: ="Microsoft Windows"
acpi_rev_override [ACPI] Override the _REV object to return 5 (instead
of 2 which is mandated by ACPI 6) as the supported ACPI
specification revision (when using this switch, it may
be necessary to carry out a cold reboot _twice_ in a
row to make it take effect on the platform firmware).
acpi_osi= [HW,ACPI] Modify list of supported OS interface strings acpi_osi= [HW,ACPI] Modify list of supported OS interface strings
acpi_osi="string1" # add string1 acpi_osi="string1" # add string1
acpi_osi="!string2" # remove string2 acpi_osi="!string2" # remove string2
......
...@@ -80,6 +80,26 @@ config ACPI_PROCFS_POWER ...@@ -80,6 +80,26 @@ config ACPI_PROCFS_POWER
Say N to delete power /proc/acpi/ directories that have moved to /sys/ Say N to delete power /proc/acpi/ directories that have moved to /sys/
config ACPI_REV_OVERRIDE_POSSIBLE
bool "Allow supported ACPI revision to be overriden"
depends on X86
default y
help
The platform firmware on some systems expects Linux to return "5" as
the supported ACPI revision which makes it expose system configuration
information in a special way.
For example, based on what ACPI exports as the supported revision,
Dell XPS 13 (2015) configures its audio device to either work in HDA
mode or in I2S mode, where the former is supposed to be used on Linux
until the latter is fully supported (in the kernel as well as in user
space).
This option enables a DMI-based quirk for the above Dell machine (so
that HDA audio is exposed by the platform firmware to the kernel) and
makes it possible to force the kernel to return "5" as the supported
ACPI revision via the "acpi_rev_override" command line switch.
config ACPI_EC_DEBUGFS config ACPI_EC_DEBUGFS
tristate "EC read/write access through /sys/kernel/debug/ec" tristate "EC read/write access through /sys/kernel/debug/ec"
default n default n
......
...@@ -59,5 +59,8 @@ ...@@ -59,5 +59,8 @@
#include "acglobal.h" /* All global variables */ #include "acglobal.h" /* All global variables */
#include "achware.h" /* Hardware defines and interfaces */ #include "achware.h" /* Hardware defines and interfaces */
#include "acutils.h" /* Utility interfaces */ #include "acutils.h" /* Utility interfaces */
#ifndef ACPI_USE_SYSTEM_CLIBRARY
#include "acclib.h" /* C library interfaces */
#endif /* !ACPI_USE_SYSTEM_CLIBRARY */
#endif /* __ACCOMMON_H__ */ #endif /* __ACCOMMON_H__ */
...@@ -61,6 +61,8 @@ ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header); ...@@ -61,6 +61,8 @@ ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header);
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS); ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS);
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs32);
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs64);
#endif /* !ACPI_REDUCED_HARDWARE */ #endif /* !ACPI_REDUCED_HARDWARE */
......
...@@ -468,6 +468,8 @@ void acpi_ex_eisa_id_to_string(char *dest, u64 compressed_id); ...@@ -468,6 +468,8 @@ void acpi_ex_eisa_id_to_string(char *dest, u64 compressed_id);
void acpi_ex_integer_to_string(char *dest, u64 value); void acpi_ex_integer_to_string(char *dest, u64 value);
void acpi_ex_pci_cls_to_string(char *dest, u8 class_code[3]);
u8 acpi_is_valid_space_id(u8 space_id); u8 acpi_is_valid_space_id(u8 space_id);
/* /*
......
...@@ -213,6 +213,7 @@ struct acpi_table_list { ...@@ -213,6 +213,7 @@ struct acpi_table_list {
#define ACPI_TABLE_INDEX_DSDT (0) #define ACPI_TABLE_INDEX_DSDT (0)
#define ACPI_TABLE_INDEX_FACS (1) #define ACPI_TABLE_INDEX_FACS (1)
#define ACPI_TABLE_INDEX_X_FACS (2)
struct acpi_find_context { struct acpi_find_context {
char *search_for; char *search_for;
......
...@@ -66,6 +66,7 @@ ...@@ -66,6 +66,7 @@
#define ACPI_NS_PREFIX_IS_SCOPE 0x10 #define ACPI_NS_PREFIX_IS_SCOPE 0x10
#define ACPI_NS_EXTERNAL 0x20 #define ACPI_NS_EXTERNAL 0x20
#define ACPI_NS_TEMPORARY 0x40 #define ACPI_NS_TEMPORARY 0x40
#define ACPI_NS_OVERRIDE_IF_FOUND 0x80
/* Flags for acpi_ns_walk_namespace */ /* Flags for acpi_ns_walk_namespace */
......
...@@ -335,6 +335,7 @@ struct acpi_object_reference { ...@@ -335,6 +335,7 @@ struct acpi_object_reference {
void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */
struct acpi_namespace_node *node; /* ref_of or Namepath */ struct acpi_namespace_node *node; /* ref_of or Namepath */
union acpi_operand_object **where; /* Target of Index */ union acpi_operand_object **where; /* Target of Index */
u8 *index_pointer; /* Used for Buffers and Strings */
u32 value; /* Used for Local/Arg/Index/ddb_handle */ u32 value; /* Used for Local/Arg/Index/ddb_handle */
}; };
......
...@@ -82,6 +82,7 @@ struct acpi_walk_state { ...@@ -82,6 +82,7 @@ struct acpi_walk_state {
u8 return_used; u8 return_used;
u8 scope_depth; u8 scope_depth;
u8 pass_number; /* Parse pass during table load */ u8 pass_number; /* Parse pass during table load */
u8 namespace_override; /* Override existing objects */
u8 result_size; /* Total elements for the result stack */ u8 result_size; /* Total elements for the result stack */
u8 result_count; /* Current number of occupied elements of result stack */ u8 result_count; /* Current number of occupied elements of result stack */
u32 aml_offset; u32 aml_offset;
......
...@@ -205,66 +205,6 @@ acpi_status acpi_ut_hardware_initialize(void); ...@@ -205,66 +205,6 @@ acpi_status acpi_ut_hardware_initialize(void);
void acpi_ut_subsystem_shutdown(void); void acpi_ut_subsystem_shutdown(void);
/*
* utclib - Local implementations of C library functions
*/
#ifndef ACPI_USE_SYSTEM_CLIBRARY
acpi_size acpi_ut_strlen(const char *string);
char *acpi_ut_strchr(const char *string, int ch);
char *acpi_ut_strcpy(char *dst_string, const char *src_string);
char *acpi_ut_strncpy(char *dst_string,
const char *src_string, acpi_size count);
int acpi_ut_memcmp(const char *buffer1, const char *buffer2, acpi_size count);
int acpi_ut_strncmp(const char *string1, const char *string2, acpi_size count);
int acpi_ut_strcmp(const char *string1, const char *string2);
char *acpi_ut_strcat(char *dst_string, const char *src_string);
char *acpi_ut_strncat(char *dst_string,
const char *src_string, acpi_size count);
u32 acpi_ut_strtoul(const char *string, char **terminator, u32 base);
char *acpi_ut_strstr(char *string1, char *string2);
void *acpi_ut_memcpy(void *dest, const void *src, acpi_size count);
void *acpi_ut_memset(void *dest, u8 value, acpi_size count);
int acpi_ut_to_upper(int c);
int acpi_ut_to_lower(int c);
extern const u8 _acpi_ctype[];
#define _ACPI_XA 0x00 /* extra alphabetic - not supported */
#define _ACPI_XS 0x40 /* extra space */
#define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */
#define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */
#define _ACPI_DI 0x04 /* '0'-'9' */
#define _ACPI_LO 0x02 /* 'a'-'z' */
#define _ACPI_PU 0x10 /* punctuation */
#define _ACPI_SP 0x08 /* space, tab, CR, LF, VT, FF */
#define _ACPI_UP 0x01 /* 'A'-'Z' */
#define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */
#define ACPI_IS_DIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI))
#define ACPI_IS_SPACE(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP))
#define ACPI_IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD))
#define ACPI_IS_UPPER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP))
#define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
#define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_XS | _ACPI_PU))
#define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP))
#endif /* !ACPI_USE_SYSTEM_CLIBRARY */
#define ACPI_IS_ASCII(c) ((c) < 0x80) #define ACPI_IS_ASCII(c) ((c) < 0x80)
/* /*
...@@ -430,6 +370,10 @@ acpi_status ...@@ -430,6 +370,10 @@ acpi_status
acpi_ut_execute_CID(struct acpi_namespace_node *device_node, acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id_list ** return_cid_list); struct acpi_pnp_device_id_list ** return_cid_list);
acpi_status
acpi_ut_execute_CLS(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id **return_id);
/* /*
* utlock - reader/writer locks * utlock - reader/writer locks
*/ */
......
...@@ -502,7 +502,7 @@ acpi_ds_create_field(union acpi_parse_object *op, ...@@ -502,7 +502,7 @@ acpi_ds_create_field(union acpi_parse_object *op,
} }
} }
ACPI_MEMSET(&info, 0, sizeof(struct acpi_create_field_info)); memset(&info, 0, sizeof(struct acpi_create_field_info));
/* Second arg is the field flags */ /* Second arg is the field flags */
......
...@@ -207,7 +207,7 @@ acpi_ds_initialize_objects(u32 table_index, ...@@ -207,7 +207,7 @@ acpi_ds_initialize_objects(u32 table_index,
/* Set all init info to zero */ /* Set all init info to zero */
ACPI_MEMSET(&info, 0, sizeof(struct acpi_init_walk_info)); memset(&info, 0, sizeof(struct acpi_init_walk_info));
info.owner_id = owner_id; info.owner_id = owner_id;
info.table_index = table_index; info.table_index = table_index;
......
...@@ -339,8 +339,8 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, ...@@ -339,8 +339,8 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
/* Initialize buffer from the byte_list (if present) */ /* Initialize buffer from the byte_list (if present) */
if (byte_list) { if (byte_list) {
ACPI_MEMCPY(obj_desc->buffer.pointer, memcpy(obj_desc->buffer.pointer, byte_list->named.data,
byte_list->named.data, byte_list_length); byte_list_length);
} }
} }
...@@ -750,8 +750,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -750,8 +750,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
obj_desc->string.pointer = op->common.value.string; obj_desc->string.pointer = op->common.value.string;
obj_desc->string.length = obj_desc->string.length = (u32)strlen(op->common.value.string);
(u32) ACPI_STRLEN(op->common.value.string);
/* /*
* The string is contained in the ACPI table, don't ever try * The string is contained in the ACPI table, don't ever try
......
...@@ -572,8 +572,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -572,8 +572,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
obj_desc = obj_desc =
acpi_ut_create_string_object((acpi_size) name_length); acpi_ut_create_string_object((acpi_size) name_length);
ACPI_STRNCPY(obj_desc->string.pointer, strncpy(obj_desc->string.pointer,
name_string, name_length); name_string, name_length);
status = AE_OK; status = AE_OK;
} else { } else {
/* /*
......
...@@ -315,10 +315,19 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -315,10 +315,19 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
flags = ACPI_NS_NO_UPSEARCH; flags = ACPI_NS_NO_UPSEARCH;
if ((walk_state->opcode != AML_SCOPE_OP) && if ((walk_state->opcode != AML_SCOPE_OP) &&
(!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
flags |= ACPI_NS_ERROR_IF_FOUND; if (walk_state->namespace_override) {
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, flags |= ACPI_NS_OVERRIDE_IF_FOUND;
"[%s] Cannot already exist\n", ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
acpi_ut_get_type_name(object_type))); "[%s] Override allowed\n",
acpi_ut_get_type_name
(object_type)));
} else {
flags |= ACPI_NS_ERROR_IF_FOUND;
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"[%s] Cannot already exist\n",
acpi_ut_get_type_name
(object_type)));
}
} else { } else {
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"[%s] Both Find or Create allowed\n", "[%s] Both Find or Create allowed\n",
......
...@@ -377,7 +377,7 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle, ...@@ -377,7 +377,7 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
/* 4) The last two characters of the name are the hex GPE Number */ /* 4) The last two characters of the name are the hex GPE Number */
gpe_number = ACPI_STRTOUL(&name[2], NULL, 16); gpe_number = strtoul(&name[2], NULL, 16);
if (gpe_number == ACPI_UINT32_MAX) { if (gpe_number == ACPI_UINT32_MAX) {
/* Conversion failed; invalid method, just ignore it */ /* Conversion failed; invalid method, just ignore it */
......
...@@ -470,7 +470,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -470,7 +470,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
ACPI_MEMCPY(table, table_header, length); memcpy(table, table_header, length);
break; break;
default: default:
......
...@@ -227,9 +227,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, ...@@ -227,9 +227,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
/* Copy the integer to the buffer, LSB first */ /* Copy the integer to the buffer, LSB first */
new_buf = return_desc->buffer.pointer; new_buf = return_desc->buffer.pointer;
ACPI_MEMCPY(new_buf, memcpy(new_buf,
&obj_desc->integer.value, &obj_desc->integer.value, acpi_gbl_integer_byte_width);
acpi_gbl_integer_byte_width);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
...@@ -252,8 +251,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, ...@@ -252,8 +251,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
/* Copy the string to the buffer */ /* Copy the string to the buffer */
new_buf = return_desc->buffer.pointer; new_buf = return_desc->buffer.pointer;
ACPI_STRNCPY((char *)new_buf, (char *)obj_desc->string.pointer, strncpy((char *)new_buf, (char *)obj_desc->string.pointer,
obj_desc->string.length); obj_desc->string.length);
break; break;
default: default:
......
...@@ -76,6 +76,8 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, ...@@ -76,6 +76,8 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
{ {
u32 i; u32 i;
u32 timer; u32 timer;
union acpi_operand_object *object_desc;
u32 value;
ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc); ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc);
...@@ -254,8 +256,44 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, ...@@ -254,8 +256,44 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
object)->object, object)->object,
level + 4, 0); level + 4, 0);
} else { } else {
acpi_ex_do_debug_object(source_desc->reference. object_desc = source_desc->reference.object;
object, level + 4, 0); value = source_desc->reference.value;
switch (object_desc->common.type) {
case ACPI_TYPE_BUFFER:
acpi_os_printf("Buffer[%u] = 0x%2.2X\n",
value,
*source_desc->reference.
index_pointer);
break;
case ACPI_TYPE_STRING:
acpi_os_printf
("String[%u] = \"%c\" (0x%2.2X)\n",
value,
*source_desc->reference.
index_pointer,
*source_desc->reference.
index_pointer);
break;
case ACPI_TYPE_PACKAGE:
acpi_os_printf("Package[%u] = ", value);
acpi_ex_do_debug_object(*source_desc->
reference.where,
level + 4, 0);
break;
default:
acpi_os_printf
("Unknown Reference object type %X\n",
object_desc->common.type);
break;
}
} }
} }
break; break;
......
...@@ -224,7 +224,7 @@ static struct acpi_exdump_info acpi_ex_dump_index_field[5] = { ...@@ -224,7 +224,7 @@ static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"} {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
}; };
static struct acpi_exdump_info acpi_ex_dump_reference[8] = { static struct acpi_exdump_info acpi_ex_dump_reference[9] = {
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL}, {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"}, {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"},
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"}, {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
...@@ -232,6 +232,8 @@ static struct acpi_exdump_info acpi_ex_dump_reference[8] = { ...@@ -232,6 +232,8 @@ static struct acpi_exdump_info acpi_ex_dump_reference[8] = {
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"}, {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
{ACPI_EXD_NODE, ACPI_EXD_OFFSET(reference.node), "Node"}, {ACPI_EXD_NODE, ACPI_EXD_OFFSET(reference.node), "Node"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"}, {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.index_pointer),
"Index Pointer"},
{ACPI_EXD_REFERENCE, 0, NULL} {ACPI_EXD_REFERENCE, 0, NULL}
}; };
...@@ -1005,14 +1007,13 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) ...@@ -1005,14 +1007,13 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
} else if (obj_desc->reference.object) { } else if (obj_desc->reference.object) {
if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
ACPI_DESC_TYPE_OPERAND) { ACPI_DESC_TYPE_OPERAND) {
acpi_os_printf(" Target: %p", acpi_os_printf("%22s %p", "Target :",
obj_desc->reference.object); obj_desc->reference.object);
if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) { if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) {
acpi_os_printf(" Table Index: %X\n", acpi_os_printf(" Table Index: %X\n",
obj_desc->reference.value); obj_desc->reference.value);
} else { } else {
acpi_os_printf(" Target: %p [%s]\n", acpi_os_printf(" [%s]\n",
obj_desc->reference.object,
acpi_ut_get_type_name(((union acpi_ut_get_type_name(((union
acpi_operand_object acpi_operand_object
*) *)
......
...@@ -428,7 +428,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, ...@@ -428,7 +428,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
} }
buffer = buffer_desc->buffer.pointer; buffer = buffer_desc->buffer.pointer;
ACPI_MEMCPY(buffer, source_desc->buffer.pointer, length); memcpy(buffer, source_desc->buffer.pointer, length);
/* Lock entire transaction if requested */ /* Lock entire transaction if requested */
......
...@@ -416,22 +416,22 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc, ...@@ -416,22 +416,22 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
* Copy the data from the source buffer. * Copy the data from the source buffer.
* Length is the field width in bytes. * Length is the field width in bytes.
*/ */
ACPI_MEMCPY(value, memcpy(value,
(obj_desc->buffer_field.buffer_obj)->buffer. (obj_desc->buffer_field.buffer_obj)->buffer.
pointer + pointer +
obj_desc->buffer_field.base_byte_offset + obj_desc->buffer_field.base_byte_offset +
field_datum_byte_offset, field_datum_byte_offset,
obj_desc->common_field.access_byte_width); obj_desc->common_field.access_byte_width);
} else { } else {
/* /*
* Copy the data to the target buffer. * Copy the data to the target buffer.
* Length is the field width in bytes. * Length is the field width in bytes.
*/ */
ACPI_MEMCPY((obj_desc->buffer_field.buffer_obj)->buffer. memcpy((obj_desc->buffer_field.buffer_obj)->buffer.
pointer + pointer +
obj_desc->buffer_field.base_byte_offset + obj_desc->buffer_field.base_byte_offset +
field_datum_byte_offset, value, field_datum_byte_offset, value,
obj_desc->common_field.access_byte_width); obj_desc->common_field.access_byte_width);
} }
status = AE_OK; status = AE_OK;
...@@ -703,7 +703,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, ...@@ -703,7 +703,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(AE_BUFFER_OVERFLOW); return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
} }
ACPI_MEMSET(buffer, 0, buffer_length); memset(buffer, 0, buffer_length);
access_bit_width = ACPI_MUL_8(obj_desc->common_field.access_byte_width); access_bit_width = ACPI_MUL_8(obj_desc->common_field.access_byte_width);
/* Handle the simple case here */ /* Handle the simple case here */
...@@ -720,7 +720,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, ...@@ -720,7 +720,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
status = status =
acpi_ex_field_datum_io(obj_desc, 0, &raw_datum, acpi_ex_field_datum_io(obj_desc, 0, &raw_datum,
ACPI_READ); ACPI_READ);
ACPI_MEMCPY(buffer, &raw_datum, buffer_length); memcpy(buffer, &raw_datum, buffer_length);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
...@@ -793,9 +793,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, ...@@ -793,9 +793,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
/* Write merged datum to target buffer */ /* Write merged datum to target buffer */
ACPI_MEMCPY(((char *)buffer) + buffer_offset, &merged_datum, memcpy(((char *)buffer) + buffer_offset, &merged_datum,
ACPI_MIN(obj_desc->common_field.access_byte_width, ACPI_MIN(obj_desc->common_field.access_byte_width,
buffer_length - buffer_offset)); buffer_length - buffer_offset));
buffer_offset += obj_desc->common_field.access_byte_width; buffer_offset += obj_desc->common_field.access_byte_width;
merged_datum = merged_datum =
...@@ -811,9 +811,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, ...@@ -811,9 +811,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
/* Write the last datum to the buffer */ /* Write the last datum to the buffer */
ACPI_MEMCPY(((char *)buffer) + buffer_offset, &merged_datum, memcpy(((char *)buffer) + buffer_offset, &merged_datum,
ACPI_MIN(obj_desc->common_field.access_byte_width, ACPI_MIN(obj_desc->common_field.access_byte_width,
buffer_length - buffer_offset)); buffer_length - buffer_offset));
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -878,7 +878,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc, ...@@ -878,7 +878,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
* at Byte zero. All unused (upper) bytes of the * at Byte zero. All unused (upper) bytes of the
* buffer will be 0. * buffer will be 0.
*/ */
ACPI_MEMCPY((char *)new_buffer, (char *)buffer, buffer_length); memcpy((char *)new_buffer, (char *)buffer, buffer_length);
buffer = new_buffer; buffer = new_buffer;
buffer_length = required_length; buffer_length = required_length;
} }
...@@ -918,9 +918,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc, ...@@ -918,9 +918,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
/* Get initial Datum from the input buffer */ /* Get initial Datum from the input buffer */
ACPI_MEMCPY(&raw_datum, buffer, memcpy(&raw_datum, buffer,
ACPI_MIN(obj_desc->common_field.access_byte_width, ACPI_MIN(obj_desc->common_field.access_byte_width,
buffer_length - buffer_offset)); buffer_length - buffer_offset));
merged_datum = merged_datum =
raw_datum << obj_desc->common_field.start_field_bit_offset; raw_datum << obj_desc->common_field.start_field_bit_offset;
...@@ -970,9 +970,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc, ...@@ -970,9 +970,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
/* Get the next input datum from the buffer */ /* Get the next input datum from the buffer */
buffer_offset += obj_desc->common_field.access_byte_width; buffer_offset += obj_desc->common_field.access_byte_width;
ACPI_MEMCPY(&raw_datum, ((char *)buffer) + buffer_offset, memcpy(&raw_datum, ((char *)buffer) + buffer_offset,
ACPI_MIN(obj_desc->common_field.access_byte_width, ACPI_MIN(obj_desc->common_field.access_byte_width,
buffer_length - buffer_offset)); buffer_length - buffer_offset));
merged_datum |= merged_datum |=
raw_datum << obj_desc->common_field.start_field_bit_offset; raw_datum << obj_desc->common_field.start_field_bit_offset;
......
...@@ -209,8 +209,8 @@ acpi_ex_concat_template(union acpi_operand_object *operand0, ...@@ -209,8 +209,8 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
* end_tag descriptor is copied from Operand1. * end_tag descriptor is copied from Operand1.
*/ */
new_buf = return_desc->buffer.pointer; new_buf = return_desc->buffer.pointer;
ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0); memcpy(new_buf, operand0->buffer.pointer, length0);
ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1); memcpy(new_buf + length0, operand1->buffer.pointer, length1);
/* Insert end_tag and set the checksum to zero, means "ignore checksum" */ /* Insert end_tag and set the checksum to zero, means "ignore checksum" */
...@@ -318,14 +318,14 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, ...@@ -318,14 +318,14 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
/* Copy the first integer, LSB first */ /* Copy the first integer, LSB first */
ACPI_MEMCPY(new_buf, &operand0->integer.value, memcpy(new_buf, &operand0->integer.value,
acpi_gbl_integer_byte_width); acpi_gbl_integer_byte_width);
/* Copy the second integer (LSB first) after the first */ /* Copy the second integer (LSB first) after the first */
ACPI_MEMCPY(new_buf + acpi_gbl_integer_byte_width, memcpy(new_buf + acpi_gbl_integer_byte_width,
&local_operand1->integer.value, &local_operand1->integer.value,
acpi_gbl_integer_byte_width); acpi_gbl_integer_byte_width);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
...@@ -346,9 +346,9 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, ...@@ -346,9 +346,9 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
/* Concatenate the strings */ /* Concatenate the strings */
ACPI_STRCPY(new_buf, operand0->string.pointer); strcpy(new_buf, operand0->string.pointer);
ACPI_STRCPY(new_buf + operand0->string.length, strcpy(new_buf + operand0->string.length,
local_operand1->string.pointer); local_operand1->string.pointer);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
...@@ -369,11 +369,11 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, ...@@ -369,11 +369,11 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
/* Concatenate the buffers */ /* Concatenate the buffers */
ACPI_MEMCPY(new_buf, operand0->buffer.pointer, memcpy(new_buf, operand0->buffer.pointer,
operand0->buffer.length); operand0->buffer.length);
ACPI_MEMCPY(new_buf + operand0->buffer.length, memcpy(new_buf + operand0->buffer.length,
local_operand1->buffer.pointer, local_operand1->buffer.pointer,
local_operand1->buffer.length); local_operand1->buffer.length);
break; break;
default: default:
...@@ -660,9 +660,9 @@ acpi_ex_do_logical_op(u16 opcode, ...@@ -660,9 +660,9 @@ acpi_ex_do_logical_op(u16 opcode,
/* Lexicographic compare: compare the data bytes */ /* Lexicographic compare: compare the data bytes */
compare = ACPI_MEMCMP(operand0->buffer.pointer, compare = memcmp(operand0->buffer.pointer,
local_operand1->buffer.pointer, local_operand1->buffer.pointer,
(length0 > length1) ? length1 : length0); (length0 > length1) ? length1 : length0);
switch (opcode) { switch (opcode) {
case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
......
...@@ -192,7 +192,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string) ...@@ -192,7 +192,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
char_buf[4] = '\0'; char_buf[4] = '\0';
if (name_string) { if (name_string) {
ACPI_STRCAT(name_string, char_buf); strcat(name_string, char_buf);
ACPI_DEBUG_PRINT((ACPI_DB_NAMES, ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
"Appended to - %s\n", name_string)); "Appended to - %s\n", name_string));
} else { } else {
......
...@@ -337,8 +337,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) ...@@ -337,8 +337,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
* Copy the raw buffer data with no transform. * Copy the raw buffer data with no transform.
* (NULL terminated already) * (NULL terminated already)
*/ */
ACPI_MEMCPY(return_desc->string.pointer, memcpy(return_desc->string.pointer,
operand[0]->buffer.pointer, length); operand[0]->buffer.pointer, length);
break; break;
case AML_CONCAT_RES_OP: case AML_CONCAT_RES_OP:
...@@ -380,6 +380,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) ...@@ -380,6 +380,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
return_desc->reference.target_type = return_desc->reference.target_type =
ACPI_TYPE_BUFFER_FIELD; ACPI_TYPE_BUFFER_FIELD;
return_desc->reference.index_pointer =
&(operand[0]->buffer.pointer[index]);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
...@@ -391,6 +393,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) ...@@ -391,6 +393,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
return_desc->reference.target_type = return_desc->reference.target_type =
ACPI_TYPE_BUFFER_FIELD; ACPI_TYPE_BUFFER_FIELD;
return_desc->reference.index_pointer =
&(operand[0]->buffer.pointer[index]);
break; break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
......
...@@ -237,8 +237,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state) ...@@ -237,8 +237,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
/* We have a buffer, copy the portion requested */ /* We have a buffer, copy the portion requested */
ACPI_MEMCPY(buffer, operand[0]->string.pointer + index, memcpy(buffer, operand[0]->string.pointer + index,
length); length);
} }
/* Set the length of the new String/Buffer */ /* Set the length of the new String/Buffer */
......
...@@ -517,15 +517,14 @@ acpi_ex_data_table_space_handler(u32 function, ...@@ -517,15 +517,14 @@ acpi_ex_data_table_space_handler(u32 function,
switch (function) { switch (function) {
case ACPI_READ: case ACPI_READ:
ACPI_MEMCPY(ACPI_CAST_PTR(char, value), memcpy(ACPI_CAST_PTR(char, value),
ACPI_PHYSADDR_TO_PTR(address), ACPI_PHYSADDR_TO_PTR(address), ACPI_DIV_8(bit_width));
ACPI_DIV_8(bit_width));
break; break;
case ACPI_WRITE: case ACPI_WRITE:
ACPI_MEMCPY(ACPI_PHYSADDR_TO_PTR(address), memcpy(ACPI_PHYSADDR_TO_PTR(address),
ACPI_CAST_PTR(char, value), ACPI_DIV_8(bit_width)); ACPI_CAST_PTR(char, value), ACPI_DIV_8(bit_width));
break; break;
default: default:
......
...@@ -100,9 +100,9 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc, ...@@ -100,9 +100,9 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
/* Clear existing buffer and copy in the new one */ /* Clear existing buffer and copy in the new one */
ACPI_MEMSET(target_desc->buffer.pointer, 0, memset(target_desc->buffer.pointer, 0,
target_desc->buffer.length); target_desc->buffer.length);
ACPI_MEMCPY(target_desc->buffer.pointer, buffer, length); memcpy(target_desc->buffer.pointer, buffer, length);
#ifdef ACPI_OBSOLETE_BEHAVIOR #ifdef ACPI_OBSOLETE_BEHAVIOR
/* /*
...@@ -129,8 +129,8 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc, ...@@ -129,8 +129,8 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
} else { } else {
/* Truncate the source, copy only what will fit */ /* Truncate the source, copy only what will fit */
ACPI_MEMCPY(target_desc->buffer.pointer, buffer, memcpy(target_desc->buffer.pointer, buffer,
target_desc->buffer.length); target_desc->buffer.length);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Truncating source buffer from %X to %X\n", "Truncating source buffer from %X to %X\n",
...@@ -187,9 +187,9 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc, ...@@ -187,9 +187,9 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
* String will fit in existing non-static buffer. * String will fit in existing non-static buffer.
* Clear old string and copy in the new one * Clear old string and copy in the new one
*/ */
ACPI_MEMSET(target_desc->string.pointer, 0, memset(target_desc->string.pointer, 0,
(acpi_size) target_desc->string.length + 1); (acpi_size) target_desc->string.length + 1);
ACPI_MEMCPY(target_desc->string.pointer, buffer, length); memcpy(target_desc->string.pointer, buffer, length);
} else { } else {
/* /*
* Free the current buffer, then allocate a new buffer * Free the current buffer, then allocate a new buffer
...@@ -210,7 +210,7 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc, ...@@ -210,7 +210,7 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
} }
target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER; target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
ACPI_MEMCPY(target_desc->string.pointer, buffer, length); memcpy(target_desc->string.pointer, buffer, length);
} }
/* Set the new target length */ /* Set the new target length */
......
...@@ -378,6 +378,38 @@ void acpi_ex_integer_to_string(char *out_string, u64 value) ...@@ -378,6 +378,38 @@ void acpi_ex_integer_to_string(char *out_string, u64 value)
} }
} }
/*******************************************************************************
*
* FUNCTION: acpi_ex_pci_cls_to_string
*
* PARAMETERS: out_string - Where to put the converted string (7 bytes)
* PARAMETERS: class_code - PCI class code to be converted (3 bytes)
*
* RETURN: None
*
* DESCRIPTION: Convert 3-bytes PCI class code to string representation.
* Return buffer must be large enough to hold the string. The
* string returned is always exactly of length
* ACPI_PCICLS_STRING_SIZE (includes null terminator).
*
******************************************************************************/
void acpi_ex_pci_cls_to_string(char *out_string, u8 class_code[3])
{
ACPI_FUNCTION_ENTRY();
/* All 3 bytes are hexadecimal */
out_string[0] = acpi_ut_hex_to_ascii_char((u64)class_code[0], 4);
out_string[1] = acpi_ut_hex_to_ascii_char((u64)class_code[0], 0);
out_string[2] = acpi_ut_hex_to_ascii_char((u64)class_code[1], 4);
out_string[3] = acpi_ut_hex_to_ascii_char((u64)class_code[1], 0);
out_string[4] = acpi_ut_hex_to_ascii_char((u64)class_code[2], 4);
out_string[5] = acpi_ut_hex_to_ascii_char((u64)class_code[2], 0);
out_string[6] = 0;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_is_valid_space_id * FUNCTION: acpi_is_valid_space_id
......
...@@ -50,6 +50,13 @@ ...@@ -50,6 +50,13 @@
ACPI_MODULE_NAME("hwxfsleep") ACPI_MODULE_NAME("hwxfsleep")
/* Local prototypes */ /* Local prototypes */
#if (!ACPI_REDUCED_HARDWARE)
static acpi_status
acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
acpi_physical_address physical_address,
acpi_physical_address physical_address64);
#endif
static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id); static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id);
/* /*
...@@ -72,6 +79,7 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = { ...@@ -72,6 +79,7 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
/* /*
* These functions are removed for the ACPI_REDUCED_HARDWARE case: * These functions are removed for the ACPI_REDUCED_HARDWARE case:
* acpi_set_firmware_waking_vectors
* acpi_set_firmware_waking_vector * acpi_set_firmware_waking_vector
* acpi_set_firmware_waking_vector64 * acpi_set_firmware_waking_vector64
* acpi_enter_sleep_state_s4bios * acpi_enter_sleep_state_s4bios
...@@ -80,20 +88,26 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = { ...@@ -80,20 +88,26 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_set_firmware_waking_vector * FUNCTION: acpi_hw_set_firmware_waking_vectors
* *
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode * PARAMETERS: facs - Pointer to FACS table
* physical_address - 32-bit physical address of ACPI real mode
* entry point. * entry point.
* physical_address64 - 64-bit physical address of ACPI protected
* mode entry point.
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_set_firmware_waking_vector(u32 physical_address) static acpi_status
acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
acpi_physical_address physical_address,
acpi_physical_address physical_address64)
{ {
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector); ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vectors);
/* /*
...@@ -106,17 +120,92 @@ acpi_status acpi_set_firmware_waking_vector(u32 physical_address) ...@@ -106,17 +120,92 @@ acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
/* Set the 32-bit vector */ /* Set the 32-bit vector */
acpi_gbl_FACS->firmware_waking_vector = physical_address; facs->firmware_waking_vector = (u32)physical_address;
/* Clear the 64-bit vector if it exists */ if (facs->length > 32) {
if (facs->version >= 1) {
if ((acpi_gbl_FACS->length > 32) && (acpi_gbl_FACS->version >= 1)) { /* Set the 64-bit vector */
acpi_gbl_FACS->xfirmware_waking_vector = 0;
facs->xfirmware_waking_vector = physical_address64;
} else {
/* Clear the 64-bit vector if it exists */
facs->xfirmware_waking_vector = 0;
}
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
/*******************************************************************************
*
* FUNCTION: acpi_set_firmware_waking_vectors
*
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
* entry point.
* physical_address64 - 64-bit physical address of ACPI protected
* mode entry point.
*
* RETURN: Status
*
* DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
*
******************************************************************************/
acpi_status
acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
acpi_physical_address physical_address64)
{
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
/* If Hardware Reduced flag is set, there is no FACS */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS (AE_OK);
}
if (acpi_gbl_facs32) {
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs32,
physical_address,
physical_address64);
}
if (acpi_gbl_facs64) {
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs64,
physical_address,
physical_address64);
}
return_ACPI_STATUS(AE_OK);
}
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vectors)
/*******************************************************************************
*
* FUNCTION: acpi_set_firmware_waking_vector
*
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
* entry point.
*
* RETURN: Status
*
* DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS
*
******************************************************************************/
acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
{
acpi_status status;
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
status = acpi_set_firmware_waking_vectors((acpi_physical_address)
physical_address, 0);
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector) ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
#if ACPI_MACHINE_WIDTH == 64 #if ACPI_MACHINE_WIDTH == 64
...@@ -136,25 +225,19 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector) ...@@ -136,25 +225,19 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
******************************************************************************/ ******************************************************************************/
acpi_status acpi_set_firmware_waking_vector64(u64 physical_address) acpi_status acpi_set_firmware_waking_vector64(u64 physical_address)
{ {
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64); acpi_status status;
/* Determine if the 64-bit vector actually exists */
if ((acpi_gbl_FACS->length <= 32) || (acpi_gbl_FACS->version < 1)) { ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
return_ACPI_STATUS(AE_NOT_EXIST);
}
/* Clear 32-bit vector, set the 64-bit X_ vector */ status = acpi_set_firmware_waking_vectors(0,
(acpi_physical_address)
physical_address);
acpi_gbl_FACS->firmware_waking_vector = 0; return_ACPI_STATUS(status);
acpi_gbl_FACS->xfirmware_waking_vector = physical_address;
return_ACPI_STATUS(AE_OK);
} }
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64) ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
#endif #endif
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_enter_sleep_state_s4bios * FUNCTION: acpi_enter_sleep_state_s4bios
......
...@@ -102,7 +102,7 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -102,7 +102,7 @@ acpi_status acpi_ns_root_initialize(void)
/* _OSI is optional for now, will be permanent later */ /* _OSI is optional for now, will be permanent later */
if (!ACPI_STRCMP(init_val->name, "_OSI") if (!strcmp(init_val->name, "_OSI")
&& !acpi_gbl_create_osi_method) { && !acpi_gbl_create_osi_method) {
continue; continue;
} }
...@@ -180,7 +180,7 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -180,7 +180,7 @@ acpi_status acpi_ns_root_initialize(void)
/* Build an object around the static string */ /* Build an object around the static string */
obj_desc->string.length = (u32)ACPI_STRLEN(val); obj_desc->string.length = (u32)strlen(val);
obj_desc->string.pointer = val; obj_desc->string.pointer = val;
obj_desc->common.flags |= AOPOBJ_STATIC_POINTER; obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;
break; break;
...@@ -203,7 +203,7 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -203,7 +203,7 @@ acpi_status acpi_ns_root_initialize(void)
/* Special case for ACPI Global Lock */ /* Special case for ACPI Global Lock */
if (ACPI_STRCMP(init_val->name, "_GL_") == 0) { if (strcmp(init_val->name, "_GL_") == 0) {
acpi_gbl_global_lock_mutex = obj_desc; acpi_gbl_global_lock_mutex = obj_desc;
/* Create additional counting semaphore for global lock */ /* Create additional counting semaphore for global lock */
...@@ -304,7 +304,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info, ...@@ -304,7 +304,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
} }
local_flags = flags & ~(ACPI_NS_ERROR_IF_FOUND | ACPI_NS_SEARCH_PARENT); local_flags = flags &
~(ACPI_NS_ERROR_IF_FOUND | ACPI_NS_OVERRIDE_IF_FOUND |
ACPI_NS_SEARCH_PARENT);
*return_node = ACPI_ENTRY_NOT_FOUND; *return_node = ACPI_ENTRY_NOT_FOUND;
acpi_gbl_ns_lookup_count++; acpi_gbl_ns_lookup_count++;
...@@ -547,6 +549,12 @@ acpi_ns_lookup(union acpi_generic_state *scope_info, ...@@ -547,6 +549,12 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
if (flags & ACPI_NS_ERROR_IF_FOUND) { if (flags & ACPI_NS_ERROR_IF_FOUND) {
local_flags |= ACPI_NS_ERROR_IF_FOUND; local_flags |= ACPI_NS_ERROR_IF_FOUND;
} }
/* Set override flag according to caller */
if (flags & ACPI_NS_OVERRIDE_IF_FOUND) {
local_flags |= ACPI_NS_OVERRIDE_IF_FOUND;
}
} }
/* Extract one ACPI name from the front of the pathname */ /* Extract one ACPI name from the front of the pathname */
......
...@@ -187,8 +187,8 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object, ...@@ -187,8 +187,8 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object,
* Copy the raw buffer data with no transform. String is already NULL * Copy the raw buffer data with no transform. String is already NULL
* terminated at Length+1. * terminated at Length+1.
*/ */
ACPI_MEMCPY(new_object->string.pointer, memcpy(new_object->string.pointer,
original_object->buffer.pointer, length); original_object->buffer.pointer, length);
break; break;
default: default:
...@@ -251,9 +251,9 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object, ...@@ -251,9 +251,9 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
ACPI_MEMCPY(new_object->buffer.pointer, memcpy(new_object->buffer.pointer,
original_object->string.pointer, original_object->string.pointer,
original_object->string.length); original_object->string.length);
break; break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
......
...@@ -101,7 +101,7 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname) ...@@ -101,7 +101,7 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)
while (num_segments) { while (num_segments) {
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
ACPI_IS_PRINT(pathname[i]) ? isprint((int)pathname[i]) ?
acpi_os_printf("%c", pathname[i]) : acpi_os_printf("%c", pathname[i]) :
acpi_os_printf("?"); acpi_os_printf("?");
} }
......
...@@ -59,15 +59,14 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, ...@@ -59,15 +59,14 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
* *
* FUNCTION: acpi_ns_evaluate * FUNCTION: acpi_ns_evaluate
* *
* PARAMETERS: info - Evaluation info block, contains: * PARAMETERS: info - Evaluation info block, contains these fields
* and more:
* prefix_node - Prefix or Method/Object Node to execute * prefix_node - Prefix or Method/Object Node to execute
* relative_path - Name of method to execute, If NULL, the * relative_path - Name of method to execute, If NULL, the
* Node is the object to execute * Node is the object to execute
* parameters - List of parameters to pass to the method, * parameters - List of parameters to pass to the method,
* terminated by NULL. Params itself may be * terminated by NULL. Params itself may be
* NULL if no parameters are being passed. * NULL if no parameters are being passed.
* return_object - Where to put method's return value (if
* any). If NULL, no value is returned.
* parameter_type - Type of Parameter list * parameter_type - Type of Parameter list
* return_object - Where to put method's return value (if * return_object - Where to put method's return value (if
* any). If NULL, no value is returned. * any). If NULL, no value is returned.
...@@ -440,7 +439,7 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, ...@@ -440,7 +439,7 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
/* Initialize the evaluation information block */ /* Initialize the evaluation information block */
ACPI_MEMSET(info, 0, sizeof(struct acpi_evaluate_info)); memset(info, 0, sizeof(struct acpi_evaluate_info));
info->prefix_node = parent_node; info->prefix_node = parent_node;
/* /*
......
...@@ -90,7 +90,7 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -90,7 +90,7 @@ acpi_status acpi_ns_initialize_objects(void)
/* Set all init info to zero */ /* Set all init info to zero */
ACPI_MEMSET(&info, 0, sizeof(struct acpi_init_walk_info)); memset(&info, 0, sizeof(struct acpi_init_walk_info));
/* Walk entire namespace from the supplied root */ /* Walk entire namespace from the supplied root */
...@@ -566,7 +566,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle, ...@@ -566,7 +566,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_METHOD, device_node, METHOD_NAME__INI)); (ACPI_TYPE_METHOD, device_node, METHOD_NAME__INI));
ACPI_MEMSET(info, 0, sizeof(struct acpi_evaluate_info)); memset(info, 0, sizeof(struct acpi_evaluate_info));
info->prefix_node = device_node; info->prefix_node = device_node;
info->relative_pathname = METHOD_NAME__INI; info->relative_pathname = METHOD_NAME__INI;
info->parameters = NULL; info->parameters = NULL;
......
...@@ -117,6 +117,13 @@ acpi_ns_one_complete_parse(u32 pass_number, ...@@ -117,6 +117,13 @@ acpi_ns_one_complete_parse(u32 pass_number,
(u8) pass_number); (u8) pass_number);
} }
/* Found OSDT table, enable the namespace override feature */
if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_OSDT) &&
pass_number == ACPI_IMODE_LOAD_PASS1) {
walk_state->namespace_override = TRUE;
}
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_ds_delete_walk_state(walk_state); acpi_ds_delete_walk_state(walk_state);
goto cleanup; goto cleanup;
......
...@@ -580,7 +580,7 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info, ...@@ -580,7 +580,7 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
* # is a hex digit. * # is a hex digit.
*/ */
for (dest = new_string->string.pointer; *source; dest++, source++) { for (dest = new_string->string.pointer; *source; dest++, source++) {
*dest = (char)ACPI_TOUPPER(*source); *dest = (char)toupper((int)*source);
} }
acpi_ut_remove_reference(return_object); acpi_ut_remove_reference(return_object);
......
...@@ -325,8 +325,41 @@ acpi_ns_search_and_enter(u32 target_name, ...@@ -325,8 +325,41 @@ acpi_ns_search_and_enter(u32 target_name,
* If we found it AND the request specifies that a find is an error, * If we found it AND the request specifies that a find is an error,
* return the error * return the error
*/ */
if ((status == AE_OK) && (flags & ACPI_NS_ERROR_IF_FOUND)) { if (status == AE_OK) {
status = AE_ALREADY_EXISTS;
/* The node was found in the namespace */
/*
* If the namespace override feature is enabled for this node,
* delete any existing attached sub-object and make the node
* look like a new node that is owned by the override table.
*/
if (flags & ACPI_NS_OVERRIDE_IF_FOUND) {
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
"Namespace override: %4.4s pass %u type %X Owner %X\n",
ACPI_CAST_PTR(char,
&target_name),
interpreter_mode,
(*return_node)->type,
walk_state->owner_id));
acpi_ns_delete_children(*return_node);
if (acpi_gbl_runtime_namespace_override) {
acpi_ut_remove_reference((*return_node)->object);
(*return_node)->object = NULL;
(*return_node)->owner_id =
walk_state->owner_id;
} else {
acpi_ns_remove_node(*return_node);
*return_node = ACPI_ENTRY_NOT_FOUND;
}
}
/* Return an error if we don't expect to find the object */
else if (flags & ACPI_NS_ERROR_IF_FOUND) {
status = AE_ALREADY_EXISTS;
}
} }
#ifdef ACPI_ASL_COMPILER #ifdef ACPI_ASL_COMPILER
if (*return_node && (*return_node)->type == ACPI_TYPE_ANY) { if (*return_node && (*return_node)->type == ACPI_TYPE_ANY) {
......
...@@ -292,8 +292,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info) ...@@ -292,8 +292,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
} else { } else {
/* Convert the character to uppercase and save it */ /* Convert the character to uppercase and save it */
result[i] = result[i] = (char)toupper((int)*external_name);
(char)ACPI_TOUPPER((int)*external_name);
external_name++; external_name++;
} }
} }
......
...@@ -696,7 +696,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle, ...@@ -696,7 +696,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
no_match = ACPI_STRCMP(hid->string, info->hid); no_match = strcmp(hid->string, info->hid);
ACPI_FREE(hid); ACPI_FREE(hid);
if (no_match) { if (no_match) {
...@@ -715,8 +715,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle, ...@@ -715,8 +715,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
found = FALSE; found = FALSE;
for (i = 0; i < cid->count; i++) { for (i = 0; i < cid->count; i++) {
if (ACPI_STRCMP(cid->ids[i].string, info->hid) if (strcmp(cid->ids[i].string, info->hid) == 0) {
== 0) {
/* Found a matching CID */ /* Found a matching CID */
......
...@@ -114,7 +114,7 @@ acpi_get_handle(acpi_handle parent, ...@@ -114,7 +114,7 @@ acpi_get_handle(acpi_handle parent,
/* Special case for root-only, since we can't search for it */ /* Special case for root-only, since we can't search for it */
if (!ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH)) { if (!strcmp(pathname, ACPI_NS_ROOT_PATH)) {
*ret_handle = *ret_handle =
ACPI_CAST_PTR(acpi_handle, acpi_gbl_root_node); ACPI_CAST_PTR(acpi_handle, acpi_gbl_root_node);
return (AE_OK); return (AE_OK);
...@@ -242,7 +242,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest, ...@@ -242,7 +242,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
/* Copy actual string and return a pointer to the next string area */ /* Copy actual string and return a pointer to the next string area */
ACPI_MEMCPY(string_area, source->string, source->length); memcpy(string_area, source->string, source->length);
return (string_area + source->length); return (string_area + source->length);
} }
...@@ -260,7 +260,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest, ...@@ -260,7 +260,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
* control methods (Such as in the case of a device.) * control methods (Such as in the case of a device.)
* *
* For Device and Processor objects, run the Device _HID, _UID, _CID, _SUB, * For Device and Processor objects, run the Device _HID, _UID, _CID, _SUB,
* _STA, _ADR, _sx_w, and _sx_d methods. * _CLS, _STA, _ADR, _sx_w, and _sx_d methods.
* *
* Note: Allocates the return buffer, must be freed by the caller. * Note: Allocates the return buffer, must be freed by the caller.
* *
...@@ -276,11 +276,12 @@ acpi_get_object_info(acpi_handle handle, ...@@ -276,11 +276,12 @@ acpi_get_object_info(acpi_handle handle,
struct acpi_pnp_device_id *hid = NULL; struct acpi_pnp_device_id *hid = NULL;
struct acpi_pnp_device_id *uid = NULL; struct acpi_pnp_device_id *uid = NULL;
struct acpi_pnp_device_id *sub = NULL; struct acpi_pnp_device_id *sub = NULL;
struct acpi_pnp_device_id *cls = NULL;
char *next_id_string; char *next_id_string;
acpi_object_type type; acpi_object_type type;
acpi_name name; acpi_name name;
u8 param_count = 0; u8 param_count = 0;
u8 valid = 0; u16 valid = 0;
u32 info_size; u32 info_size;
u32 i; u32 i;
acpi_status status; acpi_status status;
...@@ -320,7 +321,7 @@ acpi_get_object_info(acpi_handle handle, ...@@ -320,7 +321,7 @@ acpi_get_object_info(acpi_handle handle,
if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) { if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
/* /*
* Get extra info for ACPI Device/Processor objects only: * Get extra info for ACPI Device/Processor objects only:
* Run the Device _HID, _UID, _SUB, and _CID methods. * Run the Device _HID, _UID, _SUB, _CID, and _CLS methods.
* *
* Note: none of these methods are required, so they may or may * Note: none of these methods are required, so they may or may
* not be present for this device. The Info->Valid bitfield is used * not be present for this device. The Info->Valid bitfield is used
...@@ -363,6 +364,14 @@ acpi_get_object_info(acpi_handle handle, ...@@ -363,6 +364,14 @@ acpi_get_object_info(acpi_handle handle,
sizeof(struct acpi_pnp_device_id_list)); sizeof(struct acpi_pnp_device_id_list));
valid |= ACPI_VALID_CID; valid |= ACPI_VALID_CID;
} }
/* Execute the Device._CLS method */
status = acpi_ut_execute_CLS(node, &cls);
if (ACPI_SUCCESS(status)) {
info_size += cls->length;
valid |= ACPI_VALID_CLS;
}
} }
/* /*
...@@ -486,6 +495,11 @@ acpi_get_object_info(acpi_handle handle, ...@@ -486,6 +495,11 @@ acpi_get_object_info(acpi_handle handle,
} }
} }
if (cls) {
next_id_string = acpi_ns_copy_device_id(&info->class_code,
cls, next_id_string);
}
/* Copy the fixed-length data */ /* Copy the fixed-length data */
info->info_size = info_size; info->info_size = info_size;
...@@ -510,6 +524,9 @@ acpi_get_object_info(acpi_handle handle, ...@@ -510,6 +524,9 @@ acpi_get_object_info(acpi_handle handle,
if (cid_list) { if (cid_list) {
ACPI_FREE(cid_list); ACPI_FREE(cid_list);
} }
if (cls) {
ACPI_FREE(cls);
}
return (status); return (status);
} }
...@@ -620,7 +637,7 @@ acpi_status acpi_install_method(u8 *buffer) ...@@ -620,7 +637,7 @@ acpi_status acpi_install_method(u8 *buffer)
/* Copy the method AML to the local buffer */ /* Copy the method AML to the local buffer */
ACPI_MEMCPY(aml_buffer, aml_start, aml_length); memcpy(aml_buffer, aml_start, aml_length);
/* Initialize the method object with the new method's information */ /* Initialize the method object with the new method's information */
......
...@@ -93,10 +93,9 @@ void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode) ...@@ -93,10 +93,9 @@ void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
op->common.descriptor_type = ACPI_DESC_TYPE_PARSER; op->common.descriptor_type = ACPI_DESC_TYPE_PARSER;
op->common.aml_opcode = opcode; op->common.aml_opcode = opcode;
ACPI_DISASM_ONLY_MEMBERS(ACPI_STRNCPY(op->common.aml_op_name, ACPI_DISASM_ONLY_MEMBERS(strncpy(op->common.aml_op_name,
(acpi_ps_get_opcode_info (acpi_ps_get_opcode_info(opcode))->
(opcode))->name, name, sizeof(op->common.aml_op_name)));
sizeof(op->common.aml_op_name)));
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -353,13 +353,13 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, ...@@ -353,13 +353,13 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
/* +1 to include null terminator */ /* +1 to include null terminator */
user_prt->length += user_prt->length +=
(u32) ACPI_STRLEN(user_prt->source) + 1; (u32)strlen(user_prt->source) + 1;
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
ACPI_STRCPY(user_prt->source, strcpy(user_prt->source,
obj_desc->string.pointer); obj_desc->string.pointer);
/* /*
* Add to the Length field the length of the string * Add to the Length field the length of the string
......
...@@ -119,7 +119,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -119,7 +119,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
/* /*
* Get the resource type and the initial (minimum) length * Get the resource type and the initial (minimum) length
*/ */
ACPI_MEMSET(resource, 0, INIT_RESOURCE_LENGTH(info)); memset(resource, 0, INIT_RESOURCE_LENGTH(info));
resource->type = INIT_RESOURCE_TYPE(info); resource->type = INIT_RESOURCE_TYPE(info);
resource->length = INIT_RESOURCE_LENGTH(info); resource->length = INIT_RESOURCE_LENGTH(info);
break; break;
...@@ -324,13 +324,13 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -324,13 +324,13 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
case ACPI_RSC_SET8: case ACPI_RSC_SET8:
ACPI_MEMSET(destination, info->aml_offset, info->value); memset(destination, info->aml_offset, info->value);
break; break;
case ACPI_RSC_DATA8: case ACPI_RSC_DATA8:
target = ACPI_ADD_PTR(char, resource, info->value); target = ACPI_ADD_PTR(char, resource, info->value);
ACPI_MEMCPY(destination, source, ACPI_GET16(target)); memcpy(destination, source, ACPI_GET16(target));
break; break;
case ACPI_RSC_ADDRESS: case ACPI_RSC_ADDRESS:
...@@ -502,7 +502,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -502,7 +502,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
switch (info->opcode) { switch (info->opcode) {
case ACPI_RSC_INITSET: case ACPI_RSC_INITSET:
ACPI_MEMSET(aml, 0, INIT_RESOURCE_LENGTH(info)); memset(aml, 0, INIT_RESOURCE_LENGTH(info));
aml_length = INIT_RESOURCE_LENGTH(info); aml_length = INIT_RESOURCE_LENGTH(info);
acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info), acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info),
aml_length, aml); aml_length, aml);
......
...@@ -148,7 +148,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) ...@@ -148,7 +148,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
case ACPI_RSC_MOVE_SERIAL_VEN: case ACPI_RSC_MOVE_SERIAL_VEN:
case ACPI_RSC_MOVE_SERIAL_RES: case ACPI_RSC_MOVE_SERIAL_RES:
ACPI_MEMCPY(destination, source, item_count); memcpy(destination, source, item_count);
return; return;
/* /*
...@@ -364,12 +364,11 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length, ...@@ -364,12 +364,11 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
* Zero the entire area of the buffer. * Zero the entire area of the buffer.
*/ */
total_length = total_length =
(u32) (u32)strlen(ACPI_CAST_PTR(char, &aml_resource_source[1])) +
ACPI_STRLEN(ACPI_CAST_PTR(char, &aml_resource_source[1])) +
1; 1;
total_length = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(total_length); total_length = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(total_length);
ACPI_MEMSET(resource_source->string_ptr, 0, total_length); memset(resource_source->string_ptr, 0, total_length);
/* Copy the resource_source string to the destination */ /* Copy the resource_source string to the destination */
...@@ -432,8 +431,8 @@ acpi_rs_set_resource_source(union aml_resource * aml, ...@@ -432,8 +431,8 @@ acpi_rs_set_resource_source(union aml_resource * aml,
/* Copy the resource_source string */ /* Copy the resource_source string */
ACPI_STRCPY(ACPI_CAST_PTR(char, &aml_resource_source[1]), strcpy(ACPI_CAST_PTR(char, &aml_resource_source[1]),
resource_source->string_ptr); resource_source->string_ptr);
/* /*
* Add the length of the string (+ 1 for null terminator) to the * Add the length of the string (+ 1 for null terminator) to the
......
...@@ -398,8 +398,8 @@ acpi_resource_to_address64(struct acpi_resource *resource, ...@@ -398,8 +398,8 @@ acpi_resource_to_address64(struct acpi_resource *resource,
/* Simple copy for 64 bit source */ /* Simple copy for 64 bit source */
ACPI_MEMCPY(out, &resource->data, memcpy(out, &resource->data,
sizeof(struct acpi_resource_address64)); sizeof(struct acpi_resource_address64));
break; break;
default: default:
...@@ -499,7 +499,7 @@ acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context) ...@@ -499,7 +499,7 @@ acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context)
*/ */
if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) || if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) ||
(vendor->uuid_subtype != info->uuid->subtype) || (vendor->uuid_subtype != info->uuid->subtype) ||
(ACPI_MEMCMP(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) { (memcmp(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) {
return (AE_OK); return (AE_OK);
} }
...@@ -513,7 +513,7 @@ acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context) ...@@ -513,7 +513,7 @@ acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context)
/* Found the correct resource, copy and return it */ /* Found the correct resource, copy and return it */
ACPI_MEMCPY(buffer->pointer, resource, resource->length); memcpy(buffer->pointer, resource, resource->length);
buffer->length = resource->length; buffer->length = resource->length;
/* Found the desired descriptor, terminate resource walk */ /* Found the desired descriptor, terminate resource walk */
......
...@@ -73,7 +73,7 @@ acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc, ...@@ -73,7 +73,7 @@ acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
* Initialize the table descriptor. Set the pointer to NULL, since the * Initialize the table descriptor. Set the pointer to NULL, since the
* table is not fully mapped at this time. * table is not fully mapped at this time.
*/ */
ACPI_MEMSET(table_desc, 0, sizeof(struct acpi_table_desc)); memset(table_desc, 0, sizeof(struct acpi_table_desc));
table_desc->address = address; table_desc->address = address;
table_desc->length = table->length; table_desc->length = table->length;
table_desc->flags = flags; table_desc->flags = flags;
...@@ -465,9 +465,9 @@ acpi_status acpi_tb_resize_root_table_list(void) ...@@ -465,9 +465,9 @@ acpi_status acpi_tb_resize_root_table_list(void)
/* Copy and free the previous table array */ /* Copy and free the previous table array */
if (acpi_gbl_root_table_list.tables) { if (acpi_gbl_root_table_list.tables) {
ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, memcpy(tables, acpi_gbl_root_table_list.tables,
(acpi_size) table_count * (acpi_size) table_count *
sizeof(struct acpi_table_desc)); sizeof(struct acpi_table_desc));
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
ACPI_FREE(acpi_gbl_root_table_list.tables); ACPI_FREE(acpi_gbl_root_table_list.tables);
......
...@@ -350,9 +350,18 @@ void acpi_tb_parse_fadt(u32 table_index) ...@@ -350,9 +350,18 @@ void acpi_tb_parse_fadt(u32 table_index)
/* If Hardware Reduced flag is set, there is no FACS */ /* If Hardware Reduced flag is set, there is no FACS */
if (!acpi_gbl_reduced_hardware) { if (!acpi_gbl_reduced_hardware) {
acpi_tb_install_fixed_table((acpi_physical_address) if (acpi_gbl_FADT.facs) {
acpi_gbl_FADT.Xfacs, ACPI_SIG_FACS, acpi_tb_install_fixed_table((acpi_physical_address)
ACPI_TABLE_INDEX_FACS); acpi_gbl_FADT.facs,
ACPI_SIG_FACS,
ACPI_TABLE_INDEX_FACS);
}
if (acpi_gbl_FADT.Xfacs) {
acpi_tb_install_fixed_table((acpi_physical_address)
acpi_gbl_FADT.Xfacs,
ACPI_SIG_FACS,
ACPI_TABLE_INDEX_X_FACS);
}
} }
} }
...@@ -389,12 +398,12 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length) ...@@ -389,12 +398,12 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
/* Clear the entire local FADT */ /* Clear the entire local FADT */
ACPI_MEMSET(&acpi_gbl_FADT, 0, sizeof(struct acpi_table_fadt)); memset(&acpi_gbl_FADT, 0, sizeof(struct acpi_table_fadt));
/* Copy the original FADT, up to sizeof (struct acpi_table_fadt) */ /* Copy the original FADT, up to sizeof (struct acpi_table_fadt) */
ACPI_MEMCPY(&acpi_gbl_FADT, table, memcpy(&acpi_gbl_FADT, table,
ACPI_MIN(length, sizeof(struct acpi_table_fadt))); ACPI_MIN(length, sizeof(struct acpi_table_fadt)));
/* Take a copy of the Hardware Reduced flag */ /* Take a copy of the Hardware Reduced flag */
...@@ -491,13 +500,9 @@ static void acpi_tb_convert_fadt(void) ...@@ -491,13 +500,9 @@ static void acpi_tb_convert_fadt(void)
acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt); acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
/* /*
* Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary. * Expand the 32-bit DSDT addresses to 64-bit as necessary.
* Later ACPICA code will always use the X 64-bit field. * Later ACPICA code will always use the X 64-bit field.
*/ */
acpi_gbl_FADT.Xfacs = acpi_tb_select_address("FACS",
acpi_gbl_FADT.facs,
acpi_gbl_FADT.Xfacs);
acpi_gbl_FADT.Xdsdt = acpi_tb_select_address("DSDT", acpi_gbl_FADT.Xdsdt = acpi_tb_select_address("DSDT",
acpi_gbl_FADT.dsdt, acpi_gbl_FADT.dsdt,
acpi_gbl_FADT.Xdsdt); acpi_gbl_FADT.Xdsdt);
......
...@@ -76,16 +76,16 @@ acpi_tb_find_table(char *signature, ...@@ -76,16 +76,16 @@ acpi_tb_find_table(char *signature,
/* Normalize the input strings */ /* Normalize the input strings */
ACPI_MEMSET(&header, 0, sizeof(struct acpi_table_header)); memset(&header, 0, sizeof(struct acpi_table_header));
ACPI_MOVE_NAME(header.signature, signature); ACPI_MOVE_NAME(header.signature, signature);
ACPI_STRNCPY(header.oem_id, oem_id, ACPI_OEM_ID_SIZE); strncpy(header.oem_id, oem_id, ACPI_OEM_ID_SIZE);
ACPI_STRNCPY(header.oem_table_id, oem_table_id, ACPI_OEM_TABLE_ID_SIZE); strncpy(header.oem_table_id, oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
/* Search for the table */ /* Search for the table */
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
if (ACPI_MEMCMP(&(acpi_gbl_root_table_list.tables[i].signature), if (memcmp(&(acpi_gbl_root_table_list.tables[i].signature),
header.signature, ACPI_NAME_SIZE)) { header.signature, ACPI_NAME_SIZE)) {
/* Not the requested table */ /* Not the requested table */
...@@ -112,21 +112,20 @@ acpi_tb_find_table(char *signature, ...@@ -112,21 +112,20 @@ acpi_tb_find_table(char *signature,
/* Check for table match on all IDs */ /* Check for table match on all IDs */
if (!ACPI_MEMCMP if (!memcmp
(acpi_gbl_root_table_list.tables[i].pointer->signature, (acpi_gbl_root_table_list.tables[i].pointer->signature,
header.signature, ACPI_NAME_SIZE) && (!oem_id[0] header.signature, ACPI_NAME_SIZE) && (!oem_id[0]
|| ||
!ACPI_MEMCMP !memcmp
(acpi_gbl_root_table_list. (acpi_gbl_root_table_list.
tables[i].pointer-> tables[i].pointer->
oem_id, oem_id,
header.oem_id, header.oem_id,
ACPI_OEM_ID_SIZE)) ACPI_OEM_ID_SIZE))
&& (!oem_table_id[0] && (!oem_table_id[0]
|| !ACPI_MEMCMP(acpi_gbl_root_table_list.tables[i]. || !memcmp(acpi_gbl_root_table_list.tables[i].pointer->
pointer->oem_table_id, oem_table_id, header.oem_table_id,
header.oem_table_id, ACPI_OEM_TABLE_ID_SIZE))) {
ACPI_OEM_TABLE_ID_SIZE))) {
*table_index = i; *table_index = i;
ACPI_DEBUG_PRINT((ACPI_DB_TABLES, ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
......
...@@ -87,8 +87,8 @@ acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index) ...@@ -87,8 +87,8 @@ acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
* not just the header. * not just the header.
*/ */
is_identical = (u8)((table_desc->length != table_length || is_identical = (u8)((table_desc->length != table_length ||
ACPI_MEMCMP(table_desc->pointer, table, memcmp(table_desc->pointer, table, table_length)) ?
table_length)) ? FALSE : TRUE); FALSE : TRUE);
/* Release the acquired table */ /* Release the acquired table */
...@@ -289,8 +289,7 @@ acpi_tb_install_standard_table(acpi_physical_address address, ...@@ -289,8 +289,7 @@ acpi_tb_install_standard_table(acpi_physical_address address,
if ((new_table_desc.signature.ascii[0] != 0x00) && if ((new_table_desc.signature.ascii[0] != 0x00) &&
(!ACPI_COMPARE_NAME (!ACPI_COMPARE_NAME
(&new_table_desc.signature, ACPI_SIG_SSDT)) (&new_table_desc.signature, ACPI_SIG_SSDT))
&& (ACPI_STRNCMP(new_table_desc.signature.ascii, "OEM", 3))) && (strncmp(new_table_desc.signature.ascii, "OEM", 3))) {
{
ACPI_BIOS_ERROR((AE_INFO, ACPI_BIOS_ERROR((AE_INFO,
"Table has invalid signature [%4.4s] (0x%8.8X), " "Table has invalid signature [%4.4s] (0x%8.8X), "
"must be SSDT or OEMx", "must be SSDT or OEMx",
......
...@@ -73,7 +73,7 @@ static void acpi_tb_fix_string(char *string, acpi_size length) ...@@ -73,7 +73,7 @@ static void acpi_tb_fix_string(char *string, acpi_size length)
{ {
while (length && *string) { while (length && *string) {
if (!ACPI_IS_PRINT(*string)) { if (!isprint((int)*string)) {
*string = '?'; *string = '?';
} }
string++; string++;
...@@ -100,7 +100,7 @@ acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, ...@@ -100,7 +100,7 @@ acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
struct acpi_table_header *header) struct acpi_table_header *header)
{ {
ACPI_MEMCPY(out_header, header, sizeof(struct acpi_table_header)); memcpy(out_header, header, sizeof(struct acpi_table_header));
acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE); acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE);
acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE); acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE);
...@@ -138,9 +138,9 @@ acpi_tb_print_table_header(acpi_physical_address address, ...@@ -138,9 +138,9 @@ acpi_tb_print_table_header(acpi_physical_address address,
/* RSDP has no common fields */ /* RSDP has no common fields */
ACPI_MEMCPY(local_header.oem_id, memcpy(local_header.oem_id,
ACPI_CAST_PTR(struct acpi_table_rsdp, ACPI_CAST_PTR(struct acpi_table_rsdp, header)->oem_id,
header)->oem_id, ACPI_OEM_ID_SIZE); ACPI_OEM_ID_SIZE);
acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE); acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
ACPI_INFO((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", ACPI_INFO((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)",
......
...@@ -68,7 +68,6 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size); ...@@ -68,7 +68,6 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size);
acpi_status acpi_tb_initialize_facs(void) acpi_status acpi_tb_initialize_facs(void)
{ {
acpi_status status;
/* If Hardware Reduced flag is set, there is no FACS */ /* If Hardware Reduced flag is set, there is no FACS */
...@@ -77,11 +76,25 @@ acpi_status acpi_tb_initialize_facs(void) ...@@ -77,11 +76,25 @@ acpi_status acpi_tb_initialize_facs(void)
return (AE_OK); return (AE_OK);
} }
status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS, (void)acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
ACPI_CAST_INDIRECT_PTR(struct ACPI_CAST_INDIRECT_PTR(struct
acpi_table_header, acpi_table_header,
&acpi_gbl_FACS)); &acpi_gbl_facs32));
return (status); (void)acpi_get_table_by_index(ACPI_TABLE_INDEX_X_FACS,
ACPI_CAST_INDIRECT_PTR(struct
acpi_table_header,
&acpi_gbl_facs64));
if (acpi_gbl_facs64
&& (!acpi_gbl_facs32 || !acpi_gbl_use32_bit_facs_addresses)) {
acpi_gbl_FACS = acpi_gbl_facs64;
} else if (acpi_gbl_facs32) {
acpi_gbl_FACS = acpi_gbl_facs32;
}
/* If there is no FACS, just continue. There was already an error msg */
return (AE_OK);
} }
#endif /* !ACPI_REDUCED_HARDWARE */ #endif /* !ACPI_REDUCED_HARDWARE */
...@@ -101,7 +114,7 @@ acpi_status acpi_tb_initialize_facs(void) ...@@ -101,7 +114,7 @@ acpi_status acpi_tb_initialize_facs(void)
u8 acpi_tb_tables_loaded(void) u8 acpi_tb_tables_loaded(void)
{ {
if (acpi_gbl_root_table_list.current_table_count >= 3) { if (acpi_gbl_root_table_list.current_table_count >= 4) {
return (TRUE); return (TRUE);
} }
...@@ -175,7 +188,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index) ...@@ -175,7 +188,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
return (NULL); return (NULL);
} }
ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length); memcpy(new_table, table_desc->pointer, table_desc->length);
acpi_tb_uninstall_table(table_desc); acpi_tb_uninstall_table(table_desc);
acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list. acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.
...@@ -357,11 +370,11 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address) ...@@ -357,11 +370,11 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
table_entry = ACPI_ADD_PTR(u8, table, sizeof(struct acpi_table_header)); table_entry = ACPI_ADD_PTR(u8, table, sizeof(struct acpi_table_header));
/* /*
* First two entries in the table array are reserved for the DSDT * First three entries in the table array are reserved for the DSDT
* and FACS, which are not actually present in the RSDT/XSDT - they * and 32bit/64bit FACS, which are not actually present in the
* come from the FADT * RSDT/XSDT - they come from the FADT
*/ */
acpi_gbl_root_table_list.current_table_count = 2; acpi_gbl_root_table_list.current_table_count = 3;
/* Initialize the root table array from the RSDT/XSDT */ /* Initialize the root table array from the RSDT/XSDT */
......
...@@ -119,9 +119,9 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array, ...@@ -119,9 +119,9 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array,
} else { } else {
/* Root Table Array has been statically allocated by the host */ /* Root Table Array has been statically allocated by the host */
ACPI_MEMSET(initial_table_array, 0, memset(initial_table_array, 0,
(acpi_size) initial_table_count * (acpi_size) initial_table_count *
sizeof(struct acpi_table_desc)); sizeof(struct acpi_table_desc));
acpi_gbl_root_table_list.tables = initial_table_array; acpi_gbl_root_table_list.tables = initial_table_array;
acpi_gbl_root_table_list.max_table_count = initial_table_count; acpi_gbl_root_table_list.max_table_count = initial_table_count;
...@@ -242,8 +242,9 @@ acpi_get_table_header(char *signature, ...@@ -242,8 +242,9 @@ acpi_get_table_header(char *signature,
if (!header) { if (!header) {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
ACPI_MEMCPY(out_table_header, header,
sizeof(struct acpi_table_header)); memcpy(out_table_header, header,
sizeof(struct acpi_table_header));
acpi_os_unmap_memory(header, acpi_os_unmap_memory(header,
sizeof(struct sizeof(struct
acpi_table_header)); acpi_table_header));
...@@ -251,9 +252,9 @@ acpi_get_table_header(char *signature, ...@@ -251,9 +252,9 @@ acpi_get_table_header(char *signature,
return (AE_NOT_FOUND); return (AE_NOT_FOUND);
} }
} else { } else {
ACPI_MEMCPY(out_table_header, memcpy(out_table_header,
acpi_gbl_root_table_list.tables[i].pointer, acpi_gbl_root_table_list.tables[i].pointer,
sizeof(struct acpi_table_header)); sizeof(struct acpi_table_header));
} }
return (AE_OK); return (AE_OK);
} }
......
...@@ -150,8 +150,8 @@ static acpi_status acpi_tb_load_namespace(void) ...@@ -150,8 +150,8 @@ static acpi_status acpi_tb_load_namespace(void)
* Save the original DSDT header for detection of table corruption * Save the original DSDT header for detection of table corruption
* and/or replacement of the DSDT from outside the OS. * and/or replacement of the DSDT from outside the OS.
*/ */
ACPI_MEMCPY(&acpi_gbl_original_dsdt_header, acpi_gbl_DSDT, memcpy(&acpi_gbl_original_dsdt_header, acpi_gbl_DSDT,
sizeof(struct acpi_table_header)); sizeof(struct acpi_table_header));
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES); (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
...@@ -166,13 +166,18 @@ static acpi_status acpi_tb_load_namespace(void) ...@@ -166,13 +166,18 @@ static acpi_status acpi_tb_load_namespace(void)
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
if ((!ACPI_COMPARE_NAME if (!acpi_gbl_root_table_list.tables[i].address ||
(!ACPI_COMPARE_NAME
(&(acpi_gbl_root_table_list.tables[i].signature), (&(acpi_gbl_root_table_list.tables[i].signature),
ACPI_SIG_SSDT) ACPI_SIG_SSDT)
&& &&
!ACPI_COMPARE_NAME(& !ACPI_COMPARE_NAME(&
(acpi_gbl_root_table_list.tables[i]. (acpi_gbl_root_table_list.tables[i].
signature), ACPI_SIG_PSDT)) signature), ACPI_SIG_PSDT)
&&
!ACPI_COMPARE_NAME(&
(acpi_gbl_root_table_list.tables[i].
signature), ACPI_SIG_OSDT))
|| ||
ACPI_FAILURE(acpi_tb_validate_table ACPI_FAILURE(acpi_tb_validate_table
(&acpi_gbl_root_table_list.tables[i]))) { (&acpi_gbl_root_table_list.tables[i]))) {
...@@ -219,9 +224,9 @@ acpi_install_table(acpi_physical_address address, u8 physical) ...@@ -219,9 +224,9 @@ acpi_install_table(acpi_physical_address address, u8 physical)
ACPI_FUNCTION_TRACE(acpi_install_table); ACPI_FUNCTION_TRACE(acpi_install_table);
if (physical) { if (physical) {
flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL;
} else {
flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL; flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL;
} else {
flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL;
} }
status = acpi_tb_install_standard_table(address, flags, status = acpi_tb_install_standard_table(address, flags,
......
...@@ -73,7 +73,7 @@ void *acpi_os_allocate_zeroed(acpi_size size) ...@@ -73,7 +73,7 @@ void *acpi_os_allocate_zeroed(acpi_size size)
/* Clear the memory block */ /* Clear the memory block */
ACPI_MEMSET(allocation, 0, size); memset(allocation, 0, size);
} }
return (allocation); return (allocation);
...@@ -181,7 +181,7 @@ acpi_status acpi_ut_delete_caches(void) ...@@ -181,7 +181,7 @@ acpi_status acpi_ut_delete_caches(void)
char buffer[7]; char buffer[7];
if (acpi_gbl_display_final_mem_stats) { if (acpi_gbl_display_final_mem_stats) {
ACPI_STRCPY(buffer, "MEMORY"); strcpy(buffer, "MEMORY");
(void)acpi_db_display_statistics(buffer); (void)acpi_db_display_statistics(buffer);
} }
#endif #endif
...@@ -337,6 +337,6 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer, ...@@ -337,6 +337,6 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
/* Have a valid buffer, clear it */ /* Have a valid buffer, clear it */
ACPI_MEMSET(buffer->pointer, 0, required_length); memset(buffer->pointer, 0, required_length);
return (AE_OK); return (AE_OK);
} }
...@@ -159,7 +159,7 @@ void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset) ...@@ -159,7 +159,7 @@ void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
} }
buf_char = buffer[(acpi_size) i + j]; buf_char = buffer[(acpi_size) i + j];
if (ACPI_IS_PRINT(buf_char)) { if (isprint(buf_char)) {
acpi_os_printf("%c", buf_char); acpi_os_printf("%c", buf_char);
} else { } else {
acpi_os_printf("."); acpi_os_printf(".");
...@@ -319,7 +319,7 @@ acpi_ut_dump_buffer_to_file(ACPI_FILE file, ...@@ -319,7 +319,7 @@ acpi_ut_dump_buffer_to_file(ACPI_FILE file,
} }
buf_char = buffer[(acpi_size) i + j]; buf_char = buffer[(acpi_size) i + j];
if (ACPI_IS_PRINT(buf_char)) { if (isprint(buf_char)) {
acpi_ut_file_printf(file, "%c", buf_char); acpi_ut_file_printf(file, "%c", buf_char);
} else { } else {
acpi_ut_file_printf(file, "."); acpi_ut_file_printf(file, ".");
......
...@@ -84,7 +84,7 @@ acpi_os_create_cache(char *cache_name, ...@@ -84,7 +84,7 @@ acpi_os_create_cache(char *cache_name,
/* Populate the cache object and return it */ /* Populate the cache object and return it */
ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list)); memset(cache, 0, sizeof(struct acpi_memory_list));
cache->list_name = cache_name; cache->list_name = cache_name;
cache->object_size = object_size; cache->object_size = object_size;
cache->max_depth = max_depth; cache->max_depth = max_depth;
...@@ -212,7 +212,7 @@ acpi_os_release_object(struct acpi_memory_list * cache, void *object) ...@@ -212,7 +212,7 @@ acpi_os_release_object(struct acpi_memory_list * cache, void *object)
/* Mark the object as cached */ /* Mark the object as cached */
ACPI_MEMSET(object, 0xCA, cache->object_size); memset(object, 0xCA, cache->object_size);
ACPI_SET_DESCRIPTOR_TYPE(object, ACPI_DESC_TYPE_CACHED); ACPI_SET_DESCRIPTOR_TYPE(object, ACPI_DESC_TYPE_CACHED);
/* Put the object at the head of the cache list */ /* Put the object at the head of the cache list */
...@@ -281,7 +281,7 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache) ...@@ -281,7 +281,7 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache)
/* Clear (zero) the previously used Object */ /* Clear (zero) the previously used Object */
ACPI_MEMSET(object, 0, cache->object_size); memset(object, 0, cache->object_size);
} else { } else {
/* The cache is empty, create a new object */ /* The cache is empty, create a new object */
......
...@@ -129,7 +129,7 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, ...@@ -129,7 +129,7 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
/* Always clear the external object */ /* Always clear the external object */
ACPI_MEMSET(external_object, 0, sizeof(union acpi_object)); memset(external_object, 0, sizeof(union acpi_object));
/* /*
* In general, the external object will be the same type as * In general, the external object will be the same type as
...@@ -149,9 +149,9 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, ...@@ -149,9 +149,9 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
string. string.
length + 1); length + 1);
ACPI_MEMCPY((void *)data_space, memcpy((void *)data_space,
(void *)internal_object->string.pointer, (void *)internal_object->string.pointer,
(acpi_size) internal_object->string.length + 1); (acpi_size) internal_object->string.length + 1);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
...@@ -162,9 +162,9 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, ...@@ -162,9 +162,9 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
ACPI_ROUND_UP_TO_NATIVE_WORD(internal_object->string. ACPI_ROUND_UP_TO_NATIVE_WORD(internal_object->string.
length); length);
ACPI_MEMCPY((void *)data_space, memcpy((void *)data_space,
(void *)internal_object->buffer.pointer, (void *)internal_object->buffer.pointer,
internal_object->buffer.length); internal_object->buffer.length);
break; break;
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
...@@ -502,9 +502,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, ...@@ -502,9 +502,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
goto error_exit; goto error_exit;
} }
ACPI_MEMCPY(internal_object->string.pointer, memcpy(internal_object->string.pointer,
external_object->string.pointer, external_object->string.pointer,
external_object->string.length); external_object->string.length);
internal_object->string.length = external_object->string.length; internal_object->string.length = external_object->string.length;
break; break;
...@@ -517,9 +517,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, ...@@ -517,9 +517,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
goto error_exit; goto error_exit;
} }
ACPI_MEMCPY(internal_object->buffer.pointer, memcpy(internal_object->buffer.pointer,
external_object->buffer.pointer, external_object->buffer.pointer,
external_object->buffer.length); external_object->buffer.length);
internal_object->buffer.length = external_object->buffer.length; internal_object->buffer.length = external_object->buffer.length;
...@@ -694,8 +694,8 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, ...@@ -694,8 +694,8 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
copy_size = sizeof(struct acpi_namespace_node); copy_size = sizeof(struct acpi_namespace_node);
} }
ACPI_MEMCPY(ACPI_CAST_PTR(char, dest_desc), memcpy(ACPI_CAST_PTR(char, dest_desc),
ACPI_CAST_PTR(char, source_desc), copy_size); ACPI_CAST_PTR(char, source_desc), copy_size);
/* Restore the saved fields */ /* Restore the saved fields */
...@@ -725,9 +725,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, ...@@ -725,9 +725,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
/* Copy the actual buffer data */ /* Copy the actual buffer data */
ACPI_MEMCPY(dest_desc->buffer.pointer, memcpy(dest_desc->buffer.pointer,
source_desc->buffer.pointer, source_desc->buffer.pointer,
source_desc->buffer.length); source_desc->buffer.length);
} }
break; break;
...@@ -747,9 +747,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, ...@@ -747,9 +747,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
/* Copy the actual string data */ /* Copy the actual string data */
ACPI_MEMCPY(dest_desc->string.pointer, memcpy(dest_desc->string.pointer,
source_desc->string.pointer, source_desc->string.pointer,
(acpi_size) source_desc->string.length + 1); (acpi_size) source_desc->string.length + 1);
} }
break; break;
......
...@@ -111,8 +111,8 @@ void acpi_ut_track_stack_ptr(void) ...@@ -111,8 +111,8 @@ void acpi_ut_track_stack_ptr(void)
* RETURN: Updated pointer to the function name * RETURN: Updated pointer to the function name
* *
* DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
* This allows compiler macros such as __func__ to be used with no * This allows compiler macros such as __func__ to be used
* change to the debug output. * with no change to the debug output.
* *
******************************************************************************/ ******************************************************************************/
......
...@@ -102,12 +102,19 @@ const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = { ...@@ -102,12 +102,19 @@ const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
{"_SB_", ACPI_TYPE_DEVICE, NULL}, {"_SB_", ACPI_TYPE_DEVICE, NULL},
{"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL}, {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
{"_TZ_", ACPI_TYPE_DEVICE, NULL}, {"_TZ_", ACPI_TYPE_DEVICE, NULL},
{"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL}, /*
* March, 2015:
* The _REV object is in the process of being deprecated, because
* other ACPI implementations permanently return 2. Thus, it
* has little or no value. Return 2 for compatibility with
* other ACPI implementations.
*/
{"_REV", ACPI_TYPE_INTEGER, ACPI_CAST_PTR(char, 2)},
{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
{"_GL_", ACPI_TYPE_MUTEX, (char *)1}, {"_GL_", ACPI_TYPE_MUTEX, ACPI_CAST_PTR(char, 1)},
#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) #if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
{"_OSI", ACPI_TYPE_METHOD, (char *)1}, {"_OSI", ACPI_TYPE_METHOD, ACPI_CAST_PTR(char, 1)},
#endif #endif
/* Table terminator */ /* Table terminator */
......
/****************************************************************************** /******************************************************************************
* *
* Module Name: utids - support for device Ids - HID, UID, CID * Module Name: utids - support for device Ids - HID, UID, CID, SUB, CLS
* *
*****************************************************************************/ *****************************************************************************/
...@@ -111,7 +111,7 @@ acpi_ut_execute_HID(struct acpi_namespace_node *device_node, ...@@ -111,7 +111,7 @@ acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
if (obj_desc->common.type == ACPI_TYPE_INTEGER) { if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value); acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value);
} else { } else {
ACPI_STRCPY(hid->string, obj_desc->string.pointer); strcpy(hid->string, obj_desc->string.pointer);
} }
hid->length = length; hid->length = length;
...@@ -180,7 +180,7 @@ acpi_ut_execute_SUB(struct acpi_namespace_node *device_node, ...@@ -180,7 +180,7 @@ acpi_ut_execute_SUB(struct acpi_namespace_node *device_node,
/* Simply copy existing string */ /* Simply copy existing string */
ACPI_STRCPY(sub->string, obj_desc->string.pointer); strcpy(sub->string, obj_desc->string.pointer);
sub->length = length; sub->length = length;
*return_id = sub; *return_id = sub;
...@@ -256,7 +256,7 @@ acpi_ut_execute_UID(struct acpi_namespace_node *device_node, ...@@ -256,7 +256,7 @@ acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
if (obj_desc->common.type == ACPI_TYPE_INTEGER) { if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
acpi_ex_integer_to_string(uid->string, obj_desc->integer.value); acpi_ex_integer_to_string(uid->string, obj_desc->integer.value);
} else { } else {
ACPI_STRCPY(uid->string, obj_desc->string.pointer); strcpy(uid->string, obj_desc->string.pointer);
} }
uid->length = length; uid->length = length;
...@@ -393,8 +393,7 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node, ...@@ -393,8 +393,7 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
/* Copy the String CID from the returned object */ /* Copy the String CID from the returned object */
ACPI_STRCPY(next_id_string, strcpy(next_id_string, cid_objects[i]->string.pointer);
cid_objects[i]->string.pointer);
length = cid_objects[i]->string.length + 1; length = cid_objects[i]->string.length + 1;
} }
...@@ -416,3 +415,92 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node, ...@@ -416,3 +415,92 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
acpi_ut_remove_reference(obj_desc); acpi_ut_remove_reference(obj_desc);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/*******************************************************************************
*
* FUNCTION: acpi_ut_execute_CLS
*
* PARAMETERS: device_node - Node for the device
* return_id - Where the _CLS is returned
*
* RETURN: Status
*
* DESCRIPTION: Executes the _CLS control method that returns PCI-defined
* class code of the device. The _CLS value is always a package
* containing PCI class information as a list of integers.
* The returned string has format "BBSSPP", where:
* BB = Base-class code
* SS = Sub-class code
* PP = Programming Interface code
*
******************************************************************************/
acpi_status
acpi_ut_execute_CLS(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id **return_id)
{
union acpi_operand_object *obj_desc;
union acpi_operand_object **cls_objects;
u32 count;
struct acpi_pnp_device_id *cls;
u32 length;
acpi_status status;
u8 class_code[3] = { 0, 0, 0 };
ACPI_FUNCTION_TRACE(ut_execute_CLS);
status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CLS,
ACPI_BTYPE_PACKAGE, &obj_desc);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Get the size of the String to be returned, includes null terminator */
length = ACPI_PCICLS_STRING_SIZE;
cls_objects = obj_desc->package.elements;
count = obj_desc->package.count;
if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
if (count > 0
&& cls_objects[0]->common.type == ACPI_TYPE_INTEGER) {
class_code[0] = (u8)cls_objects[0]->integer.value;
}
if (count > 1
&& cls_objects[1]->common.type == ACPI_TYPE_INTEGER) {
class_code[1] = (u8)cls_objects[1]->integer.value;
}
if (count > 2
&& cls_objects[2]->common.type == ACPI_TYPE_INTEGER) {
class_code[2] = (u8)cls_objects[2]->integer.value;
}
}
/* Allocate a buffer for the CLS */
cls =
ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pnp_device_id) +
(acpi_size) length);
if (!cls) {
status = AE_NO_MEMORY;
goto cleanup;
}
/* Area for the string starts after PNP_DEVICE_ID struct */
cls->string =
ACPI_ADD_PTR(char, cls, sizeof(struct acpi_pnp_device_id));
/* Simply copy existing string */
acpi_ex_pci_cls_to_string(cls->string, class_code);
cls->length = length;
*return_id = cls;
cleanup:
/* On exit, we must delete the return object */
acpi_ut_remove_reference(obj_desc);
return_ACPI_STATUS(status);
}
...@@ -66,9 +66,9 @@ u8 acpi_ut_is_pci_root_bridge(char *id) ...@@ -66,9 +66,9 @@ u8 acpi_ut_is_pci_root_bridge(char *id)
* Check if this is a PCI root bridge. * Check if this is a PCI root bridge.
* ACPI 3.0+: check for a PCI Express root also. * ACPI 3.0+: check for a PCI Express root also.
*/ */
if (!(ACPI_STRCMP(id, if (!(strcmp(id,
PCI_ROOT_HID_STRING)) || PCI_ROOT_HID_STRING)) ||
!(ACPI_STRCMP(id, PCI_EXPRESS_ROOT_HID_STRING))) { !(strcmp(id, PCI_EXPRESS_ROOT_HID_STRING))) {
return (TRUE); return (TRUE);
} }
...@@ -97,7 +97,8 @@ u8 acpi_ut_is_aml_table(struct acpi_table_header *table) ...@@ -97,7 +97,8 @@ u8 acpi_ut_is_aml_table(struct acpi_table_header *table)
if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT) || if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT) ||
ACPI_COMPARE_NAME(table->signature, ACPI_SIG_PSDT) || ACPI_COMPARE_NAME(table->signature, ACPI_SIG_PSDT) ||
ACPI_COMPARE_NAME(table->signature, ACPI_SIG_SSDT)) { ACPI_COMPARE_NAME(table->signature, ACPI_SIG_SSDT) ||
ACPI_COMPARE_NAME(table->signature, ACPI_SIG_OSDT)) {
return (TRUE); return (TRUE);
} }
......
...@@ -232,8 +232,7 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name) ...@@ -232,8 +232,7 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name)
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
interface_info->name = interface_info->name = ACPI_ALLOCATE_ZEROED(strlen(interface_name) + 1);
ACPI_ALLOCATE_ZEROED(ACPI_STRLEN(interface_name) + 1);
if (!interface_info->name) { if (!interface_info->name) {
ACPI_FREE(interface_info); ACPI_FREE(interface_info);
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
...@@ -241,7 +240,7 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name) ...@@ -241,7 +240,7 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name)
/* Initialize new info and insert at the head of the global list */ /* Initialize new info and insert at the head of the global list */
ACPI_STRCPY(interface_info->name, interface_name); strcpy(interface_info->name, interface_name);
interface_info->flags = ACPI_OSI_DYNAMIC; interface_info->flags = ACPI_OSI_DYNAMIC;
interface_info->next = acpi_gbl_supported_interfaces; interface_info->next = acpi_gbl_supported_interfaces;
...@@ -269,7 +268,7 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name) ...@@ -269,7 +268,7 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
previous_interface = next_interface = acpi_gbl_supported_interfaces; previous_interface = next_interface = acpi_gbl_supported_interfaces;
while (next_interface) { while (next_interface) {
if (!ACPI_STRCMP(interface_name, next_interface->name)) { if (!strcmp(interface_name, next_interface->name)) {
/* Found: name is in either the static list or was added at runtime */ /* Found: name is in either the static list or was added at runtime */
...@@ -373,7 +372,7 @@ struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name) ...@@ -373,7 +372,7 @@ struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name)
next_interface = acpi_gbl_supported_interfaces; next_interface = acpi_gbl_supported_interfaces;
while (next_interface) { while (next_interface) {
if (!ACPI_STRCMP(interface_name, next_interface->name)) { if (!strcmp(interface_name, next_interface->name)) {
return (next_interface); return (next_interface);
} }
......
...@@ -148,7 +148,7 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes) ...@@ -148,7 +148,7 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes)
u32 j; u32 j;
if (!expected_btypes) { if (!expected_btypes) {
ACPI_STRCPY(buffer, "NONE"); strcpy(buffer, "NONE");
return; return;
} }
...@@ -161,7 +161,7 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes) ...@@ -161,7 +161,7 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes)
/* If one of the expected types, concatenate the name of this type */ /* If one of the expected types, concatenate the name of this type */
if (expected_btypes & this_rtype) { if (expected_btypes & this_rtype) {
ACPI_STRCAT(buffer, &ut_rtype_names[i][j]); strcat(buffer, &ut_rtype_names[i][j]);
j = 0; /* Use name separator from now on */ j = 0; /* Use name separator from now on */
} }
......
...@@ -180,7 +180,7 @@ const char *acpi_ut_scan_number(const char *string, u64 *number_ptr) ...@@ -180,7 +180,7 @@ const char *acpi_ut_scan_number(const char *string, u64 *number_ptr)
{ {
u64 number = 0; u64 number = 0;
while (ACPI_IS_DIGIT(*string)) { while (isdigit((int)*string)) {
number *= 10; number *= 10;
number += *(string++) - '0'; number += *(string++) - '0';
} }
...@@ -405,7 +405,7 @@ acpi_ut_vsnprintf(char *string, ...@@ -405,7 +405,7 @@ acpi_ut_vsnprintf(char *string,
/* Process width */ /* Process width */
width = -1; width = -1;
if (ACPI_IS_DIGIT(*format)) { if (isdigit((int)*format)) {
format = acpi_ut_scan_number(format, &number); format = acpi_ut_scan_number(format, &number);
width = (s32) number; width = (s32) number;
} else if (*format == '*') { } else if (*format == '*') {
...@@ -422,7 +422,7 @@ acpi_ut_vsnprintf(char *string, ...@@ -422,7 +422,7 @@ acpi_ut_vsnprintf(char *string,
precision = -1; precision = -1;
if (*format == '.') { if (*format == '.') {
++format; ++format;
if (ACPI_IS_DIGIT(*format)) { if (isdigit((int)*format)) {
format = acpi_ut_scan_number(format, &number); format = acpi_ut_scan_number(format, &number);
precision = (s32) number; precision = (s32) number;
} else if (*format == '*') { } else if (*format == '*') {
......
...@@ -79,7 +79,7 @@ void acpi_ut_strlwr(char *src_string) ...@@ -79,7 +79,7 @@ void acpi_ut_strlwr(char *src_string)
/* Walk entire string, lowercasing the letters */ /* Walk entire string, lowercasing the letters */
for (string = src_string; *string; string++) { for (string = src_string; *string; string++) {
*string = (char)ACPI_TOLOWER(*string); *string = (char)tolower((int)*string);
} }
return; return;
...@@ -145,7 +145,7 @@ void acpi_ut_strupr(char *src_string) ...@@ -145,7 +145,7 @@ void acpi_ut_strupr(char *src_string)
/* Walk entire string, uppercasing the letters */ /* Walk entire string, uppercasing the letters */
for (string = src_string; *string; string++) { for (string = src_string; *string; string++) {
*string = (char)ACPI_TOUPPER(*string); *string = (char)toupper((int)*string);
} }
return; return;
...@@ -202,7 +202,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -202,7 +202,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
/* Skip over any white space in the buffer */ /* Skip over any white space in the buffer */
while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) { while ((*string) && (isspace((int)*string) || *string == '\t')) {
string++; string++;
} }
...@@ -211,7 +211,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -211,7 +211,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
* We need to determine if it is decimal or hexadecimal. * We need to determine if it is decimal or hexadecimal.
*/ */
if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) { if ((*string == '0') && (tolower((int)*(string + 1)) == 'x')) {
sign_of0x = 1; sign_of0x = 1;
base = 16; base = 16;
...@@ -224,7 +224,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -224,7 +224,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
/* Any string left? Check that '0x' is not followed by white space. */ /* Any string left? Check that '0x' is not followed by white space. */
if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') { if (!(*string) || isspace((int)*string) || *string == '\t') {
if (to_integer_op) { if (to_integer_op) {
goto error_exit; goto error_exit;
} else { } else {
...@@ -241,7 +241,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -241,7 +241,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
/* Main loop: convert the string to a 32- or 64-bit integer */ /* Main loop: convert the string to a 32- or 64-bit integer */
while (*string) { while (*string) {
if (ACPI_IS_DIGIT(*string)) { if (isdigit((int)*string)) {
/* Convert ASCII 0-9 to Decimal value */ /* Convert ASCII 0-9 to Decimal value */
...@@ -252,8 +252,8 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -252,8 +252,8 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
term = 1; term = 1;
} else { } else {
this_digit = (u8)ACPI_TOUPPER(*string); this_digit = (u8)toupper((int)*string);
if (ACPI_IS_XDIGIT((char)this_digit)) { if (isxdigit((int)this_digit)) {
/* Convert ASCII Hex char to value */ /* Convert ASCII Hex char to value */
...@@ -404,7 +404,7 @@ void acpi_ut_print_string(char *string, u16 max_length) ...@@ -404,7 +404,7 @@ void acpi_ut_print_string(char *string, u16 max_length)
/* Check for printable character or hex escape */ /* Check for printable character or hex escape */
if (ACPI_IS_PRINT(string[i])) { if (isprint((int)string[i])) {
/* This is a normal character */ /* This is a normal character */
acpi_os_printf("%c", (int)string[i]); acpi_os_printf("%c", (int)string[i]);
...@@ -609,22 +609,22 @@ void ut_convert_backslashes(char *pathname) ...@@ -609,22 +609,22 @@ void ut_convert_backslashes(char *pathname)
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source) u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
{ {
if (ACPI_STRLEN(source) >= dest_size) { if (strlen(source) >= dest_size) {
return (TRUE); return (TRUE);
} }
ACPI_STRCPY(dest, source); strcpy(dest, source);
return (FALSE); return (FALSE);
} }
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source) u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
{ {
if ((ACPI_STRLEN(dest) + ACPI_STRLEN(source)) >= dest_size) { if ((strlen(dest) + strlen(source)) >= dest_size) {
return (TRUE); return (TRUE);
} }
ACPI_STRCAT(dest, source); strcat(dest, source);
return (FALSE); return (FALSE);
} }
...@@ -635,14 +635,13 @@ acpi_ut_safe_strncat(char *dest, ...@@ -635,14 +635,13 @@ acpi_ut_safe_strncat(char *dest,
{ {
acpi_size actual_transfer_length; acpi_size actual_transfer_length;
actual_transfer_length = actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
ACPI_MIN(max_transfer_length, ACPI_STRLEN(source));
if ((ACPI_STRLEN(dest) + actual_transfer_length) >= dest_size) { if ((strlen(dest) + actual_transfer_length) >= dest_size) {
return (TRUE); return (TRUE);
} }
ACPI_STRNCAT(dest, source, max_transfer_length); strncat(dest, source, max_transfer_length);
return (FALSE); return (FALSE);
} }
#endif #endif
...@@ -100,7 +100,7 @@ acpi_ut_create_list(char *list_name, ...@@ -100,7 +100,7 @@ acpi_ut_create_list(char *list_name,
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list)); memset(cache, 0, sizeof(struct acpi_memory_list));
cache->list_name = list_name; cache->list_name = list_name;
cache->object_size = object_size; cache->object_size = object_size;
...@@ -402,7 +402,7 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *allocation, ...@@ -402,7 +402,7 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *allocation,
allocation->component = component; allocation->component = component;
allocation->line = line; allocation->line = line;
ACPI_STRNCPY(allocation->module, module, ACPI_MAX_MODULE_NAME); strncpy(allocation->module, module, ACPI_MAX_MODULE_NAME);
allocation->module[ACPI_MAX_MODULE_NAME - 1] = 0; allocation->module[ACPI_MAX_MODULE_NAME - 1] = 0;
if (!element) { if (!element) {
...@@ -497,7 +497,7 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation, ...@@ -497,7 +497,7 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
/* Mark the segment as deleted */ /* Mark the segment as deleted */
ACPI_MEMSET(&allocation->user_space, 0xEA, allocation->size); memset(&allocation->user_space, 0xEA, allocation->size);
status = acpi_ut_release_mutex(ACPI_MTX_MEMORY); status = acpi_ut_release_mutex(ACPI_MTX_MEMORY);
return (status); return (status);
...@@ -595,7 +595,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) ...@@ -595,7 +595,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
while (element) { while (element) {
if ((element->component & component) && if ((element->component & component) &&
((module == NULL) ((module == NULL)
|| (0 == ACPI_STRCMP(module, element->module)))) { || (0 == strcmp(module, element->module)))) {
descriptor = descriptor =
ACPI_CAST_PTR(union acpi_descriptor, ACPI_CAST_PTR(union acpi_descriptor,
&element->user_space); &element->user_space);
......
...@@ -234,8 +234,8 @@ acpi_status acpi_get_statistics(struct acpi_statistics *stats) ...@@ -234,8 +234,8 @@ acpi_status acpi_get_statistics(struct acpi_statistics *stats)
stats->sci_count = acpi_sci_count; stats->sci_count = acpi_sci_count;
stats->gpe_count = acpi_gpe_count; stats->gpe_count = acpi_gpe_count;
ACPI_MEMCPY(stats->fixed_event_count, acpi_fixed_event_count, memcpy(stats->fixed_event_count, acpi_fixed_event_count,
sizeof(acpi_fixed_event_count)); sizeof(acpi_fixed_event_count));
/* Other counters */ /* Other counters */
...@@ -322,7 +322,7 @@ acpi_status acpi_install_interface(acpi_string interface_name) ...@@ -322,7 +322,7 @@ acpi_status acpi_install_interface(acpi_string interface_name)
/* Parameter validation */ /* Parameter validation */
if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) { if (!interface_name || (strlen(interface_name) == 0)) {
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
...@@ -374,7 +374,7 @@ acpi_status acpi_remove_interface(acpi_string interface_name) ...@@ -374,7 +374,7 @@ acpi_status acpi_remove_interface(acpi_string interface_name)
/* Parameter validation */ /* Parameter validation */
if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) { if (!interface_name || (strlen(interface_name) == 0)) {
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
......
...@@ -179,10 +179,12 @@ acpi_status __init acpi_enable_subsystem(u32 flags) ...@@ -179,10 +179,12 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
* Obtain a permanent mapping for the FACS. This is required for the * Obtain a permanent mapping for the FACS. This is required for the
* Global Lock and the Firmware Waking Vector * Global Lock and the Firmware Waking Vector
*/ */
status = acpi_tb_initialize_facs(); if (!(flags & ACPI_NO_FACS_INIT)) {
if (ACPI_FAILURE(status)) { status = acpi_tb_initialize_facs();
ACPI_WARNING((AE_INFO, "Could not map the FACS table")); if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
return_ACPI_STATUS(status);
}
} }
#endif /* !ACPI_REDUCED_HARDWARE */ #endif /* !ACPI_REDUCED_HARDWARE */
......
...@@ -162,6 +162,15 @@ static int __init dmi_disable_osi_win8(const struct dmi_system_id *d) ...@@ -162,6 +162,15 @@ static int __init dmi_disable_osi_win8(const struct dmi_system_id *d)
acpi_osi_setup("!Windows 2012"); acpi_osi_setup("!Windows 2012");
return 0; return 0;
} }
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
{
printk(KERN_NOTICE PREFIX "DMI detected: %s (force ACPI _REV to 5)\n",
d->ident);
acpi_rev_override_setup(NULL);
return 0;
}
#endif
static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
{ {
...@@ -325,6 +334,23 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { ...@@ -325,6 +334,23 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"), DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"),
}, },
}, },
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
/*
* DELL XPS 13 (2015) switches sound between HDA and I2S
* depending on the ACPI _REV callback. If userspace supports
* I2S sufficiently (or if you do not care about sound), you
* can safely disable this quirk.
*/
{
.callback = dmi_enable_rev_override,
.ident = "DELL XPS 13 (2015)",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343"),
},
},
#endif
{} {}
}; };
......
...@@ -58,6 +58,7 @@ void acpi_cmos_rtc_init(void); ...@@ -58,6 +58,7 @@ void acpi_cmos_rtc_init(void);
#else #else
static inline void acpi_cmos_rtc_init(void) {} static inline void acpi_cmos_rtc_init(void) {}
#endif #endif
int acpi_rev_override_setup(char *str);
extern bool acpi_force_hot_remove; extern bool acpi_force_hot_remove;
......
...@@ -530,6 +530,19 @@ acpi_os_get_physical_address(void *virt, acpi_physical_address * phys) ...@@ -530,6 +530,19 @@ acpi_os_get_physical_address(void *virt, acpi_physical_address * phys)
} }
#endif #endif
#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
static bool acpi_rev_override;
int __init acpi_rev_override_setup(char *str)
{
acpi_rev_override = true;
return 1;
}
__setup("acpi_rev_override", acpi_rev_override_setup);
#else
#define acpi_rev_override false
#endif
#define ACPI_MAX_OVERRIDE_LEN 100 #define ACPI_MAX_OVERRIDE_LEN 100
static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN]; static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
...@@ -548,6 +561,11 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val, ...@@ -548,6 +561,11 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
*new_val = acpi_os_name; *new_val = acpi_os_name;
} }
if (!memcmp(init_val->name, "_REV", 4) && acpi_rev_override) {
printk(KERN_INFO PREFIX "Overriding _REV return value to 5\n");
*new_val = (char *)5;
}
return AE_OK; return AE_OK;
} }
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#define METHOD_NAME__BBN "_BBN" #define METHOD_NAME__BBN "_BBN"
#define METHOD_NAME__CBA "_CBA" #define METHOD_NAME__CBA "_CBA"
#define METHOD_NAME__CID "_CID" #define METHOD_NAME__CID "_CID"
#define METHOD_NAME__CLS "_CLS"
#define METHOD_NAME__CRS "_CRS" #define METHOD_NAME__CRS "_CRS"
#define METHOD_NAME__DDN "_DDN" #define METHOD_NAME__DDN "_DDN"
#define METHOD_NAME__HID "_HID" #define METHOD_NAME__HID "_HID"
......
...@@ -294,8 +294,12 @@ ...@@ -294,8 +294,12 @@
/* DEBUG_PRINT functions */ /* DEBUG_PRINT functions */
#define ACPI_DEBUG_PRINT(plist) ACPI_ACTUAL_DEBUG plist #ifndef COMPILER_VA_MACRO
#define ACPI_DEBUG_PRINT_RAW(plist) ACPI_ACTUAL_DEBUG_RAW plist
#define ACPI_DEBUG_PRINT(plist) acpi_debug_print plist
#define ACPI_DEBUG_PRINT_RAW(plist) acpi_debug_print_raw plist
#else
/* Helper macros for DEBUG_PRINT */ /* Helper macros for DEBUG_PRINT */
...@@ -315,6 +319,11 @@ ...@@ -315,6 +319,11 @@
ACPI_DO_DEBUG_PRINT (acpi_debug_print_raw, level, line, \ ACPI_DO_DEBUG_PRINT (acpi_debug_print_raw, level, line, \
filename, modulename, component, __VA_ARGS__) filename, modulename, component, __VA_ARGS__)
#define ACPI_DEBUG_PRINT(plist) ACPI_ACTUAL_DEBUG plist
#define ACPI_DEBUG_PRINT_RAW(plist) ACPI_ACTUAL_DEBUG_RAW plist
#endif
/* /*
* Function entry tracing * Function entry tracing
* *
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20150515 #define ACPI_CA_VERSION 0x20150619
#include <acpi/acconfig.h> #include <acpi/acconfig.h>
#include <acpi/actypes.h> #include <acpi/actypes.h>
...@@ -195,9 +195,18 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE); ...@@ -195,9 +195,18 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE);
* address. Although ACPICA adheres to the ACPI specification which * address. Although ACPICA adheres to the ACPI specification which
* requires the use of the corresponding 64-bit address if it is non-zero, * requires the use of the corresponding 64-bit address if it is non-zero,
* some machines have been found to have a corrupted non-zero 64-bit * some machines have been found to have a corrupted non-zero 64-bit
* address. Default is TRUE, favor the 32-bit addresses. * address. Default is FALSE, do not favor the 32-bit addresses.
*/ */
ACPI_INIT_GLOBAL(u8, acpi_gbl_use32_bit_fadt_addresses, TRUE); ACPI_INIT_GLOBAL(u8, acpi_gbl_use32_bit_fadt_addresses, FALSE);
/*
* Optionally use 32-bit FACS table addresses.
* It is reported that some platforms fail to resume from system suspending
* if 64-bit FACS table address is selected:
* https://bugzilla.kernel.org/show_bug.cgi?id=74021
* Default is TRUE, favor the 32-bit addresses.
*/
ACPI_INIT_GLOBAL(u8, acpi_gbl_use32_bit_facs_addresses, TRUE);
/* /*
* Optionally truncate I/O addresses to 16 bits. Provides compatibility * Optionally truncate I/O addresses to 16 bits. Provides compatibility
...@@ -219,6 +228,11 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_auto_repair, FALSE); ...@@ -219,6 +228,11 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_auto_repair, FALSE);
*/ */
ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_ssdt_table_install, FALSE); ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_ssdt_table_install, FALSE);
/*
* Optionally enable runtime namespace override.
*/
ACPI_INIT_GLOBAL(u8, acpi_gbl_runtime_namespace_override, TRUE);
/* /*
* We keep track of the latest version of Windows that has been requested by * We keep track of the latest version of Windows that has been requested by
* the BIOS. ACPI 5.0. * the BIOS. ACPI 5.0.
...@@ -814,8 +828,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ...@@ -814,8 +828,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_leave_sleep_state(u8 sleep_state)) ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_leave_sleep_state(u8 sleep_state))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_set_firmware_waking_vector(u32 acpi_set_firmware_waking_vectors
physical_address)) (acpi_physical_address physical_address,
acpi_physical_address physical_address64))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_set_firmware_waking_vector(u32
physical_address))
#if ACPI_MACHINE_WIDTH == 64 #if ACPI_MACHINE_WIDTH == 64
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_set_firmware_waking_vector64(u64 acpi_set_firmware_waking_vector64(u64
......
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
#define ACPI_SIG_DSDT "DSDT" /* Differentiated System Description Table */ #define ACPI_SIG_DSDT "DSDT" /* Differentiated System Description Table */
#define ACPI_SIG_FADT "FACP" /* Fixed ACPI Description Table */ #define ACPI_SIG_FADT "FACP" /* Fixed ACPI Description Table */
#define ACPI_SIG_FACS "FACS" /* Firmware ACPI Control Structure */ #define ACPI_SIG_FACS "FACS" /* Firmware ACPI Control Structure */
#define ACPI_SIG_OSDT "OSDT" /* Override System Description Table */
#define ACPI_SIG_PSDT "PSDT" /* Persistent System Description Table */ #define ACPI_SIG_PSDT "PSDT" /* Persistent System Description Table */
#define ACPI_SIG_RSDP "RSD PTR " /* Root System Description Pointer */ #define ACPI_SIG_RSDP "RSD PTR " /* Root System Description Pointer */
#define ACPI_SIG_RSDT "RSDT" /* Root System Description Table */ #define ACPI_SIG_RSDT "RSDT" /* Root System Description Table */
......
...@@ -835,6 +835,17 @@ struct acpi_madt_generic_distributor { ...@@ -835,6 +835,17 @@ struct acpi_madt_generic_distributor {
u8 reserved2[3]; /* reserved - must be zero */ u8 reserved2[3]; /* reserved - must be zero */
}; };
/* Values for Version field above */
enum acpi_madt_gic_version {
ACPI_MADT_GIC_VERSION_NONE = 0,
ACPI_MADT_GIC_VERSION_V1 = 1,
ACPI_MADT_GIC_VERSION_V2 = 2,
ACPI_MADT_GIC_VERSION_V3 = 3,
ACPI_MADT_GIC_VERSION_V4 = 4,
ACPI_MADT_GIC_VERSION_RESERVED = 5 /* 5 and greater are reserved */
};
/* 13: Generic MSI Frame (ACPI 5.1) */ /* 13: Generic MSI Frame (ACPI 5.1) */
struct acpi_madt_generic_msi_frame { struct acpi_madt_generic_msi_frame {
......
...@@ -51,8 +51,8 @@ ...@@ -51,8 +51,8 @@
* These tables are not consumed directly by the ACPICA subsystem, but are * These tables are not consumed directly by the ACPICA subsystem, but are
* included here to support device drivers and the AML disassembler. * included here to support device drivers and the AML disassembler.
* *
* The tables in this file are defined by third-party specifications, and are * Generally, the tables in this file are defined by third-party specifications,
* not defined directly by the ACPI specification itself. * and are not defined directly by the ACPI specification itself.
* *
******************************************************************************/ ******************************************************************************/
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
#define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */ #define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */
#define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */ #define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */
#define ACPI_SIG_TCPA "TCPA" /* Trusted Computing Platform Alliance table */ #define ACPI_SIG_TCPA "TCPA" /* Trusted Computing Platform Alliance table */
#define ACPI_SIG_TPM2 "TPM2" /* Trusted Platform Module 2.0 H/W interface table */
#define ACPI_SIG_UEFI "UEFI" /* Uefi Boot Optimization Table */ #define ACPI_SIG_UEFI "UEFI" /* Uefi Boot Optimization Table */
#define ACPI_SIG_VRTC "VRTC" /* Virtual Real Time Clock Table */ #define ACPI_SIG_VRTC "VRTC" /* Virtual Real Time Clock Table */
#define ACPI_SIG_WAET "WAET" /* Windows ACPI Emulated devices Table */ #define ACPI_SIG_WAET "WAET" /* Windows ACPI Emulated devices Table */
...@@ -1179,20 +1180,85 @@ enum acpi_spmi_interface_types { ...@@ -1179,20 +1180,85 @@ enum acpi_spmi_interface_types {
/******************************************************************************* /*******************************************************************************
* *
* TCPA - Trusted Computing Platform Alliance table * TCPA - Trusted Computing Platform Alliance table
* Version 1 * Version 2
*
* Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
* December 19, 2014
* *
* Conforms to "TCG PC Specific Implementation Specification", * NOTE: There are two versions of the table with the same signature --
* Version 1.1, August 18, 2003 * the client version and the server version.
* *
******************************************************************************/ ******************************************************************************/
struct acpi_table_tcpa { struct acpi_table_tcpa_client {
struct acpi_table_header header; /* Common ACPI table header */ struct acpi_table_header header; /* Common ACPI table header */
u16 platform_class;
u32 minimum_log_length; /* Minimum length for the event log area */
u64 log_address; /* Address of the event log area */
};
struct acpi_table_tcpa_server {
struct acpi_table_header header; /* Common ACPI table header */
u16 platform_class;
u16 reserved; u16 reserved;
u32 max_log_length; /* Maximum length for the event log area */ u64 minimum_log_length; /* Minimum length for the event log area */
u64 log_address; /* Address of the event log area */ u64 log_address; /* Address of the event log area */
u16 spec_revision;
u8 device_flags;
u8 interrupt_flags;
u8 gpe_number;
u8 reserved2[3];
u32 global_interrupt;
struct acpi_generic_address address;
u32 reserved3;
struct acpi_generic_address config_address;
u8 group;
u8 bus; /* PCI Bus/Segment/Function numbers */
u8 device;
u8 function;
};
/* Values for device_flags above */
#define ACPI_TCPA_PCI_DEVICE (1)
#define ACPI_TCPA_BUS_PNP (1<<1)
#define ACPI_TCPA_ADDRESS_VALID (1<<2)
/* Values for interrupt_flags above */
#define ACPI_TCPA_INTERRUPT_MODE (1)
#define ACPI_TCPA_INTERRUPT_POLARITY (1<<1)
#define ACPI_TCPA_SCI_VIA_GPE (1<<2)
#define ACPI_TCPA_GLOBAL_INTERRUPT (1<<3)
/*******************************************************************************
*
* TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table
* Version 4
*
* Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
* December 19, 2014
*
******************************************************************************/
struct acpi_table_tpm2 {
struct acpi_table_header header; /* Common ACPI table header */
u16 platform_class;
u16 reserved;
u64 control_address;
u32 start_method;
/* Platform-specific data follows */
}; };
/* Values for start_method above */
#define ACPI_TPM2_NOT_ALLOWED 0
#define ACPI_TPM2_START_METHOD 2
#define ACPI_TPM2_MEMORY_MAPPED 6
#define ACPI_TPM2_COMMAND_BUFFER 7
#define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD 8
/******************************************************************************* /*******************************************************************************
* *
* UEFI - UEFI Boot optimization Table * UEFI - UEFI Boot optimization Table
......
...@@ -51,7 +51,8 @@ ...@@ -51,7 +51,8 @@
* These tables are not consumed directly by the ACPICA subsystem, but are * These tables are not consumed directly by the ACPICA subsystem, but are
* included here to support device drivers and the AML disassembler. * included here to support device drivers and the AML disassembler.
* *
* The tables in this file are fully defined within the ACPI specification. * In general, the tables in this file are fully defined within the ACPI
* specification.
* *
******************************************************************************/ ******************************************************************************/
...@@ -69,7 +70,6 @@ ...@@ -69,7 +70,6 @@
#define ACPI_SIG_PMTT "PMTT" /* Platform Memory Topology Table */ #define ACPI_SIG_PMTT "PMTT" /* Platform Memory Topology Table */
#define ACPI_SIG_RASF "RASF" /* RAS Feature table */ #define ACPI_SIG_RASF "RASF" /* RAS Feature table */
#define ACPI_SIG_STAO "STAO" /* Status Override table */ #define ACPI_SIG_STAO "STAO" /* Status Override table */
#define ACPI_SIG_TPM2 "TPM2" /* Trusted Platform Module 2.0 H/W interface table */
#define ACPI_SIG_WPBT "WPBT" /* Windows Platform Binary Table */ #define ACPI_SIG_WPBT "WPBT" /* Windows Platform Binary Table */
#define ACPI_SIG_XENV "XENV" /* Xen Environment table */ #define ACPI_SIG_XENV "XENV" /* Xen Environment table */
...@@ -720,36 +720,6 @@ struct acpi_table_stao { ...@@ -720,36 +720,6 @@ struct acpi_table_stao {
u8 ignore_uart; u8 ignore_uart;
}; };
/*******************************************************************************
*
* TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table
* Version 3
*
* Conforms to "TPM 2.0 Hardware Interface Table (TPM2)" 29 November 2011
*
******************************************************************************/
struct acpi_table_tpm2 {
struct acpi_table_header header; /* Common ACPI table header */
u32 flags;
u64 control_address;
u32 start_method;
};
/* Control area structure (not part of table, pointed to by control_address) */
struct acpi_tpm2_control {
u32 reserved;
u32 error;
u32 cancel;
u32 start;
u64 interrupt_control;
u32 command_size;
u64 command_address;
u32 response_size;
u64 response_address;
};
/******************************************************************************* /*******************************************************************************
* *
* WPBT - Windows Platform Environment Table (ACPI 6.0) * WPBT - Windows Platform Environment Table (ACPI 6.0)
......
...@@ -542,14 +542,14 @@ typedef u64 acpi_integer; ...@@ -542,14 +542,14 @@ typedef u64 acpi_integer;
#define ACPI_COMPARE_NAME(a,b) (*ACPI_CAST_PTR (u32, (a)) == *ACPI_CAST_PTR (u32, (b))) #define ACPI_COMPARE_NAME(a,b) (*ACPI_CAST_PTR (u32, (a)) == *ACPI_CAST_PTR (u32, (b)))
#define ACPI_MOVE_NAME(dest,src) (*ACPI_CAST_PTR (u32, (dest)) = *ACPI_CAST_PTR (u32, (src))) #define ACPI_MOVE_NAME(dest,src) (*ACPI_CAST_PTR (u32, (dest)) = *ACPI_CAST_PTR (u32, (src)))
#else #else
#define ACPI_COMPARE_NAME(a,b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_CAST_PTR (char, (b)), ACPI_NAME_SIZE)) #define ACPI_COMPARE_NAME(a,b) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_CAST_PTR (char, (b)), ACPI_NAME_SIZE))
#define ACPI_MOVE_NAME(dest,src) (ACPI_STRNCPY (ACPI_CAST_PTR (char, (dest)), ACPI_CAST_PTR (char, (src)), ACPI_NAME_SIZE)) #define ACPI_MOVE_NAME(dest,src) (strncpy (ACPI_CAST_PTR (char, (dest)), ACPI_CAST_PTR (char, (src)), ACPI_NAME_SIZE))
#endif #endif
/* Support for the special RSDP signature (8 characters) */ /* Support for the special RSDP signature (8 characters) */
#define ACPI_VALIDATE_RSDP_SIG(a) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8)) #define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
#define ACPI_MAKE_RSDP_SIG(dest) (ACPI_MEMCPY (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8)) #define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
/******************************************************************************* /*******************************************************************************
* *
...@@ -568,6 +568,7 @@ typedef u64 acpi_integer; ...@@ -568,6 +568,7 @@ typedef u64 acpi_integer;
#define ACPI_NO_ACPI_ENABLE 0x10 #define ACPI_NO_ACPI_ENABLE 0x10
#define ACPI_NO_DEVICE_INIT 0x20 #define ACPI_NO_DEVICE_INIT 0x20
#define ACPI_NO_OBJECT_INIT 0x40 #define ACPI_NO_OBJECT_INIT 0x40
#define ACPI_NO_FACS_INIT 0x80
/* /*
* Initialization state * Initialization state
...@@ -1140,6 +1141,10 @@ u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported); ...@@ -1140,6 +1141,10 @@ u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported);
#define ACPI_UUID_LENGTH 16 #define ACPI_UUID_LENGTH 16
/* Length of 3-byte PCI class code values when converted back to a string */
#define ACPI_PCICLS_STRING_SIZE 7 /* Includes null terminator */
/* Structures used for device/processor HID, UID, CID, and SUB */ /* Structures used for device/processor HID, UID, CID, and SUB */
struct acpi_pnp_device_id { struct acpi_pnp_device_id {
...@@ -1162,7 +1167,7 @@ struct acpi_device_info { ...@@ -1162,7 +1167,7 @@ struct acpi_device_info {
u32 name; /* ACPI object Name */ u32 name; /* ACPI object Name */
acpi_object_type type; /* ACPI object Type */ acpi_object_type type; /* ACPI object Type */
u8 param_count; /* If a method, required parameter count */ u8 param_count; /* If a method, required parameter count */
u8 valid; /* Indicates which optional fields are valid */ u16 valid; /* Indicates which optional fields are valid */
u8 flags; /* Miscellaneous info */ u8 flags; /* Miscellaneous info */
u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */ u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */ u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
...@@ -1171,6 +1176,7 @@ struct acpi_device_info { ...@@ -1171,6 +1176,7 @@ struct acpi_device_info {
struct acpi_pnp_device_id hardware_id; /* _HID value */ struct acpi_pnp_device_id hardware_id; /* _HID value */
struct acpi_pnp_device_id unique_id; /* _UID value */ struct acpi_pnp_device_id unique_id; /* _UID value */
struct acpi_pnp_device_id subsystem_id; /* _SUB value */ struct acpi_pnp_device_id subsystem_id; /* _SUB value */
struct acpi_pnp_device_id class_code; /* _CLS value */
struct acpi_pnp_device_id_list compatible_id_list; /* _CID list <must be last> */ struct acpi_pnp_device_id_list compatible_id_list; /* _CID list <must be last> */
}; };
...@@ -1180,14 +1186,15 @@ struct acpi_device_info { ...@@ -1180,14 +1186,15 @@ struct acpi_device_info {
/* Flags for Valid field above (acpi_get_object_info) */ /* Flags for Valid field above (acpi_get_object_info) */
#define ACPI_VALID_STA 0x01 #define ACPI_VALID_STA 0x0001
#define ACPI_VALID_ADR 0x02 #define ACPI_VALID_ADR 0x0002
#define ACPI_VALID_HID 0x04 #define ACPI_VALID_HID 0x0004
#define ACPI_VALID_UID 0x08 #define ACPI_VALID_UID 0x0008
#define ACPI_VALID_SUB 0x10 #define ACPI_VALID_SUB 0x0010
#define ACPI_VALID_CID 0x20 #define ACPI_VALID_CID 0x0020
#define ACPI_VALID_SXDS 0x40 #define ACPI_VALID_CLS 0x0040
#define ACPI_VALID_SXWS 0x80 #define ACPI_VALID_SXDS 0x0100
#define ACPI_VALID_SXWS 0x0200
/* Flags for _STA return value (current_status above) */ /* Flags for _STA return value (current_status above) */
......
...@@ -346,29 +346,6 @@ ...@@ -346,29 +346,6 @@
/* We will be linking to the standard Clib functions */ /* We will be linking to the standard Clib functions */
#define ACPI_STRSTR(s1,s2) strstr((s1), (s2))
#define ACPI_STRCHR(s1,c) strchr((s1), (c))
#define ACPI_STRLEN(s) (acpi_size) strlen((s))
#define ACPI_STRCPY(d,s) (void) strcpy((d), (s))
#define ACPI_STRNCPY(d,s,n) (void) strncpy((d), (s), (acpi_size)(n))
#define ACPI_STRNCMP(d,s,n) strncmp((d), (s), (acpi_size)(n))
#define ACPI_STRCMP(d,s) strcmp((d), (s))
#define ACPI_STRCAT(d,s) (void) strcat((d), (s))
#define ACPI_STRNCAT(d,s,n) strncat((d), (s), (acpi_size)(n))
#define ACPI_STRTOUL(d,s,n) strtoul((d), (s), (acpi_size)(n))
#define ACPI_MEMCMP(s1,s2,n) memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
#define ACPI_MEMCPY(d,s,n) (void) memcpy((d), (s), (acpi_size)(n))
#define ACPI_MEMSET(d,s,n) (void) memset((d), (s), (acpi_size)(n))
#define ACPI_TOUPPER(i) toupper((int) (i))
#define ACPI_TOLOWER(i) tolower((int) (i))
#define ACPI_IS_XDIGIT(i) isxdigit((int) (i))
#define ACPI_IS_DIGIT(i) isdigit((int) (i))
#define ACPI_IS_SPACE(i) isspace((int) (i))
#define ACPI_IS_UPPER(i) isupper((int) (i))
#define ACPI_IS_PRINT(i) isprint((int) (i))
#define ACPI_IS_ALPHA(i) isalpha((int) (i))
#else #else
/****************************************************************************** /******************************************************************************
...@@ -406,22 +383,6 @@ typedef char *va_list; ...@@ -406,22 +383,6 @@ typedef char *va_list;
/* Use the local (ACPICA) definitions of the clib functions */ /* Use the local (ACPICA) definitions of the clib functions */
#define ACPI_STRSTR(s1,s2) acpi_ut_strstr ((s1), (s2))
#define ACPI_STRCHR(s1,c) acpi_ut_strchr ((s1), (c))
#define ACPI_STRLEN(s) (acpi_size) acpi_ut_strlen ((s))
#define ACPI_STRCPY(d,s) (void) acpi_ut_strcpy ((d), (s))
#define ACPI_STRNCPY(d,s,n) (void) acpi_ut_strncpy ((d), (s), (acpi_size)(n))
#define ACPI_STRNCMP(d,s,n) acpi_ut_strncmp ((d), (s), (acpi_size)(n))
#define ACPI_STRCMP(d,s) acpi_ut_strcmp ((d), (s))
#define ACPI_STRCAT(d,s) (void) acpi_ut_strcat ((d), (s))
#define ACPI_STRNCAT(d,s,n) acpi_ut_strncat ((d), (s), (acpi_size)(n))
#define ACPI_STRTOUL(d,s,n) acpi_ut_strtoul ((d), (s), (acpi_size)(n))
#define ACPI_MEMCMP(s1,s2,n) acpi_ut_memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
#define ACPI_MEMCPY(d,s,n) (void) acpi_ut_memcpy ((d), (s), (acpi_size)(n))
#define ACPI_MEMSET(d,v,n) (void) acpi_ut_memset ((d), (v), (acpi_size)(n))
#define ACPI_TOUPPER(c) acpi_ut_to_upper ((int) (c))
#define ACPI_TOLOWER(c) acpi_ut_to_lower ((int) (c))
#endif /* ACPI_USE_SYSTEM_CLIBRARY */ #endif /* ACPI_USE_SYSTEM_CLIBRARY */
#ifndef ACPI_FILE #ifndef ACPI_FILE
......
...@@ -56,6 +56,12 @@ ...@@ -56,6 +56,12 @@
#if defined(_LINUX) || defined(__linux__) #if defined(_LINUX) || defined(__linux__)
#include <acpi/platform/aclinuxex.h> #include <acpi/platform/aclinuxex.h>
#elif defined(_AED_EFI)
#include "acefiex.h"
#elif defined(_GNU_EFI)
#include "acefiex.h"
#elif defined(__DragonFly__) #elif defined(__DragonFly__)
#include "acdragonflyex.h" #include "acdragonflyex.h"
......
...@@ -75,4 +75,8 @@ ...@@ -75,4 +75,8 @@
#undef strchr #undef strchr
#endif #endif
/* GCC supports __VA_ARGS__ in macros */
#define COMPILER_VA_MACRO 1
#endif /* __ACGCC_H__ */ #endif /* __ACGCC_H__ */
...@@ -127,7 +127,7 @@ int acpi_getopt(int argc, char **argv, char *opts) ...@@ -127,7 +127,7 @@ int acpi_getopt(int argc, char **argv, char *opts)
argv[acpi_gbl_optind][0] != '-' || argv[acpi_gbl_optind][0] != '-' ||
argv[acpi_gbl_optind][1] == '\0') { argv[acpi_gbl_optind][1] == '\0') {
return (ACPI_OPT_END); return (ACPI_OPT_END);
} else if (ACPI_STRCMP(argv[acpi_gbl_optind], "--") == 0) { } else if (strcmp(argv[acpi_gbl_optind], "--") == 0) {
acpi_gbl_optind++; acpi_gbl_optind++;
return (ACPI_OPT_END); return (ACPI_OPT_END);
} }
...@@ -140,7 +140,7 @@ int acpi_getopt(int argc, char **argv, char *opts) ...@@ -140,7 +140,7 @@ int acpi_getopt(int argc, char **argv, char *opts)
/* Make sure that the option is legal */ /* Make sure that the option is legal */
if (current_char == ':' || if (current_char == ':' ||
(opts_ptr = ACPI_STRCHR(opts, current_char)) == NULL) { (opts_ptr = strchr(opts, current_char)) == NULL) {
ACPI_OPTION_ERROR("Illegal option: -", current_char); ACPI_OPTION_ERROR("Illegal option: -", current_char);
if (argv[acpi_gbl_optind][++current_char_ptr] == '\0') { if (argv[acpi_gbl_optind][++current_char_ptr] == '\0') {
......
...@@ -22,9 +22,6 @@ acpidump options are as follow: ...@@ -22,9 +22,6 @@ acpidump options are as follow:
.B \-b .B \-b
Dump tables to binary files Dump tables to binary files
.TP .TP
.B \-c
Dump customized tables
.TP
.B \-h \-? .B \-h \-?
This help message This help message
.TP .TP
...@@ -48,15 +45,25 @@ Verbose mode ...@@ -48,15 +45,25 @@ Verbose mode
.B \-a <Address> .B \-a <Address>
Get table via a physical address Get table via a physical address
.TP .TP
.B \-c <on|off>
Turning on/off customized table dumping
.TP
.B \-f <BinaryFile> .B \-f <BinaryFile>
Get table via a binary file Get table via a binary file
.TP .TP
.B \-n <Signature> .B \-n <Signature>
Get table via a name/signature Get table via a name/signature
.TP .TP
Invocation without parameters dumps all available tables .B \-x
Do not use but dump XSDT
.TP
.B \-x \-x
Do not use or dump XSDT
.TP
.fi
Invocation without parameters dumps all available tables.
.TP .TP
Multiple mixed instances of -a, -f, and -n are supported Multiple mixed instances of -a, -f, and -n are supported.
.SH EXAMPLES .SH EXAMPLES
......
...@@ -222,7 +222,7 @@ acpi_os_get_table_by_address(acpi_physical_address address, ...@@ -222,7 +222,7 @@ acpi_os_get_table_by_address(acpi_physical_address address,
goto exit; goto exit;
} }
ACPI_MEMCPY(local_table, mapped_table, table_length); memcpy(local_table, mapped_table, table_length);
exit: exit:
osl_unmap_table(mapped_table); osl_unmap_table(mapped_table);
...@@ -531,7 +531,7 @@ static acpi_status osl_load_rsdp(void) ...@@ -531,7 +531,7 @@ static acpi_status osl_load_rsdp(void)
gbl_rsdp_address = gbl_rsdp_address =
rsdp_base + (ACPI_CAST8(mapped_table) - rsdp_address); rsdp_base + (ACPI_CAST8(mapped_table) - rsdp_address);
ACPI_MEMCPY(&gbl_rsdp, mapped_table, sizeof(struct acpi_table_rsdp)); memcpy(&gbl_rsdp, mapped_table, sizeof(struct acpi_table_rsdp));
acpi_os_unmap_memory(rsdp_address, rsdp_size); acpi_os_unmap_memory(rsdp_address, rsdp_size);
return (AE_OK); return (AE_OK);
...@@ -582,64 +582,67 @@ static acpi_status osl_table_initialize(void) ...@@ -582,64 +582,67 @@ static acpi_status osl_table_initialize(void)
return (AE_OK); return (AE_OK);
} }
/* Get RSDP from memory */ if (!gbl_dump_customized_tables) {
status = osl_load_rsdp(); /* Get RSDP from memory */
if (ACPI_FAILURE(status)) {
return (status); status = osl_load_rsdp();
} if (ACPI_FAILURE(status)) {
return (status);
}
/* Get XSDT from memory */ /* Get XSDT from memory */
if (gbl_rsdp.revision && !gbl_do_not_dump_xsdt) { if (gbl_rsdp.revision && !gbl_do_not_dump_xsdt) {
if (gbl_xsdt) { if (gbl_xsdt) {
free(gbl_xsdt); free(gbl_xsdt);
gbl_xsdt = NULL; gbl_xsdt = NULL;
}
gbl_revision = 2;
status = osl_get_bios_table(ACPI_SIG_XSDT, 0,
ACPI_CAST_PTR(struct
acpi_table_header
*, &gbl_xsdt),
&address);
if (ACPI_FAILURE(status)) {
return (status);
}
} }
gbl_revision = 2; /* Get RSDT from memory */
status = osl_get_bios_table(ACPI_SIG_XSDT, 0,
ACPI_CAST_PTR(struct if (gbl_rsdp.rsdt_physical_address) {
acpi_table_header *, if (gbl_rsdt) {
&gbl_xsdt), &address); free(gbl_rsdt);
if (ACPI_FAILURE(status)) { gbl_rsdt = NULL;
return (status); }
status = osl_get_bios_table(ACPI_SIG_RSDT, 0,
ACPI_CAST_PTR(struct
acpi_table_header
*, &gbl_rsdt),
&address);
if (ACPI_FAILURE(status)) {
return (status);
}
} }
}
/* Get RSDT from memory */ /* Get FADT from memory */
if (gbl_rsdp.rsdt_physical_address) { if (gbl_fadt) {
if (gbl_rsdt) { free(gbl_fadt);
free(gbl_rsdt); gbl_fadt = NULL;
gbl_rsdt = NULL;
} }
status = osl_get_bios_table(ACPI_SIG_RSDT, 0, status = osl_get_bios_table(ACPI_SIG_FADT, 0,
ACPI_CAST_PTR(struct ACPI_CAST_PTR(struct
acpi_table_header *, acpi_table_header *,
&gbl_rsdt), &address); &gbl_fadt),
&gbl_fadt_address);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
}
/* Get FADT from memory */
if (gbl_fadt) {
free(gbl_fadt);
gbl_fadt = NULL;
}
status = osl_get_bios_table(ACPI_SIG_FADT, 0,
ACPI_CAST_PTR(struct acpi_table_header *,
&gbl_fadt),
&gbl_fadt_address);
if (ACPI_FAILURE(status)) {
return (status);
}
if (!gbl_dump_customized_tables) {
/* Add mandatory tables to global table list first */ /* Add mandatory tables to global table list first */
...@@ -961,7 +964,7 @@ osl_get_bios_table(char *signature, ...@@ -961,7 +964,7 @@ osl_get_bios_table(char *signature,
goto exit; goto exit;
} }
ACPI_MEMCPY(local_table, mapped_table, table_length); memcpy(local_table, mapped_table, table_length);
*address = table_address; *address = table_address;
*table = local_table; *table = local_table;
......
...@@ -54,7 +54,7 @@ ACPI_MODULE_NAME("osunixmap") ...@@ -54,7 +54,7 @@ ACPI_MODULE_NAME("osunixmap")
#ifndef O_BINARY #ifndef O_BINARY
#define O_BINARY 0 #define O_BINARY 0
#endif #endif
#ifdef _free_BSD #if defined(_dragon_fly) || defined(_free_BSD)
#define MMAP_FLAGS MAP_SHARED #define MMAP_FLAGS MAP_SHARED
#else #else
#define MMAP_FLAGS MAP_PRIVATE #define MMAP_FLAGS MAP_PRIVATE
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
EXTERN u8 INIT_GLOBAL(gbl_summary_mode, FALSE); EXTERN u8 INIT_GLOBAL(gbl_summary_mode, FALSE);
EXTERN u8 INIT_GLOBAL(gbl_verbose_mode, FALSE); EXTERN u8 INIT_GLOBAL(gbl_verbose_mode, FALSE);
EXTERN u8 INIT_GLOBAL(gbl_binary_mode, FALSE); EXTERN u8 INIT_GLOBAL(gbl_binary_mode, FALSE);
EXTERN u8 INIT_GLOBAL(gbl_dump_customized_tables, FALSE); EXTERN u8 INIT_GLOBAL(gbl_dump_customized_tables, TRUE);
EXTERN u8 INIT_GLOBAL(gbl_do_not_dump_xsdt, FALSE); EXTERN u8 INIT_GLOBAL(gbl_do_not_dump_xsdt, FALSE);
EXTERN ACPI_FILE INIT_GLOBAL(gbl_output_file, NULL); EXTERN ACPI_FILE INIT_GLOBAL(gbl_output_file, NULL);
EXTERN char INIT_GLOBAL(*gbl_output_filename, NULL); EXTERN char INIT_GLOBAL(*gbl_output_filename, NULL);
......
...@@ -329,7 +329,7 @@ int ap_dump_table_by_name(char *signature) ...@@ -329,7 +329,7 @@ int ap_dump_table_by_name(char *signature)
acpi_status status; acpi_status status;
int table_status; int table_status;
if (ACPI_STRLEN(signature) != ACPI_NAME_SIZE) { if (strlen(signature) != ACPI_NAME_SIZE) {
acpi_log_error acpi_log_error
("Invalid table signature [%s]: must be exactly 4 characters\n", ("Invalid table signature [%s]: must be exactly 4 characters\n",
signature); signature);
...@@ -338,15 +338,15 @@ int ap_dump_table_by_name(char *signature) ...@@ -338,15 +338,15 @@ int ap_dump_table_by_name(char *signature)
/* Table signatures are expected to be uppercase */ /* Table signatures are expected to be uppercase */
ACPI_STRCPY(local_signature, signature); strcpy(local_signature, signature);
acpi_ut_strupr(local_signature); acpi_ut_strupr(local_signature);
/* To be friendly, handle tables whose signatures do not match the name */ /* To be friendly, handle tables whose signatures do not match the name */
if (ACPI_COMPARE_NAME(local_signature, "FADT")) { if (ACPI_COMPARE_NAME(local_signature, "FADT")) {
ACPI_STRCPY(local_signature, ACPI_SIG_FADT); strcpy(local_signature, ACPI_SIG_FADT);
} else if (ACPI_COMPARE_NAME(local_signature, "MADT")) { } else if (ACPI_COMPARE_NAME(local_signature, "MADT")) {
ACPI_STRCPY(local_signature, ACPI_SIG_MADT); strcpy(local_signature, ACPI_SIG_MADT);
} }
/* Dump all instances of this signature (to handle multiple SSDTs) */ /* Dump all instances of this signature (to handle multiple SSDTs) */
......
...@@ -136,10 +136,10 @@ int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance) ...@@ -136,10 +136,10 @@ int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance)
} else { } else {
ACPI_MOVE_NAME(filename, table->signature); ACPI_MOVE_NAME(filename, table->signature);
} }
filename[0] = (char)ACPI_TOLOWER(filename[0]); filename[0] = (char)tolower((int)filename[0]);
filename[1] = (char)ACPI_TOLOWER(filename[1]); filename[1] = (char)tolower((int)filename[1]);
filename[2] = (char)ACPI_TOLOWER(filename[2]); filename[2] = (char)tolower((int)filename[2]);
filename[3] = (char)ACPI_TOLOWER(filename[3]); filename[3] = (char)tolower((int)filename[3]);
filename[ACPI_NAME_SIZE] = 0; filename[ACPI_NAME_SIZE] = 0;
/* Handle multiple SSDts - create different filenames for each */ /* Handle multiple SSDts - create different filenames for each */
...@@ -147,10 +147,10 @@ int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance) ...@@ -147,10 +147,10 @@ int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance)
if (instance > 0) { if (instance > 0) {
acpi_ut_snprintf(instance_str, sizeof(instance_str), "%u", acpi_ut_snprintf(instance_str, sizeof(instance_str), "%u",
instance); instance);
ACPI_STRCAT(filename, instance_str); strcat(filename, instance_str);
} }
ACPI_STRCAT(filename, ACPI_TABLE_FILE_SUFFIX); strcat(filename, ACPI_TABLE_FILE_SUFFIX);
if (gbl_verbose_mode) { if (gbl_verbose_mode) {
acpi_log_error acpi_log_error
......
...@@ -80,7 +80,7 @@ struct ap_dump_action action_table[AP_MAX_ACTIONS]; ...@@ -80,7 +80,7 @@ struct ap_dump_action action_table[AP_MAX_ACTIONS];
u32 current_action = 0; u32 current_action = 0;
#define AP_UTILITY_NAME "ACPI Binary Table Dump Utility" #define AP_UTILITY_NAME "ACPI Binary Table Dump Utility"
#define AP_SUPPORTED_OPTIONS "?a:bcf:hn:o:r:svxz" #define AP_SUPPORTED_OPTIONS "?a:bc:f:hn:o:r:svxz"
/****************************************************************************** /******************************************************************************
* *
...@@ -96,7 +96,6 @@ static void ap_display_usage(void) ...@@ -96,7 +96,6 @@ static void ap_display_usage(void)
ACPI_USAGE_HEADER("acpidump [options]"); ACPI_USAGE_HEADER("acpidump [options]");
ACPI_OPTION("-b", "Dump tables to binary files"); ACPI_OPTION("-b", "Dump tables to binary files");
ACPI_OPTION("-c", "Dump customized tables");
ACPI_OPTION("-h -?", "This help message"); ACPI_OPTION("-h -?", "This help message");
ACPI_OPTION("-o <File>", "Redirect output to file"); ACPI_OPTION("-o <File>", "Redirect output to file");
ACPI_OPTION("-r <Address>", "Dump tables from specified RSDP"); ACPI_OPTION("-r <Address>", "Dump tables from specified RSDP");
...@@ -107,6 +106,7 @@ static void ap_display_usage(void) ...@@ -107,6 +106,7 @@ static void ap_display_usage(void)
ACPI_USAGE_TEXT("\nTable Options:\n"); ACPI_USAGE_TEXT("\nTable Options:\n");
ACPI_OPTION("-a <Address>", "Get table via a physical address"); ACPI_OPTION("-a <Address>", "Get table via a physical address");
ACPI_OPTION("-c <on|off>", "Turning on/off customized table dumping");
ACPI_OPTION("-f <BinaryFile>", "Get table via a binary file"); ACPI_OPTION("-f <BinaryFile>", "Get table via a binary file");
ACPI_OPTION("-n <Signature>", "Get table via a name/signature"); ACPI_OPTION("-n <Signature>", "Get table via a name/signature");
ACPI_OPTION("-x", "Do not use but dump XSDT"); ACPI_OPTION("-x", "Do not use but dump XSDT");
...@@ -181,7 +181,16 @@ static int ap_do_options(int argc, char **argv) ...@@ -181,7 +181,16 @@ static int ap_do_options(int argc, char **argv)
case 'c': /* Dump customized tables */ case 'c': /* Dump customized tables */
gbl_dump_customized_tables = TRUE; if (!strcmp(acpi_gbl_optarg, "on")) {
gbl_dump_customized_tables = TRUE;
} else if (!strcmp(acpi_gbl_optarg, "off")) {
gbl_dump_customized_tables = FALSE;
} else {
acpi_log_error
("%s: Cannot handle this switch, please use on|off\n",
acpi_gbl_optarg);
return (-1);
}
continue; continue;
case 'h': case 'h':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment