0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <acpi/acpi.h>
0012 #include "accommon.h"
0013 #include "acinterp.h"
0014 #include "amlcode.h"
0015
0016 #define _COMPONENT ACPI_EXECUTER
0017 ACPI_MODULE_NAME("exstoren")
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 acpi_status
0034 acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
0035 acpi_object_type target_type,
0036 struct acpi_walk_state *walk_state)
0037 {
0038 union acpi_operand_object *source_desc = *source_desc_ptr;
0039 acpi_status status = AE_OK;
0040
0041 ACPI_FUNCTION_TRACE(ex_resolve_object);
0042
0043
0044
0045 switch (target_type) {
0046 case ACPI_TYPE_BUFFER_FIELD:
0047 case ACPI_TYPE_LOCAL_REGION_FIELD:
0048 case ACPI_TYPE_LOCAL_BANK_FIELD:
0049 case ACPI_TYPE_LOCAL_INDEX_FIELD:
0050
0051
0052
0053
0054 case ACPI_TYPE_INTEGER:
0055 case ACPI_TYPE_STRING:
0056 case ACPI_TYPE_BUFFER:
0057
0058
0059
0060
0061
0062 if (source_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) {
0063
0064
0065
0066 status =
0067 acpi_ex_resolve_to_value(source_desc_ptr,
0068 walk_state);
0069 if (ACPI_FAILURE(status)) {
0070 break;
0071 }
0072 }
0073
0074
0075
0076 if (walk_state->opcode == AML_COPY_OBJECT_OP) {
0077 break;
0078 }
0079
0080
0081
0082 if ((source_desc->common.type != ACPI_TYPE_INTEGER) &&
0083 (source_desc->common.type != ACPI_TYPE_BUFFER) &&
0084 (source_desc->common.type != ACPI_TYPE_STRING) &&
0085 !((source_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
0086 (source_desc->reference.class == ACPI_REFCLASS_TABLE))) {
0087
0088
0089
0090 ACPI_ERROR((AE_INFO,
0091 "Cannot assign type [%s] to [%s] (must be type Int/Str/Buf)",
0092 acpi_ut_get_object_type_name(source_desc),
0093 acpi_ut_get_type_name(target_type)));
0094
0095 status = AE_AML_OPERAND_TYPE;
0096 }
0097 break;
0098
0099 case ACPI_TYPE_LOCAL_ALIAS:
0100 case ACPI_TYPE_LOCAL_METHOD_ALIAS:
0101
0102
0103
0104
0105 ACPI_ERROR((AE_INFO, "Store into an unresolved Alias object"));
0106 status = AE_AML_INTERNAL;
0107 break;
0108
0109 case ACPI_TYPE_PACKAGE:
0110 default:
0111
0112
0113
0114
0115 break;
0116 }
0117
0118 return_ACPI_STATUS(status);
0119 }
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 acpi_status
0157 acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
0158 union acpi_operand_object *dest_desc,
0159 union acpi_operand_object **new_desc,
0160 struct acpi_walk_state *walk_state)
0161 {
0162 union acpi_operand_object *actual_src_desc;
0163 acpi_status status = AE_OK;
0164
0165 ACPI_FUNCTION_TRACE_PTR(ex_store_object_to_object, source_desc);
0166
0167 actual_src_desc = source_desc;
0168 if (!dest_desc) {
0169
0170
0171
0172
0173
0174 status =
0175 acpi_ut_copy_iobject_to_iobject(actual_src_desc, new_desc,
0176 walk_state);
0177 return_ACPI_STATUS(status);
0178 }
0179
0180 if (source_desc->common.type != dest_desc->common.type) {
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 status = acpi_ex_convert_to_target_type(dest_desc->common.type,
0191 source_desc,
0192 &actual_src_desc,
0193 walk_state);
0194 if (ACPI_FAILURE(status)) {
0195 return_ACPI_STATUS(status);
0196 }
0197
0198 if (source_desc == actual_src_desc) {
0199
0200
0201
0202
0203 *new_desc = source_desc;
0204 return_ACPI_STATUS(AE_OK);
0205 }
0206 }
0207
0208
0209
0210
0211
0212 switch (dest_desc->common.type) {
0213 case ACPI_TYPE_INTEGER:
0214
0215 dest_desc->integer.value = actual_src_desc->integer.value;
0216
0217
0218
0219 (void)acpi_ex_truncate_for32bit_table(dest_desc);
0220 break;
0221
0222 case ACPI_TYPE_STRING:
0223
0224 status =
0225 acpi_ex_store_string_to_string(actual_src_desc, dest_desc);
0226 break;
0227
0228 case ACPI_TYPE_BUFFER:
0229
0230 status =
0231 acpi_ex_store_buffer_to_buffer(actual_src_desc, dest_desc);
0232 break;
0233
0234 case ACPI_TYPE_PACKAGE:
0235
0236 status =
0237 acpi_ut_copy_iobject_to_iobject(actual_src_desc, &dest_desc,
0238 walk_state);
0239 break;
0240
0241 default:
0242
0243
0244
0245 ACPI_WARNING((AE_INFO, "Store into type [%s] not implemented",
0246 acpi_ut_get_object_type_name(dest_desc)));
0247
0248 status = AE_NOT_IMPLEMENTED;
0249 break;
0250 }
0251
0252 if (actual_src_desc != source_desc) {
0253
0254
0255
0256 acpi_ut_remove_reference(actual_src_desc);
0257 }
0258
0259 *new_desc = dest_desc;
0260 return_ACPI_STATUS(status);
0261 }