File indexing completed on 2025-05-11 08:24:03
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 #include "acpi.h"
0153 #include "accommon.h"
0154 #include "acinterp.h"
0155 #include "acnamesp.h"
0156 #include "acevents.h"
0157
0158
0159 #define _COMPONENT ACPI_UTILITIES
0160 ACPI_MODULE_NAME ("utdelete")
0161
0162
0163
0164 static void
0165 AcpiUtDeleteInternalObj (
0166 ACPI_OPERAND_OBJECT *Object);
0167
0168 static void
0169 AcpiUtUpdateRefCount (
0170 ACPI_OPERAND_OBJECT *Object,
0171 UINT32 Action);
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 static void
0188 AcpiUtDeleteInternalObj (
0189 ACPI_OPERAND_OBJECT *Object)
0190 {
0191 void *ObjPointer = NULL;
0192 ACPI_OPERAND_OBJECT *HandlerDesc;
0193 ACPI_OPERAND_OBJECT *SecondDesc;
0194 ACPI_OPERAND_OBJECT *NextDesc;
0195 ACPI_OPERAND_OBJECT *StartDesc;
0196 ACPI_OPERAND_OBJECT **LastObjPtr;
0197
0198
0199 ACPI_FUNCTION_TRACE_PTR (UtDeleteInternalObj, Object);
0200
0201
0202 if (!Object)
0203 {
0204 return_VOID;
0205 }
0206
0207
0208
0209
0210
0211 switch (Object->Common.Type)
0212 {
0213 case ACPI_TYPE_STRING:
0214
0215 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** String %p, ptr %p\n",
0216 Object, Object->String.Pointer));
0217
0218
0219
0220 if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
0221 {
0222
0223
0224 ObjPointer = Object->String.Pointer;
0225 }
0226 break;
0227
0228 case ACPI_TYPE_BUFFER:
0229
0230 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n",
0231 Object, Object->Buffer.Pointer));
0232
0233
0234
0235 if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
0236 {
0237
0238
0239 ObjPointer = Object->Buffer.Pointer;
0240 }
0241 break;
0242
0243 case ACPI_TYPE_PACKAGE:
0244
0245 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n",
0246 Object->Package.Count));
0247
0248
0249
0250
0251
0252
0253
0254
0255 ObjPointer = Object->Package.Elements;
0256 break;
0257
0258
0259
0260
0261
0262 case ACPI_TYPE_DEVICE:
0263
0264 if (Object->Device.GpeBlock)
0265 {
0266 (void) AcpiEvDeleteGpeBlock (Object->Device.GpeBlock);
0267 }
0268
0269 ACPI_FALLTHROUGH;
0270
0271 case ACPI_TYPE_PROCESSOR:
0272 case ACPI_TYPE_THERMAL:
0273
0274
0275
0276 HandlerDesc = Object->CommonNotify.Handler;
0277 while (HandlerDesc)
0278 {
0279 NextDesc = HandlerDesc->AddressSpace.Next;
0280 AcpiUtRemoveReference (HandlerDesc);
0281 HandlerDesc = NextDesc;
0282 }
0283 break;
0284
0285 case ACPI_TYPE_MUTEX:
0286
0287 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0288 "***** Mutex %p, OS Mutex %p\n",
0289 Object, Object->Mutex.OsMutex));
0290
0291 if (Object == AcpiGbl_GlobalLockMutex)
0292 {
0293
0294
0295 (void) AcpiOsDeleteSemaphore (AcpiGbl_GlobalLockSemaphore);
0296 AcpiGbl_GlobalLockSemaphore = ACPI_SEMAPHORE_NULL;
0297
0298 AcpiOsDeleteMutex (Object->Mutex.OsMutex);
0299 AcpiGbl_GlobalLockMutex = NULL;
0300 }
0301 else
0302 {
0303 AcpiExUnlinkMutex (Object);
0304 AcpiOsDeleteMutex (Object->Mutex.OsMutex);
0305 }
0306 break;
0307
0308 case ACPI_TYPE_EVENT:
0309
0310 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0311 "***** Event %p, OS Semaphore %p\n",
0312 Object, Object->Event.OsSemaphore));
0313
0314 (void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore);
0315 Object->Event.OsSemaphore = ACPI_SEMAPHORE_NULL;
0316 break;
0317
0318 case ACPI_TYPE_METHOD:
0319
0320 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0321 "***** Method %p\n", Object));
0322
0323
0324
0325 if (Object->Method.Mutex)
0326 {
0327 AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex);
0328 AcpiUtDeleteObjectDesc (Object->Method.Mutex);
0329 Object->Method.Mutex = NULL;
0330 }
0331
0332 if (Object->Method.Node)
0333 {
0334 Object->Method.Node = NULL;
0335 }
0336 break;
0337
0338 case ACPI_TYPE_REGION:
0339
0340 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0341 "***** Region %p\n", Object));
0342
0343
0344
0345
0346
0347 if (!(Object->Region.Node->Flags & ANOBJ_TEMPORARY))
0348 {
0349 AcpiUtRemoveAddressRange (Object->Region.SpaceId,
0350 Object->Region.Node);
0351 }
0352
0353 SecondDesc = AcpiNsGetSecondaryObject (Object);
0354 if (SecondDesc)
0355 {
0356
0357
0358
0359
0360
0361 HandlerDesc = Object->Region.Handler;
0362 if (HandlerDesc)
0363 {
0364 NextDesc = HandlerDesc->AddressSpace.RegionList;
0365 StartDesc = NextDesc;
0366 LastObjPtr = &HandlerDesc->AddressSpace.RegionList;
0367
0368
0369
0370 while (NextDesc)
0371 {
0372 if (NextDesc == Object)
0373 {
0374 *LastObjPtr = NextDesc->Region.Next;
0375 break;
0376 }
0377
0378
0379
0380 LastObjPtr = &NextDesc->Region.Next;
0381 NextDesc = NextDesc->Region.Next;
0382
0383
0384
0385 if (NextDesc == StartDesc)
0386 {
0387 ACPI_ERROR ((AE_INFO,
0388 "Circular region list in address handler object %p",
0389 HandlerDesc));
0390 return_VOID;
0391 }
0392 }
0393
0394 if (HandlerDesc->AddressSpace.HandlerFlags &
0395 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
0396 {
0397
0398
0399 if (HandlerDesc->AddressSpace.Setup)
0400 {
0401 (void) HandlerDesc->AddressSpace.Setup (Object,
0402 ACPI_REGION_DEACTIVATE,
0403 HandlerDesc->AddressSpace.Context,
0404 &SecondDesc->Extra.RegionContext);
0405 }
0406 }
0407
0408 AcpiUtRemoveReference (HandlerDesc);
0409 }
0410
0411
0412
0413 AcpiUtDeleteObjectDesc (SecondDesc);
0414 }
0415 if (Object->Field.InternalPccBuffer)
0416 {
0417 ACPI_FREE(Object->Field.InternalPccBuffer);
0418 }
0419
0420 break;
0421
0422 case ACPI_TYPE_BUFFER_FIELD:
0423
0424 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0425 "***** Buffer Field %p\n", Object));
0426
0427 SecondDesc = AcpiNsGetSecondaryObject (Object);
0428 if (SecondDesc)
0429 {
0430 AcpiUtDeleteObjectDesc (SecondDesc);
0431 }
0432 break;
0433
0434 case ACPI_TYPE_LOCAL_BANK_FIELD:
0435
0436 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0437 "***** Bank Field %p\n", Object));
0438
0439 SecondDesc = AcpiNsGetSecondaryObject (Object);
0440 if (SecondDesc)
0441 {
0442 AcpiUtDeleteObjectDesc (SecondDesc);
0443 }
0444 break;
0445
0446 case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
0447
0448 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0449 "***** Address handler %p\n", Object));
0450
0451 AcpiOsDeleteMutex (Object->AddressSpace.ContextMutex);
0452 break;
0453
0454 default:
0455
0456 break;
0457 }
0458
0459
0460
0461 if (ObjPointer)
0462 {
0463 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object Subptr %p\n",
0464 ObjPointer));
0465 ACPI_FREE (ObjPointer);
0466 }
0467
0468
0469
0470 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, "%s: Deleting Object %p [%s]\n",
0471 ACPI_GET_FUNCTION_NAME, Object, AcpiUtGetObjectTypeName (Object)));
0472
0473 AcpiUtDeleteObjectDesc (Object);
0474 return_VOID;
0475 }
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491 void
0492 AcpiUtDeleteInternalObjectList (
0493 ACPI_OPERAND_OBJECT **ObjList)
0494 {
0495 ACPI_OPERAND_OBJECT **InternalObj;
0496
0497
0498 ACPI_FUNCTION_ENTRY ();
0499
0500
0501
0502
0503 for (InternalObj = ObjList; *InternalObj; InternalObj++)
0504 {
0505 AcpiUtRemoveReference (*InternalObj);
0506 }
0507
0508
0509
0510 ACPI_FREE (ObjList);
0511 return;
0512 }
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 static void
0529 AcpiUtUpdateRefCount (
0530 ACPI_OPERAND_OBJECT *Object,
0531 UINT32 Action)
0532 {
0533 UINT16 OriginalCount;
0534 UINT16 NewCount = 0;
0535 ACPI_CPU_FLAGS LockFlags;
0536 char *Message;
0537
0538
0539 ACPI_FUNCTION_NAME (UtUpdateRefCount);
0540
0541
0542 if (!Object)
0543 {
0544 return;
0545 }
0546
0547
0548
0549
0550
0551 LockFlags = AcpiOsAcquireLock (AcpiGbl_ReferenceCountLock);
0552 OriginalCount = Object->Common.ReferenceCount;
0553
0554
0555
0556 switch (Action)
0557 {
0558 case REF_INCREMENT:
0559
0560 NewCount = OriginalCount + 1;
0561 Object->Common.ReferenceCount = NewCount;
0562 AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags);
0563
0564
0565
0566 if (!OriginalCount)
0567 {
0568 ACPI_WARNING ((AE_INFO,
0569 "Obj %p, Reference Count was zero before increment\n",
0570 Object));
0571 }
0572
0573 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0574 "Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n",
0575 Object, Object->Common.Type,
0576 AcpiUtGetObjectTypeName (Object), NewCount));
0577 Message = "Incremement";
0578 break;
0579
0580 case REF_DECREMENT:
0581
0582
0583
0584 if (OriginalCount)
0585 {
0586 NewCount = OriginalCount - 1;
0587 Object->Common.ReferenceCount = NewCount;
0588 }
0589
0590 AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags);
0591
0592 if (!OriginalCount)
0593 {
0594 ACPI_WARNING ((AE_INFO,
0595 "Obj %p, Reference Count is already zero, cannot decrement\n",
0596 Object));
0597 return;
0598 }
0599
0600 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS,
0601 "%s: Obj %p Type %.2X Refs %.2X [Decremented]\n",
0602 ACPI_GET_FUNCTION_NAME, Object, Object->Common.Type, NewCount));
0603
0604
0605
0606 if (NewCount == 0)
0607 {
0608 AcpiUtDeleteInternalObj (Object);
0609 }
0610 Message = "Decrement";
0611 break;
0612
0613 default:
0614
0615 AcpiOsReleaseLock (AcpiGbl_ReferenceCountLock, LockFlags);
0616 ACPI_ERROR ((AE_INFO, "Unknown Reference Count action (0x%X)",
0617 Action));
0618 return;
0619 }
0620
0621
0622
0623
0624
0625 if (NewCount > ACPI_MAX_REFERENCE_COUNT)
0626 {
0627 ACPI_WARNING ((AE_INFO,
0628 "Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s",
0629 NewCount, Object, Object->Common.Type, Message));
0630 }
0631 }
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655 ACPI_STATUS
0656 AcpiUtUpdateObjectReference (
0657 ACPI_OPERAND_OBJECT *Object,
0658 UINT16 Action)
0659 {
0660 ACPI_STATUS Status = AE_OK;
0661 ACPI_GENERIC_STATE *StateList = NULL;
0662 ACPI_OPERAND_OBJECT *NextObject = NULL;
0663 ACPI_OPERAND_OBJECT *PrevObject;
0664 ACPI_GENERIC_STATE *State;
0665 UINT32 i;
0666
0667
0668 ACPI_FUNCTION_NAME (UtUpdateObjectReference);
0669
0670
0671 while (Object)
0672 {
0673
0674
0675 if (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED)
0676 {
0677 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0678 "Object %p is NS handle\n", Object));
0679 return (AE_OK);
0680 }
0681
0682
0683
0684
0685
0686 switch (Object->Common.Type)
0687 {
0688 case ACPI_TYPE_DEVICE:
0689 case ACPI_TYPE_PROCESSOR:
0690 case ACPI_TYPE_POWER:
0691 case ACPI_TYPE_THERMAL:
0692
0693
0694
0695
0696 for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
0697 {
0698 PrevObject = Object->CommonNotify.NotifyList[i];
0699 while (PrevObject)
0700 {
0701 NextObject = PrevObject->Notify.Next[i];
0702 AcpiUtUpdateRefCount (PrevObject, Action);
0703 PrevObject = NextObject;
0704 }
0705 }
0706 break;
0707
0708 case ACPI_TYPE_PACKAGE:
0709
0710
0711
0712
0713 for (i = 0; i < Object->Package.Count; i++)
0714 {
0715
0716
0717
0718
0719 NextObject = Object->Package.Elements[i];
0720 if (!NextObject)
0721 {
0722 continue;
0723 }
0724
0725 switch (NextObject->Common.Type)
0726 {
0727 case ACPI_TYPE_INTEGER:
0728 case ACPI_TYPE_STRING:
0729 case ACPI_TYPE_BUFFER:
0730
0731
0732
0733
0734
0735 AcpiUtUpdateRefCount (NextObject, Action);
0736 break;
0737
0738 default:
0739
0740
0741
0742
0743 Status = AcpiUtCreateUpdateStateAndPush (
0744 NextObject, Action, &StateList);
0745 if (ACPI_FAILURE (Status))
0746 {
0747 goto ErrorExit;
0748 }
0749 break;
0750 }
0751 }
0752
0753 NextObject = NULL;
0754 break;
0755
0756 case ACPI_TYPE_BUFFER_FIELD:
0757
0758 NextObject = Object->BufferField.BufferObj;
0759 break;
0760
0761 case ACPI_TYPE_LOCAL_BANK_FIELD:
0762
0763 NextObject = Object->BankField.BankObj;
0764 Status = AcpiUtCreateUpdateStateAndPush (
0765 Object->BankField.RegionObj, Action, &StateList);
0766 if (ACPI_FAILURE (Status))
0767 {
0768 goto ErrorExit;
0769 }
0770 break;
0771
0772 case ACPI_TYPE_LOCAL_INDEX_FIELD:
0773
0774 NextObject = Object->IndexField.IndexObj;
0775 Status = AcpiUtCreateUpdateStateAndPush (
0776 Object->IndexField.DataObj, Action, &StateList);
0777 if (ACPI_FAILURE (Status))
0778 {
0779 goto ErrorExit;
0780 }
0781 break;
0782
0783 case ACPI_TYPE_LOCAL_REFERENCE:
0784
0785
0786
0787
0788
0789 if ((Object->Reference.Class == ACPI_REFCLASS_INDEX) ||
0790 (Object->Reference.Class== ACPI_REFCLASS_NAME))
0791 {
0792 NextObject = Object->Reference.Object;
0793 }
0794 break;
0795
0796 case ACPI_TYPE_LOCAL_REGION_FIELD:
0797 case ACPI_TYPE_REGION:
0798 default:
0799
0800 break;
0801 }
0802
0803
0804
0805
0806
0807
0808 AcpiUtUpdateRefCount (Object, Action);
0809 Object = NULL;
0810
0811
0812
0813 if (NextObject)
0814 {
0815 Object = NextObject;
0816 NextObject = NULL;
0817 }
0818 else if (StateList)
0819 {
0820 State = AcpiUtPopGenericState (&StateList);
0821 Object = State->Update.Object;
0822 AcpiUtDeleteGenericState (State);
0823 }
0824 }
0825
0826 return (AE_OK);
0827
0828
0829 ErrorExit:
0830
0831 ACPI_EXCEPTION ((AE_INFO, Status,
0832 "Could not update object reference count"));
0833
0834
0835
0836 while (StateList)
0837 {
0838 State = AcpiUtPopGenericState (&StateList);
0839 AcpiUtDeleteGenericState (State);
0840 }
0841
0842 return (Status);
0843 }
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859 void
0860 AcpiUtAddReference (
0861 ACPI_OPERAND_OBJECT *Object)
0862 {
0863
0864 ACPI_FUNCTION_NAME (UtAddReference);
0865
0866
0867
0868
0869 if (!AcpiUtValidInternalObject (Object))
0870 {
0871 return;
0872 }
0873
0874 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
0875 "Obj %p Current Refs=%X [To Be Incremented]\n",
0876 Object, Object->Common.ReferenceCount));
0877
0878
0879
0880 (void) AcpiUtUpdateObjectReference (Object, REF_INCREMENT);
0881 return;
0882 }
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897 void
0898 AcpiUtRemoveReference (
0899 ACPI_OPERAND_OBJECT *Object)
0900 {
0901
0902 ACPI_FUNCTION_NAME (UtRemoveReference);
0903
0904
0905
0906
0907
0908
0909 if (!Object ||
0910 (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED))
0911
0912 {
0913 return;
0914 }
0915
0916
0917
0918 if (!AcpiUtValidInternalObject (Object))
0919 {
0920 return;
0921 }
0922
0923 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS,
0924 "%s: Obj %p Current Refs=%X [To Be Decremented]\n",
0925 ACPI_GET_FUNCTION_NAME, Object, Object->Common.ReferenceCount));
0926
0927
0928
0929
0930
0931
0932 (void) AcpiUtUpdateObjectReference (Object, REF_DECREMENT);
0933 return;
0934 }