Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/components/debugger/dbmethod.c
48406 views
1
/*******************************************************************************
2
*
3
* Module Name: dbmethod - Debug commands for control methods
4
*
5
******************************************************************************/
6
7
/******************************************************************************
8
*
9
* 1. Copyright Notice
10
*
11
* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12
* All rights reserved.
13
*
14
* 2. License
15
*
16
* 2.1. This is your license from Intel Corp. under its intellectual property
17
* rights. You may have additional license terms from the party that provided
18
* you this software, covering your right to use that party's intellectual
19
* property rights.
20
*
21
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
* copy of the source code appearing in this file ("Covered Code") an
23
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
* base code distributed originally by Intel ("Original Intel Code") to copy,
25
* make derivatives, distribute, use and display any portion of the Covered
26
* Code in any form, with the right to sublicense such rights; and
27
*
28
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
* license (with the right to sublicense), under only those claims of Intel
30
* patents that are infringed by the Original Intel Code, to make, use, sell,
31
* offer to sell, and import the Covered Code and derivative works thereof
32
* solely to the minimum extent necessary to exercise the above copyright
33
* license, and in no event shall the patent license extend to any additions
34
* to or modifications of the Original Intel Code. No other license or right
35
* is granted directly or by implication, estoppel or otherwise;
36
*
37
* The above copyright and patent license is granted only if the following
38
* conditions are met:
39
*
40
* 3. Conditions
41
*
42
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
* Redistribution of source code of any substantial portion of the Covered
44
* Code or modification with rights to further distribute source must include
45
* the above Copyright Notice, the above License, this list of Conditions,
46
* and the following Disclaimer and Export Compliance provision. In addition,
47
* Licensee must cause all Covered Code to which Licensee contributes to
48
* contain a file documenting the changes Licensee made to create that Covered
49
* Code and the date of any change. Licensee must include in that file the
50
* documentation of any changes made by any predecessor Licensee. Licensee
51
* must include a prominent statement that the modification is derived,
52
* directly or indirectly, from Original Intel Code.
53
*
54
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
* Redistribution of source code of any substantial portion of the Covered
56
* Code or modification without rights to further distribute source must
57
* include the following Disclaimer and Export Compliance provision in the
58
* documentation and/or other materials provided with distribution. In
59
* addition, Licensee may not authorize further sublicense of source of any
60
* portion of the Covered Code, and must include terms to the effect that the
61
* license from Licensee to its licensee is limited to the intellectual
62
* property embodied in the software Licensee provides to its licensee, and
63
* not to intellectual property embodied in modifications its licensee may
64
* make.
65
*
66
* 3.3. Redistribution of Executable. Redistribution in executable form of any
67
* substantial portion of the Covered Code or modification must reproduce the
68
* above Copyright Notice, and the following Disclaimer and Export Compliance
69
* provision in the documentation and/or other materials provided with the
70
* distribution.
71
*
72
* 3.4. Intel retains all right, title, and interest in and to the Original
73
* Intel Code.
74
*
75
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
* Intel shall be used in advertising or otherwise to promote the sale, use or
77
* other dealings in products derived from or relating to the Covered Code
78
* without prior written authorization from Intel.
79
*
80
* 4. Disclaimer and Export Compliance
81
*
82
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
* PARTICULAR PURPOSE.
89
*
90
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
* LIMITED REMEDY.
98
*
99
* 4.3. Licensee shall not export, either directly or indirectly, any of this
100
* software or system incorporating such software without first obtaining any
101
* required license or other approval from the U. S. Department of Commerce or
102
* any other agency or department of the United States Government. In the
103
* event Licensee exports any such software from the United States or
104
* re-exports any such software from a foreign destination, Licensee shall
105
* ensure that the distribution and export/re-export of the software is in
106
* compliance with all laws, regulations, orders, or other restrictions of the
107
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
* any of its subsidiaries will export/re-export any technical data, process,
109
* software, or service, directly or indirectly, to any country for which the
110
* United States government or any agency thereof requires an export license,
111
* other governmental approval, or letter of assurance, without first obtaining
112
* such license, approval or letter.
113
*
114
*****************************************************************************
115
*
116
* Alternatively, you may choose to be licensed under the terms of the
117
* following license:
118
*
119
* Redistribution and use in source and binary forms, with or without
120
* modification, are permitted provided that the following conditions
121
* are met:
122
* 1. Redistributions of source code must retain the above copyright
123
* notice, this list of conditions, and the following disclaimer,
124
* without modification.
125
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
126
* substantially similar to the "NO WARRANTY" disclaimer below
127
* ("Disclaimer") and any redistribution must be conditioned upon
128
* including a substantially similar Disclaimer requirement for further
129
* binary redistribution.
130
* 3. Neither the names of the above-listed copyright holders nor the names
131
* of any contributors may be used to endorse or promote products derived
132
* from this software without specific prior written permission.
133
*
134
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145
*
146
* Alternatively, you may choose to be licensed under the terms of the
147
* GNU General Public License ("GPL") version 2 as published by the Free
148
* Software Foundation.
149
*
150
*****************************************************************************/
151
152
#include <contrib/dev/acpica/include/acpi.h>
153
#include <contrib/dev/acpica/include/accommon.h>
154
#include <contrib/dev/acpica/include/acdispat.h>
155
#include <contrib/dev/acpica/include/acnamesp.h>
156
#include <contrib/dev/acpica/include/acdebug.h>
157
#include <contrib/dev/acpica/include/acparser.h>
158
#include <contrib/dev/acpica/include/acpredef.h>
159
160
161
#define _COMPONENT ACPI_CA_DEBUGGER
162
ACPI_MODULE_NAME ("dbmethod")
163
164
/* Local prototypes */
165
166
static ACPI_STATUS
167
AcpiDbWalkForExecute (
168
ACPI_HANDLE ObjHandle,
169
UINT32 NestingLevel,
170
void *Context,
171
void **ReturnValue);
172
173
static ACPI_STATUS
174
AcpiDbEvaluateObject (
175
ACPI_NAMESPACE_NODE *Node);
176
177
178
/*******************************************************************************
179
*
180
* FUNCTION: AcpiDbSetMethodBreakpoint
181
*
182
* PARAMETERS: Location - AML offset of breakpoint
183
* WalkState - Current walk info
184
* Op - Current Op (from parse walk)
185
*
186
* RETURN: None
187
*
188
* DESCRIPTION: Set a breakpoint in a control method at the specified
189
* AML offset
190
*
191
******************************************************************************/
192
193
void
194
AcpiDbSetMethodBreakpoint (
195
char *Location,
196
ACPI_WALK_STATE *WalkState,
197
ACPI_PARSE_OBJECT *Op)
198
{
199
UINT32 Address;
200
UINT32 AmlOffset;
201
202
203
if (!Op)
204
{
205
AcpiOsPrintf ("There is no method currently executing\n");
206
return;
207
}
208
209
/* Get and verify the breakpoint address */
210
211
Address = strtoul (Location, NULL, 16);
212
AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml,
213
WalkState->ParserState.AmlStart);
214
if (Address <= AmlOffset)
215
{
216
AcpiOsPrintf ("Breakpoint %X is beyond current address %X\n",
217
Address, AmlOffset);
218
}
219
220
/* Save breakpoint in current walk */
221
222
WalkState->UserBreakpoint = Address;
223
AcpiOsPrintf ("Breakpoint set at AML offset %X\n", Address);
224
}
225
226
227
/*******************************************************************************
228
*
229
* FUNCTION: AcpiDbSetMethodCallBreakpoint
230
*
231
* PARAMETERS: Op - Current Op (from parse walk)
232
*
233
* RETURN: None
234
*
235
* DESCRIPTION: Set a breakpoint in a control method at the specified
236
* AML offset
237
*
238
******************************************************************************/
239
240
void
241
AcpiDbSetMethodCallBreakpoint (
242
ACPI_PARSE_OBJECT *Op)
243
{
244
245
246
if (!Op)
247
{
248
AcpiOsPrintf ("There is no method currently executing\n");
249
return;
250
}
251
252
AcpiGbl_StepToNextCall = TRUE;
253
}
254
255
256
/*******************************************************************************
257
*
258
* FUNCTION: AcpiDbSetMethodData
259
*
260
* PARAMETERS: TypeArg - L for local, A for argument
261
* IndexArg - which one
262
* ValueArg - Value to set.
263
*
264
* RETURN: None
265
*
266
* DESCRIPTION: Set a local or argument for the running control method.
267
* NOTE: only object supported is Number.
268
*
269
******************************************************************************/
270
271
void
272
AcpiDbSetMethodData (
273
char *TypeArg,
274
char *IndexArg,
275
char *ValueArg)
276
{
277
char Type;
278
UINT32 Index;
279
UINT32 Value;
280
ACPI_WALK_STATE *WalkState;
281
ACPI_OPERAND_OBJECT *ObjDesc;
282
ACPI_STATUS Status;
283
ACPI_NAMESPACE_NODE *Node;
284
285
286
/* Validate TypeArg */
287
288
AcpiUtStrupr (TypeArg);
289
Type = TypeArg[0];
290
if ((Type != 'L') &&
291
(Type != 'A') &&
292
(Type != 'N'))
293
{
294
AcpiOsPrintf ("Invalid SET operand: %s\n", TypeArg);
295
return;
296
}
297
298
Value = strtoul (ValueArg, NULL, 16);
299
300
if (Type == 'N')
301
{
302
Node = AcpiDbConvertToNode (IndexArg);
303
if (!Node)
304
{
305
return;
306
}
307
308
if (Node->Type != ACPI_TYPE_INTEGER)
309
{
310
AcpiOsPrintf ("Can only set Integer nodes\n");
311
return;
312
}
313
ObjDesc = Node->Object;
314
ObjDesc->Integer.Value = Value;
315
return;
316
}
317
318
/* Get the index and value */
319
320
Index = strtoul (IndexArg, NULL, 16);
321
322
WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
323
if (!WalkState)
324
{
325
AcpiOsPrintf ("There is no method currently executing\n");
326
return;
327
}
328
329
/* Create and initialize the new object */
330
331
ObjDesc = AcpiUtCreateIntegerObject ((UINT64) Value);
332
if (!ObjDesc)
333
{
334
AcpiOsPrintf ("Could not create an internal object\n");
335
return;
336
}
337
338
/* Store the new object into the target */
339
340
switch (Type)
341
{
342
case 'A':
343
344
/* Set a method argument */
345
346
if (Index > ACPI_METHOD_MAX_ARG)
347
{
348
AcpiOsPrintf ("Arg%u - Invalid argument name\n",
349
Index);
350
goto Cleanup;
351
}
352
353
Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_ARG,
354
Index, ObjDesc, WalkState);
355
if (ACPI_FAILURE (Status))
356
{
357
goto Cleanup;
358
}
359
360
ObjDesc = WalkState->Arguments[Index].Object;
361
362
AcpiOsPrintf ("Arg%u: ", Index);
363
AcpiDbDisplayInternalObject (ObjDesc, WalkState);
364
break;
365
366
case 'L':
367
368
/* Set a method local */
369
370
if (Index > ACPI_METHOD_MAX_LOCAL)
371
{
372
AcpiOsPrintf ("Local%u - Invalid local variable name\n",
373
Index);
374
goto Cleanup;
375
}
376
377
Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_LOCAL,
378
Index, ObjDesc, WalkState);
379
if (ACPI_FAILURE (Status))
380
{
381
goto Cleanup;
382
}
383
384
ObjDesc = WalkState->LocalVariables[Index].Object;
385
386
AcpiOsPrintf ("Local%u: ", Index);
387
AcpiDbDisplayInternalObject (ObjDesc, WalkState);
388
break;
389
390
default:
391
392
break;
393
}
394
395
Cleanup:
396
AcpiUtRemoveReference (ObjDesc);
397
}
398
399
400
#ifdef ACPI_DISASSEMBLER
401
/*******************************************************************************
402
*
403
* FUNCTION: AcpiDbDisassembleAml
404
*
405
* PARAMETERS: Statements - Number of statements to disassemble
406
* Op - Current Op (from parse walk)
407
*
408
* RETURN: None
409
*
410
* DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
411
* of statements specified.
412
*
413
******************************************************************************/
414
415
void
416
AcpiDbDisassembleAml (
417
char *Statements,
418
ACPI_PARSE_OBJECT *Op)
419
{
420
UINT32 NumStatements = 8;
421
422
423
if (!Op)
424
{
425
AcpiOsPrintf ("There is no method currently executing\n");
426
return;
427
}
428
429
if (Statements)
430
{
431
NumStatements = strtoul (Statements, NULL, 0);
432
}
433
434
AcpiDmDisassemble (NULL, Op, NumStatements);
435
}
436
437
438
/*******************************************************************************
439
*
440
* FUNCTION: AcpiDbDisassembleMethod
441
*
442
* PARAMETERS: Name - Name of control method
443
*
444
* RETURN: None
445
*
446
* DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
447
* of statements specified.
448
*
449
******************************************************************************/
450
451
ACPI_STATUS
452
AcpiDbDisassembleMethod (
453
char *Name)
454
{
455
ACPI_STATUS Status;
456
ACPI_PARSE_OBJECT *Op;
457
ACPI_WALK_STATE *WalkState;
458
ACPI_OPERAND_OBJECT *ObjDesc;
459
ACPI_NAMESPACE_NODE *Method;
460
461
462
Method = AcpiDbConvertToNode (Name);
463
if (!Method)
464
{
465
return (AE_BAD_PARAMETER);
466
}
467
468
if (Method->Type != ACPI_TYPE_METHOD)
469
{
470
ACPI_ERROR ((AE_INFO, "%s (%s): Object must be a control method",
471
Name, AcpiUtGetTypeName (Method->Type)));
472
return (AE_BAD_PARAMETER);
473
}
474
475
ObjDesc = Method->Object;
476
477
Op = AcpiPsCreateScopeOp (ObjDesc->Method.AmlStart);
478
if (!Op)
479
{
480
return (AE_NO_MEMORY);
481
}
482
483
/* Create and initialize a new walk state */
484
485
WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
486
if (!WalkState)
487
{
488
return (AE_NO_MEMORY);
489
}
490
491
Status = AcpiDsInitAmlWalk (WalkState, Op, NULL,
492
ObjDesc->Method.AmlStart,
493
ObjDesc->Method.AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
494
if (ACPI_FAILURE (Status))
495
{
496
return (Status);
497
}
498
499
Status = AcpiUtAllocateOwnerId (&ObjDesc->Method.OwnerId);
500
if (ACPI_FAILURE(Status))
501
{
502
return (Status);
503
}
504
505
WalkState->OwnerId = ObjDesc->Method.OwnerId;
506
507
/* Push start scope on scope stack and make it current */
508
509
Status = AcpiDsScopeStackPush (Method,
510
Method->Type, WalkState);
511
if (ACPI_FAILURE (Status))
512
{
513
return (Status);
514
}
515
516
/* Parse the entire method AML including deferred operators */
517
518
WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
519
WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
520
521
Status = AcpiPsParseAml (WalkState);
522
if (ACPI_FAILURE(Status))
523
{
524
return (Status);
525
}
526
527
(void) AcpiDmParseDeferredOps (Op);
528
529
/* Now we can disassemble the method */
530
531
AcpiGbl_DmOpt_Verbose = FALSE;
532
AcpiDmDisassemble (NULL, Op, 0);
533
AcpiGbl_DmOpt_Verbose = TRUE;
534
535
AcpiPsDeleteParseTree (Op);
536
537
/* Method cleanup */
538
539
AcpiNsDeleteNamespaceSubtree (Method);
540
AcpiNsDeleteNamespaceByOwner (ObjDesc->Method.OwnerId);
541
AcpiUtReleaseOwnerId (&ObjDesc->Method.OwnerId);
542
return (AE_OK);
543
}
544
#endif
545
546
547
/*******************************************************************************
548
*
549
* FUNCTION: AcpiDbEvaluateObject
550
*
551
* PARAMETERS: Node - Namespace node for the object
552
*
553
* RETURN: Status
554
*
555
* DESCRIPTION: Main execution function for the Evaluate/Execute/All debugger
556
* commands.
557
*
558
******************************************************************************/
559
560
static ACPI_STATUS
561
AcpiDbEvaluateObject (
562
ACPI_NAMESPACE_NODE *Node)
563
{
564
char *Pathname;
565
UINT32 i;
566
ACPI_DEVICE_INFO *ObjInfo;
567
ACPI_OBJECT_LIST ParamObjects;
568
ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS];
569
ACPI_BUFFER ReturnObj;
570
ACPI_STATUS Status;
571
572
573
Pathname = AcpiNsGetExternalPathname (Node);
574
if (!Pathname)
575
{
576
return (AE_OK);
577
}
578
579
/* Get the object info for number of method parameters */
580
581
Status = AcpiGetObjectInfo (Node, &ObjInfo);
582
if (ACPI_FAILURE (Status))
583
{
584
ACPI_FREE (Pathname);
585
return (Status);
586
}
587
588
ParamObjects.Pointer = NULL;
589
ParamObjects.Count = 0;
590
591
if (ObjInfo->Type == ACPI_TYPE_METHOD)
592
{
593
/* Setup default parameters */
594
595
for (i = 0; i < ObjInfo->ParamCount; i++)
596
{
597
Params[i].Type = ACPI_TYPE_INTEGER;
598
Params[i].Integer.Value = 1;
599
}
600
601
ParamObjects.Pointer = Params;
602
ParamObjects.Count = ObjInfo->ParamCount;
603
}
604
605
ACPI_FREE (ObjInfo);
606
ReturnObj.Pointer = NULL;
607
ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
608
609
/* Do the actual method execution */
610
611
AcpiGbl_MethodExecuting = TRUE;
612
613
Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
614
AcpiGbl_MethodExecuting = FALSE;
615
616
AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
617
if (ReturnObj.Length)
618
{
619
AcpiOsPrintf ("Evaluation of %s returned object %p, "
620
"external buffer length %X\n",
621
Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length);
622
623
AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
624
AcpiOsPrintf ("\n");
625
}
626
627
ACPI_FREE (Pathname);
628
629
/* Ignore status from method execution */
630
631
return (AE_OK);
632
633
/* Update count, check if we have executed enough methods */
634
635
}
636
637
/*******************************************************************************
638
*
639
* FUNCTION: AcpiDbWalkForExecute
640
*
641
* PARAMETERS: Callback from WalkNamespace
642
*
643
* RETURN: Status
644
*
645
* DESCRIPTION: Batch execution function. Evaluates all "predefined" objects --
646
* the nameseg begins with an underscore.
647
*
648
******************************************************************************/
649
650
static ACPI_STATUS
651
AcpiDbWalkForExecute (
652
ACPI_HANDLE ObjHandle,
653
UINT32 NestingLevel,
654
void *Context,
655
void **ReturnValue)
656
{
657
ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
658
ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
659
ACPI_STATUS Status;
660
const ACPI_PREDEFINED_INFO *Predefined;
661
662
663
Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
664
if (!Predefined)
665
{
666
return (AE_OK);
667
}
668
669
if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
670
{
671
return (AE_OK);
672
}
673
674
AcpiDbEvaluateObject (Node);
675
676
/* Ignore status from object evaluation */
677
678
Status = AE_OK;
679
680
/* Update count, check if we have executed enough methods */
681
682
Info->Count++;
683
if (Info->Count >= Info->MaxCount)
684
{
685
Status = AE_CTRL_TERMINATE;
686
}
687
688
return (Status);
689
}
690
691
692
/*******************************************************************************
693
*
694
* FUNCTION: AcpiDbWalkForExecuteAll
695
*
696
* PARAMETERS: Callback from WalkNamespace
697
*
698
* RETURN: Status
699
*
700
* DESCRIPTION: Batch execution function. Evaluates all objects whose path ends
701
* with the nameseg "Info->NameSeg". Used for the "ALL" command.
702
*
703
******************************************************************************/
704
705
static ACPI_STATUS
706
AcpiDbWalkForExecuteAll (
707
ACPI_HANDLE ObjHandle,
708
UINT32 NestingLevel,
709
void *Context,
710
void **ReturnValue)
711
{
712
ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
713
ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
714
ACPI_STATUS Status;
715
716
717
if (!ACPI_COMPARE_NAMESEG (Node->Name.Ascii, Info->NameSeg))
718
{
719
return (AE_OK);
720
}
721
722
if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
723
{
724
return (AE_OK);
725
}
726
727
/* Now evaluate the input object (node) */
728
729
AcpiDbEvaluateObject (Node);
730
731
/* Ignore status from method execution */
732
733
Status = AE_OK;
734
735
/* Update count of executed methods/objects */
736
737
Info->Count++;
738
return (Status);
739
}
740
741
742
/*******************************************************************************
743
*
744
* FUNCTION: AcpiDbEvaluatePredefinedNames
745
*
746
* PARAMETERS: None
747
*
748
* RETURN: None
749
*
750
* DESCRIPTION: Namespace batch execution. Execute predefined names in the
751
* namespace, up to the max count, if specified.
752
*
753
******************************************************************************/
754
755
void
756
AcpiDbEvaluatePredefinedNames (
757
void)
758
{
759
ACPI_DB_EXECUTE_WALK Info;
760
761
762
Info.Count = 0;
763
Info.MaxCount = ACPI_UINT32_MAX;
764
765
/* Search all nodes in namespace */
766
767
(void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
768
AcpiDbWalkForExecute, NULL, (void *) &Info, NULL);
769
770
AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count);
771
}
772
773
774
/*******************************************************************************
775
*
776
* FUNCTION: AcpiDbEvaluateAll
777
*
778
* PARAMETERS: NoneAcpiGbl_DbMethodInfo
779
*
780
* RETURN: None
781
*
782
* DESCRIPTION: Namespace batch execution. Implements the "ALL" command.
783
* Execute all namepaths whose final nameseg matches the
784
* input nameseg.
785
*
786
******************************************************************************/
787
788
void
789
AcpiDbEvaluateAll (
790
char *NameSeg)
791
{
792
ACPI_DB_EXECUTE_WALK Info;
793
794
795
Info.Count = 0;
796
Info.MaxCount = ACPI_UINT32_MAX;
797
ACPI_COPY_NAMESEG (Info.NameSeg, NameSeg);
798
Info.NameSeg[ACPI_NAMESEG_SIZE] = 0;
799
800
/* Search all nodes in namespace */
801
802
(void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
803
AcpiDbWalkForExecuteAll, NULL, (void *) &Info, NULL);
804
805
AcpiOsPrintf ("Evaluated %u names in the namespace\n", Info.Count);
806
}
807
808