1 1.1 jruoho /******************************************************************************* 2 1.1 jruoho * 3 1.1 jruoho * Module Name: utdelete - object deletion and reference count utilities 4 1.1 jruoho * 5 1.1 jruoho ******************************************************************************/ 6 1.1 jruoho 7 1.12 christos /****************************************************************************** 8 1.12 christos * 9 1.12 christos * 1. Copyright Notice 10 1.12 christos * 11 1.13 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 1.1 jruoho * All rights reserved. 13 1.1 jruoho * 14 1.12 christos * 2. License 15 1.12 christos * 16 1.12 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.12 christos * rights. You may have additional license terms from the party that provided 18 1.12 christos * you this software, covering your right to use that party's intellectual 19 1.12 christos * property rights. 20 1.12 christos * 21 1.12 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.12 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.12 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.12 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.12 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.12 christos * Code in any form, with the right to sublicense such rights; and 27 1.12 christos * 28 1.12 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.12 christos * license (with the right to sublicense), under only those claims of Intel 30 1.12 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.12 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.12 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.12 christos * license, and in no event shall the patent license extend to any additions 34 1.12 christos * to or modifications of the Original Intel Code. No other license or right 35 1.12 christos * is granted directly or by implication, estoppel or otherwise; 36 1.12 christos * 37 1.12 christos * The above copyright and patent license is granted only if the following 38 1.12 christos * conditions are met: 39 1.12 christos * 40 1.12 christos * 3. Conditions 41 1.12 christos * 42 1.12 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.12 christos * Redistribution of source code of any substantial portion of the Covered 44 1.12 christos * Code or modification with rights to further distribute source must include 45 1.12 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.12 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.12 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.12 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.12 christos * Code and the date of any change. Licensee must include in that file the 50 1.12 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.12 christos * must include a prominent statement that the modification is derived, 52 1.12 christos * directly or indirectly, from Original Intel Code. 53 1.12 christos * 54 1.12 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.12 christos * Redistribution of source code of any substantial portion of the Covered 56 1.12 christos * Code or modification without rights to further distribute source must 57 1.12 christos * include the following Disclaimer and Export Compliance provision in the 58 1.12 christos * documentation and/or other materials provided with distribution. In 59 1.12 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.12 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.12 christos * license from Licensee to its licensee is limited to the intellectual 62 1.12 christos * property embodied in the software Licensee provides to its licensee, and 63 1.12 christos * not to intellectual property embodied in modifications its licensee may 64 1.12 christos * make. 65 1.12 christos * 66 1.12 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.12 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.12 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.12 christos * provision in the documentation and/or other materials provided with the 70 1.12 christos * distribution. 71 1.12 christos * 72 1.12 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.12 christos * Intel Code. 74 1.12 christos * 75 1.12 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.12 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.12 christos * other dealings in products derived from or relating to the Covered Code 78 1.12 christos * without prior written authorization from Intel. 79 1.12 christos * 80 1.12 christos * 4. Disclaimer and Export Compliance 81 1.12 christos * 82 1.12 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.12 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.12 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.12 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.12 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.12 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.12 christos * PARTICULAR PURPOSE. 89 1.12 christos * 90 1.12 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.12 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.12 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.12 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.12 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.12 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.12 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.12 christos * LIMITED REMEDY. 98 1.12 christos * 99 1.12 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.12 christos * software or system incorporating such software without first obtaining any 101 1.12 christos * required license or other approval from the U. S. Department of Commerce or 102 1.12 christos * any other agency or department of the United States Government. In the 103 1.12 christos * event Licensee exports any such software from the United States or 104 1.12 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.12 christos * ensure that the distribution and export/re-export of the software is in 106 1.12 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.12 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.12 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.12 christos * software, or service, directly or indirectly, to any country for which the 110 1.12 christos * United States government or any agency thereof requires an export license, 111 1.12 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.12 christos * such license, approval or letter. 113 1.12 christos * 114 1.12 christos ***************************************************************************** 115 1.12 christos * 116 1.12 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.12 christos * following license: 118 1.12 christos * 119 1.2 christos * Redistribution and use in source and binary forms, with or without 120 1.2 christos * modification, are permitted provided that the following conditions 121 1.2 christos * are met: 122 1.2 christos * 1. Redistributions of source code must retain the above copyright 123 1.2 christos * notice, this list of conditions, and the following disclaimer, 124 1.2 christos * without modification. 125 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below 127 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon 128 1.2 christos * including a substantially similar Disclaimer requirement for further 129 1.2 christos * binary redistribution. 130 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names 131 1.2 christos * of any contributors may be used to endorse or promote products derived 132 1.2 christos * from this software without specific prior written permission. 133 1.2 christos * 134 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 1.6 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 1.12 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.12 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.12 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.12 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.12 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.12 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.12 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.12 christos * 146 1.12 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.12 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.12 christos * Software Foundation. 149 1.12 christos * 150 1.12 christos *****************************************************************************/ 151 1.1 jruoho 152 1.1 jruoho #include "acpi.h" 153 1.1 jruoho #include "accommon.h" 154 1.1 jruoho #include "acinterp.h" 155 1.1 jruoho #include "acnamesp.h" 156 1.1 jruoho #include "acevents.h" 157 1.1 jruoho 158 1.1 jruoho 159 1.1 jruoho #define _COMPONENT ACPI_UTILITIES 160 1.1 jruoho ACPI_MODULE_NAME ("utdelete") 161 1.1 jruoho 162 1.1 jruoho /* Local prototypes */ 163 1.1 jruoho 164 1.1 jruoho static void 165 1.1 jruoho AcpiUtDeleteInternalObj ( 166 1.1 jruoho ACPI_OPERAND_OBJECT *Object); 167 1.1 jruoho 168 1.1 jruoho static void 169 1.1 jruoho AcpiUtUpdateRefCount ( 170 1.1 jruoho ACPI_OPERAND_OBJECT *Object, 171 1.1 jruoho UINT32 Action); 172 1.1 jruoho 173 1.1 jruoho 174 1.1 jruoho /******************************************************************************* 175 1.1 jruoho * 176 1.1 jruoho * FUNCTION: AcpiUtDeleteInternalObj 177 1.1 jruoho * 178 1.1 jruoho * PARAMETERS: Object - Object to be deleted 179 1.1 jruoho * 180 1.1 jruoho * RETURN: None 181 1.1 jruoho * 182 1.1 jruoho * DESCRIPTION: Low level object deletion, after reference counts have been 183 1.1 jruoho * updated (All reference counts, including sub-objects!) 184 1.1 jruoho * 185 1.1 jruoho ******************************************************************************/ 186 1.1 jruoho 187 1.1 jruoho static void 188 1.1 jruoho AcpiUtDeleteInternalObj ( 189 1.1 jruoho ACPI_OPERAND_OBJECT *Object) 190 1.1 jruoho { 191 1.1 jruoho void *ObjPointer = NULL; 192 1.1 jruoho ACPI_OPERAND_OBJECT *HandlerDesc; 193 1.1 jruoho ACPI_OPERAND_OBJECT *SecondDesc; 194 1.1 jruoho ACPI_OPERAND_OBJECT *NextDesc; 195 1.2 christos ACPI_OPERAND_OBJECT *StartDesc; 196 1.1 jruoho ACPI_OPERAND_OBJECT **LastObjPtr; 197 1.1 jruoho 198 1.1 jruoho 199 1.1 jruoho ACPI_FUNCTION_TRACE_PTR (UtDeleteInternalObj, Object); 200 1.1 jruoho 201 1.1 jruoho 202 1.1 jruoho if (!Object) 203 1.1 jruoho { 204 1.1 jruoho return_VOID; 205 1.1 jruoho } 206 1.1 jruoho 207 1.1 jruoho /* 208 1.1 jruoho * Must delete or free any pointers within the object that are not 209 1.1 jruoho * actual ACPI objects (for example, a raw buffer pointer). 210 1.1 jruoho */ 211 1.1 jruoho switch (Object->Common.Type) 212 1.1 jruoho { 213 1.1 jruoho case ACPI_TYPE_STRING: 214 1.1 jruoho 215 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** String %p, ptr %p\n", 216 1.1 jruoho Object, Object->String.Pointer)); 217 1.1 jruoho 218 1.1 jruoho /* Free the actual string buffer */ 219 1.1 jruoho 220 1.1 jruoho if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER)) 221 1.1 jruoho { 222 1.1 jruoho /* But only if it is NOT a pointer into an ACPI table */ 223 1.1 jruoho 224 1.1 jruoho ObjPointer = Object->String.Pointer; 225 1.1 jruoho } 226 1.1 jruoho break; 227 1.1 jruoho 228 1.1 jruoho case ACPI_TYPE_BUFFER: 229 1.1 jruoho 230 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n", 231 1.1 jruoho Object, Object->Buffer.Pointer)); 232 1.1 jruoho 233 1.1 jruoho /* Free the actual buffer */ 234 1.1 jruoho 235 1.1 jruoho if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER)) 236 1.1 jruoho { 237 1.1 jruoho /* But only if it is NOT a pointer into an ACPI table */ 238 1.1 jruoho 239 1.1 jruoho ObjPointer = Object->Buffer.Pointer; 240 1.1 jruoho } 241 1.1 jruoho break; 242 1.1 jruoho 243 1.1 jruoho case ACPI_TYPE_PACKAGE: 244 1.1 jruoho 245 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n", 246 1.1 jruoho Object->Package.Count)); 247 1.1 jruoho 248 1.1 jruoho /* 249 1.1 jruoho * Elements of the package are not handled here, they are deleted 250 1.1 jruoho * separately 251 1.1 jruoho */ 252 1.1 jruoho 253 1.1 jruoho /* Free the (variable length) element pointer array */ 254 1.1 jruoho 255 1.1 jruoho ObjPointer = Object->Package.Elements; 256 1.1 jruoho break; 257 1.1 jruoho 258 1.1 jruoho /* 259 1.1 jruoho * These objects have a possible list of notify handlers. 260 1.1 jruoho * Device object also may have a GPE block. 261 1.1 jruoho */ 262 1.1 jruoho case ACPI_TYPE_DEVICE: 263 1.1 jruoho 264 1.1 jruoho if (Object->Device.GpeBlock) 265 1.1 jruoho { 266 1.1 jruoho (void) AcpiEvDeleteGpeBlock (Object->Device.GpeBlock); 267 1.1 jruoho } 268 1.1 jruoho 269 1.6 christos ACPI_FALLTHROUGH; 270 1.1 jruoho 271 1.1 jruoho case ACPI_TYPE_PROCESSOR: 272 1.1 jruoho case ACPI_TYPE_THERMAL: 273 1.1 jruoho 274 1.2 christos /* Walk the address handler list for this object */ 275 1.1 jruoho 276 1.1 jruoho HandlerDesc = Object->CommonNotify.Handler; 277 1.1 jruoho while (HandlerDesc) 278 1.1 jruoho { 279 1.1 jruoho NextDesc = HandlerDesc->AddressSpace.Next; 280 1.1 jruoho AcpiUtRemoveReference (HandlerDesc); 281 1.1 jruoho HandlerDesc = NextDesc; 282 1.1 jruoho } 283 1.1 jruoho break; 284 1.1 jruoho 285 1.1 jruoho case ACPI_TYPE_MUTEX: 286 1.1 jruoho 287 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 288 1.1 jruoho "***** Mutex %p, OS Mutex %p\n", 289 1.1 jruoho Object, Object->Mutex.OsMutex)); 290 1.1 jruoho 291 1.1 jruoho if (Object == AcpiGbl_GlobalLockMutex) 292 1.1 jruoho { 293 1.1 jruoho /* Global Lock has extra semaphore */ 294 1.1 jruoho 295 1.1 jruoho (void) AcpiOsDeleteSemaphore (AcpiGbl_GlobalLockSemaphore); 296 1.11 christos AcpiGbl_GlobalLockSemaphore = ACPI_SEMAPHORE_NULL; 297 1.1 jruoho 298 1.1 jruoho AcpiOsDeleteMutex (Object->Mutex.OsMutex); 299 1.1 jruoho AcpiGbl_GlobalLockMutex = NULL; 300 1.1 jruoho } 301 1.1 jruoho else 302 1.1 jruoho { 303 1.1 jruoho AcpiExUnlinkMutex (Object); 304 1.1 jruoho AcpiOsDeleteMutex (Object->Mutex.OsMutex); 305 1.1 jruoho } 306 1.1 jruoho break; 307 1.1 jruoho 308 1.1 jruoho case ACPI_TYPE_EVENT: 309 1.1 jruoho 310 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 311 1.1 jruoho "***** Event %p, OS Semaphore %p\n", 312 1.1 jruoho Object, Object->Event.OsSemaphore)); 313 1.1 jruoho 314 1.1 jruoho (void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore); 315 1.11 christos Object->Event.OsSemaphore = ACPI_SEMAPHORE_NULL; 316 1.1 jruoho break; 317 1.1 jruoho 318 1.1 jruoho case ACPI_TYPE_METHOD: 319 1.1 jruoho 320 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 321 1.1 jruoho "***** Method %p\n", Object)); 322 1.1 jruoho 323 1.1 jruoho /* Delete the method mutex if it exists */ 324 1.1 jruoho 325 1.1 jruoho if (Object->Method.Mutex) 326 1.1 jruoho { 327 1.1 jruoho AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex); 328 1.1 jruoho AcpiUtDeleteObjectDesc (Object->Method.Mutex); 329 1.1 jruoho Object->Method.Mutex = NULL; 330 1.1 jruoho } 331 1.2 christos 332 1.2 christos if (Object->Method.Node) 333 1.2 christos { 334 1.2 christos Object->Method.Node = NULL; 335 1.2 christos } 336 1.1 jruoho break; 337 1.1 jruoho 338 1.1 jruoho case ACPI_TYPE_REGION: 339 1.1 jruoho 340 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 341 1.1 jruoho "***** Region %p\n", Object)); 342 1.1 jruoho 343 1.2 christos /* 344 1.2 christos * Update AddressRange list. However, only permanent regions 345 1.2 christos * are installed in this list. (Not created within a method) 346 1.2 christos */ 347 1.2 christos if (!(Object->Region.Node->Flags & ANOBJ_TEMPORARY)) 348 1.2 christos { 349 1.2 christos AcpiUtRemoveAddressRange (Object->Region.SpaceId, 350 1.2 christos Object->Region.Node); 351 1.2 christos } 352 1.2 christos 353 1.1 jruoho SecondDesc = AcpiNsGetSecondaryObject (Object); 354 1.1 jruoho if (SecondDesc) 355 1.1 jruoho { 356 1.1 jruoho /* 357 1.1 jruoho * Free the RegionContext if and only if the handler is one of the 358 1.1 jruoho * default handlers -- and therefore, we created the context object 359 1.1 jruoho * locally, it was not created by an external caller. 360 1.1 jruoho */ 361 1.1 jruoho HandlerDesc = Object->Region.Handler; 362 1.1 jruoho if (HandlerDesc) 363 1.1 jruoho { 364 1.1 jruoho NextDesc = HandlerDesc->AddressSpace.RegionList; 365 1.2 christos StartDesc = NextDesc; 366 1.1 jruoho LastObjPtr = &HandlerDesc->AddressSpace.RegionList; 367 1.1 jruoho 368 1.2 christos /* Remove the region object from the handler list */ 369 1.1 jruoho 370 1.1 jruoho while (NextDesc) 371 1.1 jruoho { 372 1.1 jruoho if (NextDesc == Object) 373 1.1 jruoho { 374 1.1 jruoho *LastObjPtr = NextDesc->Region.Next; 375 1.1 jruoho break; 376 1.1 jruoho } 377 1.1 jruoho 378 1.2 christos /* Walk the linked list of handlers */ 379 1.1 jruoho 380 1.1 jruoho LastObjPtr = &NextDesc->Region.Next; 381 1.1 jruoho NextDesc = NextDesc->Region.Next; 382 1.2 christos 383 1.2 christos /* Prevent infinite loop if list is corrupted */ 384 1.2 christos 385 1.2 christos if (NextDesc == StartDesc) 386 1.2 christos { 387 1.2 christos ACPI_ERROR ((AE_INFO, 388 1.2 christos "Circular region list in address handler object %p", 389 1.2 christos HandlerDesc)); 390 1.2 christos return_VOID; 391 1.2 christos } 392 1.1 jruoho } 393 1.1 jruoho 394 1.1 jruoho if (HandlerDesc->AddressSpace.HandlerFlags & 395 1.1 jruoho ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) 396 1.1 jruoho { 397 1.1 jruoho /* Deactivate region and free region context */ 398 1.1 jruoho 399 1.1 jruoho if (HandlerDesc->AddressSpace.Setup) 400 1.1 jruoho { 401 1.1 jruoho (void) HandlerDesc->AddressSpace.Setup (Object, 402 1.1 jruoho ACPI_REGION_DEACTIVATE, 403 1.1 jruoho HandlerDesc->AddressSpace.Context, 404 1.1 jruoho &SecondDesc->Extra.RegionContext); 405 1.1 jruoho } 406 1.1 jruoho } 407 1.1 jruoho 408 1.1 jruoho AcpiUtRemoveReference (HandlerDesc); 409 1.1 jruoho } 410 1.1 jruoho 411 1.1 jruoho /* Now we can free the Extra object */ 412 1.1 jruoho 413 1.1 jruoho AcpiUtDeleteObjectDesc (SecondDesc); 414 1.1 jruoho } 415 1.3 christos if (Object->Field.InternalPccBuffer) 416 1.3 christos { 417 1.3 christos ACPI_FREE(Object->Field.InternalPccBuffer); 418 1.3 christos } 419 1.3 christos 420 1.1 jruoho break; 421 1.1 jruoho 422 1.1 jruoho case ACPI_TYPE_BUFFER_FIELD: 423 1.1 jruoho 424 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 425 1.1 jruoho "***** Buffer Field %p\n", Object)); 426 1.1 jruoho 427 1.1 jruoho SecondDesc = AcpiNsGetSecondaryObject (Object); 428 1.1 jruoho if (SecondDesc) 429 1.1 jruoho { 430 1.1 jruoho AcpiUtDeleteObjectDesc (SecondDesc); 431 1.1 jruoho } 432 1.1 jruoho break; 433 1.1 jruoho 434 1.1 jruoho case ACPI_TYPE_LOCAL_BANK_FIELD: 435 1.1 jruoho 436 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 437 1.1 jruoho "***** Bank Field %p\n", Object)); 438 1.1 jruoho 439 1.1 jruoho SecondDesc = AcpiNsGetSecondaryObject (Object); 440 1.1 jruoho if (SecondDesc) 441 1.1 jruoho { 442 1.1 jruoho AcpiUtDeleteObjectDesc (SecondDesc); 443 1.1 jruoho } 444 1.1 jruoho break; 445 1.1 jruoho 446 1.7 christos case ACPI_TYPE_LOCAL_ADDRESS_HANDLER: 447 1.7 christos 448 1.7 christos ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 449 1.7 christos "***** Address handler %p\n", Object)); 450 1.7 christos 451 1.7 christos AcpiOsDeleteMutex (Object->AddressSpace.ContextMutex); 452 1.7 christos break; 453 1.7 christos 454 1.2 christos default: 455 1.1 jruoho 456 1.1 jruoho break; 457 1.1 jruoho } 458 1.1 jruoho 459 1.1 jruoho /* Free any allocated memory (pointer within the object) found above */ 460 1.1 jruoho 461 1.1 jruoho if (ObjPointer) 462 1.1 jruoho { 463 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object Subptr %p\n", 464 1.1 jruoho ObjPointer)); 465 1.1 jruoho ACPI_FREE (ObjPointer); 466 1.1 jruoho } 467 1.1 jruoho 468 1.1 jruoho /* Now the object can be safely deleted */ 469 1.1 jruoho 470 1.2 christos ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, "%s: Deleting Object %p [%s]\n", 471 1.2 christos ACPI_GET_FUNCTION_NAME, Object, AcpiUtGetObjectTypeName (Object))); 472 1.1 jruoho 473 1.1 jruoho AcpiUtDeleteObjectDesc (Object); 474 1.1 jruoho return_VOID; 475 1.1 jruoho } 476 1.1 jruoho 477 1.1 jruoho 478 1.1 jruoho /******************************************************************************* 479 1.1 jruoho * 480 1.1 jruoho * FUNCTION: AcpiUtDeleteInternalObjectList 481 1.1 jruoho * 482 1.1 jruoho * PARAMETERS: ObjList - Pointer to the list to be deleted 483 1.1 jruoho * 484 1.1 jruoho * RETURN: None 485 1.1 jruoho * 486 1.1 jruoho * DESCRIPTION: This function deletes an internal object list, including both 487 1.1 jruoho * simple objects and package objects 488 1.1 jruoho * 489 1.1 jruoho ******************************************************************************/ 490 1.1 jruoho 491 1.1 jruoho void 492 1.1 jruoho AcpiUtDeleteInternalObjectList ( 493 1.1 jruoho ACPI_OPERAND_OBJECT **ObjList) 494 1.1 jruoho { 495 1.1 jruoho ACPI_OPERAND_OBJECT **InternalObj; 496 1.1 jruoho 497 1.1 jruoho 498 1.2 christos ACPI_FUNCTION_ENTRY (); 499 1.1 jruoho 500 1.1 jruoho 501 1.1 jruoho /* Walk the null-terminated internal list */ 502 1.1 jruoho 503 1.1 jruoho for (InternalObj = ObjList; *InternalObj; InternalObj++) 504 1.1 jruoho { 505 1.1 jruoho AcpiUtRemoveReference (*InternalObj); 506 1.1 jruoho } 507 1.1 jruoho 508 1.1 jruoho /* Free the combined parameter pointer list and object array */ 509 1.1 jruoho 510 1.1 jruoho ACPI_FREE (ObjList); 511 1.2 christos return; 512 1.1 jruoho } 513 1.1 jruoho 514 1.1 jruoho 515 1.1 jruoho /******************************************************************************* 516 1.1 jruoho * 517 1.1 jruoho * FUNCTION: AcpiUtUpdateRefCount 518 1.1 jruoho * 519 1.1 jruoho * PARAMETERS: Object - Object whose ref count is to be updated 520 1.2 christos * Action - What to do (REF_INCREMENT or REF_DECREMENT) 521 1.1 jruoho * 522 1.2 christos * RETURN: None. Sets new reference count within the object 523 1.1 jruoho * 524 1.2 christos * DESCRIPTION: Modify the reference count for an internal acpi object 525 1.1 jruoho * 526 1.1 jruoho ******************************************************************************/ 527 1.1 jruoho 528 1.1 jruoho static void 529 1.1 jruoho AcpiUtUpdateRefCount ( 530 1.1 jruoho ACPI_OPERAND_OBJECT *Object, 531 1.1 jruoho UINT32 Action) 532 1.1 jruoho { 533 1.2 christos UINT16 OriginalCount; 534 1.2 christos UINT16 NewCount = 0; 535 1.2 christos ACPI_CPU_FLAGS LockFlags; 536 1.2 christos const char *Message; 537 1.1 jruoho 538 1.1 jruoho 539 1.1 jruoho ACPI_FUNCTION_NAME (UtUpdateRefCount); 540 1.1 jruoho 541 1.1 jruoho 542 1.1 jruoho if (!Object) 543 1.1 jruoho { 544 1.1 jruoho return; 545 1.1 jruoho } 546 1.1 jruoho 547 1.1 jruoho /* 548 1.2 christos * Always get the reference count lock. Note: Interpreter and/or 549 1.2 christos * Namespace is not always locked when this function is called. 550 1.1 jruoho */ 551 1.2 christos LockFlags = AcpiOsAcquireLock (AcpiGbl_ReferenceCountLock); 552 1.2 christos OriginalCount = Object->Common.ReferenceCount; 553 1.2 christos 554 1.2 christos /* Perform the reference count action (increment, decrement) */ 555 1.2 christos 556 1.1 jruoho switch (Action) 557 1.1 jruoho { 558 1.1 jruoho case REF_INCREMENT: 559 1.1 jruoho 560 1.2 christos NewCount = OriginalCount + 1; 561 1.1 jruoho Object->Common.ReferenceCount = NewCount; 562 1.2 christos AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags); 563 1.2 christos 564 1.2 christos /* The current reference count should never be zero here */ 565 1.2 christos 566 1.2 christos if (!OriginalCount) 567 1.2 christos { 568 1.2 christos ACPI_WARNING ((AE_INFO, 569 1.2 christos "Obj %p, Reference Count was zero before increment\n", 570 1.2 christos Object)); 571 1.2 christos } 572 1.1 jruoho 573 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 574 1.2 christos "Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n", 575 1.2 christos Object, Object->Common.Type, 576 1.2 christos AcpiUtGetObjectTypeName (Object), NewCount)); 577 1.13 christos Message = "Increment"; 578 1.1 jruoho break; 579 1.1 jruoho 580 1.1 jruoho case REF_DECREMENT: 581 1.1 jruoho 582 1.2 christos /* The current reference count must be non-zero */ 583 1.2 christos 584 1.2 christos if (OriginalCount) 585 1.1 jruoho { 586 1.2 christos NewCount = OriginalCount - 1; 587 1.2 christos Object->Common.ReferenceCount = NewCount; 588 1.1 jruoho } 589 1.1 jruoho 590 1.2 christos AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags); 591 1.1 jruoho 592 1.2 christos if (!OriginalCount) 593 1.1 jruoho { 594 1.2 christos ACPI_WARNING ((AE_INFO, 595 1.2 christos "Obj %p, Reference Count is already zero, cannot decrement\n", 596 1.2 christos Object)); 597 1.12 christos return; 598 1.1 jruoho } 599 1.1 jruoho 600 1.2 christos ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, 601 1.2 christos "%s: Obj %p Type %.2X Refs %.2X [Decremented]\n", 602 1.2 christos ACPI_GET_FUNCTION_NAME, Object, Object->Common.Type, NewCount)); 603 1.2 christos 604 1.2 christos /* Actually delete the object on a reference count of zero */ 605 1.2 christos 606 1.1 jruoho if (NewCount == 0) 607 1.1 jruoho { 608 1.1 jruoho AcpiUtDeleteInternalObj (Object); 609 1.1 jruoho } 610 1.2 christos Message = "Decrement"; 611 1.1 jruoho break; 612 1.1 jruoho 613 1.1 jruoho default: 614 1.1 jruoho 615 1.2 christos AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags); 616 1.2 christos ACPI_ERROR ((AE_INFO, "Unknown Reference Count action (0x%X)", 617 1.2 christos Action)); 618 1.2 christos return; 619 1.1 jruoho } 620 1.1 jruoho 621 1.1 jruoho /* 622 1.1 jruoho * Sanity check the reference count, for debug purposes only. 623 1.1 jruoho * (A deleted object will have a huge reference count) 624 1.1 jruoho */ 625 1.2 christos if (NewCount > ACPI_MAX_REFERENCE_COUNT) 626 1.1 jruoho { 627 1.1 jruoho ACPI_WARNING ((AE_INFO, 628 1.2 christos "Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s", 629 1.2 christos NewCount, Object, Object->Common.Type, Message)); 630 1.1 jruoho } 631 1.1 jruoho } 632 1.1 jruoho 633 1.1 jruoho 634 1.1 jruoho /******************************************************************************* 635 1.1 jruoho * 636 1.1 jruoho * FUNCTION: AcpiUtUpdateObjectReference 637 1.1 jruoho * 638 1.4 christos * PARAMETERS: Object - Increment or decrement the ref count for 639 1.4 christos * this object and all sub-objects 640 1.2 christos * Action - Either REF_INCREMENT or REF_DECREMENT 641 1.1 jruoho * 642 1.1 jruoho * RETURN: Status 643 1.1 jruoho * 644 1.4 christos * DESCRIPTION: Increment or decrement the object reference count 645 1.1 jruoho * 646 1.1 jruoho * Object references are incremented when: 647 1.1 jruoho * 1) An object is attached to a Node (namespace object) 648 1.1 jruoho * 2) An object is copied (all subobjects must be incremented) 649 1.1 jruoho * 650 1.1 jruoho * Object references are decremented when: 651 1.1 jruoho * 1) An object is detached from an Node 652 1.1 jruoho * 653 1.1 jruoho ******************************************************************************/ 654 1.1 jruoho 655 1.1 jruoho ACPI_STATUS 656 1.1 jruoho AcpiUtUpdateObjectReference ( 657 1.1 jruoho ACPI_OPERAND_OBJECT *Object, 658 1.1 jruoho UINT16 Action) 659 1.1 jruoho { 660 1.1 jruoho ACPI_STATUS Status = AE_OK; 661 1.1 jruoho ACPI_GENERIC_STATE *StateList = NULL; 662 1.1 jruoho ACPI_OPERAND_OBJECT *NextObject = NULL; 663 1.2 christos ACPI_OPERAND_OBJECT *PrevObject; 664 1.1 jruoho ACPI_GENERIC_STATE *State; 665 1.1 jruoho UINT32 i; 666 1.1 jruoho 667 1.1 jruoho 668 1.2 christos ACPI_FUNCTION_NAME (UtUpdateObjectReference); 669 1.1 jruoho 670 1.1 jruoho 671 1.1 jruoho while (Object) 672 1.1 jruoho { 673 1.1 jruoho /* Make sure that this isn't a namespace handle */ 674 1.1 jruoho 675 1.1 jruoho if (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED) 676 1.1 jruoho { 677 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 678 1.1 jruoho "Object %p is NS handle\n", Object)); 679 1.2 christos return (AE_OK); 680 1.1 jruoho } 681 1.1 jruoho 682 1.1 jruoho /* 683 1.4 christos * All sub-objects must have their reference count updated 684 1.2 christos * also. Different object types have different subobjects. 685 1.1 jruoho */ 686 1.1 jruoho switch (Object->Common.Type) 687 1.1 jruoho { 688 1.1 jruoho case ACPI_TYPE_DEVICE: 689 1.1 jruoho case ACPI_TYPE_PROCESSOR: 690 1.1 jruoho case ACPI_TYPE_POWER: 691 1.1 jruoho case ACPI_TYPE_THERMAL: 692 1.2 christos /* 693 1.2 christos * Update the notify objects for these types (if present) 694 1.2 christos * Two lists, system and device notify handlers. 695 1.2 christos */ 696 1.2 christos for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++) 697 1.2 christos { 698 1.2 christos PrevObject = Object->CommonNotify.NotifyList[i]; 699 1.2 christos while (PrevObject) 700 1.2 christos { 701 1.2 christos NextObject = PrevObject->Notify.Next[i]; 702 1.2 christos AcpiUtUpdateRefCount (PrevObject, Action); 703 1.2 christos PrevObject = NextObject; 704 1.2 christos } 705 1.2 christos } 706 1.1 jruoho break; 707 1.1 jruoho 708 1.1 jruoho case ACPI_TYPE_PACKAGE: 709 1.1 jruoho /* 710 1.1 jruoho * We must update all the sub-objects of the package, 711 1.1 jruoho * each of whom may have their own sub-objects. 712 1.1 jruoho */ 713 1.1 jruoho for (i = 0; i < Object->Package.Count; i++) 714 1.1 jruoho { 715 1.1 jruoho /* 716 1.2 christos * Null package elements are legal and can be simply 717 1.2 christos * ignored. 718 1.1 jruoho */ 719 1.2 christos NextObject = Object->Package.Elements[i]; 720 1.2 christos if (!NextObject) 721 1.1 jruoho { 722 1.2 christos continue; 723 1.2 christos } 724 1.2 christos 725 1.2 christos switch (NextObject->Common.Type) 726 1.2 christos { 727 1.2 christos case ACPI_TYPE_INTEGER: 728 1.2 christos case ACPI_TYPE_STRING: 729 1.2 christos case ACPI_TYPE_BUFFER: 730 1.2 christos /* 731 1.2 christos * For these very simple sub-objects, we can just 732 1.2 christos * update the reference count here and continue. 733 1.2 christos * Greatly increases performance of this operation. 734 1.2 christos */ 735 1.2 christos AcpiUtUpdateRefCount (NextObject, Action); 736 1.2 christos break; 737 1.2 christos 738 1.2 christos default: 739 1.2 christos /* 740 1.2 christos * For complex sub-objects, push them onto the stack 741 1.2 christos * for later processing (this eliminates recursion.) 742 1.2 christos */ 743 1.2 christos Status = AcpiUtCreateUpdateStateAndPush ( 744 1.2 christos NextObject, Action, &StateList); 745 1.2 christos if (ACPI_FAILURE (Status)) 746 1.2 christos { 747 1.2 christos goto ErrorExit; 748 1.2 christos } 749 1.2 christos break; 750 1.1 jruoho } 751 1.1 jruoho } 752 1.4 christos 753 1.2 christos NextObject = NULL; 754 1.1 jruoho break; 755 1.1 jruoho 756 1.1 jruoho case ACPI_TYPE_BUFFER_FIELD: 757 1.1 jruoho 758 1.1 jruoho NextObject = Object->BufferField.BufferObj; 759 1.1 jruoho break; 760 1.1 jruoho 761 1.1 jruoho case ACPI_TYPE_LOCAL_BANK_FIELD: 762 1.1 jruoho 763 1.1 jruoho NextObject = Object->BankField.BankObj; 764 1.1 jruoho Status = AcpiUtCreateUpdateStateAndPush ( 765 1.2 christos Object->BankField.RegionObj, Action, &StateList); 766 1.1 jruoho if (ACPI_FAILURE (Status)) 767 1.1 jruoho { 768 1.1 jruoho goto ErrorExit; 769 1.1 jruoho } 770 1.1 jruoho break; 771 1.1 jruoho 772 1.1 jruoho case ACPI_TYPE_LOCAL_INDEX_FIELD: 773 1.1 jruoho 774 1.1 jruoho NextObject = Object->IndexField.IndexObj; 775 1.1 jruoho Status = AcpiUtCreateUpdateStateAndPush ( 776 1.2 christos Object->IndexField.DataObj, Action, &StateList); 777 1.1 jruoho if (ACPI_FAILURE (Status)) 778 1.1 jruoho { 779 1.1 jruoho goto ErrorExit; 780 1.1 jruoho } 781 1.1 jruoho break; 782 1.1 jruoho 783 1.1 jruoho case ACPI_TYPE_LOCAL_REFERENCE: 784 1.1 jruoho /* 785 1.1 jruoho * The target of an Index (a package, string, or buffer) or a named 786 1.1 jruoho * reference must track changes to the ref count of the index or 787 1.1 jruoho * target object. 788 1.1 jruoho */ 789 1.1 jruoho if ((Object->Reference.Class == ACPI_REFCLASS_INDEX) || 790 1.1 jruoho (Object->Reference.Class== ACPI_REFCLASS_NAME)) 791 1.1 jruoho { 792 1.1 jruoho NextObject = Object->Reference.Object; 793 1.1 jruoho } 794 1.1 jruoho break; 795 1.1 jruoho 796 1.5 christos case ACPI_TYPE_LOCAL_REGION_FIELD: 797 1.1 jruoho case ACPI_TYPE_REGION: 798 1.1 jruoho default: 799 1.2 christos 800 1.1 jruoho break; /* No subobjects for all other types */ 801 1.1 jruoho } 802 1.1 jruoho 803 1.1 jruoho /* 804 1.1 jruoho * Now we can update the count in the main object. This can only 805 1.1 jruoho * happen after we update the sub-objects in case this causes the 806 1.1 jruoho * main object to be deleted. 807 1.1 jruoho */ 808 1.1 jruoho AcpiUtUpdateRefCount (Object, Action); 809 1.1 jruoho Object = NULL; 810 1.1 jruoho 811 1.1 jruoho /* Move on to the next object to be updated */ 812 1.1 jruoho 813 1.1 jruoho if (NextObject) 814 1.1 jruoho { 815 1.1 jruoho Object = NextObject; 816 1.1 jruoho NextObject = NULL; 817 1.1 jruoho } 818 1.1 jruoho else if (StateList) 819 1.1 jruoho { 820 1.1 jruoho State = AcpiUtPopGenericState (&StateList); 821 1.1 jruoho Object = State->Update.Object; 822 1.1 jruoho AcpiUtDeleteGenericState (State); 823 1.1 jruoho } 824 1.1 jruoho } 825 1.1 jruoho 826 1.2 christos return (AE_OK); 827 1.1 jruoho 828 1.1 jruoho 829 1.1 jruoho ErrorExit: 830 1.1 jruoho 831 1.1 jruoho ACPI_EXCEPTION ((AE_INFO, Status, 832 1.1 jruoho "Could not update object reference count")); 833 1.1 jruoho 834 1.1 jruoho /* Free any stacked Update State objects */ 835 1.1 jruoho 836 1.1 jruoho while (StateList) 837 1.1 jruoho { 838 1.1 jruoho State = AcpiUtPopGenericState (&StateList); 839 1.1 jruoho AcpiUtDeleteGenericState (State); 840 1.1 jruoho } 841 1.1 jruoho 842 1.2 christos return (Status); 843 1.1 jruoho } 844 1.1 jruoho 845 1.1 jruoho 846 1.1 jruoho /******************************************************************************* 847 1.1 jruoho * 848 1.1 jruoho * FUNCTION: AcpiUtAddReference 849 1.1 jruoho * 850 1.1 jruoho * PARAMETERS: Object - Object whose reference count is to be 851 1.1 jruoho * incremented 852 1.1 jruoho * 853 1.1 jruoho * RETURN: None 854 1.1 jruoho * 855 1.1 jruoho * DESCRIPTION: Add one reference to an ACPI object 856 1.1 jruoho * 857 1.1 jruoho ******************************************************************************/ 858 1.1 jruoho 859 1.1 jruoho void 860 1.1 jruoho AcpiUtAddReference ( 861 1.1 jruoho ACPI_OPERAND_OBJECT *Object) 862 1.1 jruoho { 863 1.1 jruoho 864 1.2 christos ACPI_FUNCTION_NAME (UtAddReference); 865 1.1 jruoho 866 1.1 jruoho 867 1.1 jruoho /* Ensure that we have a valid object */ 868 1.1 jruoho 869 1.1 jruoho if (!AcpiUtValidInternalObject (Object)) 870 1.1 jruoho { 871 1.2 christos return; 872 1.1 jruoho } 873 1.1 jruoho 874 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 875 1.1 jruoho "Obj %p Current Refs=%X [To Be Incremented]\n", 876 1.1 jruoho Object, Object->Common.ReferenceCount)); 877 1.1 jruoho 878 1.1 jruoho /* Increment the reference count */ 879 1.1 jruoho 880 1.1 jruoho (void) AcpiUtUpdateObjectReference (Object, REF_INCREMENT); 881 1.2 christos return; 882 1.1 jruoho } 883 1.1 jruoho 884 1.1 jruoho 885 1.1 jruoho /******************************************************************************* 886 1.1 jruoho * 887 1.1 jruoho * FUNCTION: AcpiUtRemoveReference 888 1.1 jruoho * 889 1.1 jruoho * PARAMETERS: Object - Object whose ref count will be decremented 890 1.1 jruoho * 891 1.1 jruoho * RETURN: None 892 1.1 jruoho * 893 1.1 jruoho * DESCRIPTION: Decrement the reference count of an ACPI internal object 894 1.1 jruoho * 895 1.1 jruoho ******************************************************************************/ 896 1.1 jruoho 897 1.1 jruoho void 898 1.1 jruoho AcpiUtRemoveReference ( 899 1.1 jruoho ACPI_OPERAND_OBJECT *Object) 900 1.1 jruoho { 901 1.1 jruoho 902 1.2 christos ACPI_FUNCTION_NAME (UtRemoveReference); 903 1.1 jruoho 904 1.1 jruoho 905 1.1 jruoho /* 906 1.1 jruoho * Allow a NULL pointer to be passed in, just ignore it. This saves 907 1.1 jruoho * each caller from having to check. Also, ignore NS nodes. 908 1.1 jruoho */ 909 1.1 jruoho if (!Object || 910 1.1 jruoho (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED)) 911 1.1 jruoho 912 1.1 jruoho { 913 1.2 christos return; 914 1.1 jruoho } 915 1.1 jruoho 916 1.1 jruoho /* Ensure that we have a valid object */ 917 1.1 jruoho 918 1.1 jruoho if (!AcpiUtValidInternalObject (Object)) 919 1.1 jruoho { 920 1.2 christos return; 921 1.1 jruoho } 922 1.1 jruoho 923 1.2 christos ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, 924 1.2 christos "%s: Obj %p Current Refs=%X [To Be Decremented]\n", 925 1.2 christos ACPI_GET_FUNCTION_NAME, Object, Object->Common.ReferenceCount)); 926 1.1 jruoho 927 1.1 jruoho /* 928 1.1 jruoho * Decrement the reference count, and only actually delete the object 929 1.1 jruoho * if the reference count becomes 0. (Must also decrement the ref count 930 1.1 jruoho * of all subobjects!) 931 1.1 jruoho */ 932 1.1 jruoho (void) AcpiUtUpdateObjectReference (Object, REF_DECREMENT); 933 1.2 christos return; 934 1.1 jruoho } 935