ReactOS 0.4.16-dev-1505-g12fa72a
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 = -((uacpi_i64)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 "%.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}
435
437{
438 if (id == UACPI_NULL)
439 return;
440
441 uacpi_free(id, sizeof(uacpi_id_string) + id->size);
442}
443
446)
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}
559
561{
562 if (list == UACPI_NULL)
563 return;
564
566}
567
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}
590
592{
593 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
594}
595
596#define CLS_REPR_SIZE 7
597
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}
611
614)
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}
654
657)
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}
714
716 uacpi_id_string *id, const uacpi_char *const *ids
717)
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}
728
730 uacpi_namespace_node *parent, uacpi_char *template, uacpi_u8 num_methods,
731 uacpi_u8 *out_values
732)
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}
765
766#define NODE_INFO_EVAL_ADD_ID(name) \
767 if (uacpi_eval_##name(node, &name) == UACPI_STATUS_OK) { \
768 size += name->size; \
769 if (uacpi_unlikely(size < name->size)) { \
770 ret = UACPI_STATUS_AML_BAD_ENCODING; \
771 goto out; \
772 } \
773 }
774
775#define NODE_INFO_COPY_ID(name, flag) \
776 if (name != UACPI_NULL) { \
777 flags |= UACPI_NS_NODE_INFO_HAS_##flag; \
778 info->name.value = cursor; \
779 info->name.size = name->size; \
780 uacpi_memcpy(cursor, name->value, name->size); \
781 cursor += name->size; \
782 } else { \
783 uacpi_memzero(&info->name, sizeof(*name)); \
784 } \
785
788)
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}
885
887{
888 if (info == UACPI_NULL)
889 return;
890
891 uacpi_free(info, info->size);
892}
893
896)
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}
926
928 const uacpi_char *const *target_hids;
929 void *user;
931};
932
935)
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}
954
955
957 uacpi_namespace_node *parent, const uacpi_char *const *hids,
959)
960{
962
963 struct device_find_ctx ctx = {
964 .target_hids = hids,
965 .user = user,
966 .cb = cb,
967 };
968
972 );
973}
974
976 const uacpi_char *hid, uacpi_iteration_callback cb, void *user
977)
978{
979 const uacpi_char *hids[] = {
980 hid, UACPI_NULL
981 };
982
984}
985
987{
991
993
997
998 arg->integer = model;
999 args.objects = &arg;
1000 args.count = 1;
1001
1004
1007
1008 return ret;
1009}
1010
1013)
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}
1122
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}
1134
1136{
1137 if (str == UACPI_NULL)
1138 return;
1139
1140 uacpi_free((void*)str, uacpi_strlen(str) + 1);
1141}
1142
1143#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
const WCHAR * text
Definition: package.c:1794
#define ACPI_STA_RESULT_DEVICE_PRESENT
Definition: acpi.h:987
#define ACPI_STA_RESULT_DEVICE_FUNCTIONING
Definition: acpi.h:990
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
#define uacpi_error(...)
Definition: log.h:21
#define uacpi_warn(...)
Definition: log.h:20
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:661
#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:267
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:58
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
int64_t uacpi_i64
Definition: types.h:27
#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:50
uacpi_iteration_decision
Definition: types.h:28
@ UACPI_ITERATION_DECISION_NEXT_PEER
Definition: types.h:33
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:130
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:129
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:132
@ UACPI_OBJECT_DEVICE_BIT
Definition: types.h:134
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:72
@ UACPI_OBJECT_METHOD
Definition: types.h:113
@ UACPI_OBJECT_STRING
Definition: types.h:107
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:117
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
@ UACPI_OBJECT_PACKAGE
Definition: types.h:109
@ UACPI_OBJECT_INTEGER
Definition: types.h:106
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1079
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
return ret
Definition: mutex.c:146
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 HMODULE MODULEINFO DWORD cb
Definition: module.c:33
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:930
const uacpi_char *const * target_hids
Definition: utilities.c:928
uacpi_size size
Definition: types.h:31
uacpi_char * text
Definition: types.h:29
uacpi_char * value
Definition: utilities.h:76
uacpi_u32 size
Definition: utilities.h:75
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:56
uacpi_u32 num_ids
Definition: utilities.h:88
uacpi_id_string ids[]
Definition: utilities.h:94
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
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:699
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
Definition: dlist.c:348
Definition: pdh_main.c:96
#define NODE_INFO_EVAL_ADD_ID(name)
Definition: utilities.c:766
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:655
uacpi_bool uacpi_device_matches_pnp_id(uacpi_namespace_node *node, const uacpi_char *const *ids)
Definition: utilities.c:894
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
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:715
uacpi_status uacpi_find_devices(const uacpi_char *hid, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:975
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:598
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:568
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:775
#define CLS_REPR_SIZE
Definition: utilities.c:596
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:436
uacpi_status uacpi_get_namespace_node_info(uacpi_namespace_node *node, uacpi_namespace_node_info **out_info)
Definition: utilities.c:786
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:1011
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_cls(uacpi_namespace_node *node, uacpi_id_string **out_id)
Definition: utilities.c:612
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:560
static uacpi_iteration_decision find_one_device(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: utilities.c:933
void uacpi_free_pci_routing_table(uacpi_pci_routing_table *table)
Definition: utilities.c:1123
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:444
void uacpi_free_dynamic_string(const uacpi_char *str)
Definition: utilities.c:1135
uacpi_status uacpi_set_interrupt_model(uacpi_interrupt_model model)
Definition: utilities.c:986
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:591
void uacpi_free_namespace_node_info(uacpi_namespace_node_info *info)
Definition: utilities.c:886
#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_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