ReactOS 0.4.17-dev-117-g313be0c
types.c
Go to the documentation of this file.
1#include <uacpi/types.h>
9#include <uacpi/kernel_api.h>
10
13)
14{
15 switch (space) {
17 return "SystemMemory";
19 return "SystemIO";
21 return "PCI_Config";
23 return "EmbeddedControl";
25 return "SMBus";
27 return "SystemCMOS";
29 return "PciBarTarget";
31 return "IPMI";
33 return "GeneralPurposeIO";
35 return "GenericSerialBus";
37 return "PCC";
39 return "PlatformRtMechanism";
41 return "FFixedHW";
43 return "TableData";
44 default:
45 return "<vendor specific>";
46 }
47}
48
49#ifndef UACPI_BAREBONES_MODE
50
52{
53 switch (type) {
55 return "Uninitialized";
57 return "Integer";
59 return "String";
61 return "Buffer";
63 return "Package";
65 return "Field Unit";
67 return "Device";
69 return "Event";
71 return "Reference";
73 return "Buffer Index";
75 return "Method";
77 return "Mutex";
79 return "Operation Region";
81 return "Power Resource";
83 return "Processor";
85 return "Thermal Zone";
87 return "Buffer Field";
89 return "Debug";
90 default:
91 return "<Invalid type>";
92 }
93}
94
96{
98
101 return UACPI_FALSE;
102
104
105 if (initial_size) {
106 buf->data = uacpi_kernel_alloc(initial_size);
107 if (uacpi_unlikely(buf->data == UACPI_NULL)) {
108 uacpi_free(buf, sizeof(*buf));
109 return UACPI_FALSE;
110 }
111
112 buf->size = initial_size;
113 }
114
115 obj->buffer = buf;
116 return UACPI_TRUE;
117}
118
120{
121 return buffer_alloc(object, 0);
122}
123
125 uacpi_package *pkg, uacpi_size num_elements,
126 enum uacpi_prealloc_objects prealloc_objects
127)
128{
130
131 if (uacpi_unlikely(num_elements == 0))
132 return UACPI_TRUE;
133
135 num_elements * sizeof(uacpi_handle)
136 );
137 if (uacpi_unlikely(pkg->objects == UACPI_NULL))
138 return UACPI_FALSE;
139
140 pkg->count = num_elements;
141
142 if (prealloc_objects == UACPI_PREALLOC_OBJECTS_YES) {
143 for (i = 0; i < num_elements; ++i) {
145
146 if (uacpi_unlikely(pkg->objects[i] == UACPI_NULL))
147 return UACPI_FALSE;
148 }
149 }
150
151 return UACPI_TRUE;
152}
153
155 uacpi_object *obj, uacpi_size initial_size,
157)
158{
159 uacpi_package *pkg;
160
162 if (uacpi_unlikely(pkg == UACPI_NULL))
163 return UACPI_FALSE;
164
166
167 if (uacpi_unlikely(!uacpi_package_fill(pkg, initial_size, prealloc))) {
168 uacpi_free(pkg, sizeof(*pkg));
169 return UACPI_FALSE;
170 }
171
172 obj->package = pkg;
173 return UACPI_TRUE;
174}
175
177{
178 return package_alloc(object, 0, UACPI_PREALLOC_OBJECTS_NO);
179}
180
182{
184
187 return UACPI_NULL;
188
190
192 if (mutex->handle == UACPI_NULL) {
193 uacpi_free(mutex, sizeof(*mutex));
194 return UACPI_NULL;
195 }
196
198 return mutex;
199}
200
202{
203 obj->mutex = uacpi_create_mutex();
204 return obj->mutex != UACPI_NULL;
205}
206
208{
210
211 event = uacpi_kernel_alloc_zeroed(sizeof(uacpi_event));
213 return UACPI_FALSE;
214
215 event->handle = uacpi_kernel_create_event();
216 if (event->handle == UACPI_NULL) {
217 uacpi_free(event, sizeof(*event));
218 return UACPI_FALSE;
219 }
220
222 obj->event = event;
223
224 return UACPI_TRUE;
225}
226
228{
230
233 return UACPI_FALSE;
234
236 obj->method = method;
237
238 return UACPI_TRUE;
239}
240
242{
243 uacpi_operation_region *op_region;
244
245 op_region = uacpi_kernel_alloc_zeroed(sizeof(*op_region));
246 if (uacpi_unlikely(op_region == UACPI_NULL))
247 return UACPI_FALSE;
248
249 uacpi_shareable_init(op_region);
250 obj->op_region = op_region;
251
252 return UACPI_TRUE;
253}
254
256{
257 uacpi_field_unit *field_unit;
258
259 field_unit = uacpi_kernel_alloc_zeroed(sizeof(*field_unit));
260 if (uacpi_unlikely(field_unit == UACPI_NULL))
261 return UACPI_FALSE;
262
263 uacpi_shareable_init(field_unit);
264 obj->field_unit = field_unit;
265
266 return UACPI_TRUE;
267}
268
270{
271 uacpi_processor *processor;
272
273 processor = uacpi_kernel_alloc_zeroed(sizeof(*processor));
274 if (uacpi_unlikely(processor == UACPI_NULL))
275 return UACPI_FALSE;
276
277 uacpi_shareable_init(processor);
278 obj->processor = processor;
279
280 return UACPI_TRUE;
281}
282
284{
286
289 return UACPI_FALSE;
290
292 obj->device = device;
293
294 return UACPI_TRUE;
295}
296
298{
299 uacpi_thermal_zone *thermal_zone;
300
301 thermal_zone = uacpi_kernel_alloc_zeroed(sizeof(*thermal_zone));
302 if (uacpi_unlikely(thermal_zone == UACPI_NULL))
303 return UACPI_FALSE;
304
305 uacpi_shareable_init(thermal_zone);
306 obj->thermal_zone = thermal_zone;
307
308 return UACPI_TRUE;
309}
310
312
325};
326
328{
331
334 return ret;
335
337 ret->type = type;
338
340 if (ctor == UACPI_NULL)
341 return ret;
342
343 if (uacpi_unlikely(!ctor(ret))) {
344 uacpi_free(ret, sizeof(*ret));
345 return UACPI_NULL;
346 }
347
348 return ret;
349}
350
352{
354
355 if (buf->data != UACPI_NULL)
356 /*
357 * If buffer has a size of 0 but a valid data pointer it's probably an
358 * "empty" buffer allocated by the interpreter in make_null_buffer
359 * and its real size is actually 1.
360 */
361 uacpi_free(buf->data, UACPI_MAX(buf->size, 1));
362
363 uacpi_free(buf, sizeof(*buf));
364}
365
368
370{
372
373 slot = free_queue_alloc(queue);
375 return UACPI_FALSE;
376
377 *slot = pkg;
378 return UACPI_TRUE;
379}
380
381static void free_object(uacpi_object *obj);
382
383// No references allowed here, only plain objects
384static void free_plain_no_recurse(uacpi_object *obj, struct free_queue *queue)
385{
386 switch (obj->type) {
388 if (uacpi_shareable_unref(obj->package) > 1)
389 break;
390
392 obj->package))) {
394 "unable to free nested package @%p: not enough memory\n",
395 obj->package
396 );
397 }
398
399 // Don't call free_object here as that will recurse
400 uacpi_free(obj, sizeof(*obj));
401 break;
402 default:
403 /*
404 * This call is guaranteed to not recurse further as we handle
405 * recursive cases elsewhere explicitly.
406 */
408 }
409}
410
411static void unref_plain_no_recurse(uacpi_object *obj, struct free_queue *queue)
412{
413 if (uacpi_shareable_unref(obj) > 1)
414 return;
415
417}
418
419static void unref_chain_no_recurse(uacpi_object *obj, struct free_queue *queue)
420{
421 uacpi_object *next_obj = UACPI_NULL;
422
423 while (obj) {
424 if (obj->type == UACPI_OBJECT_REFERENCE)
425 next_obj = obj->inner_object;
426
427 if (uacpi_shareable_unref(obj) > 1)
428 goto do_next;
429
430 if (obj->type == UACPI_OBJECT_REFERENCE) {
431 uacpi_free(obj, sizeof(*obj));
432 } else {
434 }
435
436 do_next:
437 obj = next_obj;
438 next_obj = UACPI_NULL;
439 }
440}
441
442static void unref_object_no_recurse(uacpi_object *obj, struct free_queue *queue)
443{
444 if (obj->type == UACPI_OBJECT_REFERENCE) {
446 return;
447 }
448
450}
451
453{
454 struct free_queue queue = { 0 };
455 uacpi_package *pkg = handle;
458
459 free_queue_push(&queue, pkg);
460
461 while (free_queue_size(&queue) != 0) {
462 pkg = *free_queue_last(&queue);
463 free_queue_pop(&queue);
464
465 /*
466 * 1. Unref/free every object in the package. Note that this might add
467 * even more packages into the free queue.
468 */
469 for (i = 0; i < pkg->count; ++i) {
470 obj = pkg->objects[i];
472 }
473
474 // 2. Release the object array
475 uacpi_free(pkg->objects, sizeof(*pkg->objects) * pkg->count);
476
477 // 3. Release the package itself
478 uacpi_free(pkg, sizeof(*pkg));
479 }
480
481 free_queue_clear(&queue);
482}
483
485{
487
489 uacpi_free(mutex, sizeof(*mutex));
490}
491
493{
494 if (mutex == UACPI_NULL)
495 return;
496
498}
499
501{
502 uacpi_event *event = handle;
503
505 uacpi_free(event, sizeof(*event));
506}
507
509{
511 uacpi_free(handler, sizeof(*handler));
512}
513
516)
517{
518 uacpi_address_space_handler *next_handler;
519
520 while (handler) {
521 next_handler = handler->next;
524 );
525 handler = next_handler;
526 }
527}
528
530{
531 uacpi_device_notify_handler *next_handler;
532
533 while (handler) {
534 next_handler = handler->next;
535 uacpi_free(handler, sizeof(*handler));
536 handler = next_handler;
537 }
538}
539
541{
543
544 free_address_space_handlers(handlers->address_space_head);
546}
547
549{
552 );
553}
554
556{
557 uacpi_operation_region *op_region = handle;
558
559 if (uacpi_unlikely(op_region->handler != UACPI_NULL)) {
561 "BUG: attempting to free an opregion@%p with a handler attached\n",
562 op_region
563 );
564 }
565
566 switch (op_region->space) {
568 uacpi_free(op_region->internal_buffer, op_region->length);
569 break;
572 &(struct uacpi_table) { .index = op_region->table_idx }
573 );
574 break;
575 default:
576 break;
577 }
578
579 uacpi_free(op_region, sizeof(*op_region));
580}
581
583{
586 uacpi_free(device, sizeof(*device));
587}
588
590{
591 uacpi_processor *processor = handle;
592 free_handlers(processor);
593 uacpi_free(processor, sizeof(*processor));
594}
595
597{
598 uacpi_thermal_zone *thermal_zone = handle;
599 free_handlers(thermal_zone);
600 uacpi_free(thermal_zone, sizeof(*thermal_zone));
601}
602
604{
605 uacpi_field_unit *field_unit = handle;
606
607 if (field_unit->connection)
608 uacpi_object_unref(field_unit->connection);
609
610 switch (field_unit->kind) {
613 break;
618 );
619 break;
622 field_unit->index, free_field_unit
623 );
625 field_unit->data, free_field_unit
626 );
627 break;
628 default:
629 break;
630 }
631
632 uacpi_free(field_unit, sizeof(*field_unit));
633}
634
636{
638
640 method->mutex, free_mutex
641 );
642
643 if (!method->native_call && method->owns_code)
644 uacpi_free(method->code, method->size);
645 uacpi_free(method, sizeof(*method));
646}
647
649{
651}
652
654{
655 switch (obj->type) {
659 break;
661 uacpi_shareable_unref_and_delete_if_last(obj->buffer_field.backing,
663 break;
667 break;
669 uacpi_method_unref(obj->method);
670 break;
674 break;
678 break;
680 uacpi_mutex_unref(obj->mutex);
681 break;
684 free_event);
685 break;
689 break;
693 break;
697 break;
701 break;
702 default:
703 break;
704 }
705}
706
708{
710 uacpi_free(obj, sizeof(*obj));
711}
712
714{
715 uacpi_warn("object refcount bug, marking chain @%p as bugged\n", obj);
716
717 while (obj) {
719
720 if (obj->type == UACPI_OBJECT_REFERENCE)
721 obj = obj->inner_object;
722 else
723 obj = UACPI_NULL;
724 }
725}
726
728{
729 while (obj) {
731
732 if (obj->type == UACPI_OBJECT_REFERENCE)
733 obj = obj->inner_object;
734 else
735 obj = UACPI_NULL;
736 }
737}
738
740{
741 uacpi_object *next_obj = UACPI_NULL;
742
743 while (obj) {
744 if (obj->type == UACPI_OBJECT_REFERENCE)
745 next_obj = obj->inner_object;
746
749
750 obj = next_obj;
751 next_obj = UACPI_NULL;
752 }
753}
754
756{
757 uacpi_object *this_obj = obj;
758
759 if (!obj)
760 return;
761
762 while (obj) {
764 return;
765
767
768 if (obj->type == UACPI_OBJECT_REFERENCE) {
769 obj = obj->inner_object;
770 } else {
771 obj = UACPI_NULL;
772 }
773 }
774
775 if (uacpi_shareable_refcount(this_obj) == 0)
776 free_chain(this_obj);
777}
778
780 uacpi_object *obj, uacpi_size buf_size,
781 const void *src, uacpi_size src_size
782)
783{
784 if (uacpi_unlikely(!buffer_alloc(obj, buf_size)))
786
787 uacpi_memcpy_zerout(obj->buffer->data, src, buf_size, src_size);
788 return UACPI_STATUS_OK;
789}
790
792 enum uacpi_assign_behavior behavior)
793{
794 if (behavior == UACPI_ASSIGN_BEHAVIOR_SHALLOW_COPY) {
795 dst->buffer = src->buffer;
796 uacpi_shareable_ref(dst->buffer);
797 return UACPI_STATUS_OK;
798 }
799
800 return buffer_alloc_and_store(dst, src->buffer->size,
801 src->buffer->data, src->buffer->size);
802}
803
807};
808
809DYNAMIC_ARRAY_WITH_INLINE_STORAGE(pkg_copy_reqs, struct pkg_copy_req, 2)
811 pkg_copy_reqs, struct pkg_copy_req, static
812)
813
814static uacpi_bool pkg_copy_reqs_push(
815 struct pkg_copy_reqs *reqs,
817)
818{
819 struct pkg_copy_req *req;
820
821 req = pkg_copy_reqs_alloc(reqs);
822 if (uacpi_unlikely(req == UACPI_NULL))
823 return UACPI_FALSE;
824
825 req->dst = dst;
826 req->src = pkg;
827
828 return UACPI_TRUE;
829}
830
833 struct pkg_copy_reqs *reqs
834)
835{
837 uacpi_package *dst_package;
838
839 if (uacpi_unlikely(!package_alloc(dst, src->count,
842
844 dst_package = dst->package;
845
846 for (i = 0; i < src->count; ++i) {
847 uacpi_status st;
848 uacpi_object *src_obj = src->objects[i];
849 uacpi_object *dst_obj = dst_package->objects[i];
850
851 // Don't copy the internal package index reference
852 if (src_obj->type == UACPI_OBJECT_REFERENCE &&
854 src_obj = src_obj->inner_object;
855
856 if (src_obj->type == UACPI_OBJECT_PACKAGE) {
858
859 ret = pkg_copy_reqs_push(reqs, dst_obj, src_obj->package);
860 if (uacpi_unlikely(!ret))
862
863 continue;
864 }
865
866 st = uacpi_object_assign(dst_obj, src_obj,
868 if (uacpi_unlikely_error(st))
869 return st;
870 }
871
872 return UACPI_STATUS_OK;
873}
874
876{
878 struct pkg_copy_reqs reqs = { 0 };
879
880 pkg_copy_reqs_push(&reqs, dst, src->package);
881
882 while (pkg_copy_reqs_size(&reqs) != 0) {
883 struct pkg_copy_req req;
884
885 req = *pkg_copy_reqs_last(&reqs);
886 pkg_copy_reqs_pop(&reqs);
887
888 ret = deep_copy_package_no_recurse(req.dst, req.src, &reqs);
890 break;
891 }
892
893 pkg_copy_reqs_clear(&reqs);
894 return ret;
895}
896
898 enum uacpi_assign_behavior behavior)
899{
900 if (behavior == UACPI_ASSIGN_BEHAVIOR_DEEP_COPY) {
902 dst->mutex->sync_level = src->mutex->sync_level;
903 return UACPI_STATUS_OK;
904 }
905
907 }
908
909 dst->mutex = src->mutex;
910 uacpi_shareable_ref(dst->mutex);
911
912 return UACPI_STATUS_OK;
913}
914
916 enum uacpi_assign_behavior behavior)
917{
918 if (behavior == UACPI_ASSIGN_BEHAVIOR_DEEP_COPY) {
920 return UACPI_STATUS_OK;
921
923 }
924
925 dst->event = src->event;
926 uacpi_shareable_ref(dst->event);
927
928 return UACPI_STATUS_OK;
929}
930
932 enum uacpi_assign_behavior behavior)
933{
934 if (behavior == UACPI_ASSIGN_BEHAVIOR_SHALLOW_COPY) {
935 dst->package = src->package;
936 uacpi_shareable_ref(dst->package);
937 return UACPI_STATUS_OK;
938 }
939
940 return deep_copy_package(dst, src);
941}
942
944{
945 uacpi_u32 refs_to_add;
946
947 parent->inner_object = child;
948
951 return;
952 }
953
954 refs_to_add = uacpi_shareable_refcount(parent);
955 while (refs_to_add--)
957}
958
960{
961 uacpi_u32 refs_to_remove;
963
964 child = parent->inner_object;
965 parent->inner_object = UACPI_NULL;
966
968 return;
969
970 refs_to_remove = uacpi_shareable_refcount(parent);
971 while (refs_to_remove--)
973}
974
976{
977 return obj->type;
978}
979
981{
982 return (1u << obj->type);
983}
984
986{
987 return obj->type == type;
988}
989
992)
993{
994 return (uacpi_object_get_type_bit(obj) & type_mask) != 0;
995}
996
997#define TYPE_CHECK_USER_OBJ_RET(obj, type_bits, ret) \
998 do { \
999 if (uacpi_unlikely(obj == UACPI_NULL || \
1000 !uacpi_object_is_one_of(obj, type_bits))) \
1001 return ret; \
1002 } while (0)
1003
1004#define TYPE_CHECK_USER_OBJ(obj, type_bits) \
1005 TYPE_CHECK_USER_OBJ_RET(obj, type_bits, UACPI_STATUS_INVALID_ARGUMENT)
1006
1007#define ENSURE_VALID_USER_OBJ_RET(obj, ret) \
1008 do { \
1009 if (uacpi_unlikely(obj == UACPI_NULL)) \
1010 return ret; \
1011 } while (0)
1012
1013#define ENSURE_VALID_USER_OBJ(obj) \
1014 ENSURE_VALID_USER_OBJ_RET(obj, UACPI_STATUS_INVALID_ARGUMENT)
1015
1017{
1019
1020 *out = obj->integer;
1021 return UACPI_STATUS_OK;
1022}
1023
1025{
1027
1029 .type = UACPI_OBJECT_INTEGER,
1030 .integer = value,
1032}
1033
1035{
1036 out_view->bytes = buf->byte_data;
1037 out_view->length = buf->size;
1038}
1039
1042)
1043{
1045
1046 uacpi_buffer_to_view(obj->buffer, out);
1047 return UACPI_STATUS_OK;
1048}
1049
1052)
1053{
1056 );
1057}
1058
1060{
1063 );
1064}
1065
1067{
1070 );
1071}
1072
1074{
1076 return obj->flags == UACPI_STRING_KIND_PATH;
1077}
1078
1081 uacpi_namespace_node **out_node
1082)
1083{
1086
1089
1091 scope, obj->buffer->text, &node
1092 );
1094 *out_node = node;
1095 return ret;
1096}
1097
1100)
1101{
1103 uacpi_object tmp_obj = {
1104 .type = type,
1105 };
1106 uacpi_size dst_buf_size = in.length;
1107
1109
1110 if (type == UACPI_OBJECT_STRING && (in.length == 0 ||
1111 in.const_bytes[in.length - 1] != 0x00))
1112 dst_buf_size++;
1113
1115 &tmp_obj, dst_buf_size, in.const_bytes, in.length
1116 );
1118 return ret;
1119
1122 );
1124
1125 return ret;
1126}
1127
1129{
1131}
1132
1134{
1136}
1137
1139{
1141}
1142
1145)
1146{
1148 uacpi_u8 bitness;
1150
1151 ret = uacpi_get_aml_bitness(&bitness);
1153 return ret;
1154
1155 switch (behavior) {
1158 if (bitness == 32 && value > 0xFFFFFFFF) {
1159 if (behavior == UACPI_OVERFLOW_DISALLOW)
1161
1162 value &= 0xFFFFFFFF;
1163 }
1169
1170 *out_obj = obj;
1171 return ret;
1172 default:
1174 }
1175}
1176
1178{
1180
1183 return obj;
1184
1185 obj->integer = value;
1186 return obj;
1187}
1188
1191)
1192{
1195
1198 return UACPI_NULL;
1199
1203 return UACPI_NULL;
1204 }
1205
1206 return obj;
1207}
1208
1210{
1212}
1213
1215{
1217}
1218
1220{
1222 .const_text = str,
1223 .length = uacpi_strlen(str) + 1,
1224 });
1225}
1226
1229)
1230{
1232
1233 out->objects = obj->package->objects;
1234 out->count = obj->package->count;
1235 return UACPI_STATUS_OK;
1236}
1237
1239{
1241
1243
1246 return UACPI_NULL;
1247
1250
1251 return obj;
1252}
1253
1256)
1257{
1259
1262
1263 // First clear out the object
1267 );
1269 return ret;
1270
1274
1275 return UACPI_STATUS_OK;
1276}
1277
1280)
1281{
1283
1284 *out = obj->inner_object;
1286
1287 return UACPI_STATUS_OK;
1288}
1289
1292)
1293{
1295
1296 out->id = obj->processor->id;
1297 out->block_address = obj->processor->block_address;
1298 out->block_length = obj->processor->block_length;
1299 return UACPI_STATUS_OK;
1300}
1301
1304)
1305{
1307
1308 out->system_level = obj->power_resource.system_level;
1309 out->resource_order = obj->power_resource.resource_order;
1310 return UACPI_STATUS_OK;
1311}
1312
1315)
1316{
1318 uacpi_size i;
1319 uacpi_object tmp_obj = {
1321 };
1322
1324
1325 if (uacpi_unlikely(!package_alloc(&tmp_obj, in.count,
1328
1329 obj->type = UACPI_OBJECT_PACKAGE;
1330
1331 for (i = 0; i < in.count; ++i) {
1332 tmp_obj.package->objects[i] = in.objects[i];
1333 uacpi_object_ref(tmp_obj.package->objects[i]);
1334 }
1335
1338
1339 return ret;
1340}
1341
1343{
1346
1349 return obj;
1350
1354 return UACPI_NULL;
1355 }
1356
1357 return obj;
1358}
1359
1361 enum uacpi_assign_behavior behavior)
1362{
1364
1365 if (src == dst)
1366 return ret;
1367
1368 switch (dst->type) {
1371 break;
1376 case UACPI_OBJECT_MUTEX:
1377 case UACPI_OBJECT_EVENT:
1382 break;
1383 default:
1384 break;
1385 }
1386
1387 switch (src->type) {
1389 case UACPI_OBJECT_DEBUG:
1390 break;
1393 dst->flags = src->flags;
1394 ret = assign_buffer(dst, src, behavior);
1395 break;
1397 dst->buffer_field = src->buffer_field;
1398 uacpi_shareable_ref(dst->buffer_field.backing);
1399 break;
1401 dst->buffer_index = src->buffer_index;
1402 uacpi_shareable_ref(dst->buffer_index.buffer);
1403 break;
1405 dst->integer = src->integer;
1406 break;
1408 dst->method = src->method;
1409 uacpi_shareable_ref(dst->method);
1410 break;
1411 case UACPI_OBJECT_MUTEX:
1412 ret = assign_mutex(dst, src, behavior);
1413 break;
1414 case UACPI_OBJECT_EVENT:
1415 ret = assign_event(dst, src, behavior);
1416 break;
1418 dst->op_region = src->op_region;
1419 uacpi_shareable_ref(dst->op_region);
1420 break;
1422 ret = assign_package(dst, src, behavior);
1423 break;
1425 dst->field_unit = src->field_unit;
1426 uacpi_shareable_ref(dst->field_unit);
1427 break;
1429 uacpi_object_attach_child(dst, src->inner_object);
1430 break;
1432 dst->processor = src->processor;
1433 uacpi_shareable_ref(dst->processor);
1434 break;
1436 dst->device = src->device;
1437 uacpi_shareable_ref(dst->device);
1438 break;
1440 dst->thermal_zone = src->thermal_zone;
1441 uacpi_shareable_ref(dst->thermal_zone);
1442 break;
1443 default:
1445 }
1446
1447 if (ret == UACPI_STATUS_OK)
1448 dst->type = src->type;
1449
1450 return ret;
1451}
1452
1455)
1456{
1458
1461 return ret;
1462
1463 ret->flags = kind;
1465 return ret;
1466}
1467
1469{
1470 for (;;) {
1471 if (object->type != UACPI_OBJECT_REFERENCE ||
1474 return object;
1475
1476 object = object->inner_object;
1477 }
1478}
1479
1480#endif // !UACPI_BAREBONES_MODE
#define UACPI_THREAD_ID_NONE
Definition: arch_helpers.h:35
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool prealloc
Definition: btrfs_drv.h:1364
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
method
Definition: dragdrop.c:54
#define uacpi_warn(...)
Definition: log.h:20
void uacpi_namespace_node_unref(uacpi_namespace_node *node)
Definition: namespace.c:297
#define UACPI_MAX(x, y)
Definition: stdlib.h:103
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
#define uacpi_free(mem, _)
Definition: stdlib.h:96
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
Definition: stdlib.c:112
uacpi_size uacpi_strlen(const uacpi_char *str)
Definition: stdlib.c:72
uacpi_prealloc_objects
Definition: types.h:291
@ UACPI_PREALLOC_OBJECTS_YES
Definition: types.h:293
@ UACPI_PREALLOC_OBJECTS_NO
Definition: types.h:292
uacpi_reference_kind
Definition: types.h:10
@ UACPI_REFERENCE_KIND_ARG
Definition: types.h:13
@ UACPI_REFERENCE_KIND_REFOF
Definition: types.h:11
@ UACPI_REFERENCE_KIND_PKG_INDEX
Definition: types.h:15
@ UACPI_FIELD_UNIT_KIND_NORMAL
Definition: types.h:204
@ UACPI_FIELD_UNIT_KIND_BANK
Definition: types.h:206
@ UACPI_FIELD_UNIT_KIND_INDEX
Definition: types.h:205
uacpi_assign_behavior
Definition: types.h:275
@ UACPI_ASSIGN_BEHAVIOR_DEEP_COPY
Definition: types.h:276
@ UACPI_ASSIGN_BEHAVIOR_SHALLOW_COPY
Definition: types.h:277
@ UACPI_STRING_KIND_PATH
Definition: types.h:21
uacpi_status uacpi_namespace_node_resolve_from_aml_namepath(uacpi_namespace_node *scope, const uacpi_char *path, uacpi_namespace_node **out_node)
Definition: namespace.c:634
#define UACPI_FALLTHROUGH
Definition: compiler.h:70
#define uacpi_likely(expr)
Definition: compiler.h:59
#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
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
#define UACPI_TRUE
Definition: types.h:29
#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_UNIMPLEMENTED
Definition: status.h:19
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_OK
Definition: status.h:11
uacpi_object_type_bits
Definition: types.h:128
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:130
@ UACPI_OBJECT_REFERENCE_BIT
Definition: types.h:144
@ UACPI_OBJECT_PROCESSOR_BIT
Definition: types.h:140
@ UACPI_OBJECT_BUFFER_BIT
Definition: types.h:131
@ UACPI_OBJECT_POWER_RESOURCE_BIT
Definition: types.h:139
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:129
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:132
uacpi_overflow_behavior
Definition: types.h:183
@ UACPI_OVERFLOW_TRUNCATE
Definition: types.h:185
@ UACPI_OVERFLOW_ALLOW
Definition: types.h:184
@ UACPI_OVERFLOW_DISALLOW
Definition: types.h:186
uacpi_object_type
Definition: types.h:104
@ UACPI_OBJECT_MAX_TYPE_VALUE
Definition: types.h:124
@ UACPI_OBJECT_EVENT
Definition: types.h:112
@ UACPI_OBJECT_METHOD
Definition: types.h:113
@ UACPI_OBJECT_BUFFER
Definition: types.h:108
@ 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_POWER_RESOURCE
Definition: types.h:116
@ UACPI_OBJECT_UNINITIALIZED
Definition: types.h:105
@ UACPI_OBJECT_REFERENCE
Definition: types.h:122
@ UACPI_OBJECT_MUTEX
Definition: types.h:114
@ UACPI_OBJECT_DEBUG
Definition: types.h:120
@ UACPI_OBJECT_INTEGER
Definition: types.h:106
@ UACPI_OBJECT_BUFFER_FIELD
Definition: types.h:119
@ UACPI_OBJECT_OPERATION_REGION
Definition: types.h:115
@ UACPI_OBJECT_FIELD_UNIT
Definition: types.h:110
@ UACPI_OBJECT_THERMAL_ZONE
Definition: types.h:118
@ UACPI_OBJECT_BUFFER_INDEX
Definition: types.h:123
uacpi_address_space
Definition: types.h:36
@ UACPI_ADDRESS_SPACE_IPMI
Definition: types.h:44
@ UACPI_ADDRESS_SPACE_PRM
Definition: types.h:48
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
Definition: types.h:37
@ UACPI_ADDRESS_SPACE_GENERAL_PURPOSE_IO
Definition: types.h:45
@ UACPI_ADDRESS_SPACE_FFIXEDHW
Definition: types.h:49
@ UACPI_ADDRESS_SPACE_PCI_CONFIG
Definition: types.h:39
@ UACPI_ADDRESS_SPACE_TABLE_DATA
Definition: types.h:52
@ UACPI_ADDRESS_SPACE_EMBEDDED_CONTROLLER
Definition: types.h:40
@ UACPI_ADDRESS_SPACE_SYSTEM_CMOS
Definition: types.h:42
@ UACPI_ADDRESS_SPACE_GENERIC_SERIAL_BUS
Definition: types.h:46
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
Definition: types.h:38
@ UACPI_ADDRESS_SPACE_SMBUS
Definition: types.h:41
@ UACPI_ADDRESS_SPACE_PCC
Definition: types.h:47
@ UACPI_ADDRESS_SPACE_PCI_BAR_TARGET
Definition: types.h:43
return ret
Definition: mutex.c:146
static void make_chain_bugged(uacpi_object *obj)
Definition: types.c:713
static uacpi_bool package_alloc(uacpi_object *obj, uacpi_size initial_size, enum uacpi_prealloc_objects prealloc)
Definition: types.c:154
static void free_event(uacpi_handle handle)
Definition: types.c:500
struct uacpi_object * uacpi_create_internal_reference(enum uacpi_reference_kind kind, uacpi_object *child)
Definition: types.c:1453
static void free_object(uacpi_object *obj)
Definition: types.c:707
uacpi_bool uacpi_object_is_one_of(uacpi_object *obj, uacpi_object_type_bits type_mask)
Definition: types.c:990
uacpi_object_type_bits uacpi_object_get_type_bit(uacpi_object *obj)
Definition: types.c:980
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
void uacpi_object_ref(uacpi_object *obj)
Definition: types.c:727
uacpi_object_type uacpi_object_get_type(uacpi_object *obj)
Definition: types.c:975
static object_ctor object_constructor_table[UACPI_OBJECT_MAX_TYPE_VALUE+1]
Definition: types.c:313
static uacpi_status assign_event(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior behavior)
Definition: types.c:915
uacpi_status uacpi_object_assign_package(uacpi_object *obj, uacpi_object_array in)
Definition: types.c:1313
uacpi_status uacpi_object_assign_reference(uacpi_object *obj, uacpi_object *child)
Definition: types.c:1254
static void free_address_space_handler(uacpi_handle handle)
Definition: types.c:508
static uacpi_status assign_package(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior behavior)
Definition: types.c:931
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *obj, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1079
static void free_buffer(uacpi_handle handle)
Definition: types.c:351
static uacpi_bool free_queue_push(struct free_queue *queue, uacpi_package *pkg)
Definition: types.c:369
#define TYPE_CHECK_USER_OBJ(obj, type_bits)
Definition: types.c:1004
static void free_thermal_zone(uacpi_handle handle)
Definition: types.c:596
uacpi_status uacpi_object_get_string_or_buffer(uacpi_object *obj, uacpi_data_view *out)
Definition: types.c:1050
#define ENSURE_VALID_USER_OBJ(obj)
Definition: types.c:1013
static void free_device_notify_handlers(uacpi_device_notify_handler *handler)
Definition: types.c:529
static void free_plain_no_recurse(uacpi_object *obj, struct free_queue *queue)
Definition: types.c:384
static void unref_object_no_recurse(uacpi_object *obj, struct free_queue *queue)
Definition: types.c:442
static uacpi_status uacpi_object_do_assign_buffer(uacpi_object *obj, uacpi_data_view in, uacpi_object_type type)
Definition: types.c:1098
uacpi_status uacpi_object_get_integer(uacpi_object *obj, uacpi_u64 *out)
Definition: types.c:1016
static uacpi_bool buffer_alloc(uacpi_object *obj, uacpi_size initial_size)
Definition: types.c:95
uacpi_bool(* object_ctor)(uacpi_object *obj)
Definition: types.c:311
void uacpi_object_detach_child(uacpi_object *parent)
Definition: types.c:959
static uacpi_status uacpi_object_do_get_string_or_buffer(uacpi_object *obj, uacpi_data_view *out, uacpi_u32 mask)
Definition: types.c:1040
static void free_handlers(uacpi_handle handle)
Definition: types.c:540
static uacpi_status deep_copy_package(uacpi_object *dst, uacpi_object *src)
Definition: types.c:875
static uacpi_status deep_copy_package_no_recurse(uacpi_object *dst, uacpi_package *src, struct pkg_copy_reqs *reqs)
Definition: types.c:831
uacpi_status uacpi_object_get_processor_info(uacpi_object *obj, uacpi_processor_info *out)
Definition: types.c:1290
uacpi_object * uacpi_object_create_package(uacpi_object_array in)
Definition: types.c:1342
uacpi_bool uacpi_package_fill(uacpi_package *pkg, uacpi_size num_elements, enum uacpi_prealloc_objects prealloc_objects)
Definition: types.c:124
uacpi_status uacpi_object_get_buffer(uacpi_object *obj, uacpi_data_view *out)
Definition: types.c:1066
uacpi_status uacpi_object_assign_string(uacpi_object *obj, uacpi_data_view in)
Definition: types.c:1128
static uacpi_status buffer_alloc_and_store(uacpi_object *obj, uacpi_size buf_size, const void *src, uacpi_size src_size)
Definition: types.c:779
#define ENSURE_VALID_USER_OBJ_RET(obj, ret)
Definition: types.c:1007
static uacpi_bool field_unit_alloc(uacpi_object *obj)
Definition: types.c:255
static uacpi_bool thermal_zone_alloc(uacpi_object *obj)
Definition: types.c:297
uacpi_object * uacpi_object_create_integer(uacpi_u64 value)
Definition: types.c:1177
static uacpi_bool event_alloc(uacpi_object *obj)
Definition: types.c:207
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type type)
Definition: types.c:51
static void unref_chain_no_recurse(uacpi_object *obj, struct free_queue *queue)
Definition: types.c:419
uacpi_status uacpi_object_assign_integer(uacpi_object *obj, uacpi_u64 value)
Definition: types.c:1024
static uacpi_bool device_alloc(uacpi_object *obj)
Definition: types.c:283
const uacpi_char * uacpi_address_space_to_string(enum uacpi_address_space space)
Definition: types.c:11
static uacpi_object * uacpi_object_do_create_string_or_buffer(uacpi_data_view view, uacpi_object_type type)
Definition: types.c:1189
static uacpi_status assign_buffer(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior behavior)
Definition: types.c:791
static void free_mutex(uacpi_handle handle)
Definition: types.c:484
static void unref_plain_no_recurse(uacpi_object *obj, struct free_queue *queue)
Definition: types.c:411
static void free_device(uacpi_handle handle)
Definition: types.c:582
static uacpi_bool processor_alloc(uacpi_object *obj)
Definition: types.c:269
void uacpi_mutex_unref(uacpi_mutex *mutex)
Definition: types.c:492
static void free_method(uacpi_handle handle)
Definition: types.c:635
static uacpi_status assign_mutex(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior behavior)
Definition: types.c:897
uacpi_status uacpi_object_assign(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior behavior)
Definition: types.c:1360
uacpi_object * uacpi_object_create_reference(uacpi_object *child)
Definition: types.c:1238
uacpi_status uacpi_object_get_package(uacpi_object *obj, uacpi_object_array *out)
Definition: types.c:1227
uacpi_object * uacpi_object_create_buffer(uacpi_data_view view)
Definition: types.c:1214
static uacpi_bool empty_package_alloc(uacpi_object *object)
Definition: types.c:176
uacpi_object * uacpi_object_create_string(uacpi_data_view view)
Definition: types.c:1209
static void free_field_unit(uacpi_handle handle)
Definition: types.c:603
static void free_chain(uacpi_object *obj)
Definition: types.c:739
uacpi_mutex * uacpi_create_mutex(void)
Definition: types.c:181
void uacpi_object_attach_child(uacpi_object *parent, uacpi_object *child)
Definition: types.c:943
static void free_op_region(uacpi_handle handle)
Definition: types.c:555
static uacpi_bool method_alloc(uacpi_object *obj)
Definition: types.c:227
uacpi_status uacpi_object_create_integer_safe(uacpi_u64 value, uacpi_overflow_behavior behavior, uacpi_object **out_obj)
Definition: types.c:1143
uacpi_status uacpi_object_get_power_resource_info(uacpi_object *obj, uacpi_power_resource_info *out)
Definition: types.c:1302
uacpi_bool uacpi_object_is_aml_namepath(uacpi_object *obj)
Definition: types.c:1073
uacpi_status uacpi_object_assign_buffer(uacpi_object *obj, uacpi_data_view in)
Definition: types.c:1133
uacpi_status uacpi_object_get_string(uacpi_object *obj, uacpi_data_view *out)
Definition: types.c:1059
static uacpi_bool mutex_alloc(uacpi_object *obj)
Definition: types.c:201
static uacpi_bool op_region_alloc(uacpi_object *obj)
Definition: types.c:241
void uacpi_method_unref(uacpi_control_method *method)
Definition: types.c:648
void uacpi_buffer_to_view(uacpi_buffer *buf, uacpi_data_view *out_view)
Definition: types.c:1034
void uacpi_address_space_handler_unref(uacpi_address_space_handler *handler)
Definition: types.c:548
uacpi_object * uacpi_object_create_uninitialized(void)
Definition: types.c:1138
static void free_address_space_handlers(uacpi_address_space_handler *handler)
Definition: types.c:514
uacpi_bool uacpi_object_is(uacpi_object *obj, uacpi_object_type type)
Definition: types.c:985
#define TYPE_CHECK_USER_OBJ_RET(obj, type_bits, ret)
Definition: types.c:997
static uacpi_bool empty_buffer_or_string_alloc(uacpi_object *object)
Definition: types.c:119
uacpi_object * uacpi_object_create_cstring(const uacpi_char *str)
Definition: types.c:1219
static void free_package(uacpi_handle handle)
Definition: types.c:452
uacpi_object * uacpi_unwrap_internal_reference(uacpi_object *object)
Definition: types.c:1468
uacpi_status uacpi_object_get_dereferenced(uacpi_object *obj, uacpi_object **out)
Definition: types.c:1278
static void free_processor(uacpi_handle handle)
Definition: types.c:589
static void free_object_storage(uacpi_object *obj)
Definition: types.c:653
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
r parent
Definition: btrfs.c:3010
#define DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL(name, type, prefix)
#define DYNAMIC_ARRAY_WITH_INLINE_STORAGE(name, type, inline_capacity)
Definition: dynamic_array.h:7
static xmlCharEncodingHandlerPtr * handlers
Definition: encoding.c:1380
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
struct _cl_event * event
Definition: glext.h:7739
GLenum src
Definition: glext.h:6340
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint in
Definition: glext.h:9616
GLenum GLenum dst
Definition: glext.h:6340
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
void uacpi_kernel_free_event(uacpi_handle)
Definition: uacpiosl.c:60
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
uacpi_handle uacpi_kernel_create_mutex(void)
Definition: uacpiosl.c:139
void uacpi_kernel_free_mutex(uacpi_handle)
Definition: uacpiosl.c:146
uacpi_handle uacpi_kernel_create_event(void)
Definition: uacpiosl.c:53
static HWND child
Definition: cursoricon.c:298
LPFNCONSTRUCTOR ctor
Definition: msctf.cpp:51
const WCHAR * str
void uacpi_make_shareable_bugged(uacpi_handle)
Definition: shareable.c:25
void uacpi_shareable_init(uacpi_handle)
Definition: shareable.c:9
void uacpi_shareable_unref_and_delete_if_last(uacpi_handle, void(*do_free)(uacpi_handle))
Definition: shareable.c:51
uacpi_bool uacpi_bugged_shareable(uacpi_handle)
Definition: shareable.c:15
uacpi_u32 uacpi_shareable_ref(uacpi_handle)
Definition: shareable.c:31
uacpi_u32 uacpi_shareable_refcount(uacpi_handle)
Definition: shareable.c:65
uacpi_u32 uacpi_shareable_unref(uacpi_handle)
Definition: shareable.c:41
Definition: vfat.h:185
Definition: devices.h:37
Definition: module.h:456
uacpi_package * src
Definition: types.c:806
uacpi_object * dst
Definition: types.c:805
uacpi_size length
Definition: types.h:99
uacpi_u8 * bytes
Definition: types.h:90
struct uacpi_field_unit * bank_selection
Definition: types.h:227
uacpi_namespace_node * region
Definition: types.h:215
uacpi_namespace_node * bank_region
Definition: types.h:226
uacpi_u8 kind
Definition: types.h:243
uacpi_object * connection
Definition: types.h:232
struct uacpi_field_unit * index
Definition: types.h:220
struct uacpi_field_unit * data
Definition: types.h:221
uacpi_u8 flags
Definition: types.h:250
uacpi_u8 type
Definition: types.h:249
uacpi_package * package
Definition: types.h:254
uacpi_object * inner_object
Definition: types.h:256
uacpi_buffer * buffer
Definition: types.h:258
uacpi_u8 * internal_buffer
Definition: types.h:130
uacpi_u64 table_idx
Definition: types.h:127
uacpi_u16 space
Definition: types.h:120
uacpi_u64 length
Definition: types.h:123
uacpi_address_space_handler * handler
Definition: types.h:118
uacpi_object ** objects
Definition: types.h:36
uacpi_size count
Definition: types.h:37
uacpi_status uacpi_table_unref(uacpi_table *)
Definition: tables.c:1158
uacpi_status uacpi_get_aml_bitness(uacpi_u8 *out_bitness)
Definition: uacpi.c:989
Definition: dlist.c:348
Definition: pdh_main.c:96
struct _slot slot
Definition: vfat.h:196
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383