1*a159c266SJung-uk Kim /****************************************************************************** 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: psxface - Parser external interfaces 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim *****************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim #define __PSXFACE_C__ 45*a159c266SJung-uk Kim 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 50*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 51*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 52*a159c266SJung-uk Kim 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim #define _COMPONENT ACPI_PARSER 55*a159c266SJung-uk Kim ACPI_MODULE_NAME ("psxface") 56*a159c266SJung-uk Kim 57*a159c266SJung-uk Kim /* Local Prototypes */ 58*a159c266SJung-uk Kim 59*a159c266SJung-uk Kim static void 60*a159c266SJung-uk Kim AcpiPsStartTrace ( 61*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info); 62*a159c266SJung-uk Kim 63*a159c266SJung-uk Kim static void 64*a159c266SJung-uk Kim AcpiPsStopTrace ( 65*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info); 66*a159c266SJung-uk Kim 67*a159c266SJung-uk Kim static void 68*a159c266SJung-uk Kim AcpiPsUpdateParameterList ( 69*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info, 70*a159c266SJung-uk Kim UINT16 Action); 71*a159c266SJung-uk Kim 72*a159c266SJung-uk Kim 73*a159c266SJung-uk Kim /******************************************************************************* 74*a159c266SJung-uk Kim * 75*a159c266SJung-uk Kim * FUNCTION: AcpiDebugTrace 76*a159c266SJung-uk Kim * 77*a159c266SJung-uk Kim * PARAMETERS: MethodName - Valid ACPI name string 78*a159c266SJung-uk Kim * DebugLevel - Optional level mask. 0 to use default 79*a159c266SJung-uk Kim * DebugLayer - Optional layer mask. 0 to use default 80*a159c266SJung-uk Kim * Flags - bit 1: one shot(1) or persistent(0) 81*a159c266SJung-uk Kim * 82*a159c266SJung-uk Kim * RETURN: Status 83*a159c266SJung-uk Kim * 84*a159c266SJung-uk Kim * DESCRIPTION: External interface to enable debug tracing during control 85*a159c266SJung-uk Kim * method execution 86*a159c266SJung-uk Kim * 87*a159c266SJung-uk Kim ******************************************************************************/ 88*a159c266SJung-uk Kim 89*a159c266SJung-uk Kim ACPI_STATUS 90*a159c266SJung-uk Kim AcpiDebugTrace ( 91*a159c266SJung-uk Kim char *Name, 92*a159c266SJung-uk Kim UINT32 DebugLevel, 93*a159c266SJung-uk Kim UINT32 DebugLayer, 94*a159c266SJung-uk Kim UINT32 Flags) 95*a159c266SJung-uk Kim { 96*a159c266SJung-uk Kim ACPI_STATUS Status; 97*a159c266SJung-uk Kim 98*a159c266SJung-uk Kim 99*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 100*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 101*a159c266SJung-uk Kim { 102*a159c266SJung-uk Kim return (Status); 103*a159c266SJung-uk Kim } 104*a159c266SJung-uk Kim 105*a159c266SJung-uk Kim /* TBDs: Validate name, allow full path or just nameseg */ 106*a159c266SJung-uk Kim 107*a159c266SJung-uk Kim AcpiGbl_TraceMethodName = *ACPI_CAST_PTR (UINT32, Name); 108*a159c266SJung-uk Kim AcpiGbl_TraceFlags = Flags; 109*a159c266SJung-uk Kim 110*a159c266SJung-uk Kim if (DebugLevel) 111*a159c266SJung-uk Kim { 112*a159c266SJung-uk Kim AcpiGbl_TraceDbgLevel = DebugLevel; 113*a159c266SJung-uk Kim } 114*a159c266SJung-uk Kim if (DebugLayer) 115*a159c266SJung-uk Kim { 116*a159c266SJung-uk Kim AcpiGbl_TraceDbgLayer = DebugLayer; 117*a159c266SJung-uk Kim } 118*a159c266SJung-uk Kim 119*a159c266SJung-uk Kim (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 120*a159c266SJung-uk Kim return (AE_OK); 121*a159c266SJung-uk Kim } 122*a159c266SJung-uk Kim 123*a159c266SJung-uk Kim 124*a159c266SJung-uk Kim /******************************************************************************* 125*a159c266SJung-uk Kim * 126*a159c266SJung-uk Kim * FUNCTION: AcpiPsStartTrace 127*a159c266SJung-uk Kim * 128*a159c266SJung-uk Kim * PARAMETERS: Info - Method info struct 129*a159c266SJung-uk Kim * 130*a159c266SJung-uk Kim * RETURN: None 131*a159c266SJung-uk Kim * 132*a159c266SJung-uk Kim * DESCRIPTION: Start control method execution trace 133*a159c266SJung-uk Kim * 134*a159c266SJung-uk Kim ******************************************************************************/ 135*a159c266SJung-uk Kim 136*a159c266SJung-uk Kim static void 137*a159c266SJung-uk Kim AcpiPsStartTrace ( 138*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info) 139*a159c266SJung-uk Kim { 140*a159c266SJung-uk Kim ACPI_STATUS Status; 141*a159c266SJung-uk Kim 142*a159c266SJung-uk Kim 143*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 144*a159c266SJung-uk Kim 145*a159c266SJung-uk Kim 146*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 147*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 148*a159c266SJung-uk Kim { 149*a159c266SJung-uk Kim return; 150*a159c266SJung-uk Kim } 151*a159c266SJung-uk Kim 152*a159c266SJung-uk Kim if ((!AcpiGbl_TraceMethodName) || 153*a159c266SJung-uk Kim (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer)) 154*a159c266SJung-uk Kim { 155*a159c266SJung-uk Kim goto Exit; 156*a159c266SJung-uk Kim } 157*a159c266SJung-uk Kim 158*a159c266SJung-uk Kim AcpiGbl_OriginalDbgLevel = AcpiDbgLevel; 159*a159c266SJung-uk Kim AcpiGbl_OriginalDbgLayer = AcpiDbgLayer; 160*a159c266SJung-uk Kim 161*a159c266SJung-uk Kim AcpiDbgLevel = 0x00FFFFFF; 162*a159c266SJung-uk Kim AcpiDbgLayer = ACPI_UINT32_MAX; 163*a159c266SJung-uk Kim 164*a159c266SJung-uk Kim if (AcpiGbl_TraceDbgLevel) 165*a159c266SJung-uk Kim { 166*a159c266SJung-uk Kim AcpiDbgLevel = AcpiGbl_TraceDbgLevel; 167*a159c266SJung-uk Kim } 168*a159c266SJung-uk Kim if (AcpiGbl_TraceDbgLayer) 169*a159c266SJung-uk Kim { 170*a159c266SJung-uk Kim AcpiDbgLayer = AcpiGbl_TraceDbgLayer; 171*a159c266SJung-uk Kim } 172*a159c266SJung-uk Kim 173*a159c266SJung-uk Kim 174*a159c266SJung-uk Kim Exit: 175*a159c266SJung-uk Kim (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 176*a159c266SJung-uk Kim } 177*a159c266SJung-uk Kim 178*a159c266SJung-uk Kim 179*a159c266SJung-uk Kim /******************************************************************************* 180*a159c266SJung-uk Kim * 181*a159c266SJung-uk Kim * FUNCTION: AcpiPsStopTrace 182*a159c266SJung-uk Kim * 183*a159c266SJung-uk Kim * PARAMETERS: Info - Method info struct 184*a159c266SJung-uk Kim * 185*a159c266SJung-uk Kim * RETURN: None 186*a159c266SJung-uk Kim * 187*a159c266SJung-uk Kim * DESCRIPTION: Stop control method execution trace 188*a159c266SJung-uk Kim * 189*a159c266SJung-uk Kim ******************************************************************************/ 190*a159c266SJung-uk Kim 191*a159c266SJung-uk Kim static void 192*a159c266SJung-uk Kim AcpiPsStopTrace ( 193*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info) 194*a159c266SJung-uk Kim { 195*a159c266SJung-uk Kim ACPI_STATUS Status; 196*a159c266SJung-uk Kim 197*a159c266SJung-uk Kim 198*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 199*a159c266SJung-uk Kim 200*a159c266SJung-uk Kim 201*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 202*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 203*a159c266SJung-uk Kim { 204*a159c266SJung-uk Kim return; 205*a159c266SJung-uk Kim } 206*a159c266SJung-uk Kim 207*a159c266SJung-uk Kim if ((!AcpiGbl_TraceMethodName) || 208*a159c266SJung-uk Kim (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer)) 209*a159c266SJung-uk Kim { 210*a159c266SJung-uk Kim goto Exit; 211*a159c266SJung-uk Kim } 212*a159c266SJung-uk Kim 213*a159c266SJung-uk Kim /* Disable further tracing if type is one-shot */ 214*a159c266SJung-uk Kim 215*a159c266SJung-uk Kim if (AcpiGbl_TraceFlags & 1) 216*a159c266SJung-uk Kim { 217*a159c266SJung-uk Kim AcpiGbl_TraceMethodName = 0; 218*a159c266SJung-uk Kim AcpiGbl_TraceDbgLevel = 0; 219*a159c266SJung-uk Kim AcpiGbl_TraceDbgLayer = 0; 220*a159c266SJung-uk Kim } 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim AcpiDbgLevel = AcpiGbl_OriginalDbgLevel; 223*a159c266SJung-uk Kim AcpiDbgLayer = AcpiGbl_OriginalDbgLayer; 224*a159c266SJung-uk Kim 225*a159c266SJung-uk Kim Exit: 226*a159c266SJung-uk Kim (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 227*a159c266SJung-uk Kim } 228*a159c266SJung-uk Kim 229*a159c266SJung-uk Kim 230*a159c266SJung-uk Kim /******************************************************************************* 231*a159c266SJung-uk Kim * 232*a159c266SJung-uk Kim * FUNCTION: AcpiPsExecuteMethod 233*a159c266SJung-uk Kim * 234*a159c266SJung-uk Kim * PARAMETERS: Info - Method info block, contains: 235*a159c266SJung-uk Kim * Node - Method Node to execute 236*a159c266SJung-uk Kim * ObjDesc - Method object 237*a159c266SJung-uk Kim * Parameters - List of parameters to pass to the method, 238*a159c266SJung-uk Kim * terminated by NULL. Params itself may be 239*a159c266SJung-uk Kim * NULL if no parameters are being passed. 240*a159c266SJung-uk Kim * ReturnObject - Where to put method's return value (if 241*a159c266SJung-uk Kim * any). If NULL, no value is returned. 242*a159c266SJung-uk Kim * ParameterType - Type of Parameter list 243*a159c266SJung-uk Kim * ReturnObject - Where to put method's return value (if 244*a159c266SJung-uk Kim * any). If NULL, no value is returned. 245*a159c266SJung-uk Kim * PassNumber - Parse or execute pass 246*a159c266SJung-uk Kim * 247*a159c266SJung-uk Kim * RETURN: Status 248*a159c266SJung-uk Kim * 249*a159c266SJung-uk Kim * DESCRIPTION: Execute a control method 250*a159c266SJung-uk Kim * 251*a159c266SJung-uk Kim ******************************************************************************/ 252*a159c266SJung-uk Kim 253*a159c266SJung-uk Kim ACPI_STATUS 254*a159c266SJung-uk Kim AcpiPsExecuteMethod ( 255*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info) 256*a159c266SJung-uk Kim { 257*a159c266SJung-uk Kim ACPI_STATUS Status; 258*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op; 259*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState; 260*a159c266SJung-uk Kim 261*a159c266SJung-uk Kim 262*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (PsExecuteMethod); 263*a159c266SJung-uk Kim 264*a159c266SJung-uk Kim 265*a159c266SJung-uk Kim /* Quick validation of DSDT header */ 266*a159c266SJung-uk Kim 267*a159c266SJung-uk Kim AcpiTbCheckDsdtHeader (); 268*a159c266SJung-uk Kim 269*a159c266SJung-uk Kim /* Validate the Info and method Node */ 270*a159c266SJung-uk Kim 271*a159c266SJung-uk Kim if (!Info || !Info->ResolvedNode) 272*a159c266SJung-uk Kim { 273*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NULL_ENTRY); 274*a159c266SJung-uk Kim } 275*a159c266SJung-uk Kim 276*a159c266SJung-uk Kim /* Init for new method, wait on concurrency semaphore */ 277*a159c266SJung-uk Kim 278*a159c266SJung-uk Kim Status = AcpiDsBeginMethodExecution (Info->ResolvedNode, Info->ObjDesc, NULL); 279*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 280*a159c266SJung-uk Kim { 281*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 282*a159c266SJung-uk Kim } 283*a159c266SJung-uk Kim 284*a159c266SJung-uk Kim /* 285*a159c266SJung-uk Kim * The caller "owns" the parameters, so give each one an extra reference 286*a159c266SJung-uk Kim */ 287*a159c266SJung-uk Kim AcpiPsUpdateParameterList (Info, REF_INCREMENT); 288*a159c266SJung-uk Kim 289*a159c266SJung-uk Kim /* Begin tracing if requested */ 290*a159c266SJung-uk Kim 291*a159c266SJung-uk Kim AcpiPsStartTrace (Info); 292*a159c266SJung-uk Kim 293*a159c266SJung-uk Kim /* 294*a159c266SJung-uk Kim * Execute the method. Performs parse simultaneously 295*a159c266SJung-uk Kim */ 296*a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, 297*a159c266SJung-uk Kim "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n", 298*a159c266SJung-uk Kim Info->ResolvedNode->Name.Ascii, Info->ResolvedNode, Info->ObjDesc)); 299*a159c266SJung-uk Kim 300*a159c266SJung-uk Kim /* Create and init a Root Node */ 301*a159c266SJung-uk Kim 302*a159c266SJung-uk Kim Op = AcpiPsCreateScopeOp (); 303*a159c266SJung-uk Kim if (!Op) 304*a159c266SJung-uk Kim { 305*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 306*a159c266SJung-uk Kim goto Cleanup; 307*a159c266SJung-uk Kim } 308*a159c266SJung-uk Kim 309*a159c266SJung-uk Kim /* Create and initialize a new walk state */ 310*a159c266SJung-uk Kim 311*a159c266SJung-uk Kim Info->PassNumber = ACPI_IMODE_EXECUTE; 312*a159c266SJung-uk Kim WalkState = AcpiDsCreateWalkState ( 313*a159c266SJung-uk Kim Info->ObjDesc->Method.OwnerId, NULL, NULL, NULL); 314*a159c266SJung-uk Kim if (!WalkState) 315*a159c266SJung-uk Kim { 316*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 317*a159c266SJung-uk Kim goto Cleanup; 318*a159c266SJung-uk Kim } 319*a159c266SJung-uk Kim 320*a159c266SJung-uk Kim Status = AcpiDsInitAmlWalk (WalkState, Op, Info->ResolvedNode, 321*a159c266SJung-uk Kim Info->ObjDesc->Method.AmlStart, 322*a159c266SJung-uk Kim Info->ObjDesc->Method.AmlLength, Info, Info->PassNumber); 323*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 324*a159c266SJung-uk Kim { 325*a159c266SJung-uk Kim AcpiDsDeleteWalkState (WalkState); 326*a159c266SJung-uk Kim goto Cleanup; 327*a159c266SJung-uk Kim } 328*a159c266SJung-uk Kim 329*a159c266SJung-uk Kim if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL) 330*a159c266SJung-uk Kim { 331*a159c266SJung-uk Kim WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL; 332*a159c266SJung-uk Kim } 333*a159c266SJung-uk Kim 334*a159c266SJung-uk Kim /* Invoke an internal method if necessary */ 335*a159c266SJung-uk Kim 336*a159c266SJung-uk Kim if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_INTERNAL_ONLY) 337*a159c266SJung-uk Kim { 338*a159c266SJung-uk Kim Status = Info->ObjDesc->Method.Dispatch.Implementation (WalkState); 339*a159c266SJung-uk Kim Info->ReturnObject = WalkState->ReturnDesc; 340*a159c266SJung-uk Kim 341*a159c266SJung-uk Kim /* Cleanup states */ 342*a159c266SJung-uk Kim 343*a159c266SJung-uk Kim AcpiDsScopeStackClear (WalkState); 344*a159c266SJung-uk Kim AcpiPsCleanupScope (&WalkState->ParserState); 345*a159c266SJung-uk Kim AcpiDsTerminateControlMethod (WalkState->MethodDesc, WalkState); 346*a159c266SJung-uk Kim AcpiDsDeleteWalkState (WalkState); 347*a159c266SJung-uk Kim goto Cleanup; 348*a159c266SJung-uk Kim } 349*a159c266SJung-uk Kim 350*a159c266SJung-uk Kim /* 351*a159c266SJung-uk Kim * Start method evaluation with an implicit return of zero. This is done 352*a159c266SJung-uk Kim * for Windows compatibility. 353*a159c266SJung-uk Kim */ 354*a159c266SJung-uk Kim if (AcpiGbl_EnableInterpreterSlack) 355*a159c266SJung-uk Kim { 356*a159c266SJung-uk Kim WalkState->ImplicitReturnObj = 357*a159c266SJung-uk Kim AcpiUtCreateIntegerObject ((UINT64) 0); 358*a159c266SJung-uk Kim if (!WalkState->ImplicitReturnObj) 359*a159c266SJung-uk Kim { 360*a159c266SJung-uk Kim Status = AE_NO_MEMORY; 361*a159c266SJung-uk Kim AcpiDsDeleteWalkState (WalkState); 362*a159c266SJung-uk Kim goto Cleanup; 363*a159c266SJung-uk Kim } 364*a159c266SJung-uk Kim } 365*a159c266SJung-uk Kim 366*a159c266SJung-uk Kim /* Parse the AML */ 367*a159c266SJung-uk Kim 368*a159c266SJung-uk Kim Status = AcpiPsParseAml (WalkState); 369*a159c266SJung-uk Kim 370*a159c266SJung-uk Kim /* WalkState was deleted by ParseAml */ 371*a159c266SJung-uk Kim 372*a159c266SJung-uk Kim Cleanup: 373*a159c266SJung-uk Kim AcpiPsDeleteParseTree (Op); 374*a159c266SJung-uk Kim 375*a159c266SJung-uk Kim /* End optional tracing */ 376*a159c266SJung-uk Kim 377*a159c266SJung-uk Kim AcpiPsStopTrace (Info); 378*a159c266SJung-uk Kim 379*a159c266SJung-uk Kim /* Take away the extra reference that we gave the parameters above */ 380*a159c266SJung-uk Kim 381*a159c266SJung-uk Kim AcpiPsUpdateParameterList (Info, REF_DECREMENT); 382*a159c266SJung-uk Kim 383*a159c266SJung-uk Kim /* Exit now if error above */ 384*a159c266SJung-uk Kim 385*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 386*a159c266SJung-uk Kim { 387*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 388*a159c266SJung-uk Kim } 389*a159c266SJung-uk Kim 390*a159c266SJung-uk Kim /* 391*a159c266SJung-uk Kim * If the method has returned an object, signal this to the caller with 392*a159c266SJung-uk Kim * a control exception code 393*a159c266SJung-uk Kim */ 394*a159c266SJung-uk Kim if (Info->ReturnObject) 395*a159c266SJung-uk Kim { 396*a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Method returned ObjDesc=%p\n", 397*a159c266SJung-uk Kim Info->ReturnObject)); 398*a159c266SJung-uk Kim ACPI_DUMP_STACK_ENTRY (Info->ReturnObject); 399*a159c266SJung-uk Kim 400*a159c266SJung-uk Kim Status = AE_CTRL_RETURN_VALUE; 401*a159c266SJung-uk Kim } 402*a159c266SJung-uk Kim 403*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 404*a159c266SJung-uk Kim } 405*a159c266SJung-uk Kim 406*a159c266SJung-uk Kim 407*a159c266SJung-uk Kim /******************************************************************************* 408*a159c266SJung-uk Kim * 409*a159c266SJung-uk Kim * FUNCTION: AcpiPsUpdateParameterList 410*a159c266SJung-uk Kim * 411*a159c266SJung-uk Kim * PARAMETERS: Info - See ACPI_EVALUATE_INFO 412*a159c266SJung-uk Kim * (Used: ParameterType and Parameters) 413*a159c266SJung-uk Kim * Action - Add or Remove reference 414*a159c266SJung-uk Kim * 415*a159c266SJung-uk Kim * RETURN: Status 416*a159c266SJung-uk Kim * 417*a159c266SJung-uk Kim * DESCRIPTION: Update reference count on all method parameter objects 418*a159c266SJung-uk Kim * 419*a159c266SJung-uk Kim ******************************************************************************/ 420*a159c266SJung-uk Kim 421*a159c266SJung-uk Kim static void 422*a159c266SJung-uk Kim AcpiPsUpdateParameterList ( 423*a159c266SJung-uk Kim ACPI_EVALUATE_INFO *Info, 424*a159c266SJung-uk Kim UINT16 Action) 425*a159c266SJung-uk Kim { 426*a159c266SJung-uk Kim UINT32 i; 427*a159c266SJung-uk Kim 428*a159c266SJung-uk Kim 429*a159c266SJung-uk Kim if (Info->Parameters) 430*a159c266SJung-uk Kim { 431*a159c266SJung-uk Kim /* Update reference count for each parameter */ 432*a159c266SJung-uk Kim 433*a159c266SJung-uk Kim for (i = 0; Info->Parameters[i]; i++) 434*a159c266SJung-uk Kim { 435*a159c266SJung-uk Kim /* Ignore errors, just do them all */ 436*a159c266SJung-uk Kim 437*a159c266SJung-uk Kim (void) AcpiUtUpdateObjectReference (Info->Parameters[i], Action); 438*a159c266SJung-uk Kim } 439*a159c266SJung-uk Kim } 440*a159c266SJung-uk Kim } 441*a159c266SJung-uk Kim 442*a159c266SJung-uk Kim 443