ReactOS 0.4.16-dev-1612-g0f4e223
utilities.c File Reference
Include dependency graph for utilities.c:

Go to the source code of this file.

Classes

struct  device_find_ctx
 

Macros

#define PNP_ID_LENGTH   8
 
#define CLS_REPR_SIZE   7
 
#define NODE_INFO_EVAL_ADD_ID(name)
 
#define NODE_INFO_COPY_ID(name, flag)
 

Enumerations

enum  char_type {
  CHAR_TYPE_CONTROL = 1 << 0 , CHAR_TYPE_SPACE = 1 << 1 , CHAR_TYPE_BLANK = 1 << 2 , CHAR_TYPE_PUNCTUATION = 1 << 3 ,
  CHAR_TYPE_LOWER = 1 << 4 , CHAR_TYPE_UPPER = 1 << 5 , CHAR_TYPE_DIGIT = 1 << 6 , CHAR_TYPE_HEX_DIGIT = 1 << 7 ,
  CHAR_TYPE_ALPHA = CHAR_TYPE_LOWER | CHAR_TYPE_UPPER , CHAR_TYPE_ALHEX = CHAR_TYPE_ALPHA | CHAR_TYPE_HEX_DIGIT , CHAR_TYPE_ALNUM = CHAR_TYPE_ALPHA | CHAR_TYPE_DIGIT
}
 

Functions

static uacpi_bool is_char (uacpi_char c, enum char_type type)
 
static uacpi_char to_lower (uacpi_char c)
 
static uacpi_bool peek_one (const uacpi_char **str, const uacpi_size *size, uacpi_char *out_char)
 
static uacpi_bool consume_one (const uacpi_char **str, uacpi_size *size, uacpi_char *out_char)
 
static uacpi_bool consume_if (const uacpi_char **str, uacpi_size *size, enum char_type type)
 
static uacpi_bool consume_if_equals (const uacpi_char **str, uacpi_size *size, uacpi_char c)
 
uacpi_status uacpi_string_to_integer (const uacpi_char *str, uacpi_size max_chars, enum uacpi_base base, uacpi_u64 *out_value)
 
static uacpi_bool is_valid_name_byte (uacpi_u8 c)
 
uacpi_bool uacpi_is_valid_nameseg (uacpi_u8 *nameseg)
 
void uacpi_eisa_id_to_string (uacpi_u32 id, uacpi_char *out_string)
 
uacpi_status uacpi_eval_hid (uacpi_namespace_node *node, uacpi_id_string **out_id)
 
void uacpi_free_id_string (uacpi_id_string *id)
 
uacpi_status uacpi_eval_cid (uacpi_namespace_node *node, uacpi_pnp_id_list **out_list)
 
void uacpi_free_pnp_id_list (uacpi_pnp_id_list *list)
 
uacpi_status uacpi_eval_sta (uacpi_namespace_node *node, uacpi_u32 *flags)
 
uacpi_status uacpi_eval_adr (uacpi_namespace_node *node, uacpi_u64 *out)
 
static uacpi_u8 extract_package_byte_or_zero (uacpi_package *pkg, uacpi_size i)
 
uacpi_status uacpi_eval_cls (uacpi_namespace_node *node, uacpi_id_string **out_id)
 
uacpi_status uacpi_eval_uid (uacpi_namespace_node *node, uacpi_id_string **out_uid)
 
static uacpi_bool matches_any (uacpi_id_string *id, const uacpi_char *const *ids)
 
static uacpi_status uacpi_eval_dstate_method_template (uacpi_namespace_node *parent, uacpi_char *template, uacpi_u8 num_methods, uacpi_u8 *out_values)
 
uacpi_status uacpi_get_namespace_node_info (uacpi_namespace_node *node, uacpi_namespace_node_info **out_info)
 
void uacpi_free_namespace_node_info (uacpi_namespace_node_info *info)
 
uacpi_bool uacpi_device_matches_pnp_id (uacpi_namespace_node *node, const uacpi_char *const *ids)
 
static uacpi_iteration_decision find_one_device (void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
 
uacpi_status uacpi_find_devices_at (uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
 
uacpi_status uacpi_find_devices (const uacpi_char *hid, uacpi_iteration_callback cb, void *user)
 
uacpi_status uacpi_set_interrupt_model (uacpi_interrupt_model model)
 
uacpi_status uacpi_get_pci_routing_table (uacpi_namespace_node *parent, uacpi_pci_routing_table **out_table)
 
void uacpi_free_pci_routing_table (uacpi_pci_routing_table *table)
 
void uacpi_free_dynamic_string (const uacpi_char *str)
 

Variables

static const uacpi_u8 ascii_map [256]
 

Macro Definition Documentation

◆ CLS_REPR_SIZE

#define CLS_REPR_SIZE   7

Definition at line 596 of file utilities.c.

◆ NODE_INFO_COPY_ID

#define NODE_INFO_COPY_ID (   name,
  flag 
)
Value:
if (name != UACPI_NULL) { \
flags |= UACPI_NS_NODE_INFO_HAS_##flag; \
info->name.value = cursor; \
info->name.size = name->size; \
uacpi_memcpy(cursor, name->value, name->size); \
cursor += name->size; \
} else { \
uacpi_memzero(&info->name, sizeof(*name)); \
} \
#define UACPI_NULL
Definition: types.h:33
GLbitfield flags
Definition: glext.h:7161
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 flag
Definition: glfuncs.h:52
const char cursor[]
Definition: icontest.c:13
Definition: name.c:39

Definition at line 775 of file utilities.c.

◆ NODE_INFO_EVAL_ADD_ID

#define NODE_INFO_EVAL_ADD_ID (   name)
Value:
if (uacpi_eval_##name(node, &name) == UACPI_STATUS_OK) { \
size += name->size; \
if (uacpi_unlikely(size < name->size)) { \
goto out; \
} \
}
#define uacpi_unlikely(expr)
Definition: compiler.h:58
@ UACPI_STATUS_AML_BAD_ENCODING
Definition: status.h:39
@ UACPI_STATUS_OK
Definition: status.h:11
return ret
Definition: mutex.c:146
GLsizeiptr size
Definition: glext.h:5919
Definition: dlist.c:348
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Definition at line 766 of file utilities.c.

◆ PNP_ID_LENGTH

#define PNP_ID_LENGTH   8

Definition at line 369 of file utilities.c.

Enumeration Type Documentation

◆ char_type

Enumerator
CHAR_TYPE_CONTROL 
CHAR_TYPE_SPACE 
CHAR_TYPE_BLANK 
CHAR_TYPE_PUNCTUATION 
CHAR_TYPE_LOWER 
CHAR_TYPE_UPPER 
CHAR_TYPE_DIGIT 
CHAR_TYPE_HEX_DIGIT 
CHAR_TYPE_ALPHA 
CHAR_TYPE_ALHEX 
CHAR_TYPE_ALNUM 

Definition at line 10 of file utilities.c.

10 {
11 CHAR_TYPE_CONTROL = 1 << 0,
12 CHAR_TYPE_SPACE = 1 << 1,
13 CHAR_TYPE_BLANK = 1 << 2,
14 CHAR_TYPE_PUNCTUATION = 1 << 3,
15 CHAR_TYPE_LOWER = 1 << 4,
16 CHAR_TYPE_UPPER = 1 << 5,
17 CHAR_TYPE_DIGIT = 1 << 6,
18 CHAR_TYPE_HEX_DIGIT = 1 << 7,
22};
@ CHAR_TYPE_ALHEX
Definition: utilities.c:20
@ CHAR_TYPE_DIGIT
Definition: utilities.c:17
@ CHAR_TYPE_LOWER
Definition: utilities.c:15
@ CHAR_TYPE_HEX_DIGIT
Definition: utilities.c:18
@ CHAR_TYPE_SPACE
Definition: utilities.c:12
@ CHAR_TYPE_ALPHA
Definition: utilities.c:19
@ CHAR_TYPE_PUNCTUATION
Definition: utilities.c:14
@ CHAR_TYPE_BLANK
Definition: utilities.c:13
@ CHAR_TYPE_ALNUM
Definition: utilities.c:21
@ CHAR_TYPE_UPPER
Definition: utilities.c:16
@ CHAR_TYPE_CONTROL
Definition: utilities.c:11

Function Documentation

◆ consume_if()

static uacpi_bool consume_if ( const uacpi_char **  str,
uacpi_size size,
enum char_type  type 
)
static

Definition at line 205 of file utilities.c.

208{
210
211 if (!peek_one(str, size, &c) || !is_char(c, type))
212 return UACPI_FALSE;
213
214 *str += 1;
215 *size -= 1;
216 return UACPI_TRUE;
217}
#define UACPI_FALSE
Definition: types.h:30
char uacpi_char
Definition: types.h:44
#define UACPI_TRUE
Definition: types.h:29
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
const WCHAR * str
static uacpi_bool is_char(uacpi_char c, enum char_type type)
Definition: utilities.c:169
static uacpi_bool peek_one(const uacpi_char **str, const uacpi_size *size, uacpi_char *out_char)
Definition: utilities.c:182

Referenced by uacpi_string_to_integer().

◆ consume_if_equals()

static uacpi_bool consume_if_equals ( const uacpi_char **  str,
uacpi_size size,
uacpi_char  c 
)
static

Definition at line 219 of file utilities.c.

222{
223 uacpi_char c1;
224
225 if (!peek_one(str, size, &c1) || to_lower(c1) != c)
226 return UACPI_FALSE;
227
228 *str += 1;
229 *size -= 1;
230 return UACPI_TRUE;
231}
#define to_lower(c)
Definition: astoll.c:46

Referenced by uacpi_string_to_integer().

◆ consume_one()

static uacpi_bool consume_one ( const uacpi_char **  str,
uacpi_size size,
uacpi_char out_char 
)
static

Definition at line 193 of file utilities.c.

196{
197 if (!peek_one(str, size, out_char))
198 return UACPI_FALSE;
199
200 *str += 1;
201 *size -= 1;
202 return UACPI_TRUE;
203}

Referenced by uacpi_string_to_integer().

◆ extract_package_byte_or_zero()

static uacpi_u8 extract_package_byte_or_zero ( uacpi_package pkg,
uacpi_size  i 
)
static

Definition at line 598 of file utilities.c.

599{
601
602 if (uacpi_unlikely(pkg->count <= i))
603 return 0;
604
605 obj = pkg->objects[i];
607 return 0;
608
609 return obj->integer;
610}
@ UACPI_OBJECT_INTEGER
Definition: types.h:106
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
uacpi_object ** objects
Definition: types.h:36
uacpi_size count
Definition: types.h:37

Referenced by uacpi_eval_cls().

◆ find_one_device()

static uacpi_iteration_decision find_one_device ( void opaque,
uacpi_namespace_node node,
uacpi_u32  depth 
)
static

Definition at line 933 of file utilities.c.

936{
937 struct device_find_ctx *ctx = opaque;
940
941 if (!uacpi_device_matches_pnp_id(node, ctx->target_hids))
943
947
951
952 return ctx->cb(ctx->user, node, depth);
953}
#define ACPI_STA_RESULT_DEVICE_PRESENT
Definition: acpi.h:987
#define ACPI_STA_RESULT_DEVICE_FUNCTIONING
Definition: acpi.h:990
uint32_t uacpi_u32
Definition: types.h:21
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_ITERATION_DECISION_NEXT_PEER
Definition: types.h:33
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
uacpi_bool uacpi_device_matches_pnp_id(uacpi_namespace_node *node, const uacpi_char *const *ids)
Definition: utilities.c:894
uacpi_status uacpi_eval_sta(uacpi_namespace_node *node, uacpi_u32 *flags)
Definition: utilities.c:568

Referenced by uacpi_find_devices_at().

◆ is_char()

static uacpi_bool is_char ( uacpi_char  c,
enum char_type  type 
)
static

Definition at line 169 of file utilities.c.

170{
171 return (ascii_map[(uacpi_u8)c] & type) == type;
172}
uint8_t uacpi_u8
Definition: types.h:19
static const uacpi_u8 ascii_map[256]
Definition: utilities.c:24

Referenced by consume_if(), and to_lower().

◆ is_valid_name_byte()

static uacpi_bool is_valid_name_byte ( uacpi_u8  c)
inlinestatic

Definition at line 299 of file utilities.c.

300{
301 // ‘_’ := 0x5F
302 if (c == 0x5F)
303 return UACPI_TRUE;
304
305 /*
306 * LeadNameChar := ‘A’-‘Z’ | ‘_’
307 * DigitChar := ‘0’ - ‘9’
308 * NameChar := DigitChar | LeadNameChar
309 * ‘A’-‘Z’ := 0x41 - 0x5A
310 * ‘0’-‘9’ := 0x30 - 0x39
311 */
312 return (ascii_map[c] & (CHAR_TYPE_DIGIT | CHAR_TYPE_UPPER)) != 0;
313}

Referenced by uacpi_is_valid_nameseg().

◆ matches_any()

static uacpi_bool matches_any ( uacpi_id_string id,
const uacpi_char *const ids 
)
static

Definition at line 715 of file utilities.c.

718{
720
721 for (i = 0; ids[i]; ++i) {
722 if (uacpi_strcmp(id->value, ids[i]) == 0)
723 return UACPI_TRUE;
724 }
725
726 return UACPI_FALSE;
727}
uacpi_i32 uacpi_strcmp(const uacpi_char *lhs, const uacpi_char *rhs)
Definition: stdlib.c:96
size_t uacpi_size
Definition: types.h:37
GLuint * ids
Definition: glext.h:5907
GLuint id
Definition: glext.h:5910

Referenced by uacpi_device_matches_pnp_id().

◆ peek_one()

static uacpi_bool peek_one ( const uacpi_char **  str,
const uacpi_size size,
uacpi_char out_char 
)
static

Definition at line 182 of file utilities.c.

185{
186 if (*size == 0)
187 return UACPI_FALSE;
188
189 *out_char = **str;
190 return UACPI_TRUE;
191}

Referenced by consume_if(), consume_if_equals(), and consume_one().

◆ to_lower()

static uacpi_char to_lower ( uacpi_char  c)
static

Definition at line 174 of file utilities.c.

175{
177 return c + ('a' - 'A');
178
179 return c;
180}

◆ uacpi_device_matches_pnp_id()

uacpi_bool uacpi_device_matches_pnp_id ( uacpi_namespace_node node,
const uacpi_char *const ids 
)

Definition at line 894 of file utilities.c.

897{
898 uacpi_status st;
901 uacpi_pnp_id_list *id_list = UACPI_NULL;
902
903 st = uacpi_eval_hid(node, &id);
904 if (st == UACPI_STATUS_OK && matches_any(id, ids)) {
905 ret = UACPI_TRUE;
906 goto out;
907 }
908
909 st = uacpi_eval_cid(node, &id_list);
910 if (st == UACPI_STATUS_OK) {
912
913 for (i = 0; i < id_list->num_ids; ++i) {
914 if (matches_any(&id_list->ids[i], ids)) {
915 ret = UACPI_TRUE;
916 goto out;
917 }
918 }
919 }
920
921out:
923 uacpi_free_pnp_id_list(id_list);
924 return ret;
925}
bool uacpi_bool
Definition: types.h:31
uacpi_u32 num_ids
Definition: utilities.h:88
uacpi_id_string ids[]
Definition: utilities.h:94
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:715
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:436
void uacpi_free_pnp_id_list(uacpi_pnp_id_list *list)
Definition: utilities.c:560
uacpi_status uacpi_eval_hid(uacpi_namespace_node *node, uacpi_id_string **out_id)
Definition: utilities.c:371
uacpi_status uacpi_eval_cid(uacpi_namespace_node *node, uacpi_pnp_id_list **out_list)
Definition: utilities.c:444

Referenced by find_one_device(), and find_pci_root().

◆ uacpi_eisa_id_to_string()

void uacpi_eisa_id_to_string ( uacpi_u32  id,
uacpi_char out_string 
)

Definition at line 323 of file utilities.c.

324{
325 static uacpi_char hex_to_ascii[16] = {
326 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
327 'A', 'B', 'C', 'D', 'E', 'F'
328 };
329
330 /*
331 * For whatever reason bits are encoded upper to lower here, swap
332 * them around so that we don't have to do ridiculous bit shifts
333 * everywhere.
334 */
335 union {
336 uacpi_u8 bytes[4];
337 uacpi_u32 dword;
338 } orig, swapped;
339
340 orig.dword = id;
341 swapped.bytes[0] = orig.bytes[3];
342 swapped.bytes[1] = orig.bytes[2];
343 swapped.bytes[2] = orig.bytes[1];
344 swapped.bytes[3] = orig.bytes[0];
345
346 /*
347 * Bit 16 - 20: 3rd character (- 0x40) of mfg code
348 * Bit 21 - 25: 2nd character (- 0x40) of mfg code
349 * Bit 26 - 30: 1st character (- 0x40) of mfg code
350 */
351 out_string[0] = (uacpi_char)(0x40 + ((swapped.dword >> 26) & 0x1F));
352 out_string[1] = (uacpi_char)(0x40 + ((swapped.dword >> 21) & 0x1F));
353 out_string[2] = (uacpi_char)(0x40 + ((swapped.dword >> 16) & 0x1F));
354
355 /*
356 * Bit 0 - 3 : 4th hex digit of product number
357 * Bit 4 - 7 : 3rd hex digit of product number
358 * Bit 8 - 11: 2nd hex digit of product number
359 * Bit 12 - 15: 1st hex digit of product number
360 */
361 out_string[3] = hex_to_ascii[(swapped.dword >> 12) & 0x0F];
362 out_string[4] = hex_to_ascii[(swapped.dword >> 8 ) & 0x0F];
363 out_string[5] = hex_to_ascii[(swapped.dword >> 4 ) & 0x0F];
364 out_string[6] = hex_to_ascii[(swapped.dword >> 0 ) & 0x0F];
365
366 out_string[7] = '\0';
367}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74

Referenced by uacpi_eval_cid(), and uacpi_eval_hid().

◆ uacpi_eval_adr()

uacpi_status uacpi_eval_adr ( uacpi_namespace_node node,
uacpi_u64 out 
)

Definition at line 591 of file utilities.c.

592{
593 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
594}
uacpi_status uacpi_eval_integer(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_u64 *out_value)
Definition: uacpi.c:882

Referenced by uacpi_get_namespace_node_info().

◆ uacpi_eval_cid()

uacpi_status uacpi_eval_cid ( uacpi_namespace_node node,
uacpi_pnp_id_list **  out_list 
)

Definition at line 444 of file utilities.c.

447{
449 uacpi_object *object, *cid_ret;
451 uacpi_size num_ids, i;
454 uacpi_char *id_buffer;
456
458 node, "_CID", UACPI_NULL,
461 &cid_ret
462 );
463 if (ret != UACPI_STATUS_OK)
464 return ret;
465
466 switch (cid_ret->type) {
468 objects = cid_ret->package->objects;
469 num_ids = cid_ret->package->count;
470 break;
471 default:
472 objects = &cid_ret;
473 num_ids = 1;
474 break;
475 }
476
477 size = sizeof(uacpi_pnp_id_list);
478 size += num_ids * sizeof(uacpi_id_string);
479
480 for (i = 0; i < num_ids; ++i) {
481 object = objects[i];
482
483 switch (object->type) {
484 case UACPI_OBJECT_STRING: {
485 uacpi_size buf_size = object->buffer->size;
486
487 if (uacpi_unlikely(buf_size == 0)) {
489 "%.4s._CID: empty EISA ID string (sub-object %zu)\n",
491 );
493 }
494
495 size += buf_size;
496 if (uacpi_unlikely(size < buf_size)) {
498 "%.4s._CID: buffer size overflow (+ %zu)\n",
500 );
502 }
503
504 break;
505 }
506
509 break;
510 default:
512 "%.4s._CID: invalid package sub-object %zu type: %s\n",
515 );
517 }
518 }
519
523 list->num_ids = num_ids;
524 list->size = size - sizeof(uacpi_pnp_id_list);
525
526 id_buffer = UACPI_PTR_ADD(list, sizeof(uacpi_pnp_id_list));
527 id_buffer += num_ids * sizeof(uacpi_id_string);
528
529 for (i = 0; i < num_ids; ++i) {
530 object = objects[i];
531 id = &list->ids[i];
532
533 switch (object->type) {
534 case UACPI_OBJECT_STRING: {
535 uacpi_buffer *buf = object->buffer;
536
537 id->size = buf->size;
538 id->value = id_buffer;
539
540 uacpi_memcpy(id->value, buf->text, id->size);
541 id->value[id->size - 1] = '\0';
542 break;
543 }
544
546 id->size = PNP_ID_LENGTH;
547 id->value = id_buffer;
548 uacpi_eisa_id_to_string(object->integer, id_buffer);
549 break;
550 }
551
552 id_buffer += id->size;
553 }
554
555 uacpi_object_unref(cid_ret);
556 *out_list = list;
557 return ret;
558}
Definition: list.h:37
size_type size() const
Definition: _list.h:379
const WCHAR * text
Definition: package.c:1794
#define uacpi_error(...)
Definition: log.h:21
#define uacpi_memcpy
Definition: stdlib.h:34
uacpi_object_name uacpi_namespace_node_name(const uacpi_namespace_node *node)
Definition: namespace.c:752
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_AML_INCOMPATIBLE_OBJECT_TYPE
Definition: status.h:38
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:130
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:129
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:132
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_OBJECT_STRING
Definition: types.h:107
@ UACPI_OBJECT_PACKAGE
Definition: types.h:109
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
struct output_fragment * out_list
Definition: write.c:75
static const CLSID * objects[]
Definition: apphelp.c:112
#define list
Definition: rosglue.h:35
char * value
Definition: compiler.c:67
uacpi_size size
Definition: types.h:31
uacpi_u8 type
Definition: types.h:249
uacpi_package * package
Definition: types.h:254
uacpi_status uacpi_eval_typed(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object_type_bits ret_mask, uacpi_object **ret)
Definition: uacpi.c:844
#define PNP_ID_LENGTH
Definition: utilities.c:369
void uacpi_eisa_id_to_string(uacpi_u32 id, uacpi_char *out_string)
Definition: utilities.c:323

Referenced by uacpi_device_matches_pnp_id().

◆ uacpi_eval_cls()

uacpi_status uacpi_eval_cls ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Definition at line 612 of file utilities.c.

615{
618 uacpi_package *pkg;
619 uacpi_u8 class_codes[3];
620 uacpi_id_string *id_string;
621
624 );
625 if (ret != UACPI_STATUS_OK)
626 return ret;
627
628 pkg = obj->package;
629 class_codes[0] = extract_package_byte_or_zero(pkg, 0);
630 class_codes[1] = extract_package_byte_or_zero(pkg, 1);
631 class_codes[2] = extract_package_byte_or_zero(pkg, 2);
632
633 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + CLS_REPR_SIZE);
634 if (uacpi_unlikely(id_string == UACPI_NULL)) {
636 goto out;
637 }
638
639 id_string->size = CLS_REPR_SIZE;
640 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
641
643 id_string->value, CLS_REPR_SIZE, "%02X%02X%02X",
644 class_codes[0], class_codes[1], class_codes[2]
645 );
646
647out:
649 *out_id = id_string;
650
652 return ret;
653}
uacpi_i32 uacpi_snprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
Definition: stdlib.c:661
#define uacpi_likely_success(expr)
Definition: status.h:53
uacpi_char * value
Definition: utilities.h:76
uacpi_u32 size
Definition: utilities.h:75
static uacpi_u8 extract_package_byte_or_zero(uacpi_package *pkg, uacpi_size i)
Definition: utilities.c:598
#define CLS_REPR_SIZE
Definition: utilities.c:596

◆ uacpi_eval_dstate_method_template()

static uacpi_status uacpi_eval_dstate_method_template ( uacpi_namespace_node parent,
uacpi_char template,
uacpi_u8  num_methods,
uacpi_u8 out_values 
)
static

Definition at line 729 of file utilities.c.

733{
734 uacpi_u8 i;
737
738 // We expect either _SxD or _SxW, so increment template[2]
739 for (i = 0; i < num_methods; ++i, template[2]++) {
740 eval_ret = uacpi_eval_typed(
742 );
743 if (eval_ret == UACPI_STATUS_OK) {
745 out_values[i] = obj->integer;
747 continue;
748 }
749
750 out_values[i] = 0xFF;
751 if (uacpi_unlikely(eval_ret != UACPI_STATUS_NOT_FOUND)) {
752 const char *path;
753
756 "failed to evaluate %s.%s: %s\n",
757 path, template, uacpi_status_to_string(eval_ret)
758 );
760 }
761 }
762
763 return ret;
764}
#define uacpi_warn(...)
Definition: log.h:20
const uacpi_char * uacpi_namespace_node_generate_absolute_path(const uacpi_namespace_node *node)
Definition: namespace.c:1034
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
const uacpi_char * uacpi_status_to_string(uacpi_status)
Definition: uacpi.c:50
r parent
Definition: btrfs.c:3010
void uacpi_free_dynamic_string(const uacpi_char *str)
Definition: utilities.c:1135

Referenced by uacpi_get_namespace_node_info().

◆ uacpi_eval_hid()

uacpi_status uacpi_eval_hid ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Definition at line 371 of file utilities.c.

372{
374 uacpi_object *hid_ret;
377
379 node, "_HID", UACPI_NULL,
381 &hid_ret
382 );
383 if (ret != UACPI_STATUS_OK)
384 return ret;
385
386 size = sizeof(uacpi_id_string);
387
388 switch (hid_ret->type) {
389 case UACPI_OBJECT_STRING: {
390 uacpi_buffer *buf = hid_ret->buffer;
391
392 size += buf->size;
393 if (uacpi_unlikely(buf->size == 0 || size < buf->size)) {
395 "%.4s._HID: empty/invalid EISA ID string (%zu bytes)\n",
397 );
399 break;
400 }
401
403 if (uacpi_unlikely(id == UACPI_NULL)) {
405 break;
406 }
407 id->size = buf->size;
408 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
409
410 uacpi_memcpy(id->value, buf->text, buf->size);
411 id->value[buf->size - 1] = '\0';
412 break;
413 }
414
417
419 if (uacpi_unlikely(id == UACPI_NULL)) {
421 break;
422 }
423 id->size = PNP_ID_LENGTH;
424 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
425
426 uacpi_eisa_id_to_string(hid_ret->integer, id->value);
427 break;
428 }
429
430 uacpi_object_unref(hid_ret);
432 *out_id = id;
433 return ret;
434}
uacpi_u64 integer
Definition: types.h:253
uacpi_buffer * buffer
Definition: types.h:258

Referenced by uacpi_device_matches_pnp_id().

◆ uacpi_eval_sta()

uacpi_status uacpi_eval_sta ( uacpi_namespace_node node,
uacpi_u32 flags 
)

Definition at line 568 of file utilities.c.

569{
571 uacpi_u64 value = 0;
572
574
575 /*
576 * ACPI 6.5 specification:
577 * If a device object (including the processor object) does not have
578 * an _STA object, then OSPM assumes that all of the above bits are
579 * set (i.e., the device is present, enabled, shown in the UI,
580 * and functioning).
581 */
583 value = 0xFFFFFFFF;
585 }
586
587 *flags = value;
588 return ret;
589}
uint64_t uacpi_u64
Definition: types.h:22
Definition: pdh_main.c:96

Referenced by find_one_device(), and sta_eval().

◆ uacpi_eval_uid()

uacpi_status uacpi_eval_uid ( uacpi_namespace_node node,
uacpi_id_string **  out_uid 
)

Definition at line 655 of file utilities.c.

658{
661 uacpi_id_string *id_string;
663
665 node, "_UID", UACPI_NULL,
667 &obj
668 );
669 if (ret != UACPI_STATUS_OK)
670 return ret;
671
672 if (obj->type == UACPI_OBJECT_STRING) {
673 size = obj->buffer->size;
674 if (uacpi_unlikely(size == 0 || size > 0xE0000000)) {
676 "invalid %.4s._UID string size: %u\n",
678 );
680 goto out;
681 }
682 } else {
684 UACPI_NULL, 0, "%"UACPI_PRIu64, UACPI_FMT64(obj->integer)
685 ) + 1;
686 }
687
688 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + size);
689 if (uacpi_unlikely(id_string == UACPI_NULL)) {
691 goto out;
692 }
693
694 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
695 id_string->size = size;
696
697 if (obj->type == UACPI_OBJECT_STRING) {
698 uacpi_memcpy(id_string->value, obj->buffer->text, size);
699 id_string->value[size - 1] = '\0';
700 } else {
702 id_string->value, id_string->size, "%"UACPI_PRIu64,
703 UACPI_FMT64(obj->integer)
704 );
705 }
706
707out:
709 *out_uid = id_string;
710
712 return ret;
713}
#define UACPI_FMT64(val)
Definition: types.h:62
#define UACPI_PRIu64
Definition: types.h:59

◆ uacpi_find_devices()

uacpi_status uacpi_find_devices ( const uacpi_char hid,
uacpi_iteration_callback  cb,
void user 
)

Definition at line 975 of file utilities.c.

978{
979 const uacpi_char *hids[] = {
980 hid, UACPI_NULL
981 };
982
984}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:267
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
uacpi_status uacpi_find_devices_at(uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:956

◆ uacpi_find_devices_at()

uacpi_status uacpi_find_devices_at ( uacpi_namespace_node parent,
const uacpi_char *const hids,
uacpi_iteration_callback  cb,
void user 
)

Definition at line 956 of file utilities.c.

960{
962
963 struct device_find_ctx ctx = {
964 .target_hids = hids,
965 .user = user,
966 .cb = cb,
967 };
968
972 );
973}
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
#define UACPI_MAX_DEPTH_ANY
Definition: namespace.h:102
uacpi_status uacpi_namespace_for_each_child(uacpi_namespace_node *parent, uacpi_iteration_callback descending_callback, uacpi_iteration_callback ascending_callback, uacpi_object_type_bits type_mask, uacpi_u32 max_depth, void *user)
Definition: namespace.c:948
@ UACPI_OBJECT_DEVICE_BIT
Definition: types.h:134
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:72
static uacpi_iteration_decision find_one_device(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: utilities.c:933

Referenced by uacpi_find_devices().

◆ uacpi_free_dynamic_string()

◆ uacpi_free_id_string()

void uacpi_free_id_string ( uacpi_id_string id)

Definition at line 436 of file utilities.c.

437{
438 if (id == UACPI_NULL)
439 return;
440
441 uacpi_free(id, sizeof(uacpi_id_string) + id->size);
442}

Referenced by uacpi_device_matches_pnp_id(), and uacpi_get_namespace_node_info().

◆ uacpi_free_namespace_node_info()

void uacpi_free_namespace_node_info ( uacpi_namespace_node_info info)

Definition at line 886 of file utilities.c.

887{
888 if (info == UACPI_NULL)
889 return;
890
891 uacpi_free(info, info->size);
892}

◆ uacpi_free_pci_routing_table()

void uacpi_free_pci_routing_table ( uacpi_pci_routing_table table)

Definition at line 1123 of file utilities.c.

1124{
1125 if (table == UACPI_NULL)
1126 return;
1127
1128 uacpi_free(
1129 table,
1130 sizeof(uacpi_pci_routing_table) +
1131 table->num_entries * sizeof(uacpi_pci_routing_table_entry)
1132 );
1133}
Definition: utilities.h:56

Referenced by uacpi_get_pci_routing_table().

◆ uacpi_free_pnp_id_list()

void uacpi_free_pnp_id_list ( uacpi_pnp_id_list list)

Definition at line 560 of file utilities.c.

561{
562 if (list == UACPI_NULL)
563 return;
564
566}

Referenced by uacpi_device_matches_pnp_id(), and uacpi_get_namespace_node_info().

◆ uacpi_get_namespace_node_info()

uacpi_status uacpi_get_namespace_node_info ( uacpi_namespace_node node,
uacpi_namespace_node_info **  out_info 
)

Definition at line 786 of file utilities.c.

789{
794 uacpi_id_string *hid = UACPI_NULL, *uid = UACPI_NULL, *cls = UACPI_NULL;
797 uacpi_u64 adr = 0;
798 uacpi_u8 flags = 0;
799 uacpi_u8 sxd[4], sxw[5];
800
804
805 if (obj->type == UACPI_OBJECT_DEVICE ||
806 obj->type == UACPI_OBJECT_PROCESSOR) {
807 char dstate_method_template[5] = { '_', 'S', '1', 'D', '\0' };
808
813
814 if (uacpi_eval_adr(node, &adr) == UACPI_STATUS_OK)
816
818 node, dstate_method_template, sizeof(sxd), sxd
819 ) == UACPI_STATUS_OK)
821
822 dstate_method_template[2] = '0';
823 dstate_method_template[3] = 'W';
824
826 node, dstate_method_template, sizeof(sxw), sxw
827 ) == UACPI_STATUS_OK)
829 }
830
834 goto out;
835 }
836 info->size = size;
839 info->type = obj->type;
840 info->num_params = info->type == UACPI_OBJECT_METHOD ? obj->method->args : 0;
841
842 info->adr = adr;
844 uacpi_memcpy(info->sxd, sxd, sizeof(sxd));
845 else
846 uacpi_memzero(info->sxd, sizeof(info->sxd));
847
849 uacpi_memcpy(info->sxw, sxw, sizeof(sxw));
850 else
851 uacpi_memzero(info->sxw, sizeof(info->sxw));
852
853 if (cid != UACPI_NULL) {
854 uacpi_u32 i;
855
856 uacpi_memcpy(&info->cid, cid, cid->size + sizeof(*cid));
857 cursor += cid->num_ids * sizeof(uacpi_id_string);
858
859 for (i = 0; i < cid->num_ids; ++i) {
860 info->cid.ids[i].value = cursor;
861 cursor += info->cid.ids[i].size;
862 }
863
865 } else {
866 uacpi_memzero(&info->cid, sizeof(*cid));
867 }
868
869 NODE_INFO_COPY_ID(hid, HID)
872
873out:
875 info->flags = flags;
876 *out_info = info;
877 }
878
883 return ret;
884}
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
Definition: namespace.c:646
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_OBJECT_METHOD
Definition: types.h:113
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:117
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
#define UID
Definition: ext2fs.h:154
static TfClientId cid
Definition: ntuser.h:566
#define NODE_INFO_EVAL_ADD_ID(name)
Definition: utilities.c:766
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:775
static uacpi_status uacpi_eval_dstate_method_template(uacpi_namespace_node *parent, uacpi_char *template, uacpi_u8 num_methods, uacpi_u8 *out_values)
Definition: utilities.c:729
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:591
#define UACPI_NS_NODE_INFO_HAS_ADR
Definition: utilities.h:133
#define UACPI_NS_NODE_INFO_HAS_SXD
Definition: utilities.h:138
#define UACPI_NS_NODE_INFO_HAS_CID
Definition: utilities.h:136
#define UACPI_NS_NODE_INFO_HAS_SXW
Definition: utilities.h:139

◆ uacpi_get_pci_routing_table()

uacpi_status uacpi_get_pci_routing_table ( uacpi_namespace_node parent,
uacpi_pci_routing_table **  out_table 
)

Definition at line 1011 of file utilities.c.

1014{
1016 uacpi_object *obj, *entry_obj, *elem_obj;
1017 uacpi_package *table_pkg, *entry_pkg;
1020 uacpi_size size, i;
1021
1023
1027
1030 );
1032 return ret;
1033
1034 table_pkg = obj->package;
1035 if (uacpi_unlikely(table_pkg->count == 0 || table_pkg->count > 1024)) {
1036 uacpi_error("invalid number of _PRT entries: %zu\n", table_pkg->count);
1039 }
1040
1041 size = table_pkg->count * sizeof(uacpi_pci_routing_table_entry);
1046 }
1047 table->num_entries = table_pkg->count;
1048
1049 for (i = 0; i < table_pkg->count; ++i) {
1050 entry_obj = table_pkg->objects[i];
1051
1052 if (uacpi_unlikely(entry_obj->type != UACPI_OBJECT_PACKAGE)) {
1053 uacpi_error("_PRT sub-object %zu is not a package: %s\n",
1054 i, uacpi_object_type_to_string(entry_obj->type));
1055 goto out_bad_encoding;
1056 }
1057
1058 entry_pkg = entry_obj->package;
1059 if (uacpi_unlikely(entry_pkg->count != 4)) {
1060 uacpi_error("invalid _PRT sub-package entry count %zu\n",
1061 entry_pkg->count);
1062 goto out_bad_encoding;
1063 }
1064
1065 entry = &table->entries[i];
1066
1067 elem_obj = entry_pkg->objects[0];
1068 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1069 uacpi_error("invalid _PRT sub-package %zu address type: %s\n",
1070 i, uacpi_object_type_to_string(elem_obj->type));
1071 goto out_bad_encoding;
1072 }
1073 entry->address = elem_obj->integer;
1074
1075 elem_obj = entry_pkg->objects[1];
1076 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1077 uacpi_error("invalid _PRT sub-package %zu pin type: %s\n",
1078 i, uacpi_object_type_to_string(elem_obj->type));
1079 goto out_bad_encoding;
1080 }
1081 entry->pin = elem_obj->integer;
1082
1083 elem_obj = entry_pkg->objects[2];
1084 switch (elem_obj->type) {
1087 elem_obj, parent, &entry->source
1088 );
1090 uacpi_error("unable to lookup _PRT source %s: %s\n",
1091 elem_obj->buffer->text, uacpi_status_to_string(ret));
1092 goto out_bad_encoding;
1093 }
1094 break;
1096 entry->source = UACPI_NULL;
1097 break;
1098 default:
1099 uacpi_error("invalid _PRT sub-package %zu source type: %s\n",
1100 i, uacpi_object_type_to_string(elem_obj->type));
1101 goto out_bad_encoding;
1102 }
1103
1104 elem_obj = entry_pkg->objects[3];
1105 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1106 uacpi_error("invalid _PRT sub-package %zu source index type: %s\n",
1107 i, uacpi_object_type_to_string(elem_obj->type));
1108 goto out_bad_encoding;
1109 }
1110 entry->index = elem_obj->integer;
1111 }
1112
1114 *out_table = table;
1115 return UACPI_STATUS_OK;
1116
1117out_bad_encoding:
1121}
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1079
uint32_t entry
Definition: isohybrid.c:63
uacpi_char * text
Definition: types.h:29
void uacpi_free_pci_routing_table(uacpi_pci_routing_table *table)
Definition: utilities.c:1123

◆ uacpi_is_valid_nameseg()

uacpi_bool uacpi_is_valid_nameseg ( uacpi_u8 nameseg)

Definition at line 315 of file utilities.c.

316{
317 return is_valid_name_byte(nameseg[0]) &&
318 is_valid_name_byte(nameseg[1]) &&
319 is_valid_name_byte(nameseg[2]) &&
320 is_valid_name_byte(nameseg[3]);
321}
static uacpi_bool is_valid_name_byte(uacpi_u8 c)
Definition: utilities.c:299

Referenced by parse_nameseg().

◆ uacpi_set_interrupt_model()

uacpi_status uacpi_set_interrupt_model ( uacpi_interrupt_model  model)

Definition at line 986 of file utilities.c.

987{
991
993
997
998 arg->integer = model;
999 args.objects = &arg;
1000 args.count = 1;
1001
1004
1007
1008 return ret;
1009}
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
#define args
Definition: format.c:66
Definition: match.c:390
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:699
void * arg
Definition: msvc.h:10

◆ uacpi_string_to_integer()

uacpi_status uacpi_string_to_integer ( const uacpi_char str,
uacpi_size  max_chars,
enum uacpi_base  base,
uacpi_u64 out_value 
)

Definition at line 233 of file utilities.c.

237{
239 uacpi_bool negative = UACPI_FALSE;
240 uacpi_u64 next, value = 0;
241 uacpi_char c = '\0';
242
243 while (consume_if(&str, &max_chars, CHAR_TYPE_SPACE));
244
245 if (consume_if_equals(&str, &max_chars, '-'))
246 negative = UACPI_TRUE;
247 else
248 consume_if_equals(&str, &max_chars, '+');
249
250 if (base == UACPI_BASE_AUTO) {
252
253 if (consume_if_equals(&str, &max_chars, '0')) {
255 if (consume_if_equals(&str, &max_chars, 'x'))
257 }
258 }
259
260 while (consume_one(&str, &max_chars, &c)) {
263 next = c - '0';
264 if (base == UACPI_BASE_OCT && next > 7)
265 goto out;
266 break;
269 if (base != UACPI_BASE_HEX)
270 goto out;
271 next = 10 + (to_lower(c) - 'a');
272 break;
273 default:
274 goto out;
275 }
276
277 next = (value * base) + next;
278 if ((next / base) != value) {
279 value = 0xFFFFFFFFFFFFFFFF;
280 goto out;
281 }
282
283 value = next;
284 }
285
286out:
287 if (negative)
288 value = -((uacpi_i64)value);
289
290 *out_value = value;
291 if (max_chars == 0 || c == '\0')
293
294 return ret;
295}
int64_t uacpi_i64
Definition: types.h:27
@ UACPI_BASE_OCT
Definition: utilities.h:32
@ UACPI_BASE_DEC
Definition: utilities.h:33
@ UACPI_BASE_AUTO
Definition: utilities.h:31
@ UACPI_BASE_HEX
Definition: utilities.h:34
static unsigned __int64 next
Definition: rand_nt.c:6
static uacpi_bool consume_if_equals(const uacpi_char **str, uacpi_size *size, uacpi_char c)
Definition: utilities.c:219
static uacpi_bool consume_one(const uacpi_char **str, uacpi_size *size, uacpi_char *out_char)
Definition: utilities.c:193
static uacpi_bool consume_if(const uacpi_char **str, uacpi_size *size, enum char_type type)
Definition: utilities.c:205

Referenced by do_match_gpe_methods(), object_to_integer(), and parse_number().

Variable Documentation

◆ ascii_map

const uacpi_u8 ascii_map[256]
static

Definition at line 24 of file utilities.c.

Referenced by is_char(), is_valid_name_byte(), and uacpi_string_to_integer().