excreate.c revision 193267
1232809Sjmallett/******************************************************************************
2232809Sjmallett *
3232809Sjmallett * Module Name: excreate - Named object creation
4232809Sjmallett *
5232809Sjmallett *****************************************************************************/
6232809Sjmallett
7232809Sjmallett/******************************************************************************
8232809Sjmallett *
9232809Sjmallett * 1. Copyright Notice
10232809Sjmallett *
11232809Sjmallett * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
12232809Sjmallett * All rights reserved.
13232809Sjmallett *
14232809Sjmallett * 2. License
15232809Sjmallett *
16232809Sjmallett * 2.1. This is your license from Intel Corp. under its intellectual property
17232809Sjmallett * rights.  You may have additional license terms from the party that provided
18232809Sjmallett * you this software, covering your right to use that party's intellectual
19232809Sjmallett * property rights.
20232809Sjmallett *
21232809Sjmallett * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22232809Sjmallett * copy of the source code appearing in this file ("Covered Code") an
23232809Sjmallett * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24232809Sjmallett * base code distributed originally by Intel ("Original Intel Code") to copy,
25232809Sjmallett * make derivatives, distribute, use and display any portion of the Covered
26232809Sjmallett * Code in any form, with the right to sublicense such rights; and
27232809Sjmallett *
28232809Sjmallett * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29232809Sjmallett * license (with the right to sublicense), under only those claims of Intel
30232809Sjmallett * patents that are infringed by the Original Intel Code, to make, use, sell,
31232809Sjmallett * offer to sell, and import the Covered Code and derivative works thereof
32232809Sjmallett * solely to the minimum extent necessary to exercise the above copyright
33232809Sjmallett * license, and in no event shall the patent license extend to any additions
34232809Sjmallett * to or modifications of the Original Intel Code.  No other license or right
35232809Sjmallett * is granted directly or by implication, estoppel or otherwise;
36232809Sjmallett *
37232809Sjmallett * The above copyright and patent license is granted only if the following
38232809Sjmallett * conditions are met:
39232809Sjmallett *
40232809Sjmallett * 3. Conditions
41232809Sjmallett *
42232809Sjmallett * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43232809Sjmallett * Redistribution of source code of any substantial portion of the Covered
44232809Sjmallett * Code or modification with rights to further distribute source must include
45232809Sjmallett * the above Copyright Notice, the above License, this list of Conditions,
46232809Sjmallett * and the following Disclaimer and Export Compliance provision.  In addition,
47232809Sjmallett * Licensee must cause all Covered Code to which Licensee contributes to
48232809Sjmallett * contain a file documenting the changes Licensee made to create that Covered
49232809Sjmallett * Code and the date of any change.  Licensee must include in that file the
50232809Sjmallett * documentation of any changes made by any predecessor Licensee.  Licensee
51232809Sjmallett * must include a prominent statement that the modification is derived,
52232809Sjmallett * directly or indirectly, from Original Intel Code.
53232809Sjmallett *
54232809Sjmallett * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55232809Sjmallett * Redistribution of source code of any substantial portion of the Covered
56232809Sjmallett * Code or modification without rights to further distribute source must
57232809Sjmallett * include the following Disclaimer and Export Compliance provision in the
58232809Sjmallett * documentation and/or other materials provided with distribution.  In
59232809Sjmallett * addition, Licensee may not authorize further sublicense of source of any
60232809Sjmallett * portion of the Covered Code, and must include terms to the effect that the
61232809Sjmallett * license from Licensee to its licensee is limited to the intellectual
62232809Sjmallett * property embodied in the software Licensee provides to its licensee, and
63232809Sjmallett * not to intellectual property embodied in modifications its licensee may
64232809Sjmallett * make.
65232809Sjmallett *
66232809Sjmallett * 3.3. Redistribution of Executable. Redistribution in executable form of any
67232809Sjmallett * substantial portion of the Covered Code or modification must reproduce the
68232809Sjmallett * above Copyright Notice, and the following Disclaimer and Export Compliance
69232809Sjmallett * provision in the documentation and/or other materials provided with the
70232809Sjmallett * distribution.
71232809Sjmallett *
72232809Sjmallett * 3.4. Intel retains all right, title, and interest in and to the Original
73232809Sjmallett * Intel Code.
74232809Sjmallett *
75232809Sjmallett * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76232809Sjmallett * Intel shall be used in advertising or otherwise to promote the sale, use or
77232809Sjmallett * other dealings in products derived from or relating to the Covered Code
78232809Sjmallett * without prior written authorization from Intel.
79232809Sjmallett *
80232809Sjmallett * 4. Disclaimer and Export Compliance
81232809Sjmallett *
82232809Sjmallett * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83232809Sjmallett * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84232809Sjmallett * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85232809Sjmallett * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86232809Sjmallett
87232809Sjmallett * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88232809Sjmallett * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89232809Sjmallett * PARTICULAR PURPOSE.
90232809Sjmallett *
91232809Sjmallett * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92232809Sjmallett * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93232809Sjmallett * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94232809Sjmallett * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95232809Sjmallett * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96232809Sjmallett * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97232809Sjmallett * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98232809Sjmallett * LIMITED REMEDY.
99232809Sjmallett *
100232809Sjmallett * 4.3. Licensee shall not export, either directly or indirectly, any of this
101232809Sjmallett * software or system incorporating such software without first obtaining any
102232809Sjmallett * required license or other approval from the U. S. Department of Commerce or
103232809Sjmallett * any other agency or department of the United States Government.  In the
104232809Sjmallett * event Licensee exports any such software from the United States or
105232809Sjmallett * re-exports any such software from a foreign destination, Licensee shall
106232809Sjmallett * ensure that the distribution and export/re-export of the software is in
107232809Sjmallett * compliance with all laws, regulations, orders, or other restrictions of the
108232809Sjmallett * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109232809Sjmallett * any of its subsidiaries will export/re-export any technical data, process,
110232809Sjmallett * software, or service, directly or indirectly, to any country for which the
111232809Sjmallett * United States government or any agency thereof requires an export license,
112232809Sjmallett * other governmental approval, or letter of assurance, without first obtaining
113232809Sjmallett * such license, approval or letter.
114232809Sjmallett *
115232809Sjmallett *****************************************************************************/
116232809Sjmallett
117232809Sjmallett#define __EXCREATE_C__
118232809Sjmallett
119232809Sjmallett#include "acpi.h"
120232809Sjmallett#include "accommon.h"
121232809Sjmallett#include "acinterp.h"
122232809Sjmallett#include "amlcode.h"
123232809Sjmallett#include "acnamesp.h"
124232809Sjmallett
125232809Sjmallett
126232809Sjmallett#define _COMPONENT          ACPI_EXECUTER
127232809Sjmallett        ACPI_MODULE_NAME    ("excreate")
128232809Sjmallett
129232809Sjmallett
130232809Sjmallett#ifndef ACPI_NO_METHOD_EXECUTION
131232809Sjmallett/*******************************************************************************
132232809Sjmallett *
133232809Sjmallett * FUNCTION:    AcpiExCreateAlias
134232809Sjmallett *
135232809Sjmallett * PARAMETERS:  WalkState            - Current state, contains operands
136232809Sjmallett *
137232809Sjmallett * RETURN:      Status
138232809Sjmallett *
139232809Sjmallett * DESCRIPTION: Create a new named alias
140232809Sjmallett *
141232809Sjmallett ******************************************************************************/
142232809Sjmallett
143232809SjmallettACPI_STATUS
144232809SjmallettAcpiExCreateAlias (
145232809Sjmallett    ACPI_WALK_STATE         *WalkState)
146232809Sjmallett{
147232809Sjmallett    ACPI_NAMESPACE_NODE     *TargetNode;
148232809Sjmallett    ACPI_NAMESPACE_NODE     *AliasNode;
149232809Sjmallett    ACPI_STATUS             Status = AE_OK;
150232809Sjmallett
151232809Sjmallett
152232809Sjmallett    ACPI_FUNCTION_TRACE (ExCreateAlias);
153232809Sjmallett
154232809Sjmallett
155232809Sjmallett    /* Get the source/alias operands (both namespace nodes) */
156232809Sjmallett
157232809Sjmallett    AliasNode =  (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
158232809Sjmallett    TargetNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[1];
159232809Sjmallett
160232809Sjmallett    if ((TargetNode->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
161232809Sjmallett        (TargetNode->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
162232809Sjmallett    {
163232809Sjmallett        /*
164232809Sjmallett         * Dereference an existing alias so that we don't create a chain
165232809Sjmallett         * of aliases.  With this code, we guarantee that an alias is
166232809Sjmallett         * always exactly one level of indirection away from the
167232809Sjmallett         * actual aliased name.
168232809Sjmallett         */
169232809Sjmallett        TargetNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, TargetNode->Object);
170232809Sjmallett    }
171232809Sjmallett
172232809Sjmallett    /*
173232809Sjmallett     * For objects that can never change (i.e., the NS node will
174232809Sjmallett     * permanently point to the same object), we can simply attach
175232809Sjmallett     * the object to the new NS node.  For other objects (such as
176232809Sjmallett     * Integers, buffers, etc.), we have to point the Alias node
177232809Sjmallett     * to the original Node.
178232809Sjmallett     */
179232809Sjmallett    switch (TargetNode->Type)
180232809Sjmallett    {
181232809Sjmallett
182232809Sjmallett    /* For these types, the sub-object can change dynamically via a Store */
183232809Sjmallett
184232809Sjmallett    case ACPI_TYPE_INTEGER:
185232809Sjmallett    case ACPI_TYPE_STRING:
186232809Sjmallett    case ACPI_TYPE_BUFFER:
187232809Sjmallett    case ACPI_TYPE_PACKAGE:
188232809Sjmallett    case ACPI_TYPE_BUFFER_FIELD:
189232809Sjmallett
190232809Sjmallett    /*
191232809Sjmallett     * These types open a new scope, so we need the NS node in order to access
192232809Sjmallett     * any children.
193232809Sjmallett     */
194232809Sjmallett    case ACPI_TYPE_DEVICE:
195232809Sjmallett    case ACPI_TYPE_POWER:
196232809Sjmallett    case ACPI_TYPE_PROCESSOR:
197232809Sjmallett    case ACPI_TYPE_THERMAL:
198232809Sjmallett    case ACPI_TYPE_LOCAL_SCOPE:
199232809Sjmallett
200232809Sjmallett        /*
201232809Sjmallett         * The new alias has the type ALIAS and points to the original
202232809Sjmallett         * NS node, not the object itself.
203232809Sjmallett         */
204232809Sjmallett        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
205232809Sjmallett        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
206232809Sjmallett        break;
207232809Sjmallett
208232809Sjmallett    case ACPI_TYPE_METHOD:
209232809Sjmallett
210232809Sjmallett        /*
211232809Sjmallett         * Control method aliases need to be differentiated
212232809Sjmallett         */
213232809Sjmallett        AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
214232809Sjmallett        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
215232809Sjmallett        break;
216232809Sjmallett
217232809Sjmallett    default:
218232809Sjmallett
219232809Sjmallett        /* Attach the original source object to the new Alias Node */
220232809Sjmallett
221232809Sjmallett        /*
222232809Sjmallett         * The new alias assumes the type of the target, and it points
223232809Sjmallett         * to the same object.  The reference count of the object has an
224232809Sjmallett         * additional reference to prevent deletion out from under either the
225232809Sjmallett         * target node or the alias Node
226232809Sjmallett         */
227232809Sjmallett        Status = AcpiNsAttachObject (AliasNode,
228232809Sjmallett                    AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
229232809Sjmallett        break;
230232809Sjmallett    }
231232809Sjmallett
232232809Sjmallett    /* Since both operands are Nodes, we don't need to delete them */
233232809Sjmallett
234232809Sjmallett    return_ACPI_STATUS (Status);
235232809Sjmallett}
236232809Sjmallett
237232809Sjmallett
238232809Sjmallett/*******************************************************************************
239232809Sjmallett *
240232809Sjmallett * FUNCTION:    AcpiExCreateEvent
241232809Sjmallett *
242232809Sjmallett * PARAMETERS:  WalkState           - Current state
243232809Sjmallett *
244232809Sjmallett * RETURN:      Status
245232809Sjmallett *
246232809Sjmallett * DESCRIPTION: Create a new event object
247232809Sjmallett *
248232809Sjmallett ******************************************************************************/
249232809Sjmallett
250232809SjmallettACPI_STATUS
251232809SjmallettAcpiExCreateEvent (
252232809Sjmallett    ACPI_WALK_STATE         *WalkState)
253232809Sjmallett{
254232809Sjmallett    ACPI_STATUS             Status;
255232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
256232809Sjmallett
257232809Sjmallett
258232809Sjmallett    ACPI_FUNCTION_TRACE (ExCreateEvent);
259232809Sjmallett
260232809Sjmallett
261232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_EVENT);
262232809Sjmallett    if (!ObjDesc)
263232809Sjmallett    {
264232809Sjmallett        Status = AE_NO_MEMORY;
265232809Sjmallett        goto Cleanup;
266232809Sjmallett    }
267232809Sjmallett
268232809Sjmallett    /*
269232809Sjmallett     * Create the actual OS semaphore, with zero initial units -- meaning
270232809Sjmallett     * that the event is created in an unsignalled state
271232809Sjmallett     */
272232809Sjmallett    Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0,
273232809Sjmallett                &ObjDesc->Event.OsSemaphore);
274232809Sjmallett    if (ACPI_FAILURE (Status))
275232809Sjmallett    {
276232809Sjmallett        goto Cleanup;
277232809Sjmallett    }
278232809Sjmallett
279232809Sjmallett    /* Attach object to the Node */
280232809Sjmallett
281232809Sjmallett    Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0],
282232809Sjmallett                ObjDesc, ACPI_TYPE_EVENT);
283232809Sjmallett
284232809SjmallettCleanup:
285232809Sjmallett    /*
286232809Sjmallett     * Remove local reference to the object (on error, will cause deletion
287232809Sjmallett     * of both object and semaphore if present.)
288232809Sjmallett     */
289232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
290232809Sjmallett    return_ACPI_STATUS (Status);
291232809Sjmallett}
292232809Sjmallett
293232809Sjmallett
294232809Sjmallett/*******************************************************************************
295232809Sjmallett *
296232809Sjmallett * FUNCTION:    AcpiExCreateMutex
297232809Sjmallett *
298232809Sjmallett * PARAMETERS:  WalkState           - Current state
299232809Sjmallett *
300232809Sjmallett * RETURN:      Status
301232809Sjmallett *
302232809Sjmallett * DESCRIPTION: Create a new mutex object
303232809Sjmallett *
304232809Sjmallett *              Mutex (Name[0], SyncLevel[1])
305232809Sjmallett *
306232809Sjmallett ******************************************************************************/
307232809Sjmallett
308232809SjmallettACPI_STATUS
309232809SjmallettAcpiExCreateMutex (
310232809Sjmallett    ACPI_WALK_STATE         *WalkState)
311232809Sjmallett{
312232809Sjmallett    ACPI_STATUS             Status = AE_OK;
313232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
314232809Sjmallett
315232809Sjmallett
316232809Sjmallett    ACPI_FUNCTION_TRACE_PTR (ExCreateMutex, ACPI_WALK_OPERANDS);
317232809Sjmallett
318232809Sjmallett
319232809Sjmallett    /* Create the new mutex object */
320232809Sjmallett
321232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX);
322232809Sjmallett    if (!ObjDesc)
323232809Sjmallett    {
324232809Sjmallett        Status = AE_NO_MEMORY;
325232809Sjmallett        goto Cleanup;
326232809Sjmallett    }
327232809Sjmallett
328232809Sjmallett    /* Create the actual OS Mutex */
329232809Sjmallett
330232809Sjmallett    Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
331232809Sjmallett    if (ACPI_FAILURE (Status))
332232809Sjmallett    {
333232809Sjmallett        goto Cleanup;
334232809Sjmallett    }
335232809Sjmallett
336232809Sjmallett    /* Init object and attach to NS node */
337232809Sjmallett
338232809Sjmallett    ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value;
339232809Sjmallett    ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
340232809Sjmallett
341232809Sjmallett    Status = AcpiNsAttachObject (ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX);
342232809Sjmallett
343232809Sjmallett
344232809SjmallettCleanup:
345232809Sjmallett    /*
346232809Sjmallett     * Remove local reference to the object (on error, will cause deletion
347232809Sjmallett     * of both object and semaphore if present.)
348232809Sjmallett     */
349232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
350232809Sjmallett    return_ACPI_STATUS (Status);
351232809Sjmallett}
352232809Sjmallett
353232809Sjmallett
354232809Sjmallett/*******************************************************************************
355232809Sjmallett *
356232809Sjmallett * FUNCTION:    AcpiExCreateRegion
357232809Sjmallett *
358232809Sjmallett * PARAMETERS:  AmlStart            - Pointer to the region declaration AML
359232809Sjmallett *              AmlLength           - Max length of the declaration AML
360232809Sjmallett *              RegionSpace         - SpaceID for the region
361232809Sjmallett *              WalkState           - Current state
362232809Sjmallett *
363232809Sjmallett * RETURN:      Status
364232809Sjmallett *
365232809Sjmallett * DESCRIPTION: Create a new operation region object
366232809Sjmallett *
367232809Sjmallett ******************************************************************************/
368232809Sjmallett
369232809SjmallettACPI_STATUS
370232809SjmallettAcpiExCreateRegion (
371232809Sjmallett    UINT8                   *AmlStart,
372232809Sjmallett    UINT32                  AmlLength,
373232809Sjmallett    UINT8                   RegionSpace,
374232809Sjmallett    ACPI_WALK_STATE         *WalkState)
375232809Sjmallett{
376232809Sjmallett    ACPI_STATUS             Status;
377232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
378232809Sjmallett    ACPI_NAMESPACE_NODE     *Node;
379232809Sjmallett    ACPI_OPERAND_OBJECT     *RegionObj2;
380232809Sjmallett
381232809Sjmallett
382232809Sjmallett    ACPI_FUNCTION_TRACE (ExCreateRegion);
383232809Sjmallett
384232809Sjmallett
385232809Sjmallett    /* Get the Namespace Node */
386232809Sjmallett
387232809Sjmallett    Node = WalkState->Op->Common.Node;
388232809Sjmallett
389232809Sjmallett    /*
390232809Sjmallett     * If the region object is already attached to this node,
391232809Sjmallett     * just return
392232809Sjmallett     */
393232809Sjmallett    if (AcpiNsGetAttachedObject (Node))
394232809Sjmallett    {
395232809Sjmallett        return_ACPI_STATUS (AE_OK);
396232809Sjmallett    }
397232809Sjmallett
398232809Sjmallett    /*
399232809Sjmallett     * Space ID must be one of the predefined IDs, or in the user-defined
400232809Sjmallett     * range
401232809Sjmallett     */
402232809Sjmallett    if ((RegionSpace >= ACPI_NUM_PREDEFINED_REGIONS) &&
403232809Sjmallett        (RegionSpace < ACPI_USER_REGION_BEGIN))
404232809Sjmallett    {
405232809Sjmallett        ACPI_ERROR ((AE_INFO, "Invalid AddressSpace type %X", RegionSpace));
406232809Sjmallett        return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
407232809Sjmallett    }
408232809Sjmallett
409232809Sjmallett    ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n",
410232809Sjmallett        AcpiUtGetRegionName (RegionSpace), RegionSpace));
411232809Sjmallett
412232809Sjmallett    /* Create the region descriptor */
413232809Sjmallett
414232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
415232809Sjmallett    if (!ObjDesc)
416232809Sjmallett    {
417232809Sjmallett        Status = AE_NO_MEMORY;
418232809Sjmallett        goto Cleanup;
419232809Sjmallett    }
420232809Sjmallett
421232809Sjmallett    /*
422232809Sjmallett     * Remember location in AML stream of address & length
423232809Sjmallett     * operands since they need to be evaluated at run time.
424232809Sjmallett     */
425232809Sjmallett    RegionObj2 = ObjDesc->Common.NextObject;
426232809Sjmallett    RegionObj2->Extra.AmlStart = AmlStart;
427232809Sjmallett    RegionObj2->Extra.AmlLength = AmlLength;
428232809Sjmallett
429232809Sjmallett    /* Init the region from the operands */
430232809Sjmallett
431232809Sjmallett    ObjDesc->Region.SpaceId = RegionSpace;
432232809Sjmallett    ObjDesc->Region.Address = 0;
433232809Sjmallett    ObjDesc->Region.Length = 0;
434232809Sjmallett    ObjDesc->Region.Node = Node;
435232809Sjmallett
436232809Sjmallett    /* Install the new region object in the parent Node */
437232809Sjmallett
438232809Sjmallett    Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_REGION);
439232809Sjmallett
440232809Sjmallett
441232809SjmallettCleanup:
442232809Sjmallett
443232809Sjmallett    /* Remove local reference to the object */
444232809Sjmallett
445232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
446232809Sjmallett    return_ACPI_STATUS (Status);
447232809Sjmallett}
448232809Sjmallett
449232809Sjmallett
450232809Sjmallett/*******************************************************************************
451232809Sjmallett *
452232809Sjmallett * FUNCTION:    AcpiExCreateProcessor
453232809Sjmallett *
454232809Sjmallett * PARAMETERS:  WalkState           - Current state
455232809Sjmallett *
456232809Sjmallett * RETURN:      Status
457232809Sjmallett *
458232809Sjmallett * DESCRIPTION: Create a new processor object and populate the fields
459232809Sjmallett *
460232809Sjmallett *              Processor (Name[0], CpuID[1], PblockAddr[2], PblockLength[3])
461232809Sjmallett *
462232809Sjmallett ******************************************************************************/
463232809Sjmallett
464232809SjmallettACPI_STATUS
465232809SjmallettAcpiExCreateProcessor (
466232809Sjmallett    ACPI_WALK_STATE         *WalkState)
467232809Sjmallett{
468232809Sjmallett    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
469232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
470232809Sjmallett    ACPI_STATUS             Status;
471232809Sjmallett
472232809Sjmallett
473232809Sjmallett    ACPI_FUNCTION_TRACE_PTR (ExCreateProcessor, WalkState);
474232809Sjmallett
475232809Sjmallett
476232809Sjmallett    /* Create the processor object */
477232809Sjmallett
478232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PROCESSOR);
479232809Sjmallett    if (!ObjDesc)
480232809Sjmallett    {
481232809Sjmallett        return_ACPI_STATUS (AE_NO_MEMORY);
482232809Sjmallett    }
483232809Sjmallett
484232809Sjmallett    /* Initialize the processor object from the operands */
485232809Sjmallett
486232809Sjmallett    ObjDesc->Processor.ProcId = (UINT8) Operand[1]->Integer.Value;
487232809Sjmallett    ObjDesc->Processor.Length = (UINT8) Operand[3]->Integer.Value;
488232809Sjmallett    ObjDesc->Processor.Address = (ACPI_IO_ADDRESS) Operand[2]->Integer.Value;
489232809Sjmallett
490232809Sjmallett    /* Install the processor object in the parent Node */
491232809Sjmallett
492232809Sjmallett    Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
493232809Sjmallett                    ObjDesc, ACPI_TYPE_PROCESSOR);
494232809Sjmallett
495232809Sjmallett    /* Remove local reference to the object */
496232809Sjmallett
497232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
498232809Sjmallett    return_ACPI_STATUS (Status);
499232809Sjmallett}
500232809Sjmallett
501232809Sjmallett
502232809Sjmallett/*******************************************************************************
503232809Sjmallett *
504232809Sjmallett * FUNCTION:    AcpiExCreatePowerResource
505232809Sjmallett *
506232809Sjmallett * PARAMETERS:  WalkState           - Current state
507232809Sjmallett *
508232809Sjmallett * RETURN:      Status
509232809Sjmallett *
510232809Sjmallett * DESCRIPTION: Create a new PowerResource object and populate the fields
511232809Sjmallett *
512232809Sjmallett *              PowerResource (Name[0], SystemLevel[1], ResourceOrder[2])
513232809Sjmallett *
514232809Sjmallett ******************************************************************************/
515232809Sjmallett
516232809SjmallettACPI_STATUS
517232809SjmallettAcpiExCreatePowerResource (
518232809Sjmallett    ACPI_WALK_STATE         *WalkState)
519232809Sjmallett{
520232809Sjmallett    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
521232809Sjmallett    ACPI_STATUS             Status;
522232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
523232809Sjmallett
524232809Sjmallett
525232809Sjmallett    ACPI_FUNCTION_TRACE_PTR (ExCreatePowerResource, WalkState);
526232809Sjmallett
527232809Sjmallett
528232809Sjmallett    /* Create the power resource object */
529232809Sjmallett
530232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_POWER);
531232809Sjmallett    if (!ObjDesc)
532232809Sjmallett    {
533232809Sjmallett        return_ACPI_STATUS (AE_NO_MEMORY);
534232809Sjmallett    }
535232809Sjmallett
536232809Sjmallett    /* Initialize the power object from the operands */
537232809Sjmallett
538232809Sjmallett    ObjDesc->PowerResource.SystemLevel = (UINT8) Operand[1]->Integer.Value;
539232809Sjmallett    ObjDesc->PowerResource.ResourceOrder = (UINT16) Operand[2]->Integer.Value;
540232809Sjmallett
541232809Sjmallett    /* Install the  power resource object in the parent Node */
542232809Sjmallett
543232809Sjmallett    Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
544232809Sjmallett                    ObjDesc, ACPI_TYPE_POWER);
545232809Sjmallett
546232809Sjmallett    /* Remove local reference to the object */
547232809Sjmallett
548232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
549232809Sjmallett    return_ACPI_STATUS (Status);
550232809Sjmallett}
551232809Sjmallett#endif
552232809Sjmallett
553232809Sjmallett
554232809Sjmallett/*******************************************************************************
555232809Sjmallett *
556232809Sjmallett * FUNCTION:    AcpiExCreateMethod
557232809Sjmallett *
558232809Sjmallett * PARAMETERS:  AmlStart        - First byte of the method's AML
559232809Sjmallett *              AmlLength       - AML byte count for this method
560232809Sjmallett *              WalkState       - Current state
561232809Sjmallett *
562232809Sjmallett * RETURN:      Status
563232809Sjmallett *
564232809Sjmallett * DESCRIPTION: Create a new method object
565232809Sjmallett *
566232809Sjmallett ******************************************************************************/
567232809Sjmallett
568232809SjmallettACPI_STATUS
569232809SjmallettAcpiExCreateMethod (
570232809Sjmallett    UINT8                   *AmlStart,
571232809Sjmallett    UINT32                  AmlLength,
572232809Sjmallett    ACPI_WALK_STATE         *WalkState)
573232809Sjmallett{
574232809Sjmallett    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
575232809Sjmallett    ACPI_OPERAND_OBJECT     *ObjDesc;
576232809Sjmallett    ACPI_STATUS             Status;
577232809Sjmallett    UINT8                   MethodFlags;
578232809Sjmallett
579232809Sjmallett
580232809Sjmallett    ACPI_FUNCTION_TRACE_PTR (ExCreateMethod, WalkState);
581232809Sjmallett
582232809Sjmallett
583232809Sjmallett    /* Create a new method object */
584232809Sjmallett
585232809Sjmallett    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
586232809Sjmallett    if (!ObjDesc)
587232809Sjmallett    {
588232809Sjmallett       Status = AE_NO_MEMORY;
589232809Sjmallett       goto Exit;
590232809Sjmallett    }
591232809Sjmallett
592232809Sjmallett    /* Save the method's AML pointer and length  */
593232809Sjmallett
594232809Sjmallett    ObjDesc->Method.AmlStart = AmlStart;
595232809Sjmallett    ObjDesc->Method.AmlLength = AmlLength;
596232809Sjmallett
597232809Sjmallett    /*
598232809Sjmallett     * Disassemble the method flags. Split off the Arg Count
599232809Sjmallett     * for efficiency
600232809Sjmallett     */
601232809Sjmallett    MethodFlags = (UINT8) Operand[1]->Integer.Value;
602232809Sjmallett
603232809Sjmallett    ObjDesc->Method.MethodFlags = (UINT8) (MethodFlags & ~AML_METHOD_ARG_COUNT);
604232809Sjmallett    ObjDesc->Method.ParamCount = (UINT8) (MethodFlags & AML_METHOD_ARG_COUNT);
605232809Sjmallett
606232809Sjmallett    /*
607232809Sjmallett     * Get the SyncLevel. If method is serialized, a mutex will be
608232809Sjmallett     * created for this method when it is parsed.
609232809Sjmallett     */
610232809Sjmallett    if (MethodFlags & AML_METHOD_SERIALIZED)
611232809Sjmallett    {
612232809Sjmallett        /*
613232809Sjmallett         * ACPI 1.0: SyncLevel = 0
614232809Sjmallett         * ACPI 2.0: SyncLevel = SyncLevel in method declaration
615232809Sjmallett         */
616232809Sjmallett        ObjDesc->Method.SyncLevel = (UINT8)
617232809Sjmallett            ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4);
618232809Sjmallett    }
619232809Sjmallett
620232809Sjmallett    /* Attach the new object to the method Node */
621232809Sjmallett
622232809Sjmallett    Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
623232809Sjmallett                    ObjDesc, ACPI_TYPE_METHOD);
624232809Sjmallett
625232809Sjmallett    /* Remove local reference to the object */
626232809Sjmallett
627232809Sjmallett    AcpiUtRemoveReference (ObjDesc);
628232809Sjmallett
629232809SjmallettExit:
630232809Sjmallett    /* Remove a reference to the operand */
631232809Sjmallett
632232809Sjmallett    AcpiUtRemoveReference (Operand[1]);
633232809Sjmallett    return_ACPI_STATUS (Status);
634232809Sjmallett}
635232809Sjmallett
636232809Sjmallett
637232809Sjmallett