ACPI_STATUS AcpiExStore ( ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT *DestDesc, ACPI_WALK_STATE *WalkState) { ACPI_STATUS Status = AE_OK; ACPI_OPERAND_OBJECT *RefDesc = DestDesc; ACPI_FUNCTION_TRACE_PTR (ExStore, DestDesc); /* Validate parameters */ if (!SourceDesc || !DestDesc) { ACPI_ERROR ((AE_INFO, "Null parameter")); return_ACPI_STATUS (AE_AML_NO_OPERAND); } /* DestDesc can be either a namespace node or an ACPI object */ if (ACPI_GET_DESCRIPTOR_TYPE (DestDesc) == ACPI_DESC_TYPE_NAMED) { /* * Dest is a namespace node, * Storing an object into a Named node. */ Status = AcpiExStoreObjectToNode (SourceDesc, (ACPI_NAMESPACE_NODE *) DestDesc, WalkState, ACPI_IMPLICIT_CONVERSION); return_ACPI_STATUS (Status); } /* Destination object must be a Reference or a Constant object */ switch (DestDesc->Common.Type) { case ACPI_TYPE_LOCAL_REFERENCE: break; case ACPI_TYPE_INTEGER: /* Allow stores to Constants -- a Noop as per ACPI spec */ if (DestDesc->Common.Flags & AOPOBJ_AML_CONSTANT) { return_ACPI_STATUS (AE_OK); } /*lint -fallthrough */ default: /* Destination is not a Reference object */ ACPI_ERROR ((AE_INFO, "Target is not a Reference or Constant object - %s [%p]", AcpiUtGetObjectTypeName (DestDesc), DestDesc)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* * Examine the Reference class. These cases are handled: * * 1) Store to Name (Change the object associated with a name) * 2) Store to an indexed area of a Buffer or Package * 3) Store to a Method Local or Arg * 4) Store to the debug object */ switch (RefDesc->Reference.Class) { case ACPI_REFCLASS_REFOF: /* Storing an object into a Name "container" */ Status = AcpiExStoreObjectToNode (SourceDesc, RefDesc->Reference.Object, WalkState, ACPI_IMPLICIT_CONVERSION); break; case ACPI_REFCLASS_INDEX: /* Storing to an Index (pointer into a packager or buffer) */ Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState); break; case ACPI_REFCLASS_LOCAL: case ACPI_REFCLASS_ARG: /* Store to a method local/arg */ Status = AcpiDsStoreObjectToLocal (RefDesc->Reference.Class, RefDesc->Reference.Value, SourceDesc, WalkState); break; case ACPI_REFCLASS_DEBUG: /* * Storing to the Debug object causes the value stored to be * displayed and otherwise has no effect -- see ACPI Specification */ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "**** Write to Debug Object: Object %p %s ****:\n\n", SourceDesc, AcpiUtGetObjectTypeName (SourceDesc))); ACPI_DEBUG_OBJECT (SourceDesc, 0, 0); break; default: ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X", RefDesc->Reference.Class)); ACPI_DUMP_ENTRY (RefDesc, ACPI_LV_INFO); Status = AE_AML_INTERNAL; break; } return_ACPI_STATUS (Status); }
acpi_status acpi_ex_store(union acpi_operand_object *source_desc, union acpi_operand_object *dest_desc, struct acpi_walk_state *walk_state) { acpi_status status = AE_OK; union acpi_operand_object *ref_desc = dest_desc; ACPI_FUNCTION_TRACE_PTR(ex_store, dest_desc); /* Validate parameters */ if (!source_desc || !dest_desc) { ACPI_ERROR((AE_INFO, "Null parameter")); return_ACPI_STATUS(AE_AML_NO_OPERAND); } /* dest_desc can be either a namespace node or an ACPI object */ if (ACPI_GET_DESCRIPTOR_TYPE(dest_desc) == ACPI_DESC_TYPE_NAMED) { /* * Dest is a namespace node, * Storing an object into a Named node. */ status = acpi_ex_store_object_to_node(source_desc, (struct acpi_namespace_node *) dest_desc, walk_state, ACPI_IMPLICIT_CONVERSION); return_ACPI_STATUS(status); } /* Destination object must be a Reference or a Constant object */ switch (ACPI_GET_OBJECT_TYPE(dest_desc)) { case ACPI_TYPE_LOCAL_REFERENCE: break; case ACPI_TYPE_INTEGER: /* Allow stores to Constants -- a Noop as per ACPI spec */ if (dest_desc->common.flags & AOPOBJ_AML_CONSTANT) { return_ACPI_STATUS(AE_OK); } /*lint -fallthrough */ default: /* Destination is not a Reference object */ ACPI_ERROR((AE_INFO, "Target is not a Reference or Constant object - %s [%p]", acpi_ut_get_object_type_name(dest_desc), dest_desc)); ACPI_DUMP_STACK_ENTRY(source_desc); ACPI_DUMP_STACK_ENTRY(dest_desc); ACPI_DUMP_OPERANDS(&dest_desc, ACPI_IMODE_EXECUTE, "ExStore", 2, "Target is not a Reference or Constant object"); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } /* * Examine the Reference opcode. These cases are handled: * * 1) Store to Name (Change the object associated with a name) * 2) Store to an indexed area of a Buffer or Package * 3) Store to a Method Local or Arg * 4) Store to the debug object */ switch (ref_desc->reference.opcode) { case AML_NAME_OP: case AML_REF_OF_OP: /* Storing an object into a Name "container" */ status = acpi_ex_store_object_to_node(source_desc, ref_desc->reference. object, walk_state, ACPI_IMPLICIT_CONVERSION); break; case AML_INDEX_OP: /* Storing to an Index (pointer into a packager or buffer) */ status = acpi_ex_store_object_to_index(source_desc, ref_desc, walk_state); break; case AML_LOCAL_OP: case AML_ARG_OP: /* Store to a method local/arg */ status = acpi_ds_store_object_to_local(ref_desc->reference.opcode, ref_desc->reference.offset, source_desc, walk_state); break; case AML_DEBUG_OP: /* * Storing to the Debug object causes the value stored to be * displayed and otherwise has no effect -- see ACPI Specification */ ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "**** Write to Debug Object: Object %p %s ****:\n\n", source_desc, acpi_ut_get_object_type_name(source_desc))); acpi_ex_do_debug_object(source_desc, 0, 0); break; default: ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X", ref_desc->reference.opcode)); ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR); status = AE_AML_INTERNAL; break; } return_ACPI_STATUS(status); }
static int acpi_ex_dump_operand(char * buf, int maxlen, union acpi_operand_object *obj_desc, u32 depth) { u32 length; int str_len = 0; ACPI_FUNCTION_NAME(ex_dump_operand) if (maxlen <= 0) { return maxlen; } if (!obj_desc) { /* This could be a null element of a package */ ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n")); return maxlen; } if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: ", obj_desc)); ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC); return maxlen; } if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p is not a node or operand object: [%s]\n", obj_desc, acpi_ut_get_descriptor_name(obj_desc))); ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object)); return maxlen; } /* obj_desc is a valid object */ if (depth > 0) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p ", depth, " ", depth, obj_desc)); } else { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p ", obj_desc)); } /* Decode object type */ switch (obj_desc->common.type) { #if 0 case ACPI_TYPE_LOCAL_REFERENCE: //str_len += snprintf(buf + str_len, maxlen - str_len, "Reference: [%s] ", // acpi_ut_get_reference_name(obj_desc)); switch (obj_desc->reference.class) { case ACPI_REFCLASS_DEBUG: str_len += snprintf(buf + str_len, maxlen - str_len, "\n"); break; case ACPI_REFCLASS_INDEX: str_len += snprintf(buf + str_len, maxlen - str_len, "%p\n", obj_desc->reference.object); break; case ACPI_REFCLASS_TABLE: str_len += snprintf(buf + str_len, maxlen - str_len, "Table Index %X\n", obj_desc->reference.value); break; case ACPI_REFCLASS_REFOF: //str_len += snprintf(buf + str_len, maxlen - str_len, "%p [%s]\n", obj_desc->reference.object, // acpi_ut_get_type_name(((union // acpi_operand_object // *) // obj_desc-> // reference. // object)->common. // type)); break; case ACPI_REFCLASS_NAME: str_len += snprintf(buf + str_len, maxlen - str_len, "- [%4.4s]\n", obj_desc->reference.node->name.ascii); break; case ACPI_REFCLASS_ARG: case ACPI_REFCLASS_LOCAL: str_len += snprintf(buf + str_len, maxlen - str_len, "%X\n", obj_desc->reference.value); break; default: /* Unknown reference class */ str_len += snprintf(buf + str_len, maxlen - str_len, "%2.2X\n", obj_desc->reference.class); break; } break; case ACPI_TYPE_BUFFER: str_len += snprintf(buf + str_len, maxlen - str_len, "Buffer length %.2X @ %p\n", obj_desc->buffer.length, obj_desc->buffer.pointer); /* Debug only -- dump the buffer contents */ if (obj_desc->buffer.pointer) { length = obj_desc->buffer.length; if (length > 128) { length = 128; } str_len += snprintf(buf + str_len, maxlen - str_len, "Buffer Contents: (displaying length 0x%.2X)\n", length); ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, length); } break; #endif case ACPI_TYPE_INTEGER: str_len += snprintf(buf + str_len, maxlen - str_len, "Integer %8.8X%8.8X\n", ACPI_FORMAT_UINT64(obj_desc->integer.value)); break; #if 0 case ACPI_TYPE_PACKAGE: str_len += snprintf(buf + str_len, maxlen - str_len, "Package [Len %X] ElementArray %p\n", obj_desc->package.count, obj_desc->package.elements); ///* // * If elements exist, package element pointer is valid, // * and debug_level exceeds 1, dump package's elements. // */ //if (obj_desc->package.count && // obj_desc->package.elements && acpi_dbg_level > 1) { // for (index = 0; index < obj_desc->package.count; index++) { // acpi_ex_dump_operand(obj_desc->package. // elements[index], // depth + 1); // } //} break; case ACPI_TYPE_REGION: //str_len += snprintf(buf + str_len, maxlen - str_len, "Region %s (%X)", // acpi_ut_get_region_name(obj_desc->region. // space_id), // obj_desc->region.space_id); /* * If the address and length have not been evaluated, * don't print them. */ if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) { str_len += snprintf(buf + str_len, maxlen - str_len, "\n"); } else { str_len += snprintf(buf + str_len, maxlen - str_len, " base %8.8X%8.8X Length %X\n", ACPI_FORMAT_NATIVE_UINT(obj_desc->region. address), obj_desc->region.length); } break; case ACPI_TYPE_STRING: str_len += snprintf(buf + str_len, maxlen - str_len, "String length %X @ %p ", obj_desc->string.length, obj_desc->string.pointer); //acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); str_len += snprintf(buf + str_len, maxlen - str_len, "\n"); break; case ACPI_TYPE_LOCAL_BANK_FIELD: str_len += snprintf(buf + str_len, maxlen - str_len, "BankField\n"); break; case ACPI_TYPE_LOCAL_REGION_FIELD: str_len += snprintf(buf + str_len, maxlen - str_len, "RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " "byte=%X bit=%X of below:\n", obj_desc->field.bit_length, obj_desc->field.access_byte_width, obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK, obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK, obj_desc->field.base_byte_offset, obj_desc->field.start_field_bit_offset); //acpi_ex_dump_operand(obj_desc->field.region_obj, depth + 1); break; case ACPI_TYPE_LOCAL_INDEX_FIELD: str_len += snprintf(buf + str_len, maxlen - str_len, "IndexField\n"); break; case ACPI_TYPE_BUFFER_FIELD: str_len += snprintf(buf + str_len, maxlen - str_len, "BufferField: %X bits at byte %X bit %X of\n", obj_desc->buffer_field.bit_length, obj_desc->buffer_field.base_byte_offset, obj_desc->buffer_field.start_field_bit_offset); if (!obj_desc->buffer_field.buffer_obj) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n")); } else if ((obj_desc->buffer_field.buffer_obj)->common.type != ACPI_TYPE_BUFFER) { str_len += snprintf(buf + str_len, maxlen - str_len, "*not a Buffer*\n"); } else { //acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj, // depth + 1); } break; case ACPI_TYPE_EVENT: str_len += snprintf(buf + str_len, maxlen - str_len, "Event\n"); break; case ACPI_TYPE_METHOD: str_len += snprintf(buf + str_len, maxlen - str_len, "Method(%X) @ %p:%X\n", obj_desc->method.param_count, obj_desc->method.aml_start, obj_desc->method.aml_length); break; case ACPI_TYPE_MUTEX: str_len += snprintf(buf + str_len, maxlen - str_len, "Mutex\n"); break; case ACPI_TYPE_DEVICE: str_len += snprintf(buf + str_len, maxlen - str_len, "Device\n"); break; case ACPI_TYPE_POWER: str_len += snprintf(buf + str_len, maxlen - str_len, "Power\n"); break; case ACPI_TYPE_PROCESSOR: str_len += snprintf(buf + str_len, maxlen - str_len, "Processor\n"); break; case ACPI_TYPE_THERMAL: str_len += snprintf(buf + str_len, maxlen - str_len, "Thermal\n"); break; #endif default: /* Unknown Type */ str_len += snprintf(buf + str_len, maxlen - str_len, "Unknown Type %X\n", obj_desc->common.type); break; } return str_len; }
void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) { u32 length; u32 index; ACPI_FUNCTION_NAME(ex_dump_operand) if (! ((ACPI_LV_EXEC & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) { return; } if (!obj_desc) { /* This could be a null element of a package */ ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n")); return; } if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: ", obj_desc)); ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC); return; } if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p is not a node or operand object: [%s]\n", obj_desc, acpi_ut_get_descriptor_name(obj_desc))); ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object)); return; } /* obj_desc is a valid object */ if (depth > 0) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p ", depth, " ", depth, obj_desc)); } else { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p ", obj_desc)); } /* Decode object type */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_LOCAL_REFERENCE: switch (obj_desc->reference.opcode) { case AML_DEBUG_OP: acpi_os_printf("Reference: Debug\n"); break; case AML_NAME_OP: ACPI_DUMP_PATHNAME(obj_desc->reference.object, "Reference: Name: ", ACPI_LV_INFO, _COMPONENT); ACPI_DUMP_ENTRY(obj_desc->reference.object, ACPI_LV_INFO); break; case AML_INDEX_OP: acpi_os_printf("Reference: Index %p\n", obj_desc->reference.object); break; case AML_REF_OF_OP: acpi_os_printf("Reference: (RefOf) %p\n", obj_desc->reference.object); break; case AML_ARG_OP: acpi_os_printf("Reference: Arg%d", obj_desc->reference.offset); if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { /* Value is an Integer */ acpi_os_printf(" value is [%8.8X%8.8x]", ACPI_FORMAT_UINT64(obj_desc-> integer. value)); } acpi_os_printf("\n"); break; case AML_LOCAL_OP: acpi_os_printf("Reference: Local%d", obj_desc->reference.offset); if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { /* Value is an Integer */ acpi_os_printf(" value is [%8.8X%8.8x]", ACPI_FORMAT_UINT64(obj_desc-> integer. value)); } acpi_os_printf("\n"); break; case AML_INT_NAMEPATH_OP: acpi_os_printf("Reference.Node->Name %X\n", obj_desc->reference.node->name.integer); break; default: /* Unknown opcode */ acpi_os_printf("Unknown Reference opcode=%X\n", obj_desc->reference.opcode); break; } break; case ACPI_TYPE_BUFFER: acpi_os_printf("Buffer len %X @ %p\n", obj_desc->buffer.length, obj_desc->buffer.pointer); length = obj_desc->buffer.length; if (length > 64) { length = 64; } /* Debug only -- dump the buffer contents */ if (obj_desc->buffer.pointer) { acpi_os_printf("Buffer Contents: "); for (index = 0; index < length; index++) { acpi_os_printf(" %02x", obj_desc->buffer.pointer[index]); } acpi_os_printf("\n"); } break; case ACPI_TYPE_INTEGER: acpi_os_printf("Integer %8.8X%8.8X\n", ACPI_FORMAT_UINT64(obj_desc->integer.value)); break; case ACPI_TYPE_PACKAGE: acpi_os_printf("Package [Len %X] ElementArray %p\n", obj_desc->package.count, obj_desc->package.elements); /* * If elements exist, package element pointer is valid, * and debug_level exceeds 1, dump package's elements. */ if (obj_desc->package.count && obj_desc->package.elements && acpi_dbg_level > 1) { for (index = 0; index < obj_desc->package.count; index++) { acpi_ex_dump_operand(obj_desc->package. elements[index], depth + 1); } } break; case ACPI_TYPE_REGION: acpi_os_printf("Region %s (%X)", acpi_ut_get_region_name(obj_desc->region. space_id), obj_desc->region.space_id); /* * If the address and length have not been evaluated, * don't print them. */ if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) { acpi_os_printf("\n"); } else { acpi_os_printf(" base %8.8X%8.8X Length %X\n", ACPI_FORMAT_UINT64(obj_desc->region. address), obj_desc->region.length); } break; case ACPI_TYPE_STRING: acpi_os_printf("String length %X @ %p ", obj_desc->string.length, obj_desc->string.pointer); acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); acpi_os_printf("\n"); break; case ACPI_TYPE_LOCAL_BANK_FIELD: acpi_os_printf("BankField\n"); break; case ACPI_TYPE_LOCAL_REGION_FIELD: acpi_os_printf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n", obj_desc->field.bit_length, obj_desc->field.access_byte_width, obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK, obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK, obj_desc->field.base_byte_offset, obj_desc->field.start_field_bit_offset); acpi_ex_dump_operand(obj_desc->field.region_obj, depth + 1); break; case ACPI_TYPE_LOCAL_INDEX_FIELD: acpi_os_printf("IndexField\n"); break; case ACPI_TYPE_BUFFER_FIELD: acpi_os_printf("BufferField: %X bits at byte %X bit %X of\n", obj_desc->buffer_field.bit_length, obj_desc->buffer_field.base_byte_offset, obj_desc->buffer_field.start_field_bit_offset); if (!obj_desc->buffer_field.buffer_obj) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n")); } else if (ACPI_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj) != ACPI_TYPE_BUFFER) { acpi_os_printf("*not a Buffer*\n"); } else { acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj, depth + 1); } break; case ACPI_TYPE_EVENT: acpi_os_printf("Event\n"); break; case ACPI_TYPE_METHOD: acpi_os_printf("Method(%X) @ %p:%X\n", obj_desc->method.param_count, obj_desc->method.aml_start, obj_desc->method.aml_length); break; case ACPI_TYPE_MUTEX: acpi_os_printf("Mutex\n"); break; case ACPI_TYPE_DEVICE: acpi_os_printf("Device\n"); break; case ACPI_TYPE_POWER: acpi_os_printf("Power\n"); break; case ACPI_TYPE_PROCESSOR: acpi_os_printf("Processor\n"); break; case ACPI_TYPE_THERMAL: acpi_os_printf("Thermal\n"); break; default: /* Unknown Type */ acpi_os_printf("Unknown Type %X\n", ACPI_GET_OBJECT_TYPE(obj_desc)); break; } return; }
acpi_status acpi_ex_store ( union acpi_operand_object *source_desc, union acpi_operand_object *dest_desc, struct acpi_walk_state *walk_state) { acpi_status status = AE_OK; union acpi_operand_object *ref_desc = dest_desc; ACPI_FUNCTION_TRACE_PTR ("ex_store", dest_desc); /* Validate parameters */ if (!source_desc || !dest_desc) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null parameter\n")); return_ACPI_STATUS (AE_AML_NO_OPERAND); } /* dest_desc can be either a namespace node or an ACPI object */ if (ACPI_GET_DESCRIPTOR_TYPE (dest_desc) == ACPI_DESC_TYPE_NAMED) { /* * Dest is a namespace node, * Storing an object into a Named node. */ status = acpi_ex_store_object_to_node (source_desc, (struct acpi_namespace_node *) dest_desc, walk_state, ACPI_IMPLICIT_CONVERSION); return_ACPI_STATUS (status); } /* Destination object must be a Reference or a Constant object */ switch (ACPI_GET_OBJECT_TYPE (dest_desc)) { case ACPI_TYPE_LOCAL_REFERENCE: break; case ACPI_TYPE_INTEGER: /* Allow stores to Constants -- a Noop as per ACPI spec */ if (dest_desc->common.flags & AOPOBJ_AML_CONSTANT) { return_ACPI_STATUS (AE_OK); } /*lint -fallthrough */ default: /* Destination is not a Reference object */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Target is not a Reference or Constant object - %s [%p]\n", acpi_ut_get_object_type_name (dest_desc), dest_desc)); ACPI_DUMP_STACK_ENTRY (source_desc); ACPI_DUMP_STACK_ENTRY (dest_desc); ACPI_DUMP_OPERANDS (&dest_desc, ACPI_IMODE_EXECUTE, "ex_store", 2, "Target is not a Reference or Constant object"); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* * Examine the Reference opcode. These cases are handled: * * 1) Store to Name (Change the object associated with a name) * 2) Store to an indexed area of a Buffer or Package * 3) Store to a Method Local or Arg * 4) Store to the debug object */ switch (ref_desc->reference.opcode) { case AML_NAME_OP: case AML_REF_OF_OP: /* Storing an object into a Name "container" */ status = acpi_ex_store_object_to_node (source_desc, ref_desc->reference.object, walk_state, ACPI_IMPLICIT_CONVERSION); break; case AML_INDEX_OP: /* Storing to an Index (pointer into a packager or buffer) */ status = acpi_ex_store_object_to_index (source_desc, ref_desc, walk_state); break; case AML_LOCAL_OP: case AML_ARG_OP: /* Store to a method local/arg */ status = acpi_ds_store_object_to_local (ref_desc->reference.opcode, ref_desc->reference.offset, source_desc, walk_state); break; case AML_DEBUG_OP: /* * Storing to the Debug object causes the value stored to be * displayed and otherwise has no effect -- see ACPI Specification */ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "**** Write to Debug Object: Object %p %s ****:\n\n", source_desc, acpi_ut_get_object_type_name (source_desc))); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %s: ", acpi_ut_get_object_type_name (source_desc))); if (!acpi_ut_valid_internal_object (source_desc)) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p, Invalid Internal Object!\n", source_desc)); break; } switch (ACPI_GET_OBJECT_TYPE (source_desc)) { case ACPI_TYPE_INTEGER: if (acpi_gbl_integer_byte_width == 4) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n", (u32) source_desc->integer.value)); } else { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (source_desc->integer.value))); } break; case ACPI_TYPE_BUFFER: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]", (u32) source_desc->buffer.length)); ACPI_DUMP_BUFFER (source_desc->buffer.pointer, (source_desc->buffer.length < 32) ? source_desc->buffer.length : 32); break; case ACPI_TYPE_STRING: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n", source_desc->string.length, source_desc->string.pointer)); break; case ACPI_TYPE_PACKAGE: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] Elements Ptr - %p\n", source_desc->package.count, source_desc->package.elements)); break; default: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p\n", source_desc)); break; } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n")); break; default: ACPI_REPORT_ERROR (("ex_store: Unknown Reference opcode %X\n", ref_desc->reference.opcode)); ACPI_DUMP_ENTRY (ref_desc, ACPI_LV_ERROR); status = AE_AML_INTERNAL; break; } return_ACPI_STATUS (status); }