exconvrt.c revision 1.1.1.19 1 /******************************************************************************
2 *
3 * Module Name: exconvrt - Object conversion routines
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2023, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acinterp.h"
47 #include "amlcode.h"
48
49
50 #define _COMPONENT ACPI_EXECUTER
51 ACPI_MODULE_NAME ("exconvrt")
52
53 /* Local prototypes */
54
55 static UINT32
56 AcpiExConvertToAscii (
57 UINT64 Integer,
58 UINT16 Base,
59 UINT8 *String,
60 UINT8 MaxLength,
61 BOOLEAN LeadingZeros);
62
63
64 /*******************************************************************************
65 *
66 * FUNCTION: AcpiExConvertToInteger
67 *
68 * PARAMETERS: ObjDesc - Object to be converted. Must be an
69 * Integer, Buffer, or String
70 * ResultDesc - Where the new Integer object is returned
71 * ImplicitConversion - Used for string conversion
72 *
73 * RETURN: Status
74 *
75 * DESCRIPTION: Convert an ACPI Object to an integer.
76 *
77 ******************************************************************************/
78
79 ACPI_STATUS
80 AcpiExConvertToInteger (
81 ACPI_OPERAND_OBJECT *ObjDesc,
82 ACPI_OPERAND_OBJECT **ResultDesc,
83 UINT32 ImplicitConversion)
84 {
85 ACPI_OPERAND_OBJECT *ReturnDesc;
86 UINT8 *Pointer;
87 UINT64 Result;
88 UINT32 i;
89 UINT32 Count;
90
91
92 ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc);
93
94
95 switch (ObjDesc->Common.Type)
96 {
97 case ACPI_TYPE_INTEGER:
98
99 /* No conversion necessary */
100
101 *ResultDesc = ObjDesc;
102 return_ACPI_STATUS (AE_OK);
103
104 case ACPI_TYPE_BUFFER:
105 case ACPI_TYPE_STRING:
106
107 /* Note: Takes advantage of common buffer/string fields */
108
109 Pointer = ObjDesc->Buffer.Pointer;
110 Count = ObjDesc->Buffer.Length;
111 break;
112
113 default:
114
115 return_ACPI_STATUS (AE_TYPE);
116 }
117
118 /*
119 * Convert the buffer/string to an integer. Note that both buffers and
120 * strings are treated as raw data - we don't convert ascii to hex for
121 * strings.
122 *
123 * There are two terminating conditions for the loop:
124 * 1) The size of an integer has been reached, or
125 * 2) The end of the buffer or string has been reached
126 */
127 Result = 0;
128
129 /* String conversion is different than Buffer conversion */
130
131 switch (ObjDesc->Common.Type)
132 {
133 case ACPI_TYPE_STRING:
134 /*
135 * Convert string to an integer - for most cases, the string must be
136 * hexadecimal as per the ACPI specification. The only exception (as
137 * of ACPI 3.0) is that the ToInteger() operator allows both decimal
138 * and hexadecimal strings (hex prefixed with "0x").
139 *
140 * Explicit conversion is used only by ToInteger.
141 * All other string-to-integer conversions are implicit conversions.
142 */
143 if (ImplicitConversion)
144 {
145 Result = AcpiUtImplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
146 }
147 else
148 {
149 Result = AcpiUtExplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer));
150 }
151 break;
152
153 case ACPI_TYPE_BUFFER:
154
155 /* Check for zero-length buffer */
156
157 if (!Count)
158 {
159 return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
160 }
161
162 /* Transfer no more than an integer's worth of data */
163
164 if (Count > AcpiGbl_IntegerByteWidth)
165 {
166 Count = AcpiGbl_IntegerByteWidth;
167 }
168
169 /*
170 * Convert buffer to an integer - we simply grab enough raw data
171 * from the buffer to fill an integer
172 */
173 for (i = 0; i < Count; i++)
174 {
175 /*
176 * Get next byte and shift it into the Result.
177 * Little endian is used, meaning that the first byte of the buffer
178 * is the LSB of the integer
179 */
180 Result |= (((UINT64) Pointer[i]) << (i * 8));
181 }
182 break;
183
184 default:
185
186 /* No other types can get here */
187
188 break;
189 }
190
191 /* Create a new integer */
192
193 ReturnDesc = AcpiUtCreateIntegerObject (Result);
194 if (!ReturnDesc)
195 {
196 return_ACPI_STATUS (AE_NO_MEMORY);
197 }
198
199 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
200 ACPI_FORMAT_UINT64 (Result)));
201
202 /* Save the Result */
203
204 (void) AcpiExTruncateFor32bitTable (ReturnDesc);
205 *ResultDesc = ReturnDesc;
206 return_ACPI_STATUS (AE_OK);
207 }
208
209
210 /*******************************************************************************
211 *
212 * FUNCTION: AcpiExConvertToBuffer
213 *
214 * PARAMETERS: ObjDesc - Object to be converted. Must be an
215 * Integer, Buffer, or String
216 * ResultDesc - Where the new buffer object is returned
217 *
218 * RETURN: Status
219 *
220 * DESCRIPTION: Convert an ACPI Object to a Buffer
221 *
222 ******************************************************************************/
223
224 ACPI_STATUS
225 AcpiExConvertToBuffer (
226 ACPI_OPERAND_OBJECT *ObjDesc,
227 ACPI_OPERAND_OBJECT **ResultDesc)
228 {
229 ACPI_OPERAND_OBJECT *ReturnDesc;
230 UINT8 *NewBuf;
231
232
233 ACPI_FUNCTION_TRACE_PTR (ExConvertToBuffer, ObjDesc);
234
235
236 switch (ObjDesc->Common.Type)
237 {
238 case ACPI_TYPE_BUFFER:
239
240 /* No conversion necessary */
241
242 *ResultDesc = ObjDesc;
243 return_ACPI_STATUS (AE_OK);
244
245
246 case ACPI_TYPE_INTEGER:
247 /*
248 * Create a new Buffer object.
249 * Need enough space for one integer
250 */
251 ReturnDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth);
252 if (!ReturnDesc)
253 {
254 return_ACPI_STATUS (AE_NO_MEMORY);
255 }
256
257 /* Copy the integer to the buffer, LSB first */
258
259 NewBuf = ReturnDesc->Buffer.Pointer;
260 memcpy (NewBuf, &ObjDesc->Integer.Value, AcpiGbl_IntegerByteWidth);
261 break;
262
263 case ACPI_TYPE_STRING:
264 /*
265 * Create a new Buffer object
266 * Size will be the string length
267 *
268 * NOTE: Add one to the string length to include the null terminator.
269 * The ACPI spec is unclear on this subject, but there is existing
270 * ASL/AML code that depends on the null being transferred to the new
271 * buffer.
272 */
273 ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE)
274 ObjDesc->String.Length + 1);
275 if (!ReturnDesc)
276 {
277 return_ACPI_STATUS (AE_NO_MEMORY);
278 }
279
280 /* Copy the string to the buffer */
281
282 NewBuf = ReturnDesc->Buffer.Pointer;
283 strncpy ((char *) NewBuf, (char *) ObjDesc->String.Pointer,
284 ObjDesc->String.Length);
285 break;
286
287 default:
288
289 return_ACPI_STATUS (AE_TYPE);
290 }
291
292 /* Mark buffer initialized */
293
294 ReturnDesc->Common.Flags |= AOPOBJ_DATA_VALID;
295 *ResultDesc = ReturnDesc;
296 return_ACPI_STATUS (AE_OK);
297 }
298
299
300 /*******************************************************************************
301 *
302 * FUNCTION: AcpiExConvertToAscii
303 *
304 * PARAMETERS: Integer - Value to be converted
305 * Base - ACPI_STRING_DECIMAL or ACPI_STRING_HEX
306 * String - Where the string is returned
307 * DataWidth - Size of data item to be converted, in bytes
308 * LeadingZeros - Allow leading zeros
309 *
310 * RETURN: Actual string length
311 *
312 * DESCRIPTION: Convert an ACPI Integer to a hex or decimal string
313 *
314 ******************************************************************************/
315
316 static UINT32
317 AcpiExConvertToAscii (
318 UINT64 Integer,
319 UINT16 Base,
320 UINT8 *String,
321 UINT8 DataWidth,
322 BOOLEAN LeadingZeros)
323 {
324 UINT64 Digit;
325 UINT32 i;
326 UINT32 j;
327 UINT32 k = 0;
328 UINT32 HexLength;
329 UINT32 DecimalLength;
330 UINT32 Remainder;
331 BOOLEAN SupressZeros = !LeadingZeros;
332 UINT8 HexChar;
333
334
335 ACPI_FUNCTION_ENTRY ();
336
337
338 switch (Base)
339 {
340 case 10:
341
342 /* Setup max length for the decimal number */
343
344 switch (DataWidth)
345 {
346 case 1:
347
348 DecimalLength = ACPI_MAX8_DECIMAL_DIGITS;
349 break;
350
351 case 4:
352
353 DecimalLength = ACPI_MAX32_DECIMAL_DIGITS;
354 break;
355
356 case 8:
357 default:
358
359 DecimalLength = ACPI_MAX64_DECIMAL_DIGITS;
360 break;
361 }
362
363 Remainder = 0;
364
365 for (i = DecimalLength; i > 0; i--)
366 {
367 /* Divide by nth factor of 10 */
368
369 Digit = Integer;
370 for (j = 0; j < i; j++)
371 {
372 (void) AcpiUtShortDivide (Digit, 10, &Digit, &Remainder);
373 }
374
375 /* Handle leading zeros */
376
377 if (Remainder != 0)
378 {
379 SupressZeros = FALSE;
380 }
381
382 if (!SupressZeros)
383 {
384 String[k] = (UINT8) (ACPI_ASCII_ZERO + Remainder);
385 k++;
386 }
387 }
388 break;
389
390 case 16:
391
392 /* HexLength: 2 ascii hex chars per data byte */
393
394 HexLength = (DataWidth * 2);
395 for (i = 0, j = (HexLength-1); i < HexLength; i++, j--)
396 {
397 /* Get one hex digit, most significant digits first */
398
399 HexChar = (UINT8)
400 AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j));
401
402 /* Supress leading zeros until the first non-zero character */
403
404 if (HexChar == ACPI_ASCII_ZERO && SupressZeros)
405 {
406 continue;
407 }
408
409 SupressZeros = FALSE;
410 String[k] = HexChar;
411 k++;
412 }
413 break;
414
415 default:
416 return (0);
417 }
418
419 /*
420 * Since leading zeros are suppressed, we must check for the case where
421 * the integer equals 0
422 *
423 * Finally, null terminate the string and return the length
424 */
425 if (!k)
426 {
427 String [0] = ACPI_ASCII_ZERO;
428 k = 1;
429 }
430
431 String [k] = 0;
432 return ((UINT32) k);
433 }
434
435
436 /*******************************************************************************
437 *
438 * FUNCTION: AcpiExConvertToString
439 *
440 * PARAMETERS: ObjDesc - Object to be converted. Must be an
441 * Integer, Buffer, or String
442 * ResultDesc - Where the string object is returned
443 * Type - String flags (base and conversion type)
444 *
445 * RETURN: Status
446 *
447 * DESCRIPTION: Convert an ACPI Object to a string. Supports both implicit
448 * and explicit conversions and related rules.
449 *
450 ******************************************************************************/
451
452 ACPI_STATUS
453 AcpiExConvertToString (
454 ACPI_OPERAND_OBJECT *ObjDesc,
455 ACPI_OPERAND_OBJECT **ResultDesc,
456 UINT32 Type)
457 {
458 ACPI_OPERAND_OBJECT *ReturnDesc;
459 UINT8 *NewBuf;
460 UINT32 i;
461 UINT32 StringLength = 0;
462 UINT16 Base = 16;
463 UINT8 Separator = ',';
464 BOOLEAN LeadingZeros;
465
466
467 ACPI_FUNCTION_TRACE_PTR (ExConvertToString, ObjDesc);
468
469
470 switch (ObjDesc->Common.Type)
471 {
472 case ACPI_TYPE_STRING:
473
474 /* No conversion necessary */
475
476 *ResultDesc = ObjDesc;
477 return_ACPI_STATUS (AE_OK);
478
479 case ACPI_TYPE_INTEGER:
480
481 switch (Type)
482 {
483 case ACPI_EXPLICIT_CONVERT_DECIMAL:
484 /*
485 * From ToDecimalString, integer source.
486 *
487 * Make room for the maximum decimal number size
488 */
489 StringLength = ACPI_MAX_DECIMAL_DIGITS;
490 LeadingZeros = FALSE;
491 Base = 10;
492 break;
493
494 case ACPI_EXPLICIT_CONVERT_HEX:
495 /*
496 * From ToHexString.
497 *
498 * Supress leading zeros and append "0x"
499 */
500 StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth) + 2;
501 LeadingZeros = FALSE;
502 break;
503 default:
504
505 /* Two hex string characters for each integer byte */
506
507 StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth);
508 LeadingZeros = TRUE;
509 break;
510 }
511
512 /*
513 * Create a new String
514 * Need enough space for one ASCII integer (plus null terminator)
515 */
516 ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength);
517 if (!ReturnDesc)
518 {
519 return_ACPI_STATUS (AE_NO_MEMORY);
520 }
521
522 NewBuf = ReturnDesc->Buffer.Pointer;
523 if (Type == ACPI_EXPLICIT_CONVERT_HEX)
524 {
525 /* Append "0x" prefix for explicit hex conversion */
526
527 *NewBuf++ = '0';
528 *NewBuf++ = 'x';
529 }
530
531 /* Convert integer to string */
532
533 StringLength = AcpiExConvertToAscii (
534 ObjDesc->Integer.Value, Base, NewBuf, AcpiGbl_IntegerByteWidth, LeadingZeros);
535
536 /* Null terminate at the correct place */
537
538 ReturnDesc->String.Length = StringLength;
539 if (Type == ACPI_EXPLICIT_CONVERT_HEX)
540 {
541 /* Take "0x" prefix into account */
542
543 ReturnDesc->String.Length += 2;
544 }
545
546 NewBuf [StringLength] = 0;
547 break;
548
549 case ACPI_TYPE_BUFFER:
550
551 /* Setup string length, base, and separator */
552
553 switch (Type)
554 {
555 case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */
556 /*
557 * Explicit conversion from the ToDecimalString ASL operator.
558 *
559 * From ACPI: "If the input is a buffer, it is converted to a
560 * a string of decimal values separated by commas."
561 */
562 LeadingZeros = FALSE;
563 Base = 10;
564
565 /*
566 * Calculate the final string length. Individual string values
567 * are variable length (include separator for each)
568 */
569 for (i = 0; i < ObjDesc->Buffer.Length; i++)
570 {
571 if (ObjDesc->Buffer.Pointer[i] >= 100)
572 {
573 StringLength += 4;
574 }
575 else if (ObjDesc->Buffer.Pointer[i] >= 10)
576 {
577 StringLength += 3;
578 }
579 else
580 {
581 StringLength += 2;
582 }
583 }
584 break;
585
586 case ACPI_IMPLICIT_CONVERT_HEX:
587 /*
588 * Implicit buffer-to-string conversion
589 *
590 * From the ACPI spec:
591 * "The entire contents of the buffer are converted to a string of
592 * two-character hexadecimal numbers, each separated by a space."
593 *
594 * Each hex number is prefixed with 0x (11/2018)
595 */
596 LeadingZeros = TRUE;
597 Separator = ' ';
598 StringLength = (ObjDesc->Buffer.Length * 5);
599 break;
600
601 case ACPI_EXPLICIT_CONVERT_HEX:
602 /*
603 * Explicit conversion from the ToHexString ASL operator.
604 *
605 * From ACPI: "If Data is a buffer, it is converted to a string of
606 * hexadecimal values separated by commas."
607 *
608 * Each hex number is prefixed with 0x (11/2018)
609 */
610 LeadingZeros = TRUE;
611 Separator = ',';
612 StringLength = (ObjDesc->Buffer.Length * 5);
613 break;
614
615 default:
616 return_ACPI_STATUS (AE_BAD_PARAMETER);
617 }
618
619 /*
620 * Create a new string object and string buffer
621 * (-1 because of extra separator included in StringLength from above)
622 * Allow creation of zero-length strings from zero-length buffers.
623 */
624 if (StringLength)
625 {
626 StringLength--;
627 }
628
629 ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength);
630 if (!ReturnDesc)
631 {
632 return_ACPI_STATUS (AE_NO_MEMORY);
633 }
634
635 NewBuf = ReturnDesc->Buffer.Pointer;
636
637 /*
638 * Convert buffer bytes to hex or decimal values
639 * (separated by commas or spaces)
640 */
641 for (i = 0; i < ObjDesc->Buffer.Length; i++)
642 {
643 if (Base == 16)
644 {
645 /* Emit 0x prefix for explicit/implicit hex conversion */
646
647 *NewBuf++ = '0';
648 *NewBuf++ = 'x';
649 }
650
651 NewBuf += AcpiExConvertToAscii (
652 (UINT64) ObjDesc->Buffer.Pointer[i], Base, NewBuf, 1, LeadingZeros);
653
654 /* Each digit is separated by either a comma or space */
655
656 *NewBuf++ = Separator;
657 }
658
659 /*
660 * Null terminate the string
661 * (overwrites final comma/space from above)
662 */
663 if (ObjDesc->Buffer.Length)
664 {
665 NewBuf--;
666 }
667 *NewBuf = 0;
668 break;
669
670 default:
671
672 return_ACPI_STATUS (AE_TYPE);
673 }
674
675 *ResultDesc = ReturnDesc;
676 return_ACPI_STATUS (AE_OK);
677 }
678
679
680 /*******************************************************************************
681 *
682 * FUNCTION: AcpiExConvertToTargetType
683 *
684 * PARAMETERS: DestinationType - Current type of the destination
685 * SourceDesc - Source object to be converted.
686 * ResultDesc - Where the converted object is returned
687 * WalkState - Current method state
688 *
689 * RETURN: Status
690 *
691 * DESCRIPTION: Implements "implicit conversion" rules for storing an object.
692 *
693 ******************************************************************************/
694
695 ACPI_STATUS
696 AcpiExConvertToTargetType (
697 ACPI_OBJECT_TYPE DestinationType,
698 ACPI_OPERAND_OBJECT *SourceDesc,
699 ACPI_OPERAND_OBJECT **ResultDesc,
700 ACPI_WALK_STATE *WalkState)
701 {
702 ACPI_STATUS Status = AE_OK;
703
704
705 ACPI_FUNCTION_TRACE (ExConvertToTargetType);
706
707
708 /* Default behavior */
709
710 *ResultDesc = SourceDesc;
711
712 /*
713 * If required by the target,
714 * perform implicit conversion on the source before we store it.
715 */
716 switch (GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs))
717 {
718 case ARGI_SIMPLE_TARGET:
719 case ARGI_FIXED_TARGET:
720 case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */
721
722 switch (DestinationType)
723 {
724 case ACPI_TYPE_LOCAL_REGION_FIELD:
725 /*
726 * Named field can always handle conversions
727 */
728 break;
729
730 default:
731
732 /* No conversion allowed for these types */
733
734 if (DestinationType != SourceDesc->Common.Type)
735 {
736 ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
737 "Explicit operator, will store (%s) over existing type (%s)\n",
738 AcpiUtGetObjectTypeName (SourceDesc),
739 AcpiUtGetTypeName (DestinationType)));
740 Status = AE_TYPE;
741 }
742 }
743 break;
744
745 case ARGI_TARGETREF:
746 case ARGI_STORE_TARGET:
747
748 switch (DestinationType)
749 {
750 case ACPI_TYPE_INTEGER:
751 case ACPI_TYPE_BUFFER_FIELD:
752 case ACPI_TYPE_LOCAL_BANK_FIELD:
753 case ACPI_TYPE_LOCAL_INDEX_FIELD:
754 /*
755 * These types require an Integer operand. We can convert
756 * a Buffer or a String to an Integer if necessary.
757 */
758 Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,
759 ACPI_IMPLICIT_CONVERSION);
760 break;
761
762 case ACPI_TYPE_STRING:
763 /*
764 * The operand must be a String. We can convert an
765 * Integer or Buffer if necessary
766 */
767 Status = AcpiExConvertToString (SourceDesc, ResultDesc,
768 ACPI_IMPLICIT_CONVERT_HEX);
769 break;
770
771 case ACPI_TYPE_BUFFER:
772 /*
773 * The operand must be a Buffer. We can convert an
774 * Integer or String if necessary
775 */
776 Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc);
777 break;
778
779 default:
780
781 ACPI_ERROR ((AE_INFO,
782 "Bad destination type during conversion: 0x%X",
783 DestinationType));
784 Status = AE_AML_INTERNAL;
785 break;
786 }
787 break;
788
789 case ARGI_REFERENCE:
790 /*
791 * CreateXxxxField cases - we are storing the field object into the name
792 */
793 break;
794
795 default:
796
797 ACPI_ERROR ((AE_INFO,
798 "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s",
799 GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs),
800 WalkState->Opcode, AcpiUtGetTypeName (DestinationType)));
801 Status = AE_AML_INTERNAL;
802 }
803
804 /*
805 * Source-to-Target conversion semantics:
806 *
807 * If conversion to the target type cannot be performed, then simply
808 * overwrite the target with the new object and type.
809 */
810 if (Status == AE_TYPE)
811 {
812 Status = AE_OK;
813 }
814
815 return_ACPI_STATUS (Status);
816 }
817