ReactOS 0.4.17-dev-684-ga6524ef
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 605 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 786 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:88
@ UACPI_STATUS_AML_BAD_ENCODING
Definition: status.h:39
@ UACPI_STATUS_OK
Definition: status.h:11
return ret
Definition: mutex.c:147
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 777 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 607 of file utilities.c.

608{
610
611 if (uacpi_unlikely(pkg->count <= i))
612 return 0;
613
614 obj = pkg->objects[i];
616 return 0;
617
618 return obj->integer;
619}
@ UACPI_OBJECT_INTEGER
Definition: types.h:112
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 944 of file utilities.c.

947{
948 struct device_find_ctx *ctx = opaque;
951
952 if (!uacpi_device_matches_pnp_id(node, ctx->target_hids))
954
958
962
963 return ctx->cb(ctx->user, node, depth);
964}
#define ACPI_STA_RESULT_DEVICE_PRESENT
Definition: acpi.h:991
#define ACPI_STA_RESULT_DEVICE_FUNCTIONING
Definition: acpi.h:994
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:39
@ 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:905
uacpi_status uacpi_eval_sta(uacpi_namespace_node *node, uacpi_u32 *flags)
Definition: utilities.c:577

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 726 of file utilities.c.

729{
731
732 for (i = 0; ids[i]; ++i) {
733 if (uacpi_strcmp(id->value, ids[i]) == 0)
734 return UACPI_TRUE;
735 }
736
737 return UACPI_FALSE;
738}
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 list 
)

Checks whether the device at 'node' matches any of the PNP ids provided in 'list' (terminated by a UACPI_NULL). This is done by first attempting to match the value returned from _HID and then the value(s) from _CID.

Note that the presence of the device (_STA) is not verified here.

Definition at line 905 of file utilities.c.

908{
909 uacpi_status st;
912 uacpi_pnp_id_list *id_list = UACPI_NULL;
913
914 st = uacpi_eval_hid(node, &id);
915 if (st == UACPI_STATUS_OK && matches_any(id, ids)) {
916 ret = UACPI_TRUE;
917 goto out;
918 }
919
920 st = uacpi_eval_cid(node, &id_list);
921 if (st == UACPI_STATUS_OK) {
923
924 for (i = 0; i < id_list->num_ids; ++i) {
925 if (matches_any(&id_list->ids[i], ids)) {
926 ret = UACPI_TRUE;
927 goto out;
928 }
929 }
930 }
931
932out:
934 uacpi_free_pnp_id_list(id_list);
935 return ret;
936}
bool uacpi_bool
Definition: types.h:31
uacpi_u32 num_ids
Definition: utilities.h:92
uacpi_id_string ids[]
Definition: utilities.h:98
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:726
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:438
void uacpi_free_pnp_id_list(uacpi_pnp_id_list *list)
Definition: utilities.c:569
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:446

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 
)

Evaluate a device's _ADR method and get its value.

Definition at line 600 of file utilities.c.

601{
602 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
603}
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:892

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 
)

Evaluate a device's _CID method and get its value. The returned structure must be freed using uacpi_free_pnp_id_list.

Definition at line 446 of file utilities.c.

449{
451 uacpi_object *object, *cid_ret;
453 uacpi_size num_ids, i;
456 uacpi_char *id_buffer;
458
460 node, "_CID", UACPI_NULL,
463 &cid_ret
464 );
465 if (ret != UACPI_STATUS_OK)
466 return ret;
467
468 switch (cid_ret->type) {
470 objects = cid_ret->package->objects;
471 num_ids = cid_ret->package->count;
472 break;
473 default:
474 objects = &cid_ret;
475 num_ids = 1;
476 break;
477 }
478
479 size = sizeof(uacpi_pnp_id_list);
480 size += num_ids * sizeof(uacpi_id_string);
481
482 for (i = 0; i < num_ids; ++i) {
483 object = objects[i];
484
485 switch (object->type) {
486 case UACPI_OBJECT_STRING: {
487 uacpi_size buf_size = object->buffer->size;
488
489 if (uacpi_unlikely(buf_size == 0)) {
491
493 "%.4s._CID: empty EISA ID string (sub-object %zu)",
494 name.text, i
495 );
497 }
498
499 size += buf_size;
500 if (uacpi_unlikely(size < buf_size)) {
502
504 "%.4s._CID: buffer size overflow (+ %zu)",
505 name.text, buf_size
506 );
508 }
509
510 break;
511 }
512
515 break;
516 default: {
518
520 "%.4s._CID: invalid package sub-object %zu type: %s",
521 name.text, i,
523 );
525 }
526 }
527 }
528
532 list->num_ids = num_ids;
533 list->size = size - sizeof(uacpi_pnp_id_list);
534
535 id_buffer = UACPI_PTR_ADD(list, sizeof(uacpi_pnp_id_list));
536 id_buffer += num_ids * sizeof(uacpi_id_string);
537
538 for (i = 0; i < num_ids; ++i) {
539 object = objects[i];
540 id = &list->ids[i];
541
542 switch (object->type) {
543 case UACPI_OBJECT_STRING: {
544 uacpi_buffer *buf = object->buffer;
545
546 id->size = buf->size;
547 id->value = id_buffer;
548
549 uacpi_memcpy(id->value, buf->text, id->size);
550 id->value[id->size - 1] = '\0';
551 break;
552 }
553
555 id->size = PNP_ID_LENGTH;
556 id->value = id_buffer;
557 uacpi_eisa_id_to_string(object->integer, id_buffer);
558 break;
559 }
560
561 id_buffer += id->size;
562 }
563
564 uacpi_object_unref(cid_ret);
565 *out_list = list;
566 return ret;
567}
Definition: list.h:37
size_type size() const
Definition: _list.h:379
#define uacpi_error(...)
Definition: log.h:36
#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:136
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:135
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:138
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_OBJECT_STRING
Definition: types.h:113
@ UACPI_OBJECT_PACKAGE
Definition: types.h:115
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
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:854
#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 
)

Evaluate a device's _CLS method and get its value. The format of returned string is BBSSPP where: BB => Base Class (e.g. 01 => Mass Storage) SS => Sub-Class (e.g. 06 => SATA) PP => Programming Interface (e.g. 01 => AHCI) The returned struture must be freed using uacpi_free_id_string.

Definition at line 621 of file utilities.c.

624{
627 uacpi_package *pkg;
628 uacpi_u8 class_codes[3];
629 uacpi_id_string *id_string;
630
633 );
634 if (ret != UACPI_STATUS_OK)
635 return ret;
636
637 pkg = obj->package;
638 class_codes[0] = extract_package_byte_or_zero(pkg, 0);
639 class_codes[1] = extract_package_byte_or_zero(pkg, 1);
640 class_codes[2] = extract_package_byte_or_zero(pkg, 2);
641
642 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + CLS_REPR_SIZE);
643 if (uacpi_unlikely(id_string == UACPI_NULL)) {
645 goto out;
646 }
647
648 id_string->size = CLS_REPR_SIZE;
649 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
650
652 id_string->value, CLS_REPR_SIZE, "%02X%02X%02X",
653 class_codes[0], class_codes[1], class_codes[2]
654 );
655
656out:
658 *out_id = id_string;
659
661 return ret;
662}
uacpi_i32 uacpi_snprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
Definition: stdlib.c:684
#define uacpi_likely_success(expr)
Definition: status.h:53
uacpi_char * value
Definition: utilities.h:80
uacpi_u32 size
Definition: utilities.h:79
static uacpi_u8 extract_package_byte_or_zero(uacpi_package *pkg, uacpi_size i)
Definition: utilities.c:607
#define CLS_REPR_SIZE
Definition: utilities.c:605

◆ 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 740 of file utilities.c.

744{
745 uacpi_u8 i;
748
749 // We expect either _SxD or _SxW, so increment template[2]
750 for (i = 0; i < num_methods; ++i, template[2]++) {
751 eval_ret = uacpi_eval_typed(
753 );
754 if (eval_ret == UACPI_STATUS_OK) {
756 out_values[i] = obj->integer;
758 continue;
759 }
760
761 out_values[i] = 0xFF;
762 if (uacpi_unlikely(eval_ret != UACPI_STATUS_NOT_FOUND)) {
763 const char *path;
764
767 "failed to evaluate %s.%s: %s",
768 path, template, uacpi_status_to_string(eval_ret)
769 );
771 }
772 }
773
774 return ret;
775}
#define uacpi_warn(...)
Definition: log.h:35
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:60
r parent
Definition: btrfs.c:3010
void uacpi_free_dynamic_string(const uacpi_char *str)
Definition: utilities.c:1148

Referenced by uacpi_get_namespace_node_info().

◆ uacpi_eval_hid()

uacpi_status uacpi_eval_hid ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Evaluate a device's _HID method and get its value. The returned struture must be freed using uacpi_free_id_string.

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
397 "%.4s._HID: empty/invalid EISA ID string (%zu bytes)",
398 name.text, buf->size
399 );
401 break;
402 }
403
405 if (uacpi_unlikely(id == UACPI_NULL)) {
407 break;
408 }
409 id->size = buf->size;
410 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
411
412 uacpi_memcpy(id->value, buf->text, buf->size);
413 id->value[buf->size - 1] = '\0';
414 break;
415 }
416
419
421 if (uacpi_unlikely(id == UACPI_NULL)) {
423 break;
424 }
425 id->size = PNP_ID_LENGTH;
426 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
427
428 uacpi_eisa_id_to_string(hid_ret->integer, id->value);
429 break;
430 }
431
432 uacpi_object_unref(hid_ret);
434 *out_id = id;
435 return ret;
436}
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 
)

Evaluate a device's _STA method and get its value. If this method is not found, the value of 'flags' is set to all ones.

Definition at line 577 of file utilities.c.

578{
580 uacpi_u64 value = 0;
581
583
584 /*
585 * ACPI 6.5 specification:
586 * If a device object (including the processor object) does not have
587 * an _STA object, then OSPM assumes that all of the above bits are
588 * set (i.e., the device is present, enabled, shown in the UI,
589 * and functioning).
590 */
592 value = 0xFFFFFFFF;
594 }
595
596 *flags = value;
597 return ret;
598}
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 
)

Evaluate a device's _UID method and get its value. The returned struture must be freed using uacpi_free_id_string.

Definition at line 664 of file utilities.c.

667{
670 uacpi_id_string *id_string;
672
674 node, "_UID", UACPI_NULL,
676 &obj
677 );
678 if (ret != UACPI_STATUS_OK)
679 return ret;
680
681 if (obj->type == UACPI_OBJECT_STRING) {
682 size = obj->buffer->size;
683 if (uacpi_unlikely(size == 0 || size > 0xE0000000)) {
685
687 "invalid %.4s._UID string size: %u",
688 name.text, size
689 );
691 goto out;
692 }
693 } else {
695 UACPI_NULL, 0, "%"UACPI_PRIu64, UACPI_FMT64(obj->integer)
696 ) + 1;
697 }
698
699 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + size);
700 if (uacpi_unlikely(id_string == UACPI_NULL)) {
702 goto out;
703 }
704
705 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
706 id_string->size = size;
707
708 if (obj->type == UACPI_OBJECT_STRING) {
709 uacpi_memcpy(id_string->value, obj->buffer->text, size);
710 id_string->value[size - 1] = '\0';
711 } else {
713 id_string->value, id_string->size, "%"UACPI_PRIu64,
714 UACPI_FMT64(obj->integer)
715 );
716 }
717
718out:
720 *out_uid = id_string;
721
723 return ret;
724}
#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 
)

Same as uacpi_find_devices_at, except this starts at the root and only matches one hid.

Definition at line 986 of file utilities.c.

989{
990 const uacpi_char *hids[2] = {
992 };
993
994 hids[0] = hid;
995
997}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:264
uacpi_status uacpi_find_devices_at(uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:967

◆ 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 
)

Find all the devices in the namespace starting at 'parent' matching the specified 'hids' (terminated by a UACPI_NULL) against any value from _HID or _CID. Only devices reported as present via _STA are checked. Any matching devices are then passed to the 'cb'.

Definition at line 967 of file utilities.c.

971{
972 struct device_find_ctx ctx = { 0 };
973
975
976 ctx.target_hids = hids;
977 ctx.user = user;
978 ctx.cb = cb;
979
983 );
984}
#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:140
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:78
static uacpi_iteration_decision find_one_device(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: utilities.c:944

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 438 of file utilities.c.

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

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 897 of file utilities.c.

898{
899 if (info == UACPI_NULL)
900 return;
901
902 uacpi_free(info, info->size);
903}

◆ uacpi_free_pci_routing_table()

void uacpi_free_pci_routing_table ( uacpi_pci_routing_table table)

Definition at line 1136 of file utilities.c.

1137{
1138 if (table == UACPI_NULL)
1139 return;
1140
1141 uacpi_free(
1142 table,
1143 sizeof(uacpi_pci_routing_table) +
1144 table->num_entries * sizeof(uacpi_pci_routing_table_entry)
1145 );
1146}
Definition: utilities.h:60

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 569 of file utilities.c.

570{
571 if (list == UACPI_NULL)
572 return;
573
575}

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 
)

Retrieve information about a namespace node. This includes the attached object's type, name, number of parameters (if it's a method), the result of evaluating _ADR, _UID, _CLS, _HID, _CID, as well as _SxD and _SxW.

The returned structure must be freed with uacpi_free_namespace_node_info.

Definition at line 797 of file utilities.c.

800{
805 uacpi_id_string *hid = UACPI_NULL, *uid = UACPI_NULL, *cls = UACPI_NULL;
808 uacpi_u64 adr = 0;
809 uacpi_u8 flags = 0;
810 uacpi_u8 sxd[4], sxw[5];
811
815
816 if (obj->type == UACPI_OBJECT_DEVICE ||
817 obj->type == UACPI_OBJECT_PROCESSOR) {
818 char dstate_method_template[5] = { '_', 'S', '1', 'D', '\0' };
819
824
825 if (uacpi_eval_adr(node, &adr) == UACPI_STATUS_OK)
827
829 node, dstate_method_template, sizeof(sxd), sxd
830 ) == UACPI_STATUS_OK)
832
833 dstate_method_template[2] = '0';
834 dstate_method_template[3] = 'W';
835
837 node, dstate_method_template, sizeof(sxw), sxw
838 ) == UACPI_STATUS_OK)
840 }
841
845 goto out;
846 }
847 info->size = size;
850 info->type = obj->type;
851 info->num_params = info->type == UACPI_OBJECT_METHOD ? obj->method->args : 0;
852
853 info->adr = adr;
855 uacpi_memcpy(info->sxd, sxd, sizeof(sxd));
856 else
857 uacpi_memzero(info->sxd, sizeof(info->sxd));
858
860 uacpi_memcpy(info->sxw, sxw, sizeof(sxw));
861 else
862 uacpi_memzero(info->sxw, sizeof(info->sxw));
863
864 if (cid != UACPI_NULL) {
865 uacpi_u32 i;
866
867 uacpi_memcpy(&info->cid, cid, cid->size + sizeof(*cid));
868 cursor += cid->num_ids * sizeof(uacpi_id_string);
869
870 for (i = 0; i < cid->num_ids; ++i) {
871 info->cid.ids[i].value = cursor;
872 cursor += info->cid.ids[i].size;
873 }
874
876 } else {
877 uacpi_memzero(&info->cid, sizeof(*cid));
878 }
879
880 NODE_INFO_COPY_ID(hid, HID)
883
884out:
886 info->flags = flags;
887 *out_info = info;
888 }
889
894 return ret;
895}
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:119
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:123
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
#define UID
Definition: ext2fs.h:154
static TfClientId cid
Definition: ntuser.h:566
#define NODE_INFO_EVAL_ADD_ID(name)
Definition: utilities.c:777
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:786
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:740
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:600
#define UACPI_NS_NODE_INFO_HAS_ADR
Definition: utilities.h:137
#define UACPI_NS_NODE_INFO_HAS_SXD
Definition: utilities.h:142
#define UACPI_NS_NODE_INFO_HAS_CID
Definition: utilities.h:140
#define UACPI_NS_NODE_INFO_HAS_SXW
Definition: utilities.h:143

◆ 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 1024 of file utilities.c.

1027{
1029 uacpi_object *obj, *entry_obj, *elem_obj;
1030 uacpi_package *table_pkg, *entry_pkg;
1033 uacpi_size size, i;
1034
1036
1040
1043 );
1045 return ret;
1046
1047 table_pkg = obj->package;
1048 if (uacpi_unlikely(table_pkg->count == 0 || table_pkg->count > 1024)) {
1049 uacpi_error("invalid number of _PRT entries: %zu", table_pkg->count);
1052 }
1053
1054 size = table_pkg->count * sizeof(uacpi_pci_routing_table_entry);
1059 }
1060 table->num_entries = table_pkg->count;
1061
1062 for (i = 0; i < table_pkg->count; ++i) {
1063 entry_obj = table_pkg->objects[i];
1064
1065 if (uacpi_unlikely(entry_obj->type != UACPI_OBJECT_PACKAGE)) {
1066 uacpi_error("_PRT sub-object %zu is not a package: %s",
1067 i, uacpi_object_type_to_string(entry_obj->type));
1068 goto out_bad_encoding;
1069 }
1070
1071 entry_pkg = entry_obj->package;
1072 if (uacpi_unlikely(entry_pkg->count != 4)) {
1073 uacpi_error("invalid _PRT sub-package entry count %zu",
1074 entry_pkg->count);
1075 goto out_bad_encoding;
1076 }
1077
1078 entry = &table->entries[i];
1079
1080 elem_obj = entry_pkg->objects[0];
1081 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1082 uacpi_error("invalid _PRT sub-package %zu address type: %s",
1083 i, uacpi_object_type_to_string(elem_obj->type));
1084 goto out_bad_encoding;
1085 }
1086 entry->address = elem_obj->integer;
1087
1088 elem_obj = entry_pkg->objects[1];
1089 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1090 uacpi_error("invalid _PRT sub-package %zu pin type: %s",
1091 i, uacpi_object_type_to_string(elem_obj->type));
1092 goto out_bad_encoding;
1093 }
1094 entry->pin = elem_obj->integer;
1095
1096 elem_obj = entry_pkg->objects[2];
1097 switch (elem_obj->type) {
1100 elem_obj, parent, &entry->source
1101 );
1103 uacpi_error("unable to lookup _PRT source %s: %s",
1104 elem_obj->buffer->text, uacpi_status_to_string(ret));
1105 goto out_bad_encoding;
1106 }
1107 break;
1109 entry->source = UACPI_NULL;
1110 break;
1111 default:
1112 uacpi_error("invalid _PRT sub-package %zu source type: %s",
1113 i, uacpi_object_type_to_string(elem_obj->type));
1114 goto out_bad_encoding;
1115 }
1116
1117 elem_obj = entry_pkg->objects[3];
1118 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1119 uacpi_error("invalid _PRT sub-package %zu source index type: %s",
1120 i, uacpi_object_type_to_string(elem_obj->type));
1121 goto out_bad_encoding;
1122 }
1123 entry->index = elem_obj->integer;
1124 }
1125
1127 *out_table = table;
1128 return UACPI_STATUS_OK;
1129
1130out_bad_encoding:
1134}
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1088
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:1136

◆ 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 999 of file utilities.c.

1000{
1004
1006
1010
1011 arg->integer = model;
1012 args.objects = &arg;
1013 args.count = 1;
1014
1017
1020
1021 return ret;
1022}
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:709
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 = 0 - value;
289
290 *out_value = value;
291 if (max_chars == 0 || c == '\0')
293
294 return ret;
295}
@ 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().