ReactOS  0.4.15-dev-509-g96a357b
exnames.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acinterp.h"
#include "amlcode.h"
Include dependency graph for exnames.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_EXECUTER
 

Functions

static charAcpiExAllocateNameString (UINT32 PrefixCount, UINT32 NumNameSegs)
 
static ACPI_STATUS AcpiExNameSegment (UINT8 **InAmlAddress, char *NameString)
 
ACPI_STATUS AcpiExGetNameString (ACPI_OBJECT_TYPE DataType, UINT8 *InAmlAddress, char **OutNameString, UINT32 *OutNameLength)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_EXECUTER

Definition at line 49 of file exnames.c.

Function Documentation

◆ AcpiExAllocateNameString()

static char * AcpiExAllocateNameString ( UINT32  PrefixCount,
UINT32  NumNameSegs 
)
static

Definition at line 82 of file exnames.c.

85 {
86  char *TempPtr;
87  char *NameString;
88  UINT32 SizeNeeded;
89 
90  ACPI_FUNCTION_TRACE (ExAllocateNameString);
91 
92 
93  /*
94  * Allow room for all \ and ^ prefixes, all segments and a MultiNamePrefix.
95  * Also, one byte for the null terminator.
96  * This may actually be somewhat longer than needed.
97  */
98  if (PrefixCount == ACPI_UINT32_MAX)
99  {
100  /* Special case for root */
101 
102  SizeNeeded = 1 + (ACPI_NAMESEG_SIZE * NumNameSegs) + 2 + 1;
103  }
104  else
105  {
106  SizeNeeded = PrefixCount + (ACPI_NAMESEG_SIZE * NumNameSegs) + 2 + 1;
107  }
108 
109  /*
110  * Allocate a buffer for the name.
111  * This buffer must be deleted by the caller!
112  */
113  NameString = ACPI_ALLOCATE (SizeNeeded);
114  if (!NameString)
115  {
117  "Could not allocate size %u", SizeNeeded));
118  return_PTR (NULL);
119  }
120 
121  TempPtr = NameString;
122 
123  /* Set up Root or Parent prefixes if needed */
124 
125  if (PrefixCount == ACPI_UINT32_MAX)
126  {
127  *TempPtr++ = AML_ROOT_PREFIX;
128  }
129  else
130  {
131  while (PrefixCount--)
132  {
133  *TempPtr++ = AML_PARENT_PREFIX;
134  }
135  }
136 
137 
138  /* Set up Dual or Multi prefixes if needed */
139 
140  if (NumNameSegs > 2)
141  {
142  /* Set up multi prefixes */
143 
144  *TempPtr++ = AML_MULTI_NAME_PREFIX;
145  *TempPtr++ = (char) NumNameSegs;
146  }
147  else if (2 == NumNameSegs)
148  {
149  /* Set up dual prefixes */
150 
151  *TempPtr++ = AML_DUAL_NAME_PREFIX;
152  }
153 
154  /*
155  * Terminate string following prefixes. AcpiExNameSegment() will
156  * append the segment(s)
157  */
158  *TempPtr = 0;
159 
160  return_PTR (NameString);
161 }
#define return_PTR(s)
Definition: acoutput.h:497
#define ACPI_ALLOCATE(a)
Definition: actypes.h:384
unsigned int UINT32
#define AML_DUAL_NAME_PREFIX
Definition: amlcode.h:66
smooth NULL
Definition: ftsmooth.c:416
#define AE_INFO
Definition: acoutput.h:230
unsigned char
Definition: typeof.h:29
#define AML_PARENT_PREFIX
Definition: amlcode.h:70
#define ACPI_UINT32_MAX
Definition: actypes.h:66
#define AML_ROOT_PREFIX
Definition: amlcode.h:69
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AML_MULTI_NAME_PREFIX
Definition: amlcode.h:67
#define ACPI_NAMESEG_SIZE
Definition: actypes.h:415

Referenced by AcpiExGetNameString().

◆ AcpiExGetNameString()

ACPI_STATUS AcpiExGetNameString ( ACPI_OBJECT_TYPE  DataType,
UINT8 InAmlAddress,
char **  OutNameString,
UINT32 OutNameLength 
)

Definition at line 278 of file exnames.c.

283 {
285  UINT8 *AmlAddress = InAmlAddress;
286  char *NameString = NULL;
287  UINT32 NumSegments;
288  UINT32 PrefixCount = 0;
290 
291 
292  ACPI_FUNCTION_TRACE_PTR (ExGetNameString, AmlAddress);
293 
294 
298  {
299  /* Disallow prefixes for types associated with FieldUnit names */
300 
301  NameString = AcpiExAllocateNameString (0, 1);
302  if (!NameString)
303  {
305  }
306  else
307  {
308  Status = AcpiExNameSegment (&AmlAddress, NameString);
309  }
310  }
311  else
312  {
313  /*
314  * DataType is not a field name.
315  * Examine first character of name for root or parent prefix operators
316  */
317  switch (*AmlAddress)
318  {
319  case AML_ROOT_PREFIX:
320 
321  ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "RootPrefix(\\) at %p\n",
322  AmlAddress));
323 
324  /*
325  * Remember that we have a RootPrefix --
326  * see comment in AcpiExAllocateNameString()
327  */
328  AmlAddress++;
329  PrefixCount = ACPI_UINT32_MAX;
330  HasPrefix = TRUE;
331  break;
332 
333  case AML_PARENT_PREFIX:
334 
335  /* Increment past possibly multiple parent prefixes */
336 
337  do
338  {
339  ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "ParentPrefix (^) at %p\n",
340  AmlAddress));
341 
342  AmlAddress++;
343  PrefixCount++;
344 
345  } while (*AmlAddress == AML_PARENT_PREFIX);
346 
347  HasPrefix = TRUE;
348  break;
349 
350  default:
351 
352  /* Not a prefix character */
353 
354  break;
355  }
356 
357  /* Examine first character of name for name segment prefix operator */
358 
359  switch (*AmlAddress)
360  {
362 
363  ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "DualNamePrefix at %p\n",
364  AmlAddress));
365 
366  AmlAddress++;
367  NameString = AcpiExAllocateNameString (PrefixCount, 2);
368  if (!NameString)
369  {
371  break;
372  }
373 
374  /* Indicate that we processed a prefix */
375 
376  HasPrefix = TRUE;
377 
378  Status = AcpiExNameSegment (&AmlAddress, NameString);
379  if (ACPI_SUCCESS (Status))
380  {
381  Status = AcpiExNameSegment (&AmlAddress, NameString);
382  }
383  break;
384 
386 
387  ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n",
388  AmlAddress));
389 
390  /* Fetch count of segments remaining in name path */
391 
392  AmlAddress++;
393  NumSegments = *AmlAddress;
394 
395  NameString = AcpiExAllocateNameString (
396  PrefixCount, NumSegments);
397  if (!NameString)
398  {
400  break;
401  }
402 
403  /* Indicate that we processed a prefix */
404 
405  AmlAddress++;
406  HasPrefix = TRUE;
407 
408  while (NumSegments &&
409  (Status = AcpiExNameSegment (&AmlAddress, NameString)) ==
410  AE_OK)
411  {
412  NumSegments--;
413  }
414 
415  break;
416 
417  case 0:
418 
419  /* NullName valid as of 8-12-98 ASL/AML Grammar Update */
420 
421  if (PrefixCount == ACPI_UINT32_MAX)
422  {
424  "NameSeg is \"\\\" followed by NULL\n"));
425  }
426 
427  /* Consume the NULL byte */
428 
429  AmlAddress++;
430  NameString = AcpiExAllocateNameString (PrefixCount, 0);
431  if (!NameString)
432  {
434  break;
435  }
436 
437  break;
438 
439  default:
440 
441  /* Name segment string */
442 
443  NameString = AcpiExAllocateNameString (PrefixCount, 1);
444  if (!NameString)
445  {
447  break;
448  }
449 
450  Status = AcpiExNameSegment (&AmlAddress, NameString);
451  break;
452  }
453  }
454 
455  if (AE_CTRL_PENDING == Status && HasPrefix)
456  {
457  /* Ran out of segments after processing a prefix */
458 
460  "Malformed Name at %p", NameString));
462  }
463 
464  if (ACPI_FAILURE (Status))
465  {
466  if (NameString)
467  {
468  ACPI_FREE (NameString);
469  }
471  }
472 
473  *OutNameString = NameString;
474  *OutNameLength = (UINT32) (AmlAddress - InAmlAddress);
475 
477 }
#define ACPI_FREE(a)
Definition: actypes.h:386
#define TRUE
Definition: types.h:120
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
#define ACPI_DB_LOAD
Definition: acoutput.h:164
#define AE_NO_MEMORY
Definition: acexcep.h:112
#define AE_AML_BAD_NAME
Definition: acexcep.h:192
BOOLEAN HasPrefix(PIP_ADDRESS Address, PIP_ADDRESS Prefix, UINT Length)
Definition: interface.c:111
static char * AcpiExAllocateNameString(UINT32 PrefixCount, UINT32 NumNameSegs)
Definition: exnames.c:82
static ACPI_STATUS AcpiExNameSegment(UINT8 **InAmlAddress, char *NameString)
Definition: exnames.c:179
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_TYPE_LOCAL_INDEX_FIELD
Definition: actypes.h:710
#define AE_CTRL_PENDING
Definition: acexcep.h:225
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
unsigned int UINT32
#define AML_DUAL_NAME_PREFIX
Definition: amlcode.h:66
unsigned char BOOLEAN
#define AE_INFO
Definition: acoutput.h:230
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define AML_PARENT_PREFIX
Definition: amlcode.h:70
#define ACPI_UINT32_MAX
Definition: actypes.h:66
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define AML_ROOT_PREFIX
Definition: amlcode.h:69
#define ACPI_TYPE_LOCAL_REGION_FIELD
Definition: actypes.h:708
Status
Definition: gdiplustypes.h:24
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AML_MULTI_NAME_PREFIX
Definition: amlcode.h:67
#define ACPI_TYPE_LOCAL_BANK_FIELD
Definition: actypes.h:709
_In_ ULONG DataType
Definition: iotypes.h:790
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiDsCreateOperand().

◆ AcpiExNameSegment()

static ACPI_STATUS AcpiExNameSegment ( UINT8 **  InAmlAddress,
char NameString 
)
static

Definition at line 179 of file exnames.c.

182 {
183  char *AmlAddress = (void *) *InAmlAddress;
185  UINT32 Index;
186  char CharBuf[5];
187 
188 
189  ACPI_FUNCTION_TRACE (ExNameSegment);
190 
191 
192  /*
193  * If first character is a digit, then we know that we aren't looking
194  * at a valid name segment
195  */
196  CharBuf[0] = *AmlAddress;
197 
198  if ('0' <= CharBuf[0] && CharBuf[0] <= '9')
199  {
200  ACPI_ERROR ((AE_INFO, "Invalid leading digit: %c", CharBuf[0]));
202  }
203 
204  for (Index = 0;
205  (Index < ACPI_NAMESEG_SIZE) && (AcpiUtValidNameChar (*AmlAddress, 0));
206  Index++)
207  {
208  CharBuf[Index] = *AmlAddress++;
209  }
210 
211 
212  /* Valid name segment */
213 
214  if (Index == 4)
215  {
216  /* Found 4 valid characters */
217 
218  CharBuf[4] = '\0';
219 
220  if (NameString)
221  {
223  "Appending NameSeg %s\n", CharBuf));
224  strcat (NameString, CharBuf);
225  }
226  else
227  {
229  "No Name string - %s\n", CharBuf));
230  }
231  }
232  else if (Index == 0)
233  {
234  /*
235  * First character was not a valid name character,
236  * so we are looking at something other than a name.
237  */
239  "Leading character is not alpha: %02Xh (not a name)\n",
240  CharBuf[0]));
242  }
243  else
244  {
245  /*
246  * Segment started with one or more valid characters, but fewer than
247  * the required 4
248  */
251  "Bad character 0x%02x in name, at %p",
252  *AmlAddress, AmlAddress));
253  }
254 
255  *InAmlAddress = ACPI_CAST_PTR (UINT8, AmlAddress);
257 }
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define AE_AML_BAD_NAME
Definition: acexcep.h:192
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define AE_CTRL_PENDING
Definition: acexcep.h:225
unsigned int UINT32
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
Status
Definition: gdiplustypes.h:24
#define ACPI_DB_INFO
Definition: acoutput.h:153
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_DB_NAMES
Definition: acoutput.h:166
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
BOOLEAN AcpiUtValidNameChar(char Character, UINT32 Position)
Definition: utascii.c:102
#define ACPI_NAMESEG_SIZE
Definition: actypes.h:415
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiExGetNameString().