Warning, cross-references for /kernel/drivers/acpica/exstore.c need to be fixed.
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 #define __EXSTORE_C__
0118
0119 #include "acpi.h"
0120 #include "accommon.h"
0121 #include "acdispat.h"
0122 #include "acinterp.h"
0123 #include "amlcode.h"
0124 #include "acnamesp.h"
0125
0126
0127 #define _COMPONENT ACPI_EXECUTER
0128 ACPI_MODULE_NAME ("exstore")
0129
0130
0131
0132 static void
0133 AcpiExDoDebugObject (
0134 ACPI_OPERAND_OBJECT *SourceDesc,
0135 UINT32 Level,
0136 UINT32 Index);
0137
0138 static ACPI_STATUS
0139 AcpiExStoreObjectToIndex (
0140 ACPI_OPERAND_OBJECT *ValDesc,
0141 ACPI_OPERAND_OBJECT *DestDesc,
0142 ACPI_WALK_STATE *WalkState);
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159 static void
0160 AcpiExDoDebugObject (
0161 ACPI_OPERAND_OBJECT *SourceDesc,
0162 UINT32 Level,
0163 UINT32 Index)
0164 {
0165 UINT32 i;
0166
0167
0168 ACPI_FUNCTION_TRACE_PTR (ExDoDebugObject, SourceDesc);
0169
0170
0171
0172
0173 if (!((Level > 0) && Index == 0))
0174 {
0175 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %*s",
0176 Level, " "));
0177 }
0178
0179
0180
0181 if (Index > 0)
0182 {
0183 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
0184 "(%.2u) ", Index -1));
0185 }
0186
0187 if (!SourceDesc)
0188 {
0189 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[Null Object]\n"));
0190 return_VOID;
0191 }
0192
0193 if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
0194 {
0195 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s ",
0196 AcpiUtGetObjectTypeName (SourceDesc)));
0197
0198 if (!AcpiUtValidInternalObject (SourceDesc))
0199 {
0200 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
0201 "%p, Invalid Internal Object!\n", SourceDesc));
0202 return_VOID;
0203 }
0204 }
0205 else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
0206 {
0207 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s: %p\n",
0208 AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
0209 SourceDesc));
0210 return_VOID;
0211 }
0212 else
0213 {
0214 return_VOID;
0215 }
0216
0217
0218
0219 switch (SourceDesc->Common.Type)
0220 {
0221 case ACPI_TYPE_INTEGER:
0222
0223
0224
0225 if (AcpiGbl_IntegerByteWidth == 4)
0226 {
0227 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n",
0228 (UINT32) SourceDesc->Integer.Value));
0229 }
0230 else
0231 {
0232 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
0233 ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value)));
0234 }
0235 break;
0236
0237 case ACPI_TYPE_BUFFER:
0238
0239 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]\n",
0240 (UINT32) SourceDesc->Buffer.Length));
0241 ACPI_DUMP_BUFFER (SourceDesc->Buffer.Pointer,
0242 (SourceDesc->Buffer.Length < 256) ? SourceDesc->Buffer.Length : 256);
0243 break;
0244
0245 case ACPI_TYPE_STRING:
0246
0247 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n",
0248 SourceDesc->String.Length, SourceDesc->String.Pointer));
0249 break;
0250
0251 case ACPI_TYPE_PACKAGE:
0252
0253 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[Contains 0x%.2X Elements]\n",
0254 SourceDesc->Package.Count));
0255
0256
0257
0258 for (i = 0; i < SourceDesc->Package.Count; i++)
0259 {
0260 AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
0261 Level+4, i+1);
0262 }
0263 break;
0264
0265 case ACPI_TYPE_LOCAL_REFERENCE:
0266
0267 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[%s] ",
0268 AcpiUtGetReferenceName (SourceDesc)));
0269
0270
0271
0272 switch (SourceDesc->Reference.Class)
0273 {
0274 case ACPI_REFCLASS_INDEX:
0275
0276 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%X\n",
0277 SourceDesc->Reference.Value));
0278 break;
0279
0280 case ACPI_REFCLASS_TABLE:
0281
0282
0283
0284 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Table Index 0x%X\n",
0285 SourceDesc->Reference.Value));
0286 return;
0287
0288 default:
0289 break;
0290 }
0291
0292 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, " "));
0293
0294
0295
0296 if (SourceDesc->Reference.Node)
0297 {
0298 if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Node) !=
0299 ACPI_DESC_TYPE_NAMED)
0300 {
0301 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
0302 " %p - Not a valid namespace node\n",
0303 SourceDesc->Reference.Node));
0304 }
0305 else
0306 {
0307 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Node %p [%4.4s] ",
0308 SourceDesc->Reference.Node, (SourceDesc->Reference.Node)->Name.Ascii));
0309
0310 switch ((SourceDesc->Reference.Node)->Type)
0311 {
0312
0313
0314 case ACPI_TYPE_DEVICE:
0315 AcpiOsPrintf ("Device\n");
0316 break;
0317
0318 case ACPI_TYPE_THERMAL:
0319 AcpiOsPrintf ("Thermal Zone\n");
0320 break;
0321
0322 default:
0323 AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
0324 Level+4, 0);
0325 break;
0326 }
0327 }
0328 }
0329 else if (SourceDesc->Reference.Object)
0330 {
0331 if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
0332 ACPI_DESC_TYPE_NAMED)
0333 {
0334 AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *)
0335 SourceDesc->Reference.Object)->Object,
0336 Level+4, 0);
0337 }
0338 else
0339 {
0340 AcpiExDoDebugObject (SourceDesc->Reference.Object, Level+4, 0);
0341 }
0342 }
0343 break;
0344
0345 default:
0346
0347 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p\n",
0348 SourceDesc));
0349 break;
0350 }
0351
0352 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n"));
0353 return_VOID;
0354 }
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377 ACPI_STATUS
0378 AcpiExStore (
0379 ACPI_OPERAND_OBJECT *SourceDesc,
0380 ACPI_OPERAND_OBJECT *DestDesc,
0381 ACPI_WALK_STATE *WalkState)
0382 {
0383 ACPI_STATUS Status = AE_OK;
0384 ACPI_OPERAND_OBJECT *RefDesc = DestDesc;
0385
0386
0387 ACPI_FUNCTION_TRACE_PTR (ExStore, DestDesc);
0388
0389
0390
0391
0392 if (!SourceDesc || !DestDesc)
0393 {
0394 ACPI_ERROR ((AE_INFO, "Null parameter"));
0395 return_ACPI_STATUS (AE_AML_NO_OPERAND);
0396 }
0397
0398
0399
0400 if (ACPI_GET_DESCRIPTOR_TYPE (DestDesc) == ACPI_DESC_TYPE_NAMED)
0401 {
0402
0403
0404
0405
0406 Status = AcpiExStoreObjectToNode (SourceDesc,
0407 (ACPI_NAMESPACE_NODE *) DestDesc, WalkState,
0408 ACPI_IMPLICIT_CONVERSION);
0409
0410 return_ACPI_STATUS (Status);
0411 }
0412
0413
0414
0415 switch (DestDesc->Common.Type)
0416 {
0417 case ACPI_TYPE_LOCAL_REFERENCE:
0418 break;
0419
0420 case ACPI_TYPE_INTEGER:
0421
0422
0423
0424 if (DestDesc->Common.Flags & AOPOBJ_AML_CONSTANT)
0425 {
0426 return_ACPI_STATUS (AE_OK);
0427 }
0428
0429
0430
0431 default:
0432
0433
0434
0435 ACPI_ERROR ((AE_INFO,
0436 "Target is not a Reference or Constant object - %s [%p]",
0437 AcpiUtGetObjectTypeName (DestDesc), DestDesc));
0438
0439 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0440 }
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450 switch (RefDesc->Reference.Class)
0451 {
0452 case ACPI_REFCLASS_REFOF:
0453
0454
0455
0456 Status = AcpiExStoreObjectToNode (SourceDesc,
0457 RefDesc->Reference.Object,
0458 WalkState, ACPI_IMPLICIT_CONVERSION);
0459 break;
0460
0461
0462 case ACPI_REFCLASS_INDEX:
0463
0464
0465
0466 Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState);
0467 break;
0468
0469
0470 case ACPI_REFCLASS_LOCAL:
0471 case ACPI_REFCLASS_ARG:
0472
0473
0474
0475 Status = AcpiDsStoreObjectToLocal (RefDesc->Reference.Class,
0476 RefDesc->Reference.Value, SourceDesc, WalkState);
0477 break;
0478
0479
0480 case ACPI_REFCLASS_DEBUG:
0481
0482
0483
0484
0485
0486 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
0487 "**** Write to Debug Object: Object %p %s ****:\n\n",
0488 SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
0489
0490 AcpiExDoDebugObject (SourceDesc, 0, 0);
0491 break;
0492
0493
0494 default:
0495
0496 ACPI_ERROR ((AE_INFO, "Unknown Reference Class %2.2X",
0497 RefDesc->Reference.Class));
0498 ACPI_DUMP_ENTRY (RefDesc, ACPI_LV_INFO);
0499
0500 Status = AE_AML_INTERNAL;
0501 break;
0502 }
0503
0504 return_ACPI_STATUS (Status);
0505 }
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522 static ACPI_STATUS
0523 AcpiExStoreObjectToIndex (
0524 ACPI_OPERAND_OBJECT *SourceDesc,
0525 ACPI_OPERAND_OBJECT *IndexDesc,
0526 ACPI_WALK_STATE *WalkState)
0527 {
0528 ACPI_STATUS Status = AE_OK;
0529 ACPI_OPERAND_OBJECT *ObjDesc;
0530 ACPI_OPERAND_OBJECT *NewDesc;
0531 UINT8 Value = 0;
0532 UINT32 i;
0533
0534
0535 ACPI_FUNCTION_TRACE (ExStoreObjectToIndex);
0536
0537
0538
0539
0540
0541
0542 switch (IndexDesc->Reference.TargetType)
0543 {
0544 case ACPI_TYPE_PACKAGE:
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554 ObjDesc = *(IndexDesc->Reference.Where);
0555
0556 if (SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE &&
0557 SourceDesc->Reference.Class == ACPI_REFCLASS_TABLE)
0558 {
0559
0560
0561 AcpiUtAddReference (SourceDesc);
0562 NewDesc = SourceDesc;
0563 }
0564 else
0565 {
0566
0567
0568 Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
0569 if (ACPI_FAILURE (Status))
0570 {
0571 return_ACPI_STATUS (Status);
0572 }
0573 }
0574
0575 if (ObjDesc)
0576 {
0577
0578
0579 for (i = 0;
0580 i < ((ACPI_OPERAND_OBJECT *)
0581 IndexDesc->Reference.Object)->Common.ReferenceCount;
0582 i++)
0583 {
0584 AcpiUtRemoveReference (ObjDesc);
0585 }
0586 }
0587
0588 *(IndexDesc->Reference.Where) = NewDesc;
0589
0590
0591
0592 for (i = 1;
0593 i < ((ACPI_OPERAND_OBJECT *)
0594 IndexDesc->Reference.Object)->Common.ReferenceCount;
0595 i++)
0596 {
0597 AcpiUtAddReference (NewDesc);
0598 }
0599
0600 break;
0601
0602
0603 case ACPI_TYPE_BUFFER_FIELD:
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619 ObjDesc = IndexDesc->Reference.Object;
0620 if ((ObjDesc->Common.Type != ACPI_TYPE_BUFFER) &&
0621 (ObjDesc->Common.Type != ACPI_TYPE_STRING))
0622 {
0623 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0624 }
0625
0626
0627
0628
0629
0630 switch (SourceDesc->Common.Type)
0631 {
0632 case ACPI_TYPE_INTEGER:
0633
0634
0635
0636 Value = (UINT8) (SourceDesc->Integer.Value);
0637 break;
0638
0639 case ACPI_TYPE_BUFFER:
0640 case ACPI_TYPE_STRING:
0641
0642
0643
0644 Value = SourceDesc->Buffer.Pointer[0];
0645 break;
0646
0647 default:
0648
0649
0650
0651 ACPI_ERROR ((AE_INFO,
0652 "Source must be Integer/Buffer/String type, not %s",
0653 AcpiUtGetObjectTypeName (SourceDesc)));
0654 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0655 }
0656
0657
0658
0659 ObjDesc->Buffer.Pointer[IndexDesc->Reference.Value] = Value;
0660 break;
0661
0662
0663 default:
0664 ACPI_ERROR ((AE_INFO,
0665 "Target is not a Package or BufferField"));
0666 Status = AE_AML_OPERAND_TYPE;
0667 break;
0668 }
0669
0670 return_ACPI_STATUS (Status);
0671 }
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700 ACPI_STATUS
0701 AcpiExStoreObjectToNode (
0702 ACPI_OPERAND_OBJECT *SourceDesc,
0703 ACPI_NAMESPACE_NODE *Node,
0704 ACPI_WALK_STATE *WalkState,
0705 UINT8 ImplicitConversion)
0706 {
0707 ACPI_STATUS Status = AE_OK;
0708 ACPI_OPERAND_OBJECT *TargetDesc;
0709 ACPI_OPERAND_OBJECT *NewDesc;
0710 ACPI_OBJECT_TYPE TargetType;
0711
0712
0713 ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToNode, SourceDesc);
0714
0715
0716
0717
0718 TargetType = AcpiNsGetType (Node);
0719 TargetDesc = AcpiNsGetAttachedObject (Node);
0720
0721 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n",
0722 SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
0723 Node, AcpiUtGetTypeName (TargetType)));
0724
0725
0726
0727
0728
0729 Status = AcpiExResolveObject (&SourceDesc, TargetType, WalkState);
0730 if (ACPI_FAILURE (Status))
0731 {
0732 return_ACPI_STATUS (Status);
0733 }
0734
0735
0736
0737 if ((!ImplicitConversion) ||
0738 ((WalkState->Opcode == AML_COPY_OP) &&
0739 (TargetType != ACPI_TYPE_LOCAL_REGION_FIELD) &&
0740 (TargetType != ACPI_TYPE_LOCAL_BANK_FIELD) &&
0741 (TargetType != ACPI_TYPE_LOCAL_INDEX_FIELD)))
0742 {
0743
0744
0745
0746
0747
0748
0749 TargetType = ACPI_TYPE_ANY;
0750 }
0751
0752
0753
0754 switch (TargetType)
0755 {
0756 case ACPI_TYPE_BUFFER_FIELD:
0757 case ACPI_TYPE_LOCAL_REGION_FIELD:
0758 case ACPI_TYPE_LOCAL_BANK_FIELD:
0759 case ACPI_TYPE_LOCAL_INDEX_FIELD:
0760
0761
0762
0763 Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
0764 &WalkState->ResultObj);
0765 break;
0766
0767
0768 case ACPI_TYPE_INTEGER:
0769 case ACPI_TYPE_STRING:
0770 case ACPI_TYPE_BUFFER:
0771
0772
0773
0774
0775
0776
0777
0778 Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
0779 &NewDesc, WalkState);
0780 if (ACPI_FAILURE (Status))
0781 {
0782 return_ACPI_STATUS (Status);
0783 }
0784
0785 if (NewDesc != TargetDesc)
0786 {
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796 Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
0797
0798 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
0799 "Store %s into %s via Convert/Attach\n",
0800 AcpiUtGetObjectTypeName (SourceDesc),
0801 AcpiUtGetObjectTypeName (NewDesc)));
0802 }
0803 break;
0804
0805
0806 default:
0807
0808 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
0809 "Storing %s (%p) directly into node (%p) with no implicit conversion\n",
0810 AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, Node));
0811
0812
0813
0814 Status = AcpiNsAttachObject (Node, SourceDesc,
0815 SourceDesc->Common.Type);
0816 break;
0817 }
0818
0819 return_ACPI_STATUS (Status);
0820 }
0821
0822