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