ReactOS  0.4.15-dev-5112-g22d8c0f
nsarguments.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
#include "acpredef.h"
Include dependency graph for nsarguments.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_NAMESPACE
 

Functions

void AcpiNsCheckArgumentTypes (ACPI_EVALUATE_INFO *Info)
 
void AcpiNsCheckAcpiCompliance (char *Pathname, ACPI_NAMESPACE_NODE *Node, const ACPI_PREDEFINED_INFO *Predefined)
 
void AcpiNsCheckArgumentCount (char *Pathname, ACPI_NAMESPACE_NODE *Node, UINT32 UserParamCount, const ACPI_PREDEFINED_INFO *Predefined)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_NAMESPACE

Definition at line 50 of file nsarguments.c.

Function Documentation

◆ AcpiNsCheckAcpiCompliance()

void AcpiNsCheckAcpiCompliance ( char Pathname,
ACPI_NAMESPACE_NODE Node,
const ACPI_PREDEFINED_INFO Predefined 
)

Definition at line 135 of file nsarguments.c.

139 {
140  UINT32 AmlParamCount;
141  UINT32 RequiredParamCount;
142 
143 
144  if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
145  {
146  return;
147  }
148 
149  /* Get the ACPI-required arg count from the predefined info table */
150 
151  RequiredParamCount =
152  METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList);
153 
154  /*
155  * If this object is not a control method, we can check if the ACPI
156  * spec requires that it be a method.
157  */
158  if (Node->Type != ACPI_TYPE_METHOD)
159  {
160  if (RequiredParamCount > 0)
161  {
162  /* Object requires args, must be implemented as a method */
163 
165  "Object (%s) must be a control method with %u arguments",
166  AcpiUtGetTypeName (Node->Type), RequiredParamCount));
167  }
168  else if (!RequiredParamCount && !Predefined->Info.ExpectedBtypes)
169  {
170  /* Object requires no args and no return value, must be a method */
171 
173  "Object (%s) must be a control method "
174  "with no arguments and no return value",
175  AcpiUtGetTypeName (Node->Type)));
176  }
177 
178  return;
179  }
180 
181  /*
182  * This is a control method.
183  * Check that the ASL/AML-defined parameter count for this method
184  * matches the ACPI-required parameter count
185  *
186  * Some methods are allowed to have a "minimum" number of args (_SCP)
187  * because their definition in ACPI has changed over time.
188  *
189  * Note: These are BIOS errors in the declaration of the object
190  */
191  AmlParamCount = Node->Object->Method.ParamCount;
192 
193  if (AmlParamCount < RequiredParamCount)
194  {
196  "Insufficient arguments - "
197  "ASL declared %u, ACPI requires %u",
198  AmlParamCount, RequiredParamCount));
199  }
200  else if ((AmlParamCount > RequiredParamCount) &&
201  !(Predefined->Info.ArgumentList & ARG_COUNT_IS_MINIMUM))
202  {
204  "Excess arguments - "
205  "ASL declared %u, ACPI requires %u",
206  AmlParamCount, RequiredParamCount));
207  }
208 }
#define ACPI_WARN_ALWAYS
Definition: acnamesp.h:87
#define ANOBJ_EVALUATED
Definition: aclocal.h:220
#define METHOD_GET_ARG_COUNT(ArgList)
Definition: acpredef.h:147
#define ACPI_BIOS_ERROR_PREDEFINED(plist)
Definition: acmacros.h:466
unsigned int UINT32
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_TYPE_METHOD
Definition: actypes.h:687
UINT8 ExpectedBtypes
Definition: aclocal.h:377
#define ARG_COUNT_IS_MINIMUM
Definition: acpredef.h:144
UINT16 ArgumentList
Definition: aclocal.h:376
const char * AcpiUtGetTypeName(ACPI_OBJECT_TYPE Type)
Definition: utdecode.c:250
ACPI_NAME_INFO Info
Definition: aclocal.h:441
Definition: dlist.c:348
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING Pathname
Definition: acpixf.h:700

Referenced by AcpiNsEvaluate().

◆ AcpiNsCheckArgumentCount()

void AcpiNsCheckArgumentCount ( char Pathname,
ACPI_NAMESPACE_NODE Node,
UINT32  UserParamCount,
const ACPI_PREDEFINED_INFO Predefined 
)

Definition at line 228 of file nsarguments.c.

233 {
234  UINT32 AmlParamCount;
235  UINT32 RequiredParamCount;
236 
237 
238  if (Node->Flags & ANOBJ_EVALUATED)
239  {
240  return;
241  }
242 
243  if (!Predefined)
244  {
245  /*
246  * Not a predefined name. Check the incoming user argument count
247  * against the count that is specified in the method/object.
248  */
249  if (Node->Type != ACPI_TYPE_METHOD)
250  {
251  if (UserParamCount)
252  {
254  "%u arguments were passed to a non-method ACPI object (%s)",
255  UserParamCount, AcpiUtGetTypeName (Node->Type)));
256  }
257 
258  return;
259  }
260 
261  /*
262  * This is a control method. Check the parameter count.
263  * We can only check the incoming argument count against the
264  * argument count declared for the method in the ASL/AML.
265  *
266  * Emit a message if too few or too many arguments have been passed
267  * by the caller.
268  *
269  * Note: Too many arguments will not cause the method to
270  * fail. However, the method will fail if there are too few
271  * arguments and the method attempts to use one of the missing ones.
272  */
273  AmlParamCount = Node->Object->Method.ParamCount;
274 
275  if (UserParamCount < AmlParamCount)
276  {
278  "Insufficient arguments - "
279  "Caller passed %u, method requires %u",
280  UserParamCount, AmlParamCount));
281  }
282  else if (UserParamCount > AmlParamCount)
283  {
285  "Excess arguments - "
286  "Caller passed %u, method requires %u",
287  UserParamCount, AmlParamCount));
288  }
289 
290  return;
291  }
292 
293  /*
294  * This is a predefined name. Validate the user-supplied parameter
295  * count against the ACPI specification. We don't validate against
296  * the method itself because what is important here is that the
297  * caller is in conformance with the spec. (The arg count for the
298  * method was checked against the ACPI spec earlier.)
299  *
300  * Some methods are allowed to have a "minimum" number of args (_SCP)
301  * because their definition in ACPI has changed over time.
302  */
303  RequiredParamCount =
304  METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList);
305 
306  if (UserParamCount < RequiredParamCount)
307  {
309  "Insufficient arguments - "
310  "Caller passed %u, ACPI requires %u",
311  UserParamCount, RequiredParamCount));
312  }
313  else if ((UserParamCount > RequiredParamCount) &&
314  !(Predefined->Info.ArgumentList & ARG_COUNT_IS_MINIMUM))
315  {
317  "Excess arguments - "
318  "Caller passed %u, ACPI requires %u",
319  UserParamCount, RequiredParamCount));
320  }
321 }
#define ACPI_WARN_ALWAYS
Definition: acnamesp.h:87
#define ANOBJ_EVALUATED
Definition: aclocal.h:220
#define METHOD_GET_ARG_COUNT(ArgList)
Definition: acpredef.h:147
unsigned int UINT32
#define ACPI_WARN_PREDEFINED(plist)
Definition: acmacros.h:464
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_TYPE_METHOD
Definition: actypes.h:687
#define ACPI_INFO_PREDEFINED(plist)
Definition: acmacros.h:465
#define ARG_COUNT_IS_MINIMUM
Definition: acpredef.h:144
UINT16 ArgumentList
Definition: aclocal.h:376
const char * AcpiUtGetTypeName(ACPI_OBJECT_TYPE Type)
Definition: utdecode.c:250
ACPI_NAME_INFO Info
Definition: aclocal.h:441
Definition: dlist.c:348
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING Pathname
Definition: acpixf.h:700

Referenced by AcpiNsEvaluate().

◆ AcpiNsCheckArgumentTypes()

void AcpiNsCheckArgumentTypes ( ACPI_EVALUATE_INFO Info)

Definition at line 68 of file nsarguments.c.

70 {
71  UINT16 ArgTypeList;
72  UINT8 ArgCount;
73  UINT8 ArgType;
74  UINT8 UserArgType;
75  UINT32 i;
76 
77 
78  /*
79  * If not a predefined name, cannot typecheck args, because
80  * we have no idea what argument types are expected.
81  * Also, ignore typecheck if warnings/errors if this method
82  * has already been evaluated at least once -- in order
83  * to suppress repetitive messages.
84  */
85  if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
86  {
87  return;
88  }
89 
90  ArgTypeList = Info->Predefined->Info.ArgumentList;
91  ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList);
92 
93  /* Typecheck all arguments */
94 
95  for (i = 0; ((i < ArgCount) && (i < Info->ParamCount)); i++)
96  {
97  ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
98  UserArgType = Info->Parameters[i]->Common.Type;
99 
100  /* No typechecking for ACPI_TYPE_ANY */
101 
102  if ((UserArgType != ArgType) && (ArgType != ACPI_TYPE_ANY))
103  {
105  "Argument #%u type mismatch - "
106  "Found [%s], ACPI requires [%s]", (i + 1),
107  AcpiUtGetTypeName (UserArgType),
108  AcpiUtGetTypeName (ArgType)));
109 
110  /* Prevent any additional typechecking for this method */
111 
112  Info->Node->Flags |= ANOBJ_EVALUATED;
113  }
114  }
115 }
#define ACPI_WARN_ALWAYS
Definition: acnamesp.h:87
#define ANOBJ_EVALUATED
Definition: aclocal.h:220
#define METHOD_GET_ARG_COUNT(ArgList)
Definition: acpredef.h:147
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
unsigned int UINT32
#define ACPI_WARN_PREDEFINED(plist)
Definition: acmacros.h:464
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_TYPE_ANY
Definition: actypes.h:679
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned short UINT16
const char * AcpiUtGetTypeName(ACPI_OBJECT_TYPE Type)
Definition: utdecode.c:250
#define METHOD_GET_NEXT_TYPE(ArgList)
Definition: acpredef.h:148
unsigned char UINT8

Referenced by AcpiNsEvaluate().