]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/dev/acpica/utobject.c
This commit was generated by cvs2svn to compensate for changes in r146611,
[FreeBSD/FreeBSD.git] / sys / contrib / dev / acpica / utobject.c
1 /******************************************************************************
2  *
3  * Module Name: utobject - ACPI object create/delete/size/cache routines
4  *              $Revision: 90 $
5  *
6  *****************************************************************************/
7
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2004, 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 #define __UTOBJECT_C__
118
119 #include "acpi.h"
120 #include "acnamesp.h"
121 #include "amlcode.h"
122
123
124 #define _COMPONENT          ACPI_UTILITIES
125         ACPI_MODULE_NAME    ("utobject")
126
127
128 /*******************************************************************************
129  *
130  * FUNCTION:    AcpiUtCreateInternalObjectDbg
131  *
132  * PARAMETERS:  ModuleName          - Source file name of caller
133  *              LineNumber          - Line number of caller
134  *              ComponentId         - Component type of caller
135  *              Type                - ACPI Type of the new object
136  *
137  * RETURN:      Object              - The new object.  Null on failure
138  *
139  * DESCRIPTION: Create and initialize a new internal object.
140  *
141  * NOTE:        We always allocate the worst-case object descriptor because
142  *              these objects are cached, and we want them to be
143  *              one-size-satisifies-any-request.  This in itself may not be
144  *              the most memory efficient, but the efficiency of the object
145  *              cache should more than make up for this!
146  *
147  ******************************************************************************/
148
149 ACPI_OPERAND_OBJECT  *
150 AcpiUtCreateInternalObjectDbg (
151     char                    *ModuleName,
152     UINT32                  LineNumber,
153     UINT32                  ComponentId,
154     ACPI_OBJECT_TYPE        Type)
155 {
156     ACPI_OPERAND_OBJECT     *Object;
157     ACPI_OPERAND_OBJECT     *SecondObject;
158
159
160     ACPI_FUNCTION_TRACE_STR ("UtCreateInternalObjectDbg", AcpiUtGetTypeName (Type));
161
162
163     /* Allocate the raw object descriptor */
164
165     Object = AcpiUtAllocateObjectDescDbg (ModuleName, LineNumber, ComponentId);
166     if (!Object)
167     {
168         return_PTR (NULL);
169     }
170
171     switch (Type)
172     {
173     case ACPI_TYPE_REGION:
174     case ACPI_TYPE_BUFFER_FIELD:
175
176         /* These types require a secondary object */
177
178         SecondObject = AcpiUtAllocateObjectDescDbg (ModuleName, LineNumber, ComponentId);
179         if (!SecondObject)
180         {
181             AcpiUtDeleteObjectDesc (Object);
182             return_PTR (NULL);
183         }
184
185         SecondObject->Common.Type = ACPI_TYPE_LOCAL_EXTRA;
186         SecondObject->Common.ReferenceCount = 1;
187
188         /* Link the second object to the first */
189
190         Object->Common.NextObject = SecondObject;
191         break;
192
193     default:
194         /* All others have no secondary object */
195         break;
196     }
197
198     /* Save the object type in the object descriptor */
199
200     Object->Common.Type = (UINT8) Type;
201
202     /* Init the reference count */
203
204     Object->Common.ReferenceCount = 1;
205
206     /* Any per-type initialization should go here */
207
208     return_PTR (Object);
209 }
210
211
212 /*******************************************************************************
213  *
214  * FUNCTION:    AcpiUtCreateBufferObject
215  *
216  * PARAMETERS:  BufferSize             - Size of buffer to be created
217  *
218  * RETURN:      Pointer to a new Buffer object
219  *
220  * DESCRIPTION: Create a fully initialized buffer object
221  *
222  ******************************************************************************/
223
224 ACPI_OPERAND_OBJECT *
225 AcpiUtCreateBufferObject (
226     ACPI_SIZE               BufferSize)
227 {
228     ACPI_OPERAND_OBJECT     *BufferDesc;
229     UINT8                   *Buffer = NULL;
230
231
232     ACPI_FUNCTION_TRACE_U32 ("UtCreateBufferObject", BufferSize);
233
234
235     /* Create a new Buffer object */
236
237     BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
238     if (!BufferDesc)
239     {
240         return_PTR (NULL);
241     }
242
243     /* Create an actual buffer only if size > 0 */
244
245     if (BufferSize > 0)
246     {
247         /* Allocate the actual buffer */
248
249         Buffer = ACPI_MEM_CALLOCATE (BufferSize);
250         if (!Buffer)
251         {
252             ACPI_REPORT_ERROR (("CreateBuffer: could not allocate size %X\n",
253                 (UINT32) BufferSize));
254             AcpiUtRemoveReference (BufferDesc);
255             return_PTR (NULL);
256         }
257     }
258
259     /* Complete buffer object initialization */
260
261     BufferDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
262     BufferDesc->Buffer.Pointer = Buffer;
263     BufferDesc->Buffer.Length = (UINT32) BufferSize;
264
265     /* Return the new buffer descriptor */
266
267     return_PTR (BufferDesc);
268 }
269
270
271 /*******************************************************************************
272  *
273  * FUNCTION:    AcpiUtCreateStringObject
274  *
275  * PARAMETERS:  StringSize             - Size of string to be created.  Does not
276  *                                       include NULL terminator, this is added
277  *                                       automatically.
278  *
279  * RETURN:      Pointer to a new String object
280  *
281  * DESCRIPTION: Create a fully initialized string object
282  *
283  ******************************************************************************/
284
285 ACPI_OPERAND_OBJECT *
286 AcpiUtCreateStringObject (
287     ACPI_SIZE               StringSize)
288 {
289     ACPI_OPERAND_OBJECT     *StringDesc;
290     char                    *String;
291
292
293     ACPI_FUNCTION_TRACE_U32 ("UtCreateStringObject", StringSize);
294
295
296     /* Create a new String object */
297
298     StringDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
299     if (!StringDesc)
300     {
301         return_PTR (NULL);
302     }
303
304     /*
305      * Allocate the actual string buffer -- (Size + 1) for NULL terminator.
306      * NOTE: Zero-length strings are NULL terminated
307      */
308     String = ACPI_MEM_CALLOCATE (StringSize + 1);
309     if (!String)
310     {
311         ACPI_REPORT_ERROR (("CreateString: could not allocate size %X\n",
312             (UINT32) StringSize));
313         AcpiUtRemoveReference (StringDesc);
314         return_PTR (NULL);
315     }
316
317     /* Complete string object initialization */
318
319     StringDesc->String.Pointer = String;
320     StringDesc->String.Length = (UINT32) StringSize;
321
322     /* Return the new string descriptor */
323
324     return_PTR (StringDesc);
325 }
326
327
328 /*******************************************************************************
329  *
330  * FUNCTION:    AcpiUtValidInternalObject
331  *
332  * PARAMETERS:  Object              - Object to be validated
333  *
334  * RETURN:      Validate a pointer to be an ACPI_OPERAND_OBJECT
335  *
336  ******************************************************************************/
337
338 BOOLEAN
339 AcpiUtValidInternalObject (
340     void                    *Object)
341 {
342
343     ACPI_FUNCTION_NAME ("UtValidInternalObject");
344
345
346     /* Check for a null pointer */
347
348     if (!Object)
349     {
350         ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));
351         return (FALSE);
352     }
353
354     /* Check the descriptor type field */
355
356     switch (ACPI_GET_DESCRIPTOR_TYPE (Object))
357     {
358     case ACPI_DESC_TYPE_OPERAND:
359
360         /* The object appears to be a valid ACPI_OPERAND_OBJECT  */
361
362         return (TRUE);
363
364     default:
365         ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
366                 "%p is not not an ACPI operand obj [%s]\n",
367                 Object, AcpiUtGetDescriptorName (Object)));
368         break;
369     }
370
371     return (FALSE);
372 }
373
374
375 /*******************************************************************************
376  *
377  * FUNCTION:    AcpiUtAllocateObjectDescDbg
378  *
379  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
380  *              LineNumber          - Caller's line number (for error output)
381  *              ComponentId         - Caller's component ID (for error output)
382  *
383  * RETURN:      Pointer to newly allocated object descriptor.  Null on error
384  *
385  * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle
386  *              error conditions.
387  *
388  ******************************************************************************/
389
390 void *
391 AcpiUtAllocateObjectDescDbg (
392     char                    *ModuleName,
393     UINT32                  LineNumber,
394     UINT32                  ComponentId)
395 {
396     ACPI_OPERAND_OBJECT     *Object;
397
398
399     ACPI_FUNCTION_TRACE ("UtAllocateObjectDescDbg");
400
401
402     Object = AcpiUtAcquireFromCache (ACPI_MEM_LIST_OPERAND);
403     if (!Object)
404     {
405         _ACPI_REPORT_ERROR (ModuleName, LineNumber, ComponentId,
406                         ("Could not allocate an object descriptor\n"));
407
408         return_PTR (NULL);
409     }
410
411     /* Mark the descriptor type */
412
413     ACPI_SET_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_OPERAND);
414
415     ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n",
416             Object, (UINT32) sizeof (ACPI_OPERAND_OBJECT)));
417
418     return_PTR (Object);
419 }
420
421
422 /*******************************************************************************
423  *
424  * FUNCTION:    AcpiUtDeleteObjectDesc
425  *
426  * PARAMETERS:  Object          - An Acpi internal object to be deleted
427  *
428  * RETURN:      None.
429  *
430  * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
431  *
432  ******************************************************************************/
433
434 void
435 AcpiUtDeleteObjectDesc (
436     ACPI_OPERAND_OBJECT     *Object)
437 {
438     ACPI_FUNCTION_TRACE_PTR ("UtDeleteObjectDesc", Object);
439
440
441     /* Object must be an ACPI_OPERAND_OBJECT  */
442
443     if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
444     {
445         ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
446                 "%p is not an ACPI Operand object [%s]\n", Object,
447                 AcpiUtGetDescriptorName (Object)));
448         return_VOID;
449     }
450
451     AcpiUtReleaseToCache (ACPI_MEM_LIST_OPERAND, Object);
452
453     return_VOID;
454 }
455
456
457 /*******************************************************************************
458  *
459  * FUNCTION:    AcpiUtDeleteObjectCache
460  *
461  * PARAMETERS:  None
462  *
463  * RETURN:      None
464  *
465  * DESCRIPTION: Purge the global state object cache.  Used during subsystem
466  *              termination.
467  *
468  ******************************************************************************/
469
470 void
471 AcpiUtDeleteObjectCache (
472     void)
473 {
474     ACPI_FUNCTION_TRACE ("UtDeleteObjectCache");
475
476
477     AcpiUtDeleteGenericCache (ACPI_MEM_LIST_OPERAND);
478     return_VOID;
479 }
480
481
482 /*******************************************************************************
483  *
484  * FUNCTION:    AcpiUtGetSimpleObjectSize
485  *
486  * PARAMETERS:  *InternalObject     - Pointer to the object we are examining
487  *              *ObjLength          - Where the length is returned
488  *
489  * RETURN:      Status
490  *
491  * DESCRIPTION: This function is called to determine the space required to
492  *              contain a simple object for return to an external user.
493  *
494  *              The length includes the object structure plus any additional
495  *              needed space.
496  *
497  ******************************************************************************/
498
499 ACPI_STATUS
500 AcpiUtGetSimpleObjectSize (
501     ACPI_OPERAND_OBJECT     *InternalObject,
502     ACPI_SIZE               *ObjLength)
503 {
504     ACPI_SIZE               Length;
505     ACPI_STATUS             Status = AE_OK;
506
507
508     ACPI_FUNCTION_TRACE_PTR ("UtGetSimpleObjectSize", InternalObject);
509
510
511     /* Handle a null object (Could be a uninitialized package element -- which is legal) */
512
513     if (!InternalObject)
514     {
515         *ObjLength = 0;
516         return_ACPI_STATUS (AE_OK);
517     }
518
519     /* Start with the length of the Acpi object */
520
521     Length = sizeof (ACPI_OBJECT);
522
523     if (ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_NAMED)
524     {
525         /* Object is a named object (reference), just return the length */
526
527         *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
528         return_ACPI_STATUS (Status);
529     }
530
531     /*
532      * The final length depends on the object type
533      * Strings and Buffers are packed right up against the parent object and
534      * must be accessed bytewise or there may be alignment problems on
535      * certain processors
536      */
537     switch (ACPI_GET_OBJECT_TYPE (InternalObject))
538     {
539     case ACPI_TYPE_STRING:
540
541         Length += (ACPI_SIZE) InternalObject->String.Length + 1;
542         break;
543
544
545     case ACPI_TYPE_BUFFER:
546
547         Length += (ACPI_SIZE) InternalObject->Buffer.Length;
548         break;
549
550
551     case ACPI_TYPE_INTEGER:
552     case ACPI_TYPE_PROCESSOR:
553     case ACPI_TYPE_POWER:
554
555         /*
556          * No extra data for these types
557          */
558         break;
559
560
561     case ACPI_TYPE_LOCAL_REFERENCE:
562
563         switch (InternalObject->Reference.Opcode)
564         {
565         case AML_INT_NAMEPATH_OP:
566
567             /*
568              * Get the actual length of the full pathname to this object.
569              * The reference will be converted to the pathname to the object
570              */
571             Length += ACPI_ROUND_UP_TO_NATIVE_WORD (AcpiNsGetPathnameLength (InternalObject->Reference.Node));
572             break;
573
574         default:
575
576             /*
577              * No other reference opcodes are supported.
578              * Notably, Locals and Args are not supported, but this may be
579              * required eventually.
580              */
581             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
582                 "Unsupported Reference opcode=%X in object %p\n",
583                 InternalObject->Reference.Opcode, InternalObject));
584             Status = AE_TYPE;
585             break;
586         }
587         break;
588
589
590     default:
591
592         ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported type=%X in object %p\n",
593             ACPI_GET_OBJECT_TYPE (InternalObject), InternalObject));
594         Status = AE_TYPE;
595         break;
596     }
597
598     /*
599      * Account for the space required by the object rounded up to the next
600      * multiple of the machine word size.  This keeps each object aligned
601      * on a machine word boundary. (preventing alignment faults on some
602      * machines.)
603      */
604     *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
605     return_ACPI_STATUS (Status);
606 }
607
608
609 /*******************************************************************************
610  *
611  * FUNCTION:    AcpiUtGetElementLength
612  *
613  * PARAMETERS:  ACPI_PKG_CALLBACK
614  *
615  * RETURN:      Status
616  *
617  * DESCRIPTION: Get the length of one package element.
618  *
619  ******************************************************************************/
620
621 ACPI_STATUS
622 AcpiUtGetElementLength (
623     UINT8                   ObjectType,
624     ACPI_OPERAND_OBJECT     *SourceObject,
625     ACPI_GENERIC_STATE      *State,
626     void                    *Context)
627 {
628     ACPI_STATUS             Status = AE_OK;
629     ACPI_PKG_INFO           *Info = (ACPI_PKG_INFO *) Context;
630     ACPI_SIZE               ObjectSpace;
631
632
633     switch (ObjectType)
634     {
635     case ACPI_COPY_TYPE_SIMPLE:
636
637         /*
638          * Simple object - just get the size (Null object/entry is handled
639          * here also) and sum it into the running package length
640          */
641         Status = AcpiUtGetSimpleObjectSize (SourceObject, &ObjectSpace);
642         if (ACPI_FAILURE (Status))
643         {
644             return (Status);
645         }
646
647         Info->Length += ObjectSpace;
648         break;
649
650
651     case ACPI_COPY_TYPE_PACKAGE:
652
653         /* Package object - nothing much to do here, let the walk handle it */
654
655         Info->NumPackages++;
656         State->Pkg.ThisTargetObj = NULL;
657         break;
658
659
660     default:
661
662         /* No other types allowed */
663
664         return (AE_BAD_PARAMETER);
665     }
666
667     return (Status);
668 }
669
670
671 /*******************************************************************************
672  *
673  * FUNCTION:    AcpiUtGetPackageObjectSize
674  *
675  * PARAMETERS:  *InternalObject     - Pointer to the object we are examining
676  *              *ObjLength          - Where the length is returned
677  *
678  * RETURN:      Status
679  *
680  * DESCRIPTION: This function is called to determine the space required to
681  *              contain a package object for return to an external user.
682  *
683  *              This is moderately complex since a package contains other
684  *              objects including packages.
685  *
686  ******************************************************************************/
687
688 ACPI_STATUS
689 AcpiUtGetPackageObjectSize (
690     ACPI_OPERAND_OBJECT     *InternalObject,
691     ACPI_SIZE               *ObjLength)
692 {
693     ACPI_STATUS             Status;
694     ACPI_PKG_INFO           Info;
695
696
697     ACPI_FUNCTION_TRACE_PTR ("UtGetPackageObjectSize", InternalObject);
698
699
700     Info.Length      = 0;
701     Info.ObjectSpace = 0;
702     Info.NumPackages = 1;
703
704     Status = AcpiUtWalkPackageTree (InternalObject, NULL,
705                             AcpiUtGetElementLength, &Info);
706     if (ACPI_FAILURE (Status))
707     {
708         return_ACPI_STATUS (Status);
709     }
710
711     /*
712      * We have handled all of the objects in all levels of the package.
713      * just add the length of the package objects themselves.
714      * Round up to the next machine word.
715      */
716     Info.Length += ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) *
717                     (ACPI_SIZE) Info.NumPackages;
718
719     /* Return the total package length */
720
721     *ObjLength = Info.Length;
722     return_ACPI_STATUS (Status);
723 }
724
725
726 /*******************************************************************************
727  *
728  * FUNCTION:    AcpiUtGetObjectSize
729  *
730  * PARAMETERS:  *InternalObject     - Pointer to the object we are examining
731  *              *ObjLength          - Where the length will be returned
732  *
733  * RETURN:      Status
734  *
735  * DESCRIPTION: This function is called to determine the space required to
736  *              contain an object for return to an API user.
737  *
738  ******************************************************************************/
739
740 ACPI_STATUS
741 AcpiUtGetObjectSize(
742     ACPI_OPERAND_OBJECT     *InternalObject,
743     ACPI_SIZE               *ObjLength)
744 {
745     ACPI_STATUS             Status;
746
747
748     ACPI_FUNCTION_ENTRY ();
749
750
751     if ((ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_OPERAND) &&
752         (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE))
753     {
754         Status = AcpiUtGetPackageObjectSize (InternalObject, ObjLength);
755     }
756     else
757     {
758         Status = AcpiUtGetSimpleObjectSize (InternalObject, ObjLength);
759     }
760
761     return (Status);
762 }
763
764