Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/components/namespace/nspredef.c
48524 views
1
/******************************************************************************
2
*
3
* Module Name: nspredef - Validation of ACPI predefined methods and objects
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
#define ACPI_CREATE_PREDEFINED_TABLE
153
154
#include <contrib/dev/acpica/include/acpi.h>
155
#include <contrib/dev/acpica/include/accommon.h>
156
#include <contrib/dev/acpica/include/acnamesp.h>
157
#include <contrib/dev/acpica/include/acpredef.h>
158
159
160
#define _COMPONENT ACPI_NAMESPACE
161
ACPI_MODULE_NAME ("nspredef")
162
163
164
/*******************************************************************************
165
*
166
* This module validates predefined ACPI objects that appear in the namespace,
167
* at the time they are evaluated (via AcpiEvaluateObject). The purpose of this
168
* validation is to detect problems with BIOS-exposed predefined ACPI objects
169
* before the results are returned to the ACPI-related drivers.
170
*
171
* There are several areas that are validated:
172
*
173
* 1) The number of input arguments as defined by the method/object in the
174
* ASL is validated against the ACPI specification.
175
* 2) The type of the return object (if any) is validated against the ACPI
176
* specification.
177
* 3) For returned package objects, the count of package elements is
178
* validated, as well as the type of each package element. Nested
179
* packages are supported.
180
*
181
* For any problems found, a warning message is issued.
182
*
183
******************************************************************************/
184
185
186
/* Local prototypes */
187
188
static ACPI_STATUS
189
AcpiNsCheckReference (
190
ACPI_EVALUATE_INFO *Info,
191
ACPI_OPERAND_OBJECT *ReturnObject);
192
193
static UINT32
194
AcpiNsGetBitmappedType (
195
ACPI_OPERAND_OBJECT *ReturnObject);
196
197
198
/*******************************************************************************
199
*
200
* FUNCTION: AcpiNsCheckReturnValue
201
*
202
* PARAMETERS: Node - Namespace node for the method/object
203
* Info - Method execution information block
204
* UserParamCount - Number of parameters actually passed
205
* ReturnStatus - Status from the object evaluation
206
* ReturnObjectPtr - Pointer to the object returned from the
207
* evaluation of a method or object
208
*
209
* RETURN: Status
210
*
211
* DESCRIPTION: Check the value returned from a predefined name.
212
*
213
******************************************************************************/
214
215
ACPI_STATUS
216
AcpiNsCheckReturnValue (
217
ACPI_NAMESPACE_NODE *Node,
218
ACPI_EVALUATE_INFO *Info,
219
UINT32 UserParamCount,
220
ACPI_STATUS ReturnStatus,
221
ACPI_OPERAND_OBJECT **ReturnObjectPtr)
222
{
223
ACPI_STATUS Status;
224
const ACPI_PREDEFINED_INFO *Predefined;
225
226
ACPI_FUNCTION_TRACE (NsCheckReturnValue);
227
228
/* If not a predefined name, we cannot validate the return object */
229
230
Predefined = Info->Predefined;
231
if (!Predefined)
232
{
233
return_ACPI_STATUS (AE_OK);
234
}
235
236
/*
237
* If the method failed or did not actually return an object, we cannot
238
* validate the return object
239
*/
240
if ((ReturnStatus != AE_OK) &&
241
(ReturnStatus != AE_CTRL_RETURN_VALUE))
242
{
243
return_ACPI_STATUS (AE_OK);
244
}
245
246
/*
247
* Return value validation and possible repair.
248
*
249
* 1) Don't perform return value validation/repair if this feature
250
* has been disabled via a global option.
251
*
252
* 2) We have a return value, but if one wasn't expected, just exit,
253
* this is not a problem. For example, if the "Implicit Return"
254
* feature is enabled, methods will always return a value.
255
*
256
* 3) If the return value can be of any type, then we cannot perform
257
* any validation, just exit.
258
*/
259
if (AcpiGbl_DisableAutoRepair ||
260
(!Predefined->Info.ExpectedBtypes) ||
261
(Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL))
262
{
263
return_ACPI_STATUS (AE_OK);
264
}
265
266
/*
267
* Check that the type of the main return object is what is expected
268
* for this predefined name
269
*/
270
Status = AcpiNsCheckObjectType (Info, ReturnObjectPtr,
271
Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
272
if (ACPI_FAILURE (Status))
273
{
274
goto Exit;
275
}
276
277
/*
278
*
279
* 4) If there is no return value and it is optional, just return
280
* AE_OK (_WAK).
281
*/
282
if (!(*ReturnObjectPtr))
283
{
284
goto Exit;
285
}
286
287
/*
288
* For returned Package objects, check the type of all sub-objects.
289
* Note: Package may have been newly created by call above.
290
*/
291
if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE)
292
{
293
Info->ParentPackage = *ReturnObjectPtr;
294
Status = AcpiNsCheckPackage (Info, ReturnObjectPtr);
295
if (ACPI_FAILURE (Status))
296
{
297
/* We might be able to fix some errors */
298
299
if ((Status != AE_AML_OPERAND_TYPE) &&
300
(Status != AE_AML_OPERAND_VALUE))
301
{
302
goto Exit;
303
}
304
}
305
}
306
307
/*
308
* The return object was OK, or it was successfully repaired above.
309
* Now make some additional checks such as verifying that package
310
* objects are sorted correctly (if required) or buffer objects have
311
* the correct data width (bytes vs. dwords). These repairs are
312
* performed on a per-name basis, i.e., the code is specific to
313
* particular predefined names.
314
*/
315
Status = AcpiNsComplexRepairs (Info, Node, Status, ReturnObjectPtr);
316
317
Exit:
318
/*
319
* If the object validation failed or if we successfully repaired one
320
* or more objects, mark the parent node to suppress further warning
321
* messages during the next evaluation of the same method/object.
322
*/
323
if (ACPI_FAILURE (Status) ||
324
(Info->ReturnFlags & ACPI_OBJECT_REPAIRED))
325
{
326
Node->Flags |= ANOBJ_EVALUATED;
327
}
328
329
return_ACPI_STATUS (Status);
330
}
331
332
333
/*******************************************************************************
334
*
335
* FUNCTION: AcpiNsCheckObjectType
336
*
337
* PARAMETERS: Info - Method execution information block
338
* ReturnObjectPtr - Pointer to the object returned from the
339
* evaluation of a method or object
340
* ExpectedBtypes - Bitmap of expected return type(s)
341
* PackageIndex - Index of object within parent package (if
342
* applicable - ACPI_NOT_PACKAGE_ELEMENT
343
* otherwise)
344
*
345
* RETURN: Status
346
*
347
* DESCRIPTION: Check the type of the return object against the expected object
348
* type(s). Use of Btype allows multiple expected object types.
349
*
350
******************************************************************************/
351
352
ACPI_STATUS
353
AcpiNsCheckObjectType (
354
ACPI_EVALUATE_INFO *Info,
355
ACPI_OPERAND_OBJECT **ReturnObjectPtr,
356
UINT32 ExpectedBtypes,
357
UINT32 PackageIndex)
358
{
359
ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
360
ACPI_STATUS Status = AE_OK;
361
char TypeBuffer[96]; /* Room for 10 types */
362
363
364
/* A Namespace node should not get here, but make sure */
365
366
if (ReturnObject &&
367
ACPI_GET_DESCRIPTOR_TYPE (ReturnObject) == ACPI_DESC_TYPE_NAMED)
368
{
369
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
370
"Invalid return type - Found a Namespace node [%4.4s] type %s",
371
ReturnObject->Node.Name.Ascii,
372
AcpiUtGetTypeName (ReturnObject->Node.Type)));
373
return (AE_AML_OPERAND_TYPE);
374
}
375
376
/*
377
* Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type.
378
* The bitmapped type allows multiple possible return types.
379
*
380
* Note, the cases below must handle all of the possible types returned
381
* from all of the predefined names (including elements of returned
382
* packages)
383
*/
384
Info->ReturnBtype = AcpiNsGetBitmappedType (ReturnObject);
385
if (Info->ReturnBtype == ACPI_RTYPE_ANY)
386
{
387
/* Not one of the supported objects, must be incorrect */
388
goto TypeErrorExit;
389
}
390
391
/* For reference objects, check that the reference type is correct */
392
393
if ((Info->ReturnBtype & ExpectedBtypes) == ACPI_RTYPE_REFERENCE)
394
{
395
Status = AcpiNsCheckReference (Info, ReturnObject);
396
return (Status);
397
}
398
399
/* Attempt simple repair of the returned object if necessary */
400
401
Status = AcpiNsSimpleRepair (Info, ExpectedBtypes,
402
PackageIndex, ReturnObjectPtr);
403
if (ACPI_SUCCESS (Status))
404
{
405
return (AE_OK); /* Successful repair */
406
}
407
408
409
TypeErrorExit:
410
411
/* Create a string with all expected types for this predefined object */
412
413
AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
414
415
if (!ReturnObject)
416
{
417
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
418
"Expected return object of type %s",
419
TypeBuffer));
420
}
421
else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
422
{
423
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
424
"Return type mismatch - found %s, expected %s",
425
AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer));
426
}
427
else
428
{
429
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
430
"Return Package type mismatch at index %u - "
431
"found %s, expected %s", PackageIndex,
432
AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer));
433
}
434
435
return (AE_AML_OPERAND_TYPE);
436
}
437
438
439
/*******************************************************************************
440
*
441
* FUNCTION: AcpiNsCheckReference
442
*
443
* PARAMETERS: Info - Method execution information block
444
* ReturnObject - Object returned from the evaluation of a
445
* method or object
446
*
447
* RETURN: Status
448
*
449
* DESCRIPTION: Check a returned reference object for the correct reference
450
* type. The only reference type that can be returned from a
451
* predefined method is a named reference. All others are invalid.
452
*
453
******************************************************************************/
454
455
static ACPI_STATUS
456
AcpiNsCheckReference (
457
ACPI_EVALUATE_INFO *Info,
458
ACPI_OPERAND_OBJECT *ReturnObject)
459
{
460
461
/*
462
* Check the reference object for the correct reference type (opcode).
463
* The only type of reference that can be converted to an ACPI_OBJECT is
464
* a reference to a named object (reference class: NAME)
465
*/
466
if (ReturnObject->Reference.Class == ACPI_REFCLASS_NAME)
467
{
468
return (AE_OK);
469
}
470
471
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
472
"Return type mismatch - unexpected reference object type [%s] %2.2X",
473
AcpiUtGetReferenceName (ReturnObject),
474
ReturnObject->Reference.Class));
475
476
return (AE_AML_OPERAND_TYPE);
477
}
478
479
480
/*******************************************************************************
481
*
482
* FUNCTION: AcpiNsGetBitmappedType
483
*
484
* PARAMETERS: ReturnObject - Object returned from method/obj evaluation
485
*
486
* RETURN: Object return type. ACPI_RTYPE_ANY indicates that the object
487
* type is not supported. ACPI_RTYPE_NONE indicates that no
488
* object was returned (ReturnObject is NULL).
489
*
490
* DESCRIPTION: Convert object type into a bitmapped object return type.
491
*
492
******************************************************************************/
493
494
static UINT32
495
AcpiNsGetBitmappedType (
496
ACPI_OPERAND_OBJECT *ReturnObject)
497
{
498
UINT32 ReturnBtype;
499
500
501
if (!ReturnObject)
502
{
503
return (ACPI_RTYPE_NONE);
504
}
505
506
/* Map ACPI_OBJECT_TYPE to internal bitmapped type */
507
508
switch (ReturnObject->Common.Type)
509
{
510
case ACPI_TYPE_INTEGER:
511
512
ReturnBtype = ACPI_RTYPE_INTEGER;
513
break;
514
515
case ACPI_TYPE_BUFFER:
516
517
ReturnBtype = ACPI_RTYPE_BUFFER;
518
break;
519
520
case ACPI_TYPE_STRING:
521
522
ReturnBtype = ACPI_RTYPE_STRING;
523
break;
524
525
case ACPI_TYPE_PACKAGE:
526
527
ReturnBtype = ACPI_RTYPE_PACKAGE;
528
break;
529
530
case ACPI_TYPE_LOCAL_REFERENCE:
531
532
ReturnBtype = ACPI_RTYPE_REFERENCE;
533
break;
534
535
default:
536
537
/* Not one of the supported objects, must be incorrect */
538
539
ReturnBtype = ACPI_RTYPE_ANY;
540
break;
541
}
542
543
return (ReturnBtype);
544
}
545
546