Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/components/namespace/nsconvert.c
48524 views
1
/******************************************************************************
2
*
3
* Module Name: nsconvert - Object conversions for objects returned by
4
* predefined methods
5
*
6
*****************************************************************************/
7
8
/******************************************************************************
9
*
10
* 1. Copyright Notice
11
*
12
* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
13
* All rights reserved.
14
*
15
* 2. License
16
*
17
* 2.1. This is your license from Intel Corp. under its intellectual property
18
* rights. You may have additional license terms from the party that provided
19
* you this software, covering your right to use that party's intellectual
20
* property rights.
21
*
22
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23
* copy of the source code appearing in this file ("Covered Code") an
24
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
25
* base code distributed originally by Intel ("Original Intel Code") to copy,
26
* make derivatives, distribute, use and display any portion of the Covered
27
* Code in any form, with the right to sublicense such rights; and
28
*
29
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30
* license (with the right to sublicense), under only those claims of Intel
31
* patents that are infringed by the Original Intel Code, to make, use, sell,
32
* offer to sell, and import the Covered Code and derivative works thereof
33
* solely to the minimum extent necessary to exercise the above copyright
34
* license, and in no event shall the patent license extend to any additions
35
* to or modifications of the Original Intel Code. No other license or right
36
* is granted directly or by implication, estoppel or otherwise;
37
*
38
* The above copyright and patent license is granted only if the following
39
* conditions are met:
40
*
41
* 3. Conditions
42
*
43
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
44
* Redistribution of source code of any substantial portion of the Covered
45
* Code or modification with rights to further distribute source must include
46
* the above Copyright Notice, the above License, this list of Conditions,
47
* and the following Disclaimer and Export Compliance provision. In addition,
48
* Licensee must cause all Covered Code to which Licensee contributes to
49
* contain a file documenting the changes Licensee made to create that Covered
50
* Code and the date of any change. Licensee must include in that file the
51
* documentation of any changes made by any predecessor Licensee. Licensee
52
* must include a prominent statement that the modification is derived,
53
* directly or indirectly, from Original Intel Code.
54
*
55
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56
* Redistribution of source code of any substantial portion of the Covered
57
* Code or modification without rights to further distribute source must
58
* include the following Disclaimer and Export Compliance provision in the
59
* documentation and/or other materials provided with distribution. In
60
* addition, Licensee may not authorize further sublicense of source of any
61
* portion of the Covered Code, and must include terms to the effect that the
62
* license from Licensee to its licensee is limited to the intellectual
63
* property embodied in the software Licensee provides to its licensee, and
64
* not to intellectual property embodied in modifications its licensee may
65
* make.
66
*
67
* 3.3. Redistribution of Executable. Redistribution in executable form of any
68
* substantial portion of the Covered Code or modification must reproduce the
69
* above Copyright Notice, and the following Disclaimer and Export Compliance
70
* provision in the documentation and/or other materials provided with the
71
* distribution.
72
*
73
* 3.4. Intel retains all right, title, and interest in and to the Original
74
* Intel Code.
75
*
76
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
77
* Intel shall be used in advertising or otherwise to promote the sale, use or
78
* other dealings in products derived from or relating to the Covered Code
79
* without prior written authorization from Intel.
80
*
81
* 4. Disclaimer and Export Compliance
82
*
83
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89
* PARTICULAR PURPOSE.
90
*
91
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98
* LIMITED REMEDY.
99
*
100
* 4.3. Licensee shall not export, either directly or indirectly, any of this
101
* software or system incorporating such software without first obtaining any
102
* required license or other approval from the U. S. Department of Commerce or
103
* any other agency or department of the United States Government. In the
104
* event Licensee exports any such software from the United States or
105
* re-exports any such software from a foreign destination, Licensee shall
106
* ensure that the distribution and export/re-export of the software is in
107
* compliance with all laws, regulations, orders, or other restrictions of the
108
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
109
* any of its subsidiaries will export/re-export any technical data, process,
110
* software, or service, directly or indirectly, to any country for which the
111
* United States government or any agency thereof requires an export license,
112
* other governmental approval, or letter of assurance, without first obtaining
113
* such license, approval or letter.
114
*
115
*****************************************************************************
116
*
117
* Alternatively, you may choose to be licensed under the terms of the
118
* following license:
119
*
120
* Redistribution and use in source and binary forms, with or without
121
* modification, are permitted provided that the following conditions
122
* are met:
123
* 1. Redistributions of source code must retain the above copyright
124
* notice, this list of conditions, and the following disclaimer,
125
* without modification.
126
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
127
* substantially similar to the "NO WARRANTY" disclaimer below
128
* ("Disclaimer") and any redistribution must be conditioned upon
129
* including a substantially similar Disclaimer requirement for further
130
* binary redistribution.
131
* 3. Neither the names of the above-listed copyright holders nor the names
132
* of any contributors may be used to endorse or promote products derived
133
* from this software without specific prior written permission.
134
*
135
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
136
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
138
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146
*
147
* Alternatively, you may choose to be licensed under the terms of the
148
* GNU General Public License ("GPL") version 2 as published by the Free
149
* Software Foundation.
150
*
151
*****************************************************************************/
152
153
#include <contrib/dev/acpica/include/acpi.h>
154
#include <contrib/dev/acpica/include/accommon.h>
155
#include <contrib/dev/acpica/include/acnamesp.h>
156
#include <contrib/dev/acpica/include/acinterp.h>
157
#include <contrib/dev/acpica/include/acpredef.h>
158
#include <contrib/dev/acpica/include/amlresrc.h>
159
160
#define _COMPONENT ACPI_NAMESPACE
161
ACPI_MODULE_NAME ("nsconvert")
162
163
164
/*******************************************************************************
165
*
166
* FUNCTION: AcpiNsConvertToInteger
167
*
168
* PARAMETERS: OriginalObject - Object to be converted
169
* ReturnObject - Where the new converted object is returned
170
*
171
* RETURN: Status. AE_OK if conversion was successful.
172
*
173
* DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
174
*
175
******************************************************************************/
176
177
ACPI_STATUS
178
AcpiNsConvertToInteger (
179
ACPI_OPERAND_OBJECT *OriginalObject,
180
ACPI_OPERAND_OBJECT **ReturnObject)
181
{
182
ACPI_OPERAND_OBJECT *NewObject;
183
ACPI_STATUS Status;
184
UINT64 Value = 0;
185
UINT32 i;
186
187
188
switch (OriginalObject->Common.Type)
189
{
190
case ACPI_TYPE_STRING:
191
192
/* String-to-Integer conversion */
193
194
Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, &Value);
195
if (ACPI_FAILURE (Status))
196
{
197
return (Status);
198
}
199
break;
200
201
case ACPI_TYPE_BUFFER:
202
203
/* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
204
205
if (OriginalObject->Buffer.Length > 8)
206
{
207
return (AE_AML_OPERAND_TYPE);
208
}
209
210
/* Extract each buffer byte to create the integer */
211
212
for (i = 0; i < OriginalObject->Buffer.Length; i++)
213
{
214
Value |= ((UINT64)
215
OriginalObject->Buffer.Pointer[i] << (i * 8));
216
}
217
break;
218
219
default:
220
221
return (AE_AML_OPERAND_TYPE);
222
}
223
224
NewObject = AcpiUtCreateIntegerObject (Value);
225
if (!NewObject)
226
{
227
return (AE_NO_MEMORY);
228
}
229
230
*ReturnObject = NewObject;
231
return (AE_OK);
232
}
233
234
235
/*******************************************************************************
236
*
237
* FUNCTION: AcpiNsConvertToString
238
*
239
* PARAMETERS: OriginalObject - Object to be converted
240
* ReturnObject - Where the new converted object is returned
241
*
242
* RETURN: Status. AE_OK if conversion was successful.
243
*
244
* DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
245
*
246
******************************************************************************/
247
248
ACPI_STATUS
249
AcpiNsConvertToString (
250
ACPI_OPERAND_OBJECT *OriginalObject,
251
ACPI_OPERAND_OBJECT **ReturnObject)
252
{
253
ACPI_OPERAND_OBJECT *NewObject;
254
ACPI_SIZE Length;
255
ACPI_STATUS Status;
256
257
258
switch (OriginalObject->Common.Type)
259
{
260
case ACPI_TYPE_INTEGER:
261
/*
262
* Integer-to-String conversion. Commonly, convert
263
* an integer of value 0 to a NULL string. The last element of
264
* _BIF and _BIX packages occasionally need this fix.
265
*/
266
if (OriginalObject->Integer.Value == 0)
267
{
268
/* Allocate a new NULL string object */
269
270
NewObject = AcpiUtCreateStringObject (0);
271
if (!NewObject)
272
{
273
return (AE_NO_MEMORY);
274
}
275
}
276
else
277
{
278
Status = AcpiExConvertToString (OriginalObject,
279
&NewObject, ACPI_IMPLICIT_CONVERT_HEX);
280
if (ACPI_FAILURE (Status))
281
{
282
return (Status);
283
}
284
}
285
break;
286
287
case ACPI_TYPE_BUFFER:
288
/*
289
* Buffer-to-String conversion. Use a ToString
290
* conversion, no transform performed on the buffer data. The best
291
* example of this is the _BIF method, where the string data from
292
* the battery is often (incorrectly) returned as buffer object(s).
293
*/
294
Length = 0;
295
while ((Length < OriginalObject->Buffer.Length) &&
296
(OriginalObject->Buffer.Pointer[Length]))
297
{
298
Length++;
299
}
300
301
/* Allocate a new string object */
302
303
NewObject = AcpiUtCreateStringObject (Length);
304
if (!NewObject)
305
{
306
return (AE_NO_MEMORY);
307
}
308
309
/*
310
* Copy the raw buffer data with no transform. String is already NULL
311
* terminated at Length+1.
312
*/
313
memcpy (NewObject->String.Pointer,
314
OriginalObject->Buffer.Pointer, Length);
315
break;
316
317
default:
318
319
return (AE_AML_OPERAND_TYPE);
320
}
321
322
*ReturnObject = NewObject;
323
return (AE_OK);
324
}
325
326
327
/*******************************************************************************
328
*
329
* FUNCTION: AcpiNsConvertToBuffer
330
*
331
* PARAMETERS: OriginalObject - Object to be converted
332
* ReturnObject - Where the new converted object is returned
333
*
334
* RETURN: Status. AE_OK if conversion was successful.
335
*
336
* DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
337
*
338
******************************************************************************/
339
340
ACPI_STATUS
341
AcpiNsConvertToBuffer (
342
ACPI_OPERAND_OBJECT *OriginalObject,
343
ACPI_OPERAND_OBJECT **ReturnObject)
344
{
345
ACPI_OPERAND_OBJECT *NewObject;
346
ACPI_STATUS Status;
347
ACPI_OPERAND_OBJECT **Elements;
348
UINT32 *DwordBuffer;
349
UINT32 Count;
350
UINT32 i;
351
352
353
switch (OriginalObject->Common.Type)
354
{
355
case ACPI_TYPE_INTEGER:
356
/*
357
* Integer-to-Buffer conversion.
358
* Convert the Integer to a packed-byte buffer. _MAT and other
359
* objects need this sometimes, if a read has been performed on a
360
* Field object that is less than or equal to the global integer
361
* size (32 or 64 bits).
362
*/
363
Status = AcpiExConvertToBuffer (OriginalObject, &NewObject);
364
if (ACPI_FAILURE (Status))
365
{
366
return (Status);
367
}
368
break;
369
370
case ACPI_TYPE_STRING:
371
372
/* String-to-Buffer conversion. Simple data copy */
373
374
NewObject = AcpiUtCreateBufferObject
375
(OriginalObject->String.Length);
376
if (!NewObject)
377
{
378
return (AE_NO_MEMORY);
379
}
380
381
memcpy (NewObject->Buffer.Pointer,
382
OriginalObject->String.Pointer, OriginalObject->String.Length);
383
break;
384
385
case ACPI_TYPE_PACKAGE:
386
/*
387
* This case is often seen for predefined names that must return a
388
* Buffer object with multiple DWORD integers within. For example,
389
* _FDE and _GTM. The Package can be converted to a Buffer.
390
*/
391
392
/* All elements of the Package must be integers */
393
394
Elements = OriginalObject->Package.Elements;
395
Count = OriginalObject->Package.Count;
396
397
for (i = 0; i < Count; i++)
398
{
399
if ((!*Elements) ||
400
((*Elements)->Common.Type != ACPI_TYPE_INTEGER))
401
{
402
return (AE_AML_OPERAND_TYPE);
403
}
404
Elements++;
405
}
406
407
/* Create the new buffer object to replace the Package */
408
409
NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count));
410
if (!NewObject)
411
{
412
return (AE_NO_MEMORY);
413
}
414
415
/* Copy the package elements (integers) to the buffer as DWORDs */
416
417
Elements = OriginalObject->Package.Elements;
418
DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer);
419
420
for (i = 0; i < Count; i++)
421
{
422
*DwordBuffer = (UINT32) (*Elements)->Integer.Value;
423
DwordBuffer++;
424
Elements++;
425
}
426
break;
427
428
default:
429
430
return (AE_AML_OPERAND_TYPE);
431
}
432
433
*ReturnObject = NewObject;
434
return (AE_OK);
435
}
436
437
438
/*******************************************************************************
439
*
440
* FUNCTION: AcpiNsConvertToUnicode
441
*
442
* PARAMETERS: Scope - Namespace node for the method/object
443
* OriginalObject - ASCII String Object to be converted
444
* ReturnObject - Where the new converted object is returned
445
*
446
* RETURN: Status. AE_OK if conversion was successful.
447
*
448
* DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
449
*
450
******************************************************************************/
451
452
ACPI_STATUS
453
AcpiNsConvertToUnicode (
454
ACPI_NAMESPACE_NODE *Scope,
455
ACPI_OPERAND_OBJECT *OriginalObject,
456
ACPI_OPERAND_OBJECT **ReturnObject)
457
{
458
ACPI_OPERAND_OBJECT *NewObject;
459
char *AsciiString;
460
UINT16 *UnicodeBuffer;
461
UINT32 UnicodeLength;
462
UINT32 i;
463
464
465
if (!OriginalObject)
466
{
467
return (AE_OK);
468
}
469
470
/* If a Buffer was returned, it must be at least two bytes long */
471
472
if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER)
473
{
474
if (OriginalObject->Buffer.Length < 2)
475
{
476
return (AE_AML_OPERAND_VALUE);
477
}
478
479
*ReturnObject = NULL;
480
return (AE_OK);
481
}
482
483
/*
484
* The original object is an ASCII string. Convert this string to
485
* a unicode buffer.
486
*/
487
AsciiString = OriginalObject->String.Pointer;
488
UnicodeLength = (OriginalObject->String.Length * 2) + 2;
489
490
/* Create a new buffer object for the Unicode data */
491
492
NewObject = AcpiUtCreateBufferObject (UnicodeLength);
493
if (!NewObject)
494
{
495
return (AE_NO_MEMORY);
496
}
497
498
UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer);
499
500
/* Convert ASCII to Unicode */
501
502
for (i = 0; i < OriginalObject->String.Length; i++)
503
{
504
UnicodeBuffer[i] = (UINT16) AsciiString[i];
505
}
506
507
*ReturnObject = NewObject;
508
return (AE_OK);
509
}
510
511
512
/*******************************************************************************
513
*
514
* FUNCTION: AcpiNsConvertToResource
515
*
516
* PARAMETERS: Scope - Namespace node for the method/object
517
* OriginalObject - Object to be converted
518
* ReturnObject - Where the new converted object is returned
519
*
520
* RETURN: Status. AE_OK if conversion was successful
521
*
522
* DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
523
* Buffer.
524
*
525
******************************************************************************/
526
527
ACPI_STATUS
528
AcpiNsConvertToResource (
529
ACPI_NAMESPACE_NODE *Scope,
530
ACPI_OPERAND_OBJECT *OriginalObject,
531
ACPI_OPERAND_OBJECT **ReturnObject)
532
{
533
ACPI_OPERAND_OBJECT *NewObject;
534
UINT8 *Buffer;
535
536
537
/*
538
* We can fix the following cases for an expected resource template:
539
* 1. No return value (interpreter slack mode is disabled)
540
* 2. A "Return (Zero)" statement
541
* 3. A "Return empty buffer" statement
542
*
543
* We will return a buffer containing a single EndTag
544
* resource descriptor.
545
*/
546
if (OriginalObject)
547
{
548
switch (OriginalObject->Common.Type)
549
{
550
case ACPI_TYPE_INTEGER:
551
552
/* We can only repair an Integer==0 */
553
554
if (OriginalObject->Integer.Value)
555
{
556
return (AE_AML_OPERAND_TYPE);
557
}
558
break;
559
560
case ACPI_TYPE_BUFFER:
561
562
if (OriginalObject->Buffer.Length)
563
{
564
/* Additional checks can be added in the future */
565
566
*ReturnObject = NULL;
567
return (AE_OK);
568
}
569
break;
570
571
case ACPI_TYPE_STRING:
572
default:
573
574
return (AE_AML_OPERAND_TYPE);
575
}
576
}
577
578
/* Create the new buffer object for the resource descriptor */
579
580
NewObject = AcpiUtCreateBufferObject (2);
581
if (!NewObject)
582
{
583
return (AE_NO_MEMORY);
584
}
585
586
Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
587
588
/* Initialize the Buffer with a single EndTag descriptor */
589
590
Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
591
Buffer[1] = 0x00;
592
593
*ReturnObject = NewObject;
594
return (AE_OK);
595
}
596
597
598
/*******************************************************************************
599
*
600
* FUNCTION: AcpiNsConvertToReference
601
*
602
* PARAMETERS: Scope - Namespace node for the method/object
603
* OriginalObject - Object to be converted
604
* ReturnObject - Where the new converted object is returned
605
*
606
* RETURN: Status. AE_OK if conversion was successful
607
*
608
* DESCRIPTION: Attempt to convert a Integer object to a ObjectReference.
609
* Buffer.
610
*
611
******************************************************************************/
612
613
ACPI_STATUS
614
AcpiNsConvertToReference (
615
ACPI_NAMESPACE_NODE *Scope,
616
ACPI_OPERAND_OBJECT *OriginalObject,
617
ACPI_OPERAND_OBJECT **ReturnObject)
618
{
619
ACPI_OPERAND_OBJECT *NewObject = NULL;
620
ACPI_STATUS Status;
621
ACPI_NAMESPACE_NODE *Node;
622
ACPI_GENERIC_STATE ScopeInfo;
623
char *Name;
624
625
626
ACPI_FUNCTION_NAME (NsConvertToReference);
627
628
629
/* Convert path into internal presentation */
630
631
Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name);
632
if (ACPI_FAILURE (Status))
633
{
634
return_ACPI_STATUS (Status);
635
}
636
637
/* Find the namespace node */
638
639
ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope);
640
Status = AcpiNsLookup (&ScopeInfo, Name,
641
ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
642
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
643
if (ACPI_FAILURE (Status))
644
{
645
/* Check if we are resolving a named reference within a package */
646
647
ACPI_ERROR_NAMESPACE (&ScopeInfo,
648
OriginalObject->String.Pointer, Status);
649
goto ErrorExit;
650
}
651
652
/* Create and init a new internal ACPI object */
653
654
NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
655
if (!NewObject)
656
{
657
Status = AE_NO_MEMORY;
658
goto ErrorExit;
659
}
660
NewObject->Reference.Node = Node;
661
NewObject->Reference.Object = Node->Object;
662
NewObject->Reference.Class = ACPI_REFCLASS_NAME;
663
664
/*
665
* Increase reference of the object if needed (the object is likely a
666
* null for device nodes).
667
*/
668
AcpiUtAddReference (Node->Object);
669
670
ErrorExit:
671
ACPI_FREE (Name);
672
*ReturnObject = NewObject;
673
return (Status);
674
}
675
676