ReactOS 0.4.17-dev-683-g0dafdc5
utilities.c
Go to the documentation of this file.
1#include <uacpi/types.h>
2#include <uacpi/status.h>
3#include <uacpi/uacpi.h>
4
9
22};
23
24static const uacpi_u8 ascii_map[256] = {
33 CHAR_TYPE_CONTROL, // -> 8 control codes
34
36
40 CHAR_TYPE_CONTROL | CHAR_TYPE_SPACE, // -> 13 whitespaces
41
59 CHAR_TYPE_CONTROL, // -> 31 control codes
60
61 CHAR_TYPE_SPACE | CHAR_TYPE_BLANK, // 32 space
62
77 CHAR_TYPE_PUNCTUATION, // -> 47 punctuation
78
88 CHAR_TYPE_DIGIT | CHAR_TYPE_HEX_DIGIT, // -> 57 digits
89
96 CHAR_TYPE_PUNCTUATION, // -> 64 punctuation
97
103 CHAR_TYPE_UPPER | CHAR_TYPE_HEX_DIGIT, // -> 70 ABCDEF
104
105 CHAR_TYPE_UPPER, // 71
106 CHAR_TYPE_UPPER, // 72
107 CHAR_TYPE_UPPER, // 73
108 CHAR_TYPE_UPPER, // 74
109 CHAR_TYPE_UPPER, // 75
110 CHAR_TYPE_UPPER, // 76
111 CHAR_TYPE_UPPER, // 77
112 CHAR_TYPE_UPPER, // 78
113 CHAR_TYPE_UPPER, // 79
114 CHAR_TYPE_UPPER, // 80
115 CHAR_TYPE_UPPER, // 81
116 CHAR_TYPE_UPPER, // 82
117 CHAR_TYPE_UPPER, // 83
118 CHAR_TYPE_UPPER, // 84
119 CHAR_TYPE_UPPER, // 85
120 CHAR_TYPE_UPPER, // 86
121 CHAR_TYPE_UPPER, // 87
122 CHAR_TYPE_UPPER, // 88
123 CHAR_TYPE_UPPER, // 89
124 CHAR_TYPE_UPPER, // -> 90 the rest of UPPERCASE alphabet
125
131 CHAR_TYPE_PUNCTUATION, // -> 96 punctuation
132
138 CHAR_TYPE_LOWER | CHAR_TYPE_HEX_DIGIT, // -> 102 abcdef
139
140 CHAR_TYPE_LOWER, // 103
141 CHAR_TYPE_LOWER, // 104
142 CHAR_TYPE_LOWER, // 105
143 CHAR_TYPE_LOWER, // 106
144 CHAR_TYPE_LOWER, // 107
145 CHAR_TYPE_LOWER, // 108
146 CHAR_TYPE_LOWER, // 109
147 CHAR_TYPE_LOWER, // 110
148 CHAR_TYPE_LOWER, // 111
149 CHAR_TYPE_LOWER, // 112
150 CHAR_TYPE_LOWER, // 113
151 CHAR_TYPE_LOWER, // 114
152 CHAR_TYPE_LOWER, // 115
153 CHAR_TYPE_LOWER, // 116
154 CHAR_TYPE_LOWER, // 117
155 CHAR_TYPE_LOWER, // 118
156 CHAR_TYPE_LOWER, // 119
157 CHAR_TYPE_LOWER, // 120
158 CHAR_TYPE_LOWER, // 121
159 CHAR_TYPE_LOWER, // -> 122 the rest of UPPERCASE alphabet
160
164 CHAR_TYPE_PUNCTUATION, // -> 126 punctuation
165
166 CHAR_TYPE_CONTROL // 127 backspace
167};
168
170{
171 return (ascii_map[(uacpi_u8)c] & type) == type;
172}
173
175{
177 return c + ('a' - 'A');
178
179 return c;
180}
181
183 const uacpi_char **str, const uacpi_size *size, uacpi_char *out_char
184)
185{
186 if (*size == 0)
187 return UACPI_FALSE;
188
189 *out_char = **str;
190 return UACPI_TRUE;
191}
192
194 const uacpi_char **str, uacpi_size *size, uacpi_char *out_char
195)
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}
204
207)
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}
218
221)
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}
232
234 const uacpi_char *str, uacpi_size max_chars, enum uacpi_base base,
235 uacpi_u64 *out_value
236)
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}
296
297#ifndef UACPI_BAREBONES_MODE
298
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}
314
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}
322
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}
368
369#define PNP_ID_LENGTH 8
370
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}
437
439{
440 if (id == UACPI_NULL)
441 return;
442
443 uacpi_free(id, sizeof(uacpi_id_string) + id->size);
444}
445
448)
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}
568
570{
571 if (list == UACPI_NULL)
572 return;
573
575}
576
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}
599
601{
602 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
603}
604
605#define CLS_REPR_SIZE 7
606
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}
620
623)
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}
663
666)
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}
725
727 uacpi_id_string *id, const uacpi_char *const *ids
728)
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}
739
741 uacpi_namespace_node *parent, uacpi_char *template, uacpi_u8 num_methods,
742 uacpi_u8 *out_values
743)
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}
776
777#define NODE_INFO_EVAL_ADD_ID(name) \
778 if (uacpi_eval_##name(node, &name) == UACPI_STATUS_OK) { \
779 size += name->size; \
780 if (uacpi_unlikely(size < name->size)) { \
781 ret = UACPI_STATUS_AML_BAD_ENCODING; \
782 goto out; \
783 } \
784 }
785
786#define NODE_INFO_COPY_ID(name, flag) \
787 if (name != UACPI_NULL) { \
788 flags |= UACPI_NS_NODE_INFO_HAS_##flag; \
789 info->name.value = cursor; \
790 info->name.size = name->size; \
791 uacpi_memcpy(cursor, name->value, name->size); \
792 cursor += name->size; \
793 } else { \
794 uacpi_memzero(&info->name, sizeof(*name)); \
795 } \
796
799)
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}
896
898{
899 if (info == UACPI_NULL)
900 return;
901
902 uacpi_free(info, info->size);
903}
904
907)
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}
937
939 const uacpi_char *const *target_hids;
940 void *user;
942};
943
946)
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}
965
966
968 uacpi_namespace_node *parent, const uacpi_char *const *hids,
970)
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}
985
987 const uacpi_char *hid, uacpi_iteration_callback cb, void *user
988)
989{
990 const uacpi_char *hids[2] = {
992 };
993
994 hids[0] = hid;
995
997}
998
1000{
1004
1006
1010
1011 arg->integer = model;
1012 args.objects = &arg;
1013 args.count = 1;
1014
1017
1020
1021 return ret;
1022}
1023
1026)
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}
1135
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}
1147
1149{
1150 if (str == UACPI_NULL)
1151 return;
1152
1153 uacpi_free((void*)str, uacpi_strlen(str) + 1);
1154}
1155
1156#endif // !UACPI_BAREBONES_MODE
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define to_lower(c)
Definition: astoll.c:46
void user(int argc, const char *argv[])
Definition: cmds.c:1350
Definition: list.h:37
size_type size() const
Definition: _list.h:379
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
#define ACPI_STA_RESULT_DEVICE_PRESENT
Definition: acpi.h:991
#define ACPI_STA_RESULT_DEVICE_FUNCTIONING
Definition: acpi.h:994
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
#define uacpi_error(...)
Definition: log.h:36
#define uacpi_warn(...)
Definition: log.h:35
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
Definition: namespace.c:646
uacpi_i32 uacpi_snprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
Definition: stdlib.c:684
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
uacpi_i32 uacpi_strcmp(const uacpi_char *lhs, const uacpi_char *rhs)
Definition: stdlib.c:96
#define uacpi_memcpy
Definition: stdlib.h:34
#define uacpi_free(mem, _)
Definition: stdlib.h:96
uacpi_size uacpi_strlen(const uacpi_char *str)
Definition: stdlib.c:72
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
uacpi_iteration_decision(* uacpi_iteration_callback)(void *user, uacpi_namespace_node *node, uacpi_u32 node_depth)
Definition: namespace.h:98
#define UACPI_MAX_DEPTH_ANY
Definition: namespace.h:102
const uacpi_char * uacpi_namespace_node_generate_absolute_path(const uacpi_namespace_node *node)
Definition: namespace.c:1034
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:264
uacpi_object_name uacpi_namespace_node_name(const uacpi_namespace_node *node)
Definition: namespace.c:752
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
#define uacpi_unlikely(expr)
Definition: compiler.h:88
size_t uacpi_size
Definition: types.h:37
uint32_t uacpi_u32
Definition: types.h:21
bool uacpi_bool
Definition: types.h:31
#define UACPI_FALSE
Definition: types.h:30
uint64_t uacpi_u64
Definition: types.h:22
char uacpi_char
Definition: types.h:44
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
#define UACPI_FMT64(val)
Definition: types.h:62
#define UACPI_TRUE
Definition: types.h:29
#define UACPI_PRIu64
Definition: types.h:59
#define uacpi_likely_success(expr)
Definition: status.h:53
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_AML_INCOMPATIBLE_OBJECT_TYPE
Definition: status.h:38
@ UACPI_STATUS_AML_BAD_ENCODING
Definition: status.h:39
@ UACPI_STATUS_OK
Definition: status.h:11
const uacpi_char * uacpi_status_to_string(uacpi_status)
Definition: uacpi.c:60
uacpi_iteration_decision
Definition: types.h:28
@ UACPI_ITERATION_DECISION_NEXT_PEER
Definition: types.h:39
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:136
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:135
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:138
@ UACPI_OBJECT_DEVICE_BIT
Definition: types.h:140
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:78
@ UACPI_OBJECT_METHOD
Definition: types.h:119
@ UACPI_OBJECT_STRING
Definition: types.h:113
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:123
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
@ UACPI_OBJECT_PACKAGE
Definition: types.h:115
@ UACPI_OBJECT_INTEGER
Definition: types.h:112
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1088
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
#define UID
Definition: ext2fs.h:154
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint * ids
Definition: glext.h:5907
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
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
const char cursor[]
Definition: icontest.c:13
static TfClientId cid
uacpi_base
Definition: utilities.h:30
@ 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
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
uint32_t entry
Definition: isohybrid.c:63
#define c
Definition: ke_i.h:80
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
static unsigned __int64 next
Definition: rand_nt.c:6
#define list
Definition: rosglue.h:35
const WCHAR * str
#define args
Definition: format.c:66
Definition: ntuser.h:566
Definition: match.c:390
char * value
Definition: compiler.c:67
uacpi_iteration_callback cb
Definition: utilities.c:941
const uacpi_char *const * target_hids
Definition: utilities.c:939
Definition: name.c:39
uacpi_size size
Definition: types.h:31
uacpi_char * text
Definition: types.h:29
uacpi_char * value
Definition: utilities.h:80
uacpi_u32 size
Definition: utilities.h:79
uacpi_u8 type
Definition: types.h:249
uacpi_package * package
Definition: types.h:254
uacpi_u64 integer
Definition: types.h:253
uacpi_buffer * buffer
Definition: types.h:258
uacpi_object ** objects
Definition: types.h:36
uacpi_size count
Definition: types.h:37
Definition: utilities.h:60
uacpi_u32 num_ids
Definition: utilities.h:92
uacpi_id_string ids[]
Definition: utilities.h:98
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
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:709
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
Definition: dlist.c:348
Definition: pdh_main.c:96
#define NODE_INFO_EVAL_ADD_ID(name)
Definition: utilities.c:777
static uacpi_bool is_char(uacpi_char c, enum char_type type)
Definition: utilities.c:169
#define PNP_ID_LENGTH
Definition: utilities.c:369
static uacpi_bool peek_one(const uacpi_char **str, const uacpi_size *size, uacpi_char *out_char)
Definition: utilities.c:182
uacpi_status uacpi_eval_uid(uacpi_namespace_node *node, uacpi_id_string **out_uid)
Definition: utilities.c:664
uacpi_bool uacpi_device_matches_pnp_id(uacpi_namespace_node *node, const uacpi_char *const *ids)
Definition: utilities.c:905
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
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:726
uacpi_status uacpi_find_devices(const uacpi_char *hid, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:986
static uacpi_bool consume_if_equals(const uacpi_char **str, uacpi_size *size, uacpi_char c)
Definition: utilities.c:219
static uacpi_u8 extract_package_byte_or_zero(uacpi_package *pkg, uacpi_size i)
Definition: utilities.c:607
uacpi_status uacpi_string_to_integer(const uacpi_char *str, uacpi_size max_chars, enum uacpi_base base, uacpi_u64 *out_value)
Definition: utilities.c:233
static uacpi_bool is_valid_name_byte(uacpi_u8 c)
Definition: utilities.c:299
static uacpi_bool consume_one(const uacpi_char **str, uacpi_size *size, uacpi_char *out_char)
Definition: utilities.c:193
uacpi_status uacpi_eval_sta(uacpi_namespace_node *node, uacpi_u32 *flags)
Definition: utilities.c:577
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:786
#define CLS_REPR_SIZE
Definition: utilities.c:605
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:438
uacpi_status uacpi_get_namespace_node_info(uacpi_namespace_node *node, uacpi_namespace_node_info **out_info)
Definition: utilities.c:797
uacpi_bool uacpi_is_valid_nameseg(uacpi_u8 *nameseg)
Definition: utilities.c:315
static uacpi_bool consume_if(const uacpi_char **str, uacpi_size *size, enum char_type type)
Definition: utilities.c:205
static const uacpi_u8 ascii_map[256]
Definition: utilities.c:24
uacpi_status uacpi_get_pci_routing_table(uacpi_namespace_node *parent, uacpi_pci_routing_table **out_table)
Definition: utilities.c:1024
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_cls(uacpi_namespace_node *node, uacpi_id_string **out_id)
Definition: utilities.c:621
void uacpi_eisa_id_to_string(uacpi_u32 id, uacpi_char *out_string)
Definition: utilities.c:323
void uacpi_free_pnp_id_list(uacpi_pnp_id_list *list)
Definition: utilities.c:569
static uacpi_iteration_decision find_one_device(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: utilities.c:944
void uacpi_free_pci_routing_table(uacpi_pci_routing_table *table)
Definition: utilities.c:1136
uacpi_status uacpi_eval_hid(uacpi_namespace_node *node, uacpi_id_string **out_id)
Definition: utilities.c:371
char_type
Definition: utilities.c:10
@ 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
uacpi_status uacpi_eval_cid(uacpi_namespace_node *node, uacpi_pnp_id_list **out_list)
Definition: utilities.c:446
void uacpi_free_dynamic_string(const uacpi_char *str)
Definition: utilities.c:1148
uacpi_status uacpi_set_interrupt_model(uacpi_interrupt_model model)
Definition: utilities.c:999
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:600
void uacpi_free_namespace_node_info(uacpi_namespace_node_info *info)
Definition: utilities.c:897
#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_interrupt_model
Definition: utilities.h:48
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
void * arg
Definition: msvc.h:10