提交 5af2b635 编写于 作者: B Bob Moore 提交者: Rafael J. Wysocki

ACPICA: Disassembler: Improve pathname support for emitted External() statements.

This change adds full pathname support for external names that have been
resolved internally by the inclusion of additional ACPI tables (via the
iASL -e option). Without this change, the disassembler can emit multiple
externals for the same object, or it become confused when the Scope()
operator is used on an external object.

Linux kernel behaviour is not affected as the structure changes and the
new invocations are only used by compiler and disassembler which are
not shipped in the kernel currently.
Reported-by: NMichael Tsirkin <mst@redhat.com>
Signed-off-by: NBob Moore <robert.moore@intel.com>
Signed-off-by: NLv Zheng <lv.zheng@intel.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 5076f005
...@@ -1038,15 +1038,16 @@ struct acpi_external_list { ...@@ -1038,15 +1038,16 @@ struct acpi_external_list {
struct acpi_external_list *next; struct acpi_external_list *next;
u32 value; u32 value;
u16 length; u16 length;
u16 flags;
u8 type; u8 type;
u8 flags;
u8 resolved;
u8 emitted;
}; };
/* Values for Flags field above */ /* Values for Flags field above */
#define ACPI_IPATH_ALLOCATED 0x01 #define ACPI_EXT_RESOLVED_REFERENCE 0x01 /* Object was resolved during cross ref */
#define ACPI_EXT_ORIGIN_FROM_FILE 0x02 /* External came from a file */
#define ACPI_EXT_INTERNAL_PATH_ALLOCATED 0x04 /* Deallocate internal path on completion */
#define ACPI_EXT_EXTERNAL_EMITTED 0x08 /* External() statement has been emitted */
struct acpi_external_file { struct acpi_external_file {
char *path; char *path;
......
...@@ -105,7 +105,7 @@ acpi_ds_create_external_region(acpi_status lookup_status, ...@@ -105,7 +105,7 @@ acpi_ds_create_external_region(acpi_status lookup_status,
* operation_region not found. Generate an External for it, and * operation_region not found. Generate an External for it, and
* insert the name into the namespace. * insert the name into the namespace.
*/ */
acpi_dm_add_to_external_list(op, path, ACPI_TYPE_REGION, 0); acpi_dm_add_op_to_external_list(op, path, ACPI_TYPE_REGION, 0, 0);
status = acpi_ns_lookup(walk_state->scope_info, path, ACPI_TYPE_REGION, status = acpi_ns_lookup(walk_state->scope_info, path, ACPI_TYPE_REGION,
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
walk_state, node); walk_state, node);
......
...@@ -181,8 +181,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -181,8 +181,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
* Target of Scope() not found. Generate an External for it, and * Target of Scope() not found. Generate an External for it, and
* insert the name into the namespace. * insert the name into the namespace.
*/ */
acpi_dm_add_to_external_list(op, path, ACPI_TYPE_DEVICE, acpi_dm_add_op_to_external_list(op, path,
0); ACPI_TYPE_DEVICE, 0, 0);
status = status =
acpi_ns_lookup(walk_state->scope_info, path, acpi_ns_lookup(walk_state->scope_info, path,
object_type, ACPI_IMODE_LOAD_PASS1, object_type, ACPI_IMODE_LOAD_PASS1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册