Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/compiler/aslexternal.c
48373 views
1
/******************************************************************************
2
*
3
* Module Name: aslexternal - ASL External opcode compiler support
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/compiler/aslcompiler.h>
153
#include "aslcompiler.y.h"
154
#include <contrib/dev/acpica/include/acparser.h>
155
#include <contrib/dev/acpica/include/amlcode.h>
156
#include <contrib/dev/acpica/include/acnamesp.h>
157
158
159
#define _COMPONENT ACPI_COMPILER
160
ACPI_MODULE_NAME ("aslexternal")
161
162
163
/* Local prototypes */
164
165
static void
166
ExInsertArgCount (
167
ACPI_PARSE_OBJECT *Op);
168
169
static void
170
ExMoveExternals (
171
ACPI_PARSE_OBJECT *DefinitionBlockOp);
172
173
174
/*******************************************************************************
175
*
176
* FUNCTION: ExDoExternal
177
*
178
* PARAMETERS: Op - Current Parse node
179
*
180
* RETURN: None
181
*
182
* DESCRIPTION: Add an External() definition to the global list. This list
183
* is used to generate External opcodes.
184
*
185
******************************************************************************/
186
187
void
188
ExDoExternal (
189
ACPI_PARSE_OBJECT *Op)
190
{
191
ACPI_PARSE_OBJECT *ListOp;
192
ACPI_PARSE_OBJECT *Prev;
193
ACPI_PARSE_OBJECT *Next;
194
ACPI_PARSE_OBJECT *ArgCountOp;
195
ACPI_PARSE_OBJECT *TypeOp;
196
ACPI_PARSE_OBJECT *ExternTypeOp = Op->Asl.Child->Asl.Next;
197
UINT32 ExternType;
198
UINT8 ParamCount = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
199
UINT32 ParamTypes[ACPI_METHOD_NUM_ARGS];
200
201
202
ExternType = AnMapObjTypeToBtype (ExternTypeOp);
203
if (ExternType != ACPI_BTYPE_METHOD)
204
{
205
/*
206
* If this is not a method, it has zero parameters this local variable
207
* is used only for methods
208
*/
209
ParamCount = 0;
210
}
211
212
/*
213
* The parser allows optional parameter return types regardless of the
214
* type. Check object type keyword emit error if optional parameter/return
215
* types exist.
216
*
217
* Check the parameter return type
218
*/
219
TypeOp = ExternTypeOp->Asl.Next;
220
if (TypeOp->Asl.Child)
221
{
222
/* Ignore the return type for now. */
223
224
(void) MtProcessTypeOp (TypeOp->Asl.Child);
225
if (ExternType != ACPI_BTYPE_METHOD)
226
{
227
sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
228
AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_RET_TYPE, TypeOp,
229
AslGbl_MsgBuffer);
230
}
231
}
232
233
/* Check the parameter types */
234
235
TypeOp = TypeOp->Asl.Next;
236
if (TypeOp->Asl.Child)
237
{
238
ParamCount = MtProcessParameterTypeList (TypeOp->Asl.Child, ParamTypes);
239
if (ExternType != ACPI_BTYPE_METHOD)
240
{
241
sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
242
AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_PARAM_TYPE, TypeOp,
243
AslGbl_MsgBuffer);
244
}
245
}
246
247
ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
248
ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
249
ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
250
ArgCountOp->Asl.Value.Integer = ParamCount;
251
UtSetParseOpName (ArgCountOp);
252
253
/* Create new list node of arbitrary type */
254
255
ListOp = TrAllocateOp (PARSEOP_DEFAULT_ARG);
256
257
/* Store External node as child */
258
259
ListOp->Asl.Child = Op;
260
ListOp->Asl.Next = NULL;
261
262
if (AslGbl_ExternalsListHead)
263
{
264
/* Link new External to end of list */
265
266
Prev = AslGbl_ExternalsListHead;
267
Next = Prev;
268
while (Next)
269
{
270
Prev = Next;
271
Next = Next->Asl.Next;
272
}
273
274
Prev->Asl.Next = ListOp;
275
}
276
else
277
{
278
AslGbl_ExternalsListHead = ListOp;
279
}
280
}
281
282
283
/*******************************************************************************
284
*
285
* FUNCTION: ExInsertArgCount
286
*
287
* PARAMETERS: Op - Op for a method invocation
288
*
289
* RETURN: None
290
*
291
* DESCRIPTION: Obtain the number of arguments for a control method -- from
292
* the actual invocation.
293
*
294
******************************************************************************/
295
296
static void
297
ExInsertArgCount (
298
ACPI_PARSE_OBJECT *Op)
299
{
300
ACPI_PARSE_OBJECT *Next;
301
ACPI_PARSE_OBJECT *NameOp;
302
ACPI_PARSE_OBJECT *Child;
303
ACPI_PARSE_OBJECT *ArgCountOp;
304
char * ExternalName;
305
char * CallName;
306
UINT16 ArgCount = 0;
307
ACPI_STATUS Status;
308
309
310
CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
311
312
Next = AslGbl_ExternalsListHead;
313
while (Next)
314
{
315
ArgCount = 0;
316
317
/* Skip if External node already handled */
318
319
if (Next->Asl.Child->Asl.CompileFlags & OP_VISITED)
320
{
321
Next = Next->Asl.Next;
322
continue;
323
}
324
325
NameOp = Next->Asl.Child->Asl.Child;
326
ExternalName = AcpiNsGetNormalizedPathname (NameOp->Asl.Node, TRUE);
327
328
if (strcmp (CallName, ExternalName))
329
{
330
ACPI_FREE (ExternalName);
331
Next = Next->Asl.Next;
332
continue;
333
}
334
335
Next->Asl.Child->Asl.CompileFlags |= OP_VISITED;
336
337
/*
338
* Since we will reposition Externals to the Root, set Namepath
339
* to the fully qualified name and recalculate the aml length
340
*/
341
Status = UtInternalizeName (ExternalName,
342
&NameOp->Asl.Value.String);
343
344
ACPI_FREE (ExternalName);
345
if (ACPI_FAILURE (Status))
346
{
347
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
348
NULL, "- Could not Internalize External");
349
break;
350
}
351
352
NameOp->Asl.AmlLength = strlen (NameOp->Asl.Value.String);
353
354
/* Get argument count */
355
356
Child = Op->Asl.Child;
357
while (Child)
358
{
359
ArgCount++;
360
Child = Child->Asl.Next;
361
}
362
363
/* Setup ArgCount operand */
364
365
ArgCountOp = Next->Asl.Child->Asl.Child->Asl.Next->Asl.Next;
366
ArgCountOp->Asl.Value.Integer = ArgCount;
367
break;
368
}
369
370
ACPI_FREE (CallName);
371
}
372
373
374
/*******************************************************************************
375
*
376
* FUNCTION: ExAmlExternalWalkBegin
377
*
378
* PARAMETERS: ASL_WALK_CALLBACK
379
*
380
* RETURN: None
381
*
382
* DESCRIPTION: Parse tree walk to create external opcode list for methods.
383
*
384
******************************************************************************/
385
386
ACPI_STATUS
387
ExAmlExternalWalkBegin (
388
ACPI_PARSE_OBJECT *Op,
389
UINT32 Level,
390
void *Context)
391
{
392
393
/* External list head saved in the definition block op */
394
395
if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
396
{
397
AslGbl_ExternalsListHead = Op->Asl.Value.Arg;
398
}
399
400
if (!AslGbl_ExternalsListHead)
401
{
402
return (AE_OK);
403
}
404
405
if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
406
{
407
return (AE_OK);
408
}
409
410
/*
411
* The NameOp child under an ExternalOp gets turned into PARSE_METHODCALL
412
* by XfNamespaceLocateBegin(). Ignore these.
413
*/
414
if (Op->Asl.Parent &&
415
Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_EXTERNAL)
416
{
417
return (AE_OK);
418
}
419
420
ExInsertArgCount (Op);
421
return (AE_OK);
422
}
423
424
425
/*******************************************************************************
426
*
427
* FUNCTION: ExAmlExternalWalkEnd
428
*
429
* PARAMETERS: ASL_WALK_CALLBACK
430
*
431
* RETURN: None
432
*
433
* DESCRIPTION: Parse tree walk to create external opcode list for methods.
434
* Here, we just want to catch the case where a definition block
435
* has been completed. Then we move all of the externals into
436
* a single block in the parse tree and thus the AML code.
437
*
438
******************************************************************************/
439
440
ACPI_STATUS
441
ExAmlExternalWalkEnd (
442
ACPI_PARSE_OBJECT *Op,
443
UINT32 Level,
444
void *Context)
445
{
446
447
if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
448
{
449
/*
450
* Process any existing external list. (Support for
451
* multiple definition blocks in a single file/compile)
452
*/
453
ExMoveExternals (Op);
454
AslGbl_ExternalsListHead = NULL;
455
}
456
457
return (AE_OK);
458
}
459
460
461
/*******************************************************************************
462
*
463
* FUNCTION: ExMoveExternals
464
*
465
* PARAMETERS: DefinitionBlockOp - Op for current definition block
466
*
467
* RETURN: None
468
*
469
* DESCRIPTION: Move all externals present in the source file into a single
470
* block of AML code, surrounded by an "If (0)" to prevent
471
* AML interpreters from attempting to execute the External
472
* opcodes.
473
*
474
******************************************************************************/
475
476
static void
477
ExMoveExternals (
478
ACPI_PARSE_OBJECT *DefinitionBlockOp)
479
{
480
ACPI_PARSE_OBJECT *ParentOp;
481
ACPI_PARSE_OBJECT *ExternalOp;
482
ACPI_PARSE_OBJECT *PredicateOp;
483
ACPI_PARSE_OBJECT *NextOp;
484
ACPI_PARSE_OBJECT *Prev;
485
ACPI_PARSE_OBJECT *Next;
486
char *ExternalName;
487
ACPI_OBJECT_TYPE ObjType;
488
ACPI_STATUS Status;
489
UINT32 i;
490
491
492
if (!AslGbl_ExternalsListHead)
493
{
494
return;
495
}
496
497
/* Remove the External nodes from the tree */
498
499
NextOp = AslGbl_ExternalsListHead;
500
while (NextOp)
501
{
502
/*
503
* The External is stored in child pointer of each node in the
504
* list
505
*/
506
ExternalOp = NextOp->Asl.Child;
507
508
/* Get/set the fully qualified name */
509
510
ExternalName = AcpiNsGetNormalizedPathname (ExternalOp->Asl.Node, TRUE);
511
ExternalOp->Asl.ExternalName = ExternalName;
512
ExternalOp->Asl.Namepath = ExternalName;
513
514
/* Set line numbers (for listings, etc.) */
515
516
ExternalOp->Asl.LineNumber = 0;
517
ExternalOp->Asl.LogicalLineNumber = 0;
518
519
Next = ExternalOp->Asl.Child;
520
Next->Asl.LineNumber = 0;
521
Next->Asl.LogicalLineNumber = 0;
522
523
if (Next->Asl.ParseOpcode == PARSEOP_NAMESEG)
524
{
525
Next->Asl.ParseOpcode = PARSEOP_NAMESTRING;
526
}
527
528
Next->Asl.ExternalName = ExternalName;
529
Status = UtInternalizeName (ExternalName, &Next->Asl.Value.String);
530
if (ACPI_FAILURE (Status))
531
{
532
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
533
Next, "Could not internalize namestring");
534
return;
535
}
536
537
Next->Asl.AmlLength = strlen (Next->Asl.Value.String);
538
539
Next = Next->Asl.Next;
540
Next->Asl.LineNumber = 0;
541
Next->Asl.LogicalLineNumber = 0;
542
543
Next = Next->Asl.Next;
544
Next->Asl.LineNumber = 0;
545
Next->Asl.LogicalLineNumber = 0;
546
547
Next = Next->Asl.Next;
548
Next->Asl.LineNumber = 0;
549
Next->Asl.LogicalLineNumber = 0;
550
551
ParentOp = ExternalOp->Asl.Parent;
552
Prev = Next = ParentOp->Asl.Child;
553
554
/* Now find the External node's position in parse tree */
555
556
while (Next != ExternalOp)
557
{
558
Prev = Next;
559
Next = Next->Asl.Next;
560
}
561
562
/* Remove the External from the parse tree */
563
564
if (Prev == ExternalOp)
565
{
566
/* External was the first child node */
567
568
ParentOp->Asl.Child = ExternalOp->Asl.Next;
569
}
570
571
Prev->Asl.Next = ExternalOp->Asl.Next;
572
ExternalOp->Asl.Next = NULL;
573
ExternalOp->Asl.Parent = AslGbl_ExternalsListHead;
574
575
/* Point the External to the next in the list */
576
577
if (NextOp->Asl.Next)
578
{
579
ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child;
580
}
581
582
NextOp = NextOp->Asl.Next;
583
}
584
585
/*
586
* Loop again to remove MethodObj Externals for which
587
* a MethodCall was not found (dead external reference)
588
*/
589
Prev = AslGbl_ExternalsListHead->Asl.Child;
590
Next = Prev;
591
while (Next)
592
{
593
ObjType = (ACPI_OBJECT_TYPE)
594
Next->Asl.Child->Asl.Next->Asl.Value.Integer;
595
596
if (ObjType == ACPI_TYPE_METHOD &&
597
!(Next->Asl.CompileFlags & OP_VISITED))
598
{
599
if (Next == Prev)
600
{
601
AslGbl_ExternalsListHead->Asl.Child = Next->Asl.Next;
602
Next->Asl.Next = NULL;
603
Prev = AslGbl_ExternalsListHead->Asl.Child;
604
Next = Prev;
605
continue;
606
}
607
else
608
{
609
Prev->Asl.Next = Next->Asl.Next;
610
Next->Asl.Next = NULL;
611
Next = Prev->Asl.Next;
612
continue;
613
}
614
}
615
616
Prev = Next;
617
Next = Next->Asl.Next;
618
}
619
620
/* If list is now empty, don't bother to make If (0) block */
621
622
if (!AslGbl_ExternalsListHead->Asl.Child)
623
{
624
return;
625
}
626
627
/* Convert Gbl_ExternalsListHead parent to If(). */
628
629
AslGbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF;
630
AslGbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP;
631
AslGbl_ExternalsListHead->Asl.CompileFlags = OP_AML_PACKAGE;
632
UtSetParseOpName (AslGbl_ExternalsListHead);
633
634
/* Create a Zero op for the If predicate */
635
636
PredicateOp = TrAllocateOp (PARSEOP_ZERO);
637
PredicateOp->Asl.AmlOpcode = AML_ZERO_OP;
638
639
PredicateOp->Asl.Parent = AslGbl_ExternalsListHead;
640
PredicateOp->Asl.Child = NULL;
641
PredicateOp->Asl.Next = AslGbl_ExternalsListHead->Asl.Child;
642
AslGbl_ExternalsListHead->Asl.Child = PredicateOp;
643
644
/* Set line numbers (for listings, etc.) */
645
646
AslGbl_ExternalsListHead->Asl.LineNumber = 0;
647
AslGbl_ExternalsListHead->Asl.LogicalLineNumber = 0;
648
649
PredicateOp->Asl.LineNumber = 0;
650
PredicateOp->Asl.LogicalLineNumber = 0;
651
652
/* Insert block back in the list */
653
654
Prev = DefinitionBlockOp->Asl.Child;
655
Next = Prev;
656
657
/* Find last default arg */
658
659
for (i = 0; i < 6; i++)
660
{
661
Prev = Next;
662
Next = Prev->Asl.Next;
663
}
664
665
if (Next)
666
{
667
/* Definition Block is not empty */
668
669
AslGbl_ExternalsListHead->Asl.Next = Next;
670
}
671
else
672
{
673
/* Definition Block is empty. */
674
675
AslGbl_ExternalsListHead->Asl.Next = NULL;
676
}
677
678
Prev->Asl.Next = AslGbl_ExternalsListHead;
679
AslGbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent;
680
}
681
682