You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
ACPICA: Fixes for Unload and DDBHandles
Implemented support for the use of DDBHandles as an Indexed Reference, as per the ACPI spec. http://www.acpica.org/bugzilla/show_bug.cgi?id=486. Implemented support for UserTerm (Method invocation) for the Unload operator as per the ACPI spec. http://www.acpica.org/bugzilla/show_bug.cgi?id=580 Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
@@ -895,14 +895,25 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
|
||||
} else if (obj_desc->reference.object) {
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
|
||||
ACPI_DESC_TYPE_OPERAND) {
|
||||
acpi_os_printf(" Target: %p [%s]\n",
|
||||
obj_desc->reference.object,
|
||||
acpi_ut_get_type_name(((union
|
||||
acpi_operand_object
|
||||
*)obj_desc->
|
||||
reference.
|
||||
object)->common.
|
||||
type));
|
||||
acpi_os_printf(" Target: %p",
|
||||
obj_desc->reference.object);
|
||||
if (obj_desc->reference.opcode == AML_LOAD_OP) {
|
||||
/*
|
||||
* For DDBHandle reference,
|
||||
* obj_desc->Reference.Object is the table index
|
||||
*/
|
||||
acpi_os_printf(" [DDBHandle]\n");
|
||||
} else {
|
||||
acpi_os_printf(" [%s]\n",
|
||||
acpi_ut_get_type_name(((union
|
||||
acpi_operand_object
|
||||
*)
|
||||
obj_desc->
|
||||
reference.
|
||||
object)->
|
||||
common.
|
||||
type));
|
||||
}
|
||||
} else {
|
||||
acpi_os_printf(" Target: %p\n",
|
||||
obj_desc->reference.object);
|
||||
|
||||
@@ -382,10 +382,10 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
||||
}
|
||||
|
||||
/*
|
||||
* For reference objects created via the ref_of or Index operators,
|
||||
* we need to get to the base object (as per the ACPI specification
|
||||
* of the object_type and size_of operators). This means traversing
|
||||
* the list of possibly many nested references.
|
||||
* For reference objects created via the ref_of, Index, or Load/load_table
|
||||
* operators, we need to get to the base object (as per the ACPI
|
||||
* specification of the object_type and size_of operators). This means
|
||||
* traversing the list of possibly many nested references.
|
||||
*/
|
||||
while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
switch (obj_desc->reference.opcode) {
|
||||
@@ -455,6 +455,11 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
||||
}
|
||||
break;
|
||||
|
||||
case AML_LOAD_OP:
|
||||
|
||||
type = ACPI_TYPE_DDB_HANDLE;
|
||||
goto exit;
|
||||
|
||||
case AML_LOCAL_OP:
|
||||
case AML_ARG_OP:
|
||||
|
||||
|
||||
@@ -434,11 +434,24 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
|
||||
*/
|
||||
obj_desc = *(index_desc->reference.where);
|
||||
|
||||
status =
|
||||
acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE
|
||||
&& source_desc->reference.opcode == AML_LOAD_OP) {
|
||||
|
||||
/* This is a DDBHandle, just add a reference to it */
|
||||
|
||||
acpi_ut_add_reference(source_desc);
|
||||
new_desc = source_desc;
|
||||
} else {
|
||||
/* Normal object, copy it */
|
||||
|
||||
status =
|
||||
acpi_ut_copy_iobject_to_iobject(source_desc,
|
||||
&new_desc,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
if (obj_desc) {
|
||||
|
||||
Reference in New Issue
Block a user