ReactOS  0.4.12-dev-418-g3df31a8
utpredef.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Module Name: utpredef - support functions for predefined names
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2019, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  * notice, this list of conditions, and the following disclaimer,
16  * without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  * substantially similar to the "NO WARRANTY" disclaimer below
19  * ("Disclaimer") and any redistribution must be conditioned upon
20  * including a substantially similar Disclaimer requirement for further
21  * binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  * of any contributors may be used to endorse or promote products derived
24  * from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acpredef.h"
47 
48 
49 #define _COMPONENT ACPI_UTILITIES
50  ACPI_MODULE_NAME ("utpredef")
51 
52 
53 /*
54  * Names for the types that can be returned by the predefined objects.
55  * Used for warning messages. Must be in the same order as the ACPI_RTYPEs
56  */
57 static const char *UtRtypeNames[] =
58 {
59  "/Integer",
60  "/String",
61  "/Buffer",
62  "/Package",
63  "/Reference",
64 };
65 
66 
67 /*******************************************************************************
68  *
69  * FUNCTION: AcpiUtGetNextPredefinedMethod
70  *
71  * PARAMETERS: ThisName - Entry in the predefined method/name table
72  *
73  * RETURN: Pointer to next entry in predefined table.
74  *
75  * DESCRIPTION: Get the next entry in the predefine method table. Handles the
76  * cases where a package info entry follows a method name that
77  * returns a package.
78  *
79  ******************************************************************************/
80 
83  const ACPI_PREDEFINED_INFO *ThisName)
84 {
85 
86  /*
87  * Skip next entry in the table if this name returns a Package
88  * (next entry contains the package info)
89  */
90  if ((ThisName->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE) &&
91  (ThisName->Info.ExpectedBtypes != ACPI_RTYPE_ALL))
92  {
93  ThisName++;
94  }
95 
96  ThisName++;
97  return (ThisName);
98 }
99 
100 
101 /*******************************************************************************
102  *
103  * FUNCTION: AcpiUtMatchPredefinedMethod
104  *
105  * PARAMETERS: Name - Name to find
106  *
107  * RETURN: Pointer to entry in predefined table. NULL indicates not found.
108  *
109  * DESCRIPTION: Check an object name against the predefined object list.
110  *
111  ******************************************************************************/
112 
113 const ACPI_PREDEFINED_INFO *
115  char *Name)
116 {
117  const ACPI_PREDEFINED_INFO *ThisName;
118 
119 
120  /* Quick check for a predefined name, first character must be underscore */
121 
122  if (Name[0] != '_')
123  {
124  return (NULL);
125  }
126 
127  /* Search info table for a predefined method/object name */
128 
129  ThisName = AcpiGbl_PredefinedMethods;
130  while (ThisName->Info.Name[0])
131  {
132  if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
133  {
134  return (ThisName);
135  }
136 
137  ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
138  }
139 
140  return (NULL); /* Not found */
141 }
142 
143 
144 /*******************************************************************************
145  *
146  * FUNCTION: AcpiUtGetExpectedReturnTypes
147  *
148  * PARAMETERS: Buffer - Where the formatted string is returned
149  * ExpectedBTypes - Bitfield of expected data types
150  *
151  * RETURN: Formatted string in Buffer.
152  *
153  * DESCRIPTION: Format the expected object types into a printable string.
154  *
155  ******************************************************************************/
156 
157 void
159  char *Buffer,
160  UINT32 ExpectedBtypes)
161 {
162  UINT32 ThisRtype;
163  UINT32 i;
164  UINT32 j;
165 
166 
167  if (!ExpectedBtypes)
168  {
169  strcpy (Buffer, "NONE");
170  return;
171  }
172 
173  j = 1;
174  Buffer[0] = 0;
175  ThisRtype = ACPI_RTYPE_INTEGER;
176 
177  for (i = 0; i < ACPI_NUM_RTYPES; i++)
178  {
179  /* If one of the expected types, concatenate the name of this type */
180 
181  if (ExpectedBtypes & ThisRtype)
182  {
183  strcat (Buffer, &UtRtypeNames[i][j]);
184  j = 0; /* Use name separator from now on */
185  }
186 
187  ThisRtype <<= 1; /* Next Rtype */
188  }
189 }
190 
191 
192 /*******************************************************************************
193  *
194  * The remaining functions are used by iASL and AcpiHelp only
195  *
196  ******************************************************************************/
197 
198 #if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP)
199 
200 /* Local prototypes */
201 
202 static UINT32
203 AcpiUtGetArgumentTypes (
204  char *Buffer,
205  UINT16 ArgumentTypes);
206 
207 
208 /* Types that can be returned externally by a predefined name */
209 
210 static const char *UtExternalTypeNames[] = /* Indexed by ACPI_TYPE_* */
211 {
212  ", UNSUPPORTED-TYPE",
213  ", Integer",
214  ", String",
215  ", Buffer",
216  ", Package"
217 };
218 
219 /* Bit widths for resource descriptor predefined names */
220 
221 static const char *UtResourceTypeNames[] =
222 {
223  "/1",
224  "/2",
225  "/3",
226  "/8",
227  "/16",
228  "/32",
229  "/64",
230  "/variable",
231 };
232 
233 
234 /*******************************************************************************
235  *
236  * FUNCTION: AcpiUtMatchResourceName
237  *
238  * PARAMETERS: Name - Name to find
239  *
240  * RETURN: Pointer to entry in the resource table. NULL indicates not
241  * found.
242  *
243  * DESCRIPTION: Check an object name against the predefined resource
244  * descriptor object list.
245  *
246  ******************************************************************************/
247 
248 const ACPI_PREDEFINED_INFO *
249 AcpiUtMatchResourceName (
250  char *Name)
251 {
252  const ACPI_PREDEFINED_INFO *ThisName;
253 
254 
255  /*
256  * Quick check for a predefined name, first character must
257  * be underscore
258  */
259  if (Name[0] != '_')
260  {
261  return (NULL);
262  }
263 
264  /* Search info table for a predefined method/object name */
265 
266  ThisName = AcpiGbl_ResourceNames;
267  while (ThisName->Info.Name[0])
268  {
269  if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
270  {
271  return (ThisName);
272  }
273 
274  ThisName++;
275  }
276 
277  return (NULL); /* Not found */
278 }
279 
280 
281 /*******************************************************************************
282  *
283  * FUNCTION: AcpiUtDisplayPredefinedMethod
284  *
285  * PARAMETERS: Buffer - Scratch buffer for this function
286  * ThisName - Entry in the predefined method/name table
287  * MultiLine - TRUE if output should be on >1 line
288  *
289  * RETURN: None
290  *
291  * DESCRIPTION: Display information about a predefined method. Number and
292  * type of the input arguments, and expected type(s) for the
293  * return value, if any.
294  *
295  ******************************************************************************/
296 
297 void
298 AcpiUtDisplayPredefinedMethod (
299  char *Buffer,
300  const ACPI_PREDEFINED_INFO *ThisName,
301  BOOLEAN MultiLine)
302 {
303  UINT32 ArgCount;
304 
305  /*
306  * Get the argument count and the string buffer
307  * containing all argument types
308  */
309  ArgCount = AcpiUtGetArgumentTypes (Buffer,
310  ThisName->Info.ArgumentList);
311 
312  if (MultiLine)
313  {
314  printf (" ");
315  }
316 
317  printf ("%4.4s Requires %s%u argument%s",
318  ThisName->Info.Name,
319  (ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM) ?
320  "(at least) " : "",
321  ArgCount, ArgCount != 1 ? "s" : "");
322 
323  /* Display the types for any arguments */
324 
325  if (ArgCount > 0)
326  {
327  printf (" (%s)", Buffer);
328  }
329 
330  if (MultiLine)
331  {
332  printf ("\n ");
333  }
334 
335  /* Get the return value type(s) allowed */
336 
337  if (ThisName->Info.ExpectedBtypes)
338  {
340  printf (" Return value types: %s\n", Buffer);
341  }
342  else
343  {
344  printf (" No return value\n");
345  }
346 }
347 
348 
349 /*******************************************************************************
350  *
351  * FUNCTION: AcpiUtGetArgumentTypes
352  *
353  * PARAMETERS: Buffer - Where to return the formatted types
354  * ArgumentTypes - Types field for this method
355  *
356  * RETURN: Count - the number of arguments required for this method
357  *
358  * DESCRIPTION: Format the required data types for this method (Integer,
359  * String, Buffer, or Package) and return the required argument
360  * count.
361  *
362  ******************************************************************************/
363 
364 static UINT32
365 AcpiUtGetArgumentTypes (
366  char *Buffer,
367  UINT16 ArgumentTypes)
368 {
369  UINT16 ThisArgumentType;
370  UINT16 SubIndex;
371  UINT16 ArgCount;
372  UINT32 i;
373 
374 
375  *Buffer = 0;
376  SubIndex = 2;
377 
378  /* First field in the types list is the count of args to follow */
379 
380  ArgCount = METHOD_GET_ARG_COUNT (ArgumentTypes);
381  if (ArgCount > METHOD_PREDEF_ARGS_MAX)
382  {
383  printf ("**** Invalid argument count (%u) "
384  "in predefined info structure\n", ArgCount);
385  return (ArgCount);
386  }
387 
388  /* Get each argument from the list, convert to ascii, store to buffer */
389 
390  for (i = 0; i < ArgCount; i++)
391  {
392  ThisArgumentType = METHOD_GET_NEXT_TYPE (ArgumentTypes);
393 
394  if (!ThisArgumentType || (ThisArgumentType > METHOD_MAX_ARG_TYPE))
395  {
396  printf ("**** Invalid argument type (%u) "
397  "in predefined info structure\n", ThisArgumentType);
398  return (ArgCount);
399  }
400 
401  strcat (Buffer, UtExternalTypeNames[ThisArgumentType] + SubIndex);
402  SubIndex = 0;
403  }
404 
405  return (ArgCount);
406 }
407 
408 
409 /*******************************************************************************
410  *
411  * FUNCTION: AcpiUtGetResourceBitWidth
412  *
413  * PARAMETERS: Buffer - Where the formatted string is returned
414  * Types - Bitfield of expected data types
415  *
416  * RETURN: Count of return types. Formatted string in Buffer.
417  *
418  * DESCRIPTION: Format the resource bit widths into a printable string.
419  *
420  ******************************************************************************/
421 
422 UINT32
423 AcpiUtGetResourceBitWidth (
424  char *Buffer,
425  UINT16 Types)
426 {
427  UINT32 i;
428  UINT16 SubIndex;
429  UINT32 Found;
430 
431 
432  *Buffer = 0;
433  SubIndex = 1;
434  Found = 0;
435 
436  for (i = 0; i < NUM_RESOURCE_WIDTHS; i++)
437  {
438  if (Types & 1)
439  {
440  strcat (Buffer, &(UtResourceTypeNames[i][SubIndex]));
441  SubIndex = 0;
442  Found++;
443  }
444 
445  Types >>= 1;
446  }
447 
448  return (Found);
449 }
450 #endif
#define NUM_RESOURCE_WIDTHS
Definition: acpredef.h:174
#define ACPI_RTYPE_INTEGER
Definition: aclocal.h:478
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define METHOD_GET_ARG_COUNT(ArgList)
Definition: acpredef.h:147
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 int UINT32
#define ACPI_MODULE_NAME(Name)
Definition: acoutput.h:216
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
return Found
Definition: dirsup.c:1270
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 GLint GLint j
Definition: glfuncs.h:250
const ACPI_PREDEFINED_INFO AcpiGbl_PredefinedMethods[]
#define ACPI_NUM_RTYPES
Definition: aclocal.h:485
char Name[ACPI_NAME_SIZE]
Definition: aclocal.h:375
UINT8 ExpectedBtypes
Definition: aclocal.h:377
#define ARG_COUNT_IS_MINIMUM
Definition: acpredef.h:144
const ACPI_PREDEFINED_INFO AcpiGbl_ResourceNames[]
const ACPI_PREDEFINED_INFO * AcpiUtMatchPredefinedMethod(char *Name)
Definition: utpredef.c:114
#define METHOD_PREDEF_ARGS_MAX
Definition: acpredef.h:141
char ACPI_OBJECT_TYPE * Types
Definition: acdebug.h:342
unsigned short UINT16
UINT16 ArgumentList
Definition: aclocal.h:376
#define ACPI_RTYPE_ALL
Definition: aclocal.h:483
void AcpiUtGetExpectedReturnTypes(char *Buffer, UINT32 ExpectedBtypes)
Definition: utpredef.c:158
const ACPI_PREDEFINED_INFO * AcpiUtGetNextPredefinedMethod(const ACPI_PREDEFINED_INFO *ThisName)
Definition: utpredef.c:82
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define const
Definition: zconf.h:230
#define METHOD_GET_NEXT_TYPE(ArgList)
Definition: acpredef.h:148
static const char * UtRtypeNames[]
Definition: utpredef.c:57
#define METHOD_MAX_ARG_TYPE
Definition: acpredef.h:145
#define ACPI_RTYPE_PACKAGE
Definition: aclocal.h:481
#define ACPI_COMPARE_NAME(a, b)
Definition: actypes.h:561
ACPI_NAME_INFO Info
Definition: aclocal.h:441
#define printf
Definition: config.h:203