ReactOS 0.4.17-dev-784-g3812a95
resources.c
Go to the documentation of this file.
1#include <uacpi/types.h>
2#include <uacpi/acpi.h>
8#include <uacpi/uacpi.h>
9
10#ifndef UACPI_BAREBONES_MODE
11
12#define LARGE_RESOURCE_BASE (ACPI_RESOURCE_END_TAG + 1)
13#define L(x) (x + LARGE_RESOURCE_BASE)
14
15/*
16 * Map raw AML resource types to the internal enum, this also takes care of type
17 * sanitization by returning UACPI_AML_RESOURCE_INVALID for any unknown type.
18 */
19static const uacpi_u8 aml_resource_to_type[256] = {
20 // Small items
30
31 // Large items
50};
51
62
63 // Large items
82};
83
115};
116
117#define SMALL_ITEM_HEADER_SIZE sizeof(struct acpi_small_item)
118#define LARGE_ITEM_HEADER_SIZE sizeof(struct acpi_large_item)
119
123};
124
126{
127 return spec->aml_size +
129}
130
132 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
133)
134{
136 uacpi_u8 i, total_bits, num_bits = 0;
137
139
140 if (spec->type == UACPI_AML_RESOURCE_IRQ) {
141 struct acpi_resource_irq *irq = data;
142 mask = irq->irq_mask;
143 total_bits = 16;
144 } else {
145 struct acpi_resource_dma *dma = data;
146 mask = dma->channel_mask;
147 total_bits = 8;
148 }
149
150 for (i = 0; i < total_bits; ++i)
151 num_bits += !!(mask & (1 << i));
152
153 return num_bits;
154}
155
157 const struct uacpi_resource_spec *spec, uacpi_resource *resource
158)
159{
162
164
165 switch (irq->length_kind) {
167 goto out_full;
170 if (irq->triggering != UACPI_TRIGGERING_EDGE)
171 goto out_full;
172 if (irq->polarity != UACPI_POLARITY_ACTIVE_HIGH)
173 goto out_full;
174 if (irq->sharing != UACPI_EXCLUSIVE)
175 goto out_full;
176
177 return size - 1;
178 }
179
180out_full:
181 if (uacpi_unlikely(irq->length_kind ==
183 uacpi_warn("requested IRQ resource length is "
184 "not compatible with specified flags, corrected");
185 }
186
187 return size;
188}
189
191 const struct uacpi_resource_spec *spec, uacpi_resource *resource
192)
193{
194 uacpi_resource_start_dependent *start_dep = &resource->start_dependent;
196
198 switch (start_dep->length_kind) {
200 goto out_full;
203 if (start_dep->compatibility != UACPI_ACCEPTABLE)
204 goto out_full;
205 if (start_dep->performance != UACPI_ACCEPTABLE)
206 goto out_full;
207
208 return size - 1;
209 }
210
211out_full:
212 if (uacpi_unlikely(start_dep->length_kind ==
214 uacpi_warn("requested StartDependentFn resource length is "
215 "not compatible with specified flags, corrected");
216 }
217
218 return size;
219}
220
222 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
223)
224{
225 UACPI_UNUSED(spec);
227 return size;
228}
229
231 const struct uacpi_resource_spec *spec, uacpi_resource *resource
232)
233{
234 uacpi_size size = resource->vendor.length;
235
236 UACPI_UNUSED(spec);
237
238 if (size > 7 || resource->type == UACPI_RESOURCE_TYPE_VENDOR_LARGE) {
241 ];
242
244 uacpi_warn("vendor data too large for small descriptor (%zu), "
245 "correcting to large", size);
247 }
248 } else {
251 ];
252 }
253
254 return size;
255}
256
258 uacpi_size base_size, uacpi_size reported_size
259)
260{
261 uacpi_size string_length;
262
263 if (reported_size <= base_size)
264 return 0;
265
266 /*
267 * The remainder of the descriptor minus the resource index field
268 */
269 string_length = (reported_size - base_size) - 1;
270 return UACPI_ALIGN_UP(string_length, sizeof(void*), uacpi_size);
271}
272
275)
276{
277 uacpi_size length = source->length;
278
279 if (uacpi_unlikely(length && !source->index_present)) {
280 uacpi_warn("resource declares no source index with non-empty "
281 "string (%zu bytes), corrected", length);
282 source->index_present = UACPI_TRUE;
283 }
284
285 // If index is included in the dynamic resource source, add it to the length
286 if (with_index)
287 length += source->index_present;
288
289 return length;
290}
291
293 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
294)
295{
298}
299
301 const struct uacpi_resource_spec *spec, uacpi_resource *resource
302)
303{
305 bool has_index = UACPI_TRUE;
306
307 switch (resource->type) {
309 source = &resource->address16.source;
310 break;
312 source = &resource->address32.source;
313 break;
315 source = &resource->address64.source;
316 break;
318 source = &resource->clock_input.source;
319 has_index = UACPI_FALSE;
320 break;
321 default:
322 return 0;
323 }
324
325 return aml_size_with_header(spec) +
327}
328
330 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
331)
332{
334 uacpi_size extra_size = 0;
335
336 extra_size += irq->num_irqs * sizeof(uacpi_u32);
337 extra_size += extra_size_for_resource_source(
338 spec->aml_size, size - extra_size
339 );
340
341 return extra_size;
342}
343
345 const struct uacpi_resource_spec *spec, uacpi_resource *resource
346)
347{
348 uacpi_resource_extended_irq *irq = &resource->extended_irq;
350
352 size += irq->num_irqs * 4;
354
355 return size;
356}
357
359 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
360)
361{
362 uacpi_size pin_table_offset;
363
364 /*
365 * These resources pretend to have variable layout by declaring "offset"
366 * fields, but the layout is hardcoded and mandated by the spec to be
367 * very specific. We can use the offset numbers here to calculate the final
368 * length.
369 *
370 * For example, the layout of GPIO connection _always_ looks as follows:
371 * [0...22] -> fixed data
372 * [23...<source name offset - 1>] -> pin table
373 * [<source name offset>...<vendor data offset - 1>] -> source name
374 * [<vendor data offset>...<data offset + data length>] -> vendor data
375 */
376 switch (spec->type) {
378 struct acpi_resource_gpio_connection *gpio = data;
379 pin_table_offset = gpio->pin_table_offset;
380 break;
381 }
382
385 pin_table_offset = pin->pin_table_offset;
386 break;
387 }
388
390 struct acpi_resource_pin_configuration *config = data;
391 pin_table_offset = config->pin_table_offset;
392 break;
393 }
394
397 pin_table_offset = group->pin_table_offset;
398 break;
399 }
400
401 default:
402 return 0;
403 }
404
405 /*
406 * The size we get passed here does not include the header size because
407 * that's how resources are encoded. Subtract it here so that we get the
408 * correct final length.
409 */
410 return size - (pin_table_offset - LARGE_ITEM_HEADER_SIZE);
411}
412
414 const struct uacpi_resource_spec *spec, uacpi_resource *resource
415)
416{
417 uacpi_size source_length, vendor_length, pin_table_length, size;
418
420 switch (spec->type) {
422 uacpi_resource_gpio_connection *res = &resource->gpio_connection;
423 source_length = res->source.length;
424 pin_table_length = res->pin_table_length;
425 vendor_length = res->vendor_data_length;
426 break;
427 }
428
430 uacpi_resource_pin_function *res = &resource->pin_function;
431 source_length = res->source.length;
432 pin_table_length = res->pin_table_length;
433 vendor_length = res->vendor_data_length;
434 break;
435 }
436
438 uacpi_resource_pin_configuration *res = &resource->pin_configuration;
439 source_length = res->source.length;
440 pin_table_length = res->pin_table_length;
441 vendor_length = res->vendor_data_length;
442 break;
443 }
444
447 source_length = res->label.length;
448 pin_table_length = res->pin_table_length;
449 vendor_length = res->vendor_data_length;
450 break;
451 }
452
453 default:
454 return 0;
455 }
456
457 size += source_length;
458 size += pin_table_length * 2;
459 size += vendor_length;
460
461 return size;
462}
463
465 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
466)
467{
468 uacpi_size source_offset;
469
470 switch (spec->type) {
473 source_offset = func->source_offset;
474 break;
475 }
476
478 struct acpi_resource_pin_group_configuration *config = data;
479 source_offset = config->source_offset;
480 break;
481 }
482
483 default:
484 return 0;
485 }
486
487 // Same logic as extra_size_for_native_gpio_or_pins
488 return size - (source_offset - LARGE_ITEM_HEADER_SIZE);
489}
490
492 const struct uacpi_resource_spec *spec, uacpi_resource *resource
493)
494{
495 uacpi_size source_length, label_length, vendor_length, size;
496
498 switch (spec->type) {
500 uacpi_resource_pin_group_function *res = &resource->pin_group_function;
501 source_length = res->source.length;
502 label_length = res->label.length;
503 vendor_length = res->vendor_data_length;
504 break;
505 }
506
509 res = &resource->pin_group_configuration;
510 source_length = res->source.length;
511 label_length = res->label.length;
512 vendor_length = res->vendor_data_length;
513 break;
514 }
515
516 default:
517 return 0;
518 }
519
520 size += source_length;
521 size += label_length;
522 size += vendor_length;
523
524 return size;
525}
526
527#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type) \
528 (sizeof(struct acpi_resource_serial_##type) \
529 - sizeof(struct acpi_resource_serial))
530
531#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type) \
532 (sizeof(uacpi_resource_##type##_connection) \
533 - sizeof(uacpi_resource_serial_bus_common))
534
536[ACPI_SERIAL_TYPE_MAX + 1] = {
541};
542
544[ACPI_SERIAL_TYPE_MAX + 1] = {
549};
550
552 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
553)
554{
555 struct acpi_resource_serial *serial = data;
556 uacpi_size extra_bytes = size;
557
558 extra_bytes -= spec->aml_size;
559 extra_bytes -= aml_serial_resource_to_extra_aml_size[serial->type];
561
562 return extra_bytes;
563}
564
566 const struct uacpi_resource_spec *spec, uacpi_resource *resource
567)
568{
570 uacpi_resource_serial_bus_common *serial_bus = &resource->serial_bus_common;
571
574 size += serial_bus->vendor_data_length;
575 size += serial_bus->source.length;
576
577 return size;
578}
579
580#define OP(short_code, ...) \
581{ \
582 .code = UACPI_RESOURCE_CONVERT_OPCODE_##short_code, \
583 __VA_ARGS__ \
584}
585
586#define END() OP(END)
587
588#define AML_O(short_aml_name, field) \
589 uacpi_offsetof(struct acpi_resource_##short_aml_name, field)
590
591#define AML_F(short_aml_name, field) \
592 .f1.aml_offset = AML_O(short_aml_name, field)
593
594#define NATIVE_O(short_name, field) \
595 uacpi_offsetof(uacpi_resource_##short_name, field)
596
597#define NATIVE_F(short_native_name, field) \
598 .f2.native_offset = NATIVE_O(short_native_name, field)
599
600#define IMM(value) .f3.imm = value
601#define ARG0(value) .f1.arg0 = (value)
602#define ARG1(value) .f2.arg1 = (value)
603#define ARG2(value) .f3.arg2 = (value)
604
605
607 OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
608 ARG2(NATIVE_O(irq, num_irqs))),
609 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(6)),
610 OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
612 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
613 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
614 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
615 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
616 END(),
617 OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
620 END(),
621};
622
624 OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
625 ARG2(NATIVE_O(irq, num_irqs))),
626 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(4)),
627 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
628 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
629 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
630 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
631 END(),
632};
633
635 OP(PACKED_ARRAY_8, AML_F(dma, channel_mask), NATIVE_F(dma, channels),
636 ARG2(NATIVE_O(dma, num_channels))),
637 OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, transfer_type), IMM(0)),
638 OP(BIT_FIELD_1, AML_F(dma, flags), NATIVE_F(dma, bus_master_status), IMM(2)),
639 OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, channel_speed), IMM(5)),
640 END(),
641};
642
643static const struct uacpi_resource_convert_instruction
645 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(4)),
646 OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
648 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
649 NATIVE_F(start_dependent, compatibility), IMM(0)),
650 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
651 NATIVE_F(start_dependent, performance), IMM(2)),
652 END(),
653 OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
655 OP(SET_TO_IMM, NATIVE_F(start_dependent, compatibility),
657 OP(SET_TO_IMM, NATIVE_F(start_dependent, performance),
659 END(),
660};
661
662static const struct uacpi_resource_convert_instruction
664 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(1)),
665 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
666 NATIVE_F(start_dependent, compatibility), IMM(0)),
667 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
668 NATIVE_F(start_dependent, performance), IMM(2)),
669 END(),
670};
671
673 OP(BIT_FIELD_1, AML_F(io, information), NATIVE_F(io, decode_type)),
674 OP(FIELD_16, AML_F(io, minimum), NATIVE_F(io, minimum)),
675 OP(FIELD_16, AML_F(io, maximum), NATIVE_F(io, maximum)),
676 OP(FIELD_8, AML_F(io, alignment), NATIVE_F(io, alignment)),
677 OP(FIELD_8, AML_F(io, length), NATIVE_F(io, length)),
678 END(),
679};
680
682 OP(FIELD_16, AML_F(fixed_io, address), NATIVE_F(fixed_io, address)),
683 OP(FIELD_8, AML_F(fixed_io, length), NATIVE_F(fixed_io, length)),
684 END(),
685};
686
688 OP(FIELD_16, AML_F(fixed_dma, request_line),
689 NATIVE_F(fixed_dma, request_line)),
690 OP(FIELD_16, AML_F(fixed_dma, channel), NATIVE_F(fixed_dma, channel)),
691 OP(FIELD_8, AML_F(fixed_dma, transfer_width),
692 NATIVE_F(fixed_dma, transfer_width)),
693 END(),
694};
695
697 OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
698 OP(FIELD_8, AML_F(vendor_defined_type0, byte_data), NATIVE_F(vendor, data)),
699 END(),
700};
701
703 OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
704 OP(FIELD_8, AML_F(vendor_defined_type1, byte_data), NATIVE_F(vendor, data)),
705 END(),
706};
707
709 OP(BIT_FIELD_1, AML_F(memory24, information),
710 NATIVE_F(memory24, write_status), IMM(0)),
711 OP(FIELD_16, AML_F(memory24, minimum), NATIVE_F(memory24, minimum), IMM(4)),
712 END(),
713};
714
716 OP(BIT_FIELD_1, AML_F(memory32, information),
717 NATIVE_F(memory32, write_status), IMM(0)),
718 OP(FIELD_32, AML_F(memory32, minimum), NATIVE_F(memory32, minimum), IMM(4)),
719 END(),
720};
721
722static const struct uacpi_resource_convert_instruction
724 OP(BIT_FIELD_1, AML_F(fixed_memory32, information),
725 NATIVE_F(fixed_memory32, write_status), IMM(0)),
726 OP(FIELD_32, AML_F(fixed_memory32, address),
727 NATIVE_F(fixed_memory32, address)),
728 OP(FIELD_32, AML_F(fixed_memory32, length),
729 NATIVE_F(fixed_memory32, length)),
730 END(),
731};
732
733static const struct uacpi_resource_convert_instruction
735 OP(FIELD_8, AML_F(generic_register, address_space_id),
736 NATIVE_F(generic_register, address_space_id), IMM(4)),
737 OP(FIELD_64, AML_F(generic_register, address),
738 NATIVE_F(generic_register, address)),
739 END(),
740};
741
742#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type) \
743 OP(LOAD_8_STORE, AML_F(addr_type, common.type), \
744 NATIVE_F(addr_type, common.type)), \
745 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_RANGE_MEMORY), IMM(5)), \
746 OP(BIT_FIELD_1, \
747 AML_F(addr_type, common.type_flags), \
748 NATIVE_F(addr_type, common.attribute.memory.write_status), IMM(0)), \
749 OP(BIT_FIELD_2, \
750 AML_F(addr_type, common.type_flags), \
751 NATIVE_F(addr_type, common.attribute.memory.caching), IMM(1)), \
752 OP(BIT_FIELD_2, \
753 AML_F(addr_type, common.type_flags), \
754 NATIVE_F(addr_type, common.attribute.memory.range_type), IMM(3)), \
755 OP(BIT_FIELD_1, \
756 AML_F(addr_type, common.type_flags), \
757 NATIVE_F(addr_type, common.attribute.memory.translation), IMM(5)), \
758 END(), \
759 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_RANGE_IO), IMM(4)), \
760 OP(BIT_FIELD_2, \
761 AML_F(addr_type, common.type_flags), \
762 NATIVE_F(addr_type, common.attribute.io.range_type), IMM(0)), \
763 OP(BIT_FIELD_1, \
764 AML_F(addr_type, common.type_flags), \
765 NATIVE_F(addr_type, common.attribute.io.translation_type), IMM(4)), \
766 OP(BIT_FIELD_1, \
767 AML_F(addr_type, common.type_flags), \
768 NATIVE_F(addr_type, common.attribute.io.translation), IMM(5)), \
769 END(), \
770 /* Memory type that we don't know, just copy the byte */ \
771 OP(FIELD_8, AML_F(addr_type, common.type_flags), \
772 NATIVE_F(addr_type, common.attribute.type_specific), IMM(0xFF)), \
773 END()
774
775#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type) \
776 OP(BIT_FIELD_1, \
777 AML_F(addr_type, common.flags), \
778 NATIVE_F(addr_type, common.direction), IMM(0)), \
779 OP(BIT_FIELD_1, \
780 AML_F(addr_type, common.flags), \
781 NATIVE_F(addr_type, common.decode_type), IMM(1)), \
782 OP(BIT_FIELD_1, \
783 AML_F(addr_type, common.flags), \
784 NATIVE_F(addr_type, common.fixed_min_address), IMM(2)), \
785 OP(BIT_FIELD_1, \
786 AML_F(addr_type, common.flags), \
787 NATIVE_F(addr_type, common.fixed_max_address), IMM(3)) \
788
789#define DEFINE_ADDRESS_CONVERSION(width) \
790 static const struct uacpi_resource_convert_instruction \
791 convert_address##width[] = { \
792 CONVERT_GENERAL_ADDRESS_FLAGS(address##width), \
793 OP(FIELD_##width, AML_F(address##width, granularity), \
794 NATIVE_F(address##width, granularity), IMM(5)), \
795 OP(RESOURCE_SOURCE, NATIVE_F(address##width, source)), \
796 CONVERT_TYPE_SPECIFIC_FLAGS(address##width), \
797 };
798
802
805 CONVERT_GENERAL_ADDRESS_FLAGS(address64_extended),
806 OP(FIELD_8, AML_F(address64_extended, revision_id),
807 NATIVE_F(address64_extended, revision_id)),
808 OP(FIELD_64, AML_F(address64_extended, granularity),
809 NATIVE_F(address64_extended, granularity), IMM(6)),
810 CONVERT_TYPE_SPECIFIC_FLAGS(address64_extended),
811};
812
813static const struct uacpi_resource_convert_instruction
815 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
816 NATIVE_F(extended_irq, direction), IMM(0)),
817 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
818 NATIVE_F(extended_irq, triggering), IMM(1)),
819 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
820 NATIVE_F(extended_irq, polarity), IMM(2)),
821 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
822 NATIVE_F(extended_irq, sharing), IMM(3)),
823 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
824 NATIVE_F(extended_irq, wake_capability), IMM(4)),
825 OP(LOAD_8_STORE, AML_F(extended_irq, num_irqs),
826 NATIVE_F(extended_irq, num_irqs), IMM(4)),
827 OP(RESOURCE_SOURCE, NATIVE_F(extended_irq, source)),
828
829 // Use FIELD_8 here since the accumulator has been multiplied by 4
830 OP(FIELD_8, AML_F(extended_irq, irqs), NATIVE_F(extended_irq, irqs)),
831 END(),
832};
833
835 OP(FIELD_8, AML_F(clock_input, revision_id),
836 NATIVE_F(clock_input, revision_id)),
837 OP(BIT_FIELD_1, AML_F(clock_input, flags), NATIVE_F(clock_input, frequency),
838 IMM(0)),
839 OP(BIT_FIELD_2, AML_F(clock_input, flags), NATIVE_F(clock_input, scale),
840 IMM(1)),
841 OP(FIELD_16, AML_F(clock_input, divisor), NATIVE_F(clock_input, divisor)),
842 OP(FIELD_32, AML_F(clock_input, numerator), NATIVE_F(clock_input, numerator)),
843 OP(FIELD_8, AML_F(clock_input, source_index), NATIVE_F(clock_input, source.index)),
844 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(clock_input, source)),
845 END(),
846};
847
848#define DECODE_SOURCE_INDEX(short_aml_name) \
849 OP(FIELD_8, AML_F(short_aml_name, source_index), \
850 NATIVE_F(short_aml_name, source.index)) \
851
852#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( \
853 short_aml_name, res_opcode, offset_field, res_field \
854) \
855 OP(LOAD_PIN_TABLE_LENGTH, AML_F(short_aml_name, offset_field), \
856 NATIVE_F(short_aml_name, pin_table_length)), \
857 OP(RESOURCE_##res_opcode, NATIVE_F(short_aml_name, res_field), \
858 AML_F(short_aml_name, offset_field), \
859 ARG2(AML_O(short_aml_name, vendor_data_offset))), \
860 OP(PIN_TABLE, AML_F(short_aml_name, pin_table_offset), \
861 NATIVE_F(short_aml_name, pin_table_length), \
862 ARG2(NATIVE_O(short_aml_name, pin_table))), \
863 OP(VENDOR_DATA, AML_F(short_aml_name, vendor_data_offset), \
864 NATIVE_F(short_aml_name, vendor_data_length), \
865 ARG2(NATIVE_O(short_aml_name, vendor_data)))
866
867static const struct uacpi_resource_convert_instruction
869 OP(FIELD_8, AML_F(gpio_connection, revision_id),
870 NATIVE_F(gpio_connection, revision_id)),
871 OP(BIT_FIELD_1, AML_F(gpio_connection, general_flags),
872 NATIVE_F(gpio_connection, direction)),
873 OP(FIELD_8, AML_F(gpio_connection, pull_configuration),
874 NATIVE_F(gpio_connection, pull_configuration)),
875 OP(FIELD_16, AML_F(gpio_connection, drive_strength),
876 NATIVE_F(gpio_connection, drive_strength), IMM(2)),
877 DECODE_SOURCE_INDEX(gpio_connection),
879 gpio_connection, SOURCE_NO_INDEX, source_offset, source
880 ),
881 OP(LOAD_8_STORE, AML_F(gpio_connection, type), NATIVE_F(gpio_connection, type)),
882 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_GPIO_CONNECTION_INTERRUPT), IMM(5)),
883 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
884 NATIVE_F(gpio_connection, intr.triggering), IMM(0)),
885 OP(BIT_FIELD_2, AML_F(gpio_connection, connection_flags),
886 NATIVE_F(gpio_connection, intr.polarity), IMM(1)),
887 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
888 NATIVE_F(gpio_connection, intr.sharing), IMM(3)),
889 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
890 NATIVE_F(gpio_connection, intr.wake_capability), IMM(4)),
891 END(),
892 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_GPIO_CONNECTION_IO), IMM(3)),
893 OP(BIT_FIELD_2, AML_F(gpio_connection, connection_flags),
894 NATIVE_F(gpio_connection, io.restriction), IMM(0)),
895 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
896 NATIVE_F(gpio_connection, io.sharing), IMM(3)),
897 END(),
898 OP(FIELD_16, AML_F(gpio_connection, connection_flags),
899 NATIVE_F(gpio_connection, type_specific), IMM(0xFF)),
900 END(),
901};
902
903static const struct uacpi_resource_convert_instruction
905 OP(FIELD_8, AML_F(pin_function, revision_id),
906 NATIVE_F(pin_function, revision_id)),
907 OP(BIT_FIELD_1, AML_F(pin_function, flags),
908 NATIVE_F(pin_function, sharing), IMM(0)),
909 OP(FIELD_8, AML_F(pin_function, pull_configuration),
910 NATIVE_F(pin_function, pull_configuration)),
911 OP(FIELD_16, AML_F(pin_function, function_number),
912 NATIVE_F(pin_function, function_number)),
913 DECODE_SOURCE_INDEX(pin_function),
915 pin_function, SOURCE_NO_INDEX, source_offset, source
916 ),
917 END(),
918};
919
920static const struct uacpi_resource_convert_instruction
922 OP(FIELD_8, AML_F(pin_configuration, revision_id),
923 NATIVE_F(pin_configuration, revision_id)),
924 OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
925 NATIVE_F(pin_configuration, sharing), IMM(0)),
926 OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
927 NATIVE_F(pin_configuration, direction), IMM(1)),
928 OP(FIELD_8, AML_F(pin_configuration, type),
929 NATIVE_F(pin_configuration, type)),
930 OP(FIELD_32, AML_F(pin_configuration, value),
931 NATIVE_F(pin_configuration, value)),
932 DECODE_SOURCE_INDEX(pin_configuration),
934 pin_configuration, SOURCE_NO_INDEX, source_offset, source
935 ),
936 END(),
937};
938
940 OP(FIELD_8, AML_F(pin_group, revision_id),
941 NATIVE_F(pin_group, revision_id)),
942 OP(BIT_FIELD_1, AML_F(pin_group, flags),
943 NATIVE_F(pin_group, direction), IMM(0)),
945 pin_group, LABEL, source_lable_offset, label
946 ),
947 END(),
948};
949
950#define DECODE_PIN_GROUP_RES_SOURCES(postfix) \
951 DECODE_SOURCE_INDEX(pin_group_##postfix), \
952 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(pin_group_##postfix, source), \
953 AML_F(pin_group_##postfix, source_offset), \
954 ARG2(AML_O(pin_group_##postfix, source_lable_offset))), \
955 OP(LOAD_16_NATIVE, NATIVE_F(pin_group_##postfix, source.length)), \
956 OP(RESOURCE_LABEL, NATIVE_F(pin_group_##postfix, label), \
957 AML_F(pin_group_##postfix, source_lable_offset), \
958 ARG2(AML_O(pin_group_##postfix, vendor_data_offset))), \
959 OP(VENDOR_DATA, AML_F(pin_group_##postfix, vendor_data_offset), \
960 NATIVE_F(pin_group_##postfix, vendor_data_length), \
961 ARG2(NATIVE_O(pin_group_##postfix, vendor_data)))
962
963static const struct uacpi_resource_convert_instruction
965 OP(FIELD_8, AML_F(pin_group_function, revision_id),
966 NATIVE_F(pin_group_function, revision_id)),
967 OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
968 NATIVE_F(pin_group_function, sharing), IMM(0)),
969 OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
970 NATIVE_F(pin_group_function, direction), IMM(1)),
971 OP(FIELD_16, AML_F(pin_group_function, function),
972 NATIVE_F(pin_group_function, function)),
974 END(),
975};
976
977static const struct uacpi_resource_convert_instruction
979 OP(FIELD_8, AML_F(pin_group_configuration, revision_id),
980 NATIVE_F(pin_group_configuration, revision_id)),
981 OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
982 NATIVE_F(pin_group_configuration, sharing), IMM(0)),
983 OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
984 NATIVE_F(pin_group_configuration, direction), IMM(1)),
985 OP(FIELD_8, AML_F(pin_group_configuration, type),
986 NATIVE_F(pin_group_configuration, type)),
987 OP(FIELD_32, AML_F(pin_group_configuration, value),
988 NATIVE_F(pin_group_configuration, value)),
989 DECODE_PIN_GROUP_RES_SOURCES(configuration),
990 END(),
991};
992
993static const struct uacpi_resource_convert_instruction
995 OP(FIELD_8, AML_F(serial, revision_id),
996 NATIVE_F(serial_bus_common, revision_id)),
997 OP(FIELD_8, AML_F(serial, type_specific_revision_id),
998 NATIVE_F(serial_bus_common, type_revision_id)),
999 OP(FIELD_8, AML_F(serial, source_index),
1000 NATIVE_F(serial_bus_common, source.index)),
1001 OP(FIELD_16, AML_F(serial, type_data_length),
1002 NATIVE_F(serial_bus_common, type_data_length)),
1003 OP(BIT_FIELD_1, AML_F(serial, flags),
1004 NATIVE_F(serial_bus_common, mode), IMM(0)),
1005 OP(BIT_FIELD_1, AML_F(serial, flags),
1006 NATIVE_F(serial_bus_common, direction), IMM(1)),
1007 OP(BIT_FIELD_1, AML_F(serial, flags),
1008 NATIVE_F(serial_bus_common, sharing), IMM(2)),
1009 OP(SERIAL_TYPE_SPECIFIC, AML_F(serial, type),
1010 NATIVE_F(serial_bus_common, type)),
1011 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(serial_bus_common, source)),
1012 OP(LOAD_8_NATIVE, NATIVE_F(serial_bus_common, type)),
1013 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_I2C), IMM(4)),
1014 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1015 NATIVE_F(i2c_connection, addressing_mode), IMM(0)),
1016 OP(FIELD_32, AML_F(serial_i2c, connection_speed),
1017 NATIVE_F(i2c_connection, connection_speed), IMM(0xFF)),
1018 OP(FIELD_16, AML_F(serial_i2c, slave_address),
1019 NATIVE_F(i2c_connection, slave_address)),
1020 END(),
1021 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_SPI), IMM(5)),
1022 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1023 NATIVE_F(spi_connection, wire_mode), IMM(0)),
1024 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1025 NATIVE_F(spi_connection, device_polarity), IMM(1)),
1026 OP(FIELD_32, AML_F(serial_spi, connection_speed),
1027 NATIVE_F(spi_connection, connection_speed), IMM(0xFF)),
1028 OP(FIELD_8, AML_F(serial_spi, data_bit_length),
1029 NATIVE_F(spi_connection, data_bit_length), IMM(5)),
1030 END(),
1031 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_UART), IMM(8)),
1032 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1033 NATIVE_F(uart_connection, flow_control), IMM(0)),
1034 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1035 NATIVE_F(uart_connection, stop_bits), IMM(2)),
1036 OP(BIT_FIELD_3, AML_F(serial, type_specific_flags),
1037 NATIVE_F(uart_connection, data_bits), IMM(4)),
1038 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1039 NATIVE_F(uart_connection, endianness), IMM(7)),
1040 OP(FIELD_32, AML_F(serial_uart, baud_rate),
1041 NATIVE_F(uart_connection, baud_rate), IMM(0xFF)),
1042 OP(FIELD_16, AML_F(serial_uart, rx_fifo),
1043 NATIVE_F(uart_connection, rx_fifo), IMM(2)),
1044 OP(FIELD_8, AML_F(serial_uart, parity),
1045 NATIVE_F(uart_connection, parity), IMM(2)),
1046 END(),
1047 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_CSI2), IMM(3)),
1048 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1049 NATIVE_F(csi2_connection, phy_type), IMM(0)),
1050 OP(BIT_FIELD_6, AML_F(serial, type_specific_flags),
1051 NATIVE_F(csi2_connection, local_port), IMM(2)),
1052 END(),
1053
1054 /*
1055 * Insert a trap to catch unimplemented types, this should be unreachable
1056 * because of validation earlier.
1057 */
1058 OP(UNREACHABLE),
1059};
1060
1061#define NATIVE_RESOURCE_HEADER_SIZE 8
1062
1063#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, \
1064 aml_struct, native_struct, ...) \
1065 [aml_type_enum] = { \
1066 .type = aml_type_enum, \
1067 .native_type = native_type_enum, \
1068 .resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
1069 .aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
1070 .native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
1071 __VA_ARGS__ \
1072 }
1073
1074#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( \
1075 aml_type_enum, native_type_enum, aml_struct, ... \
1076) \
1077 [aml_type_enum] = { \
1078 .type = aml_type_enum, \
1079 .native_type = native_type_enum, \
1080 .resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
1081 .aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
1082 .native_size = NATIVE_RESOURCE_HEADER_SIZE, \
1083 __VA_ARGS__ \
1084 }
1085
1086#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, \
1087 aml_struct, native_struct, ...) \
1088 [aml_type_enum] = { \
1089 .type = aml_type_enum, \
1090 .native_type = native_type_enum, \
1091 .resource_kind = UACPI_AML_RESOURCE_KIND_LARGE, \
1092 .aml_size = sizeof(aml_struct) - LARGE_ITEM_HEADER_SIZE, \
1093 .native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
1094 __VA_ARGS__ \
1095 }
1096
1101 struct acpi_resource_irq,
1108 ),
1112 struct acpi_resource_dma,
1118 ),
1128 ),
1132 struct acpi_resource_end_dependent,
1134 ),
1138 struct acpi_resource_io,
1142 .to_aml = convert_io,
1143 ),
1152 ),
1161 ),
1165 struct acpi_resource_vendor_defined_type0,
1172 ),
1176 struct acpi_resource_end_tag,
1178 ),
1187 ),
1196 ),
1200 struct acpi_resource_vendor_defined_type1,
1207 ),
1216 ),
1225 ),
1234 .to_native = convert_address32,
1235 .to_aml = convert_address32,
1236 ),
1245 .to_native = convert_address16,
1246 .to_aml = convert_address16,
1247 ),
1258 ),
1267 .to_native = convert_address64,
1268 .to_aml = convert_address64,
1269 ),
1273 struct acpi_resource_address64_extended,
1278 ),
1282 struct acpi_resource_gpio_connection,
1289 ),
1300 ),
1303 0, // the native type here is determined dynamically
1304 struct acpi_resource_serial,
1311 ),
1315 struct acpi_resource_pin_configuration,
1322 ),
1333 ),
1344 ),
1348 struct acpi_resource_pin_group_configuration,
1355 ),
1359 struct acpi_resource_clock_input,
1366 ),
1367};
1368
1370{
1371 if (raw_byte & ACPI_LARGE_ITEM) {
1372 return aml_resource_to_type[
1374 ];
1375 }
1376
1377 return aml_resource_to_type[
1379 ];
1380}
1381
1384)
1385{
1387
1388 /*
1389 * Resource header is not included in size for both, so we subtract
1390 * the header size from bytes_left to validate it.
1391 */
1392 if (*data & ACPI_LARGE_ITEM) {
1393 if (uacpi_unlikely(bytes_left < 3))
1395
1396 uacpi_memcpy(&size, data + 1, sizeof(size));
1399 ];
1400 } else {
1404 ];
1405 }
1406
1407 if (uacpi_unlikely(size > bytes_left))
1409
1410 *out_size = size;
1411 return UACPI_STATUS_OK;
1412}
1413
1415{
1418 uacpi_error("invalid/unsupported serial connection type %d", type);
1420 }
1421
1422 return UACPI_STATUS_OK;
1423}
1424
1427)
1428{
1430 uacpi_iteration_decision decision;
1431 uacpi_u8 *data;
1432 uacpi_size bytes_left;
1433 uacpi_u16 resource_size;
1435 const struct uacpi_resource_spec *spec;
1436
1437 bytes_left = buffer.length;
1438 data = buffer.bytes;
1439
1440 while (bytes_left) {
1444
1445 ret = get_aml_resource_size(data, bytes_left, &resource_size);
1447 return ret;
1448
1449 spec = &aml_resources[type];
1450 switch (spec->size_kind) {
1452 if (resource_size != spec->aml_size)
1454 break;
1456 if (resource_size < spec->aml_size)
1458 break;
1460 if (resource_size != spec->aml_size &&
1461 resource_size != (spec->aml_size - 1))
1463 break;
1464 default:
1466 }
1467
1469 struct acpi_resource_serial *serial;
1470
1471 serial = (struct acpi_resource_serial*)data;
1472
1475 return ret;
1476 }
1477
1478 decision = cb(user, data, resource_size, spec);
1479 switch (decision) {
1481 return UACPI_STATUS_OK;
1483 uacpi_size total_size = resource_size;
1484
1486 data += total_size;
1487 bytes_left -= total_size;
1488 break;
1489 }
1490 default:
1492 }
1493
1495 return UACPI_STATUS_OK;
1496 }
1497
1499}
1500
1502 void *opaque, uacpi_u8 *data, uacpi_u16 resource_size,
1503 const struct uacpi_resource_spec *spec
1504)
1505{
1506 uacpi_u8 **out_ptr = opaque;
1507 UACPI_UNUSED(resource_size);
1508
1509 if (spec->type != UACPI_AML_RESOURCE_END_TAG)
1511
1512 *out_ptr = data;
1514}
1515
1517 uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec
1518)
1519{
1520 uacpi_size final_size = spec->native_size;
1521
1522 if (spec->extra_size_for_native)
1523 final_size += spec->extra_size_for_native(spec, data, size);
1524
1525 return UACPI_ALIGN_UP(final_size, sizeof(void*), uacpi_size);
1526}
1527
1529 uacpi_data_view buffer, uacpi_size *out_offset
1530)
1531{
1532 uacpi_u8 *end_tag_ptr = UACPI_NULL;
1534
1535 if (buffer.length == 0) {
1536 *out_offset = 0;
1537 return UACPI_STATUS_OK;
1538 }
1539
1540 /*
1541 * This returning UACPI_STATUS_OK guarantees that end_tag_ptr is set to
1542 * a valid value because a missing end tag would produce a
1543 * UACPI_STATUS_NO_RESOURCE_END_TAG error.
1544 */
1547 return ret;
1548
1549 *out_offset = end_tag_ptr - buffer.bytes;
1550 return UACPI_STATUS_OK;
1551}
1552
1554 union {
1555 void *buf;
1558 };
1561};
1562
1565)
1566{
1567 return ctx->just_one ? UACPI_ITERATION_DECISION_BREAK :
1569}
1570
1571// Opcodes that are the same for both AML->native and native->AML
1572#define CONVERSION_OPCODES_COMMON(native_buf) \
1573 case UACPI_RESOURCE_CONVERT_OPCODE_END: \
1574 return conditional_continue(ctx); \
1575 \
1576 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_8: \
1577 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_16: \
1578 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_32: \
1579 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_64: { \
1580 uacpi_u8 bytes; \
1581 \
1582 bytes = 1 << (insn->code - UACPI_RESOURCE_CONVERT_OPCODE_FIELD_8); \
1583 accumulator = insn->f3.imm == 0xFF ? 0 : accumulator + insn->f3.imm; \
1584 \
1585 uacpi_memcpy(dst, src, bytes * UACPI_MAX(1, accumulator)); \
1586 accumulator = 0; \
1587 break; \
1588 } \
1589 \
1590 case UACPI_RESOURCE_CONVERT_OPCODE_SKIP_IF_AML_SIZE_LESS_THAN: \
1591 if (aml_size < insn->f1.arg0) \
1592 pc += insn->f3.imm; \
1593 break; \
1594 case UACPI_RESOURCE_CONVERT_OPCODE_SKIP_IF_NOT_EQUALS: \
1595 if (insn->f1.arg0 != accumulator) \
1596 pc += insn->f3.imm; \
1597 break; \
1598 \
1599 case UACPI_RESOURCE_CONVERT_OPCODE_SET_TO_IMM: \
1600 uacpi_memcpy(dst, &insn->f3.imm, sizeof(insn->f3.imm)); \
1601 break; \
1602 \
1603 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_IMM: \
1604 accumulator = insn->f3.imm; \
1605 break; \
1606 \
1607 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_STORE: \
1608 uacpi_memcpy_zerout(&accumulator, src, sizeof(accumulator), 1); \
1609 uacpi_memcpy(dst, &accumulator, 1); \
1610 \
1611 if (insn->f3.imm) \
1612 accumulator *= insn->f3.imm; \
1613 break; \
1614 \
1615 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_NATIVE: \
1616 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_16_NATIVE: { \
1617 uacpi_u8 bytes; \
1618 \
1619 bytes = \
1620 1 << (insn->code - UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_NATIVE); \
1621 uacpi_memcpy_zerout( \
1622 &accumulator, native_buf, sizeof(accumulator), bytes \
1623 ); \
1624 break; \
1625 } \
1626 \
1627 case UACPI_RESOURCE_CONVERT_OPCODE_UNREACHABLE: \
1628 default: \
1629 if (insn->code != UACPI_RESOURCE_CONVERT_OPCODE_UNREACHABLE) { \
1630 uacpi_error("unhandled resource conversion opcode %d", \
1631 insn->code); \
1632 } else { \
1633 uacpi_error("tried to execute unreachable conversion opcode"); \
1634 } \
1635 ctx->st = UACPI_STATUS_INTERNAL_ERROR; \
1636 return UACPI_ITERATION_DECISION_BREAK;
1637
1638#define PTR_AT(ptr, offset) (void*)((uacpi_u8*)(ptr) + (offset))
1639
1640#define NATIVE_OFFSET(res, offset) \
1641 PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))
1642
1643#define NATIVE_FIELD(res, name, field) \
1644 NATIVE_OFFSET(res, NATIVE_O(name, field))
1645
1646#define CHECK_AML_OOB(offset, prefix, what) \
1647 if (uacpi_unlikely(offset > ((uacpi_u32)aml_size + header_size))) { \
1648 uacpi_error(prefix what " is OOB: %zu > %u", \
1649 (uacpi_size)offset, (uacpi_u32)aml_size + header_size); \
1650 ctx->st = UACPI_STATUS_AML_INVALID_RESOURCE; \
1651 return UACPI_ITERATION_DECISION_BREAK; \
1652 }
1653
1654#define CHECK_AML_OFFSET_BASE(offset, what) \
1655 if (uacpi_unlikely(offset < base_aml_size_with_header)) { \
1656 uacpi_error( \
1657 "invalid " what " offset: %zu, expected at least %u", \
1658 (uacpi_size)offset, base_aml_size_with_header); \
1659 ctx->st = UACPI_STATUS_AML_INVALID_RESOURCE; \
1660 return UACPI_ITERATION_DECISION_BREAK; \
1661 }
1662
1663#define CHECK_AML_OFFSET(offset, what) \
1664 CHECK_AML_OOB(offset, "end of ", what) \
1665 CHECK_AML_OFFSET_BASE(offset, what)
1666
1669)
1670{
1671 return (type - ACPI_SERIAL_TYPE_I2C) +
1673}
1674
1676 void *opaque, uacpi_u8 *data, uacpi_u16 aml_size,
1677 const struct uacpi_resource_spec *spec
1678)
1679{
1680 struct resource_conversion_ctx *ctx = opaque;
1681 uacpi_resource *resource = ctx->buf;
1682 const struct uacpi_resource_convert_instruction *insns, *insn;
1683 uacpi_u8 header_size, pc = 0;
1684 uacpi_u8 *src, *dst;
1685 void *resource_end;
1686 uacpi_u16 base_aml_size;
1687 uacpi_u32 base_aml_size_with_header, accumulator = 0;
1688
1689 insns = spec->to_native;
1690
1692 resource->type = spec->native_type;
1693 resource->length = native_size_for_aml_resource(data, aml_size, spec);
1694 resource_end = ctx->byte_buf + spec->native_size;
1695 ctx->byte_buf += resource->length;
1696
1697 base_aml_size = base_aml_size_with_header = spec->aml_size;
1698 base_aml_size_with_header += header_size;
1699
1700 if (insns == UACPI_NULL)
1701 return conditional_continue(ctx);
1702
1703 for (;;) {
1704 insn = &insns[pc++];
1705
1706 src = data + insn->f1.aml_offset;
1708
1709 switch (insn->code) {
1712 uacpi_size i, j, max_bit;
1714
1716 max_bit = 16;
1717 uacpi_memcpy(&value, src, sizeof(uacpi_u16));
1718 } else {
1719 max_bit = 8;
1721 &value, src, sizeof(value), sizeof(uacpi_u8)
1722 );
1723 }
1724
1725 for (i = 0, j = 0; i < max_bit; ++i) {
1726 if (!(value & (1 << i)))
1727 continue;
1728
1729 dst[j++] = i;
1730 }
1731
1733 break;
1734 }
1735
1741
1743 mask = (1 << mask) - 1;
1744
1745 value = (*src >> insn->f3.imm) & mask;
1746 uacpi_memcpy(dst, &value, sizeof(value));
1747 break;
1748 }
1749
1751 accumulator = aml_size;
1752 uacpi_memcpy(dst, &accumulator, 4);
1753 break;
1754
1758 uacpi_size offset = 0, max_offset, length = 0;
1759 uacpi_char *src_string, *dst_string;
1760 union {
1761 void *ptr;
1764 } dst_name = { 0 };
1765
1766 dst_name.ptr = dst;
1767
1768 /*
1769 * Check if the string is bounded by anything at the top. If not, we
1770 * just assume it ends at the end of the resource.
1771 */
1772 if (insn->f3.arg2) {
1773 uacpi_memcpy_zerout(&max_offset, data + insn->f3.arg2,
1774 sizeof(max_offset), sizeof(uacpi_u16));
1775 CHECK_AML_OFFSET(max_offset, "resource source");
1776 } else {
1777 max_offset = aml_size + header_size;
1778 }
1779
1780 offset += base_aml_size_with_header;
1781 offset += accumulator;
1782
1784 dst_name.source->index_present = UACPI_TRUE;
1785
1786 if (offset >= max_offset) {
1788 dst_name.source->index_present = UACPI_FALSE;
1789 break;
1790 }
1791
1792 src_string = PTR_AT(data, offset);
1793
1795 uacpi_memcpy(&dst_name.source->index, src_string++, 1);
1796 offset++;
1797 }
1798
1799 if (offset == max_offset)
1800 break;
1801
1802 while (offset++ < max_offset) {
1803 if (src_string[length++] == '\0')
1804 break;
1805 }
1806
1807 if (src_string[length - 1] != '\0') {
1808 uacpi_error("non-null-terminated resource source string");
1811 }
1812
1813 dst_string = PTR_AT(resource_end, accumulator);
1814 uacpi_memcpy(dst_string, src_string, length);
1815
1817 dst_name.label->length = length;
1818 dst_name.label->string = dst_string;
1819 } else {
1820 dst_name.source->length = length;
1821 dst_name.source->string = dst_string;
1822 }
1823
1824 break;
1825 }
1826
1828 uacpi_memcpy_zerout(&accumulator, src,
1829 sizeof(accumulator), sizeof(uacpi_u16));
1830 CHECK_AML_OFFSET(accumulator, "pin table");
1831
1832 accumulator -= base_aml_size_with_header;
1833 break;
1834
1836 uacpi_u16 entry_count = accumulator / 2;
1837
1838 /*
1839 * Pin table is stored right at the end of the resource buffer,
1840 * copy the data there.
1841 */
1843 resource_end,
1844 data + base_aml_size_with_header,
1845 accumulator
1846 );
1847
1848 // Set pin_table_length
1849 uacpi_memcpy(dst, &entry_count, sizeof(entry_count));
1850
1851 // Set pin_table pointer
1853 &resource_end, sizeof(void*));
1854 break;
1855 }
1856
1859 uacpi_u16 data_offset, offset_from_end;
1860 void *native_dst, *vendor_data;
1861
1862 uacpi_memcpy(&data_offset, src, sizeof(data_offset));
1863 CHECK_AML_OFFSET(data_offset, "vendor data");
1864
1865 vendor_data = data + data_offset;
1866
1867 /*
1868 * Rebase the offset to cut off the header as it's not included
1869 * in the size fields.
1870 */
1871 data_offset -= header_size;
1872
1873 length = aml_size - data_offset;
1874 if (length == 0)
1875 break;
1876
1877 uacpi_memcpy(dst, &length, sizeof(uacpi_u16));
1878
1879 offset_from_end = data_offset - base_aml_size;
1880 native_dst = PTR_AT(resource_end, offset_from_end);
1881
1882 uacpi_memcpy(native_dst, vendor_data, length);
1884 &native_dst, sizeof(void*));
1885 break;
1886 }
1887
1889 uacpi_resource_serial_bus_common *serial_bus_common;
1890 uacpi_u8 serial_type, extra_size, type_length;
1891
1892 serial_bus_common = &resource->serial_bus_common;
1893 serial_type = *src;
1894 serial_bus_common->type = serial_type;
1895 resource->type = aml_serial_to_native_type(serial_type);
1896
1897 /*
1898 * Now that we know the serial type rebase the end pointers and
1899 * sizes.
1900 */
1901 resource_end = PTR_AT(
1902 resource_end,
1904 );
1905 extra_size = aml_serial_resource_to_extra_aml_size[serial_type];
1906 base_aml_size += extra_size;
1907 base_aml_size_with_header += extra_size;
1908
1909 type_length = serial_bus_common->type_data_length;
1910 if (uacpi_unlikely(type_length < extra_size)) {
1912 "invalid type-specific data length: %d, "
1913 "expected at least %d", type_length, extra_size
1914 );
1917 }
1918
1919 /*
1920 * Calculate the length of the vendor data. All the extra data
1921 * beyond the end of type-specific size is considered vendor data.
1922 */
1923 accumulator = type_length - extra_size;
1924 if (accumulator == 0)
1925 break;
1926
1927 serial_bus_common->vendor_data_length = accumulator;
1928 serial_bus_common->vendor_data = resource_end;
1930 resource_end,
1931 data + base_aml_size_with_header,
1932 accumulator
1933 );
1934 break;
1935 }
1936
1938 }
1939 }
1940}
1941
1943 void *opaque, uacpi_u8 *data, uacpi_u16 resource_size,
1944 const struct uacpi_resource_spec *spec
1945)
1946{
1947 struct resource_conversion_ctx *ctx = opaque;
1948 uacpi_size size_for_this;
1949
1950 size_for_this = native_size_for_aml_resource(data, resource_size, spec);
1951 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
1952 uacpi_error("invalid native size for aml resource: %zu",
1953 size_for_this);
1956 }
1957
1958 ctx->size += size_for_this;
1959 return conditional_continue(ctx);
1960}
1961
1964 uacpi_object **out_obj
1965)
1966{
1968 uacpi_bool is_device;
1969
1972 return ret;
1973
1974 if (uacpi_unlikely(!is_device))
1976
1978 node, method, out_obj
1979 );
1980}
1981
1983 uacpi_data_view aml_buffer, uacpi_resources **out_resources
1984)
1985{
1987 struct resource_conversion_ctx ctx = { 0 };
1989
1992 );
1994 return ret;
1995
1996 if (uacpi_unlikely_error(ctx.st))
1997 return ctx.st;
1998
1999 // Realistically any resource buffer bigger than this is probably a bug
2000 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
2001 uacpi_error("bug: bogus native resource buffer size %zu", ctx.size);
2003 }
2004
2008 resources->length = ctx.size;
2009 resources->entries = UACPI_PTR_ADD(resources, sizeof(uacpi_resources));
2010
2011 uacpi_memzero(&ctx, sizeof(ctx));
2012 ctx.buf = resources->entries;
2013
2017 return ret;
2018 }
2019
2020 *out_resources = resources;
2021 return ret;
2022}
2023
2025 uacpi_data_view aml_buffer, uacpi_resource **out_resource
2026)
2027{
2029 struct resource_conversion_ctx ctx = {
2030 .just_one = UACPI_TRUE,
2031 };
2033
2036 );
2038 return ret;
2039
2043
2044 uacpi_memzero(&ctx, sizeof(ctx));
2045 ctx.buf = resource;
2046 ctx.just_one = UACPI_TRUE;
2047
2051 return ret;
2052 }
2053
2054 *out_resource = resource;
2055 return ret;
2056}
2057
2059{
2060 if (resources == UACPI_NULL)
2061 return;
2062
2063 uacpi_free(resources, sizeof(uacpi_resources) + resources->length);
2064}
2065
2067{
2068 if (resource == UACPI_NULL)
2069 return;
2070
2071 uacpi_free(resource, resource->length);
2072}
2073
2076 uacpi_resources **out_resources
2077)
2078{
2082
2085 return ret;
2086
2087 uacpi_buffer_to_view(obj->buffer, &buffer);
2088
2089 ret = uacpi_native_resources_from_aml(buffer, out_resources);
2091
2092 return ret;
2093}
2094
2097)
2098{
2099 return extract_native_resources_from_method(device, "_CRS", out_resources);
2100}
2101
2104)
2105{
2106 return extract_native_resources_from_method(device, "_PRS", out_resources);
2107}
2108
2111 uacpi_resources **out_resources
2112)
2113{
2114 return extract_native_resources_from_method(device, method, out_resources);
2115}
2116
2119)
2120{
2121 uacpi_size bytes_left = resources->length;
2122 uacpi_resource *current = resources->entries;
2123 uacpi_iteration_decision decision;
2124
2125 while (bytes_left) {
2126 // At least the head bytes
2127 if (uacpi_unlikely(bytes_left < 4)) {
2128 uacpi_error("corrupted resource buffer %p length %zu",
2129 resources, resources->length);
2131 }
2132
2134 uacpi_error("invalid resource type %d", current->type);
2136 }
2137
2138 if (uacpi_unlikely(current->length > bytes_left)) {
2139 uacpi_error("corrupted resource@%p length %u (%zu bytes left)",
2140 current, current->length, bytes_left);
2142 }
2143
2144 decision = cb(user, current);
2145
2146 if (decision == UACPI_ITERATION_DECISION_BREAK ||
2148 return UACPI_STATUS_OK;
2149
2150 bytes_left -= current->length;
2151 current = (uacpi_resource*)((uacpi_u8*)current + current->length);
2152 }
2153
2155}
2156
2160)
2161{
2164
2167 return ret;
2168
2171
2172 return ret;
2173}
2174
2177)
2178{
2180}
2181
2183 uacpi_resource *resource, const struct uacpi_resource_spec *spec
2184)
2185{
2186 return spec->size_for_aml ?
2187 spec->size_for_aml(spec, resource) :
2189}
2190
2192 void *opaque, uacpi_resource *resource
2193)
2194{
2195 struct resource_conversion_ctx *ctx = opaque;
2196 const struct uacpi_resource_spec *spec;
2197 const struct uacpi_resource_convert_instruction *insns, *insn;
2198 uacpi_u8 pc = 0;
2199 uacpi_u8 *dst_base, *src, *dst;
2200 uacpi_u32 aml_size, base_aml_size_with_header, accumulator = 0;
2201 void *resource_end;
2202
2204 aml_size = aml_size_for_native_resource(resource, spec);
2205 insns = spec->to_aml;
2206
2207 dst_base = ctx->byte_buf;
2208 ctx->byte_buf += aml_size;
2210
2211 base_aml_size_with_header = spec->aml_size;
2212 base_aml_size_with_header += aml_resource_kind_to_header_size[
2213 spec->resource_kind
2214 ];
2215 resource_end = PTR_AT(resource, spec->native_size);
2216
2218 *dst_base = ACPI_LARGE_ITEM | type_to_aml_resource[spec->type];
2219 uacpi_memcpy(dst_base + 1, &aml_size, sizeof(uacpi_u16));
2220 } else {
2222 *dst_base |= aml_size;
2223 }
2224
2225 if (insns == UACPI_NULL)
2227
2228 for (;;) {
2229 insn = &insns[pc++];
2230
2232 dst = dst_base + insn->f1.aml_offset;
2233
2234 switch (insn->code) {
2237 uacpi_u8 i, *array_size, bytes = 1;
2238 uacpi_u16 mask = 0;
2239
2241 for (i = 0; i < *array_size; ++i)
2242 mask |= 1 << src[i];
2243
2245 bytes = 2;
2246
2248 break;
2249 }
2250
2255 *dst |= *src << insn->f3.imm;
2256 break;
2257
2259 accumulator = aml_size;
2260 break;
2261
2265 uacpi_size source_offset, length;
2266 uacpi_u8 *dst_string;
2267 const uacpi_char *src_string;
2268 union {
2269 void *ptr;
2272 } src_name = { 0 };
2273
2274 src_name.ptr = src;
2275
2276 source_offset = base_aml_size_with_header + accumulator;
2277 dst_string = dst_base + source_offset;
2278
2279 if (insn->f1.aml_offset)
2280 uacpi_memcpy(dst, &source_offset, sizeof(uacpi_u16));
2281
2283 src_name.source->index_present)
2284 uacpi_memcpy(dst_string++, &src_name.source->index, 1);
2285
2287 length = src_name.label->length;
2288 src_string = src_name.label->string;
2289 } else {
2290 length = src_name.source->length;
2291 src_string = src_name.source->string;
2292 }
2293
2294 if (length == 0)
2295 break;
2296
2297 if (uacpi_unlikely(src_string == UACPI_NULL)) {
2299 "source string length is %zu but the pointer is NULL",
2300 length
2301 );
2304 }
2305
2306 uacpi_memcpy(dst_string, src_string, length);
2307 break;
2308 }
2309
2311 uacpi_memcpy_zerout(&accumulator, src,
2312 sizeof(accumulator), sizeof(uacpi_u16));
2313 accumulator *= sizeof(uacpi_u16);
2314 break;
2315
2317 /*
2318 * The pin table resides right at the end of the base resource,
2319 * set the offset to it in the AML we're encoding.
2320 */
2321 uacpi_memcpy(dst, &base_aml_size_with_header, sizeof(uacpi_u16));
2322
2323 /*
2324 * Copy the actual data. It also resides right at the end of the
2325 * native base resource.
2326 */
2328 dst_base + base_aml_size_with_header,
2329 resource_end,
2330 accumulator
2331 );
2332 break;
2333
2335 uacpi_u16 vendor_data_length, data_offset, vendor_data_offset;
2336 uacpi_u8 *vendor_data;
2337
2338 // Read the vendor_data pointer
2339 uacpi_memcpy(&vendor_data, NATIVE_OFFSET(resource, insn->f3.arg2),
2340 sizeof(void*));
2341 uacpi_memcpy(&vendor_data_length, src, sizeof(uacpi_u16));
2342
2343 if (vendor_data == UACPI_NULL) {
2344 uacpi_size full_aml_size;
2345
2346 if (uacpi_unlikely(vendor_data_length != 0)) {
2348 "vendor_data_length is %d, but pointer is NULL",
2349 vendor_data_length
2350 );
2353 }
2354
2355 /*
2356 * There's no vendor data. The specification still mandates
2357 * that we fill the vendor data offset field correctly, meaning
2358 * we set it to the total length of the resource.
2359 */
2360 full_aml_size = aml_size;
2361 full_aml_size += aml_resource_kind_to_header_size[
2362 spec->resource_kind
2363 ];
2364
2365 uacpi_memcpy(dst, &full_aml_size, sizeof(uacpi_u16));
2366 break;
2367 }
2368
2369 /*
2370 * Calculate the offset of vendor data from the end of the native
2371 * resource and use it since it matches the offset from the end of
2372 * the AML resource.
2373 *
2374 * Non-zero value means there's a source string in between.
2375 */
2376 data_offset = vendor_data - (uacpi_u8*)resource_end;
2377 vendor_data_offset = data_offset + base_aml_size_with_header;
2378
2379 // Write vendor_data_offset
2380 uacpi_memcpy(dst, &vendor_data_offset, sizeof(uacpi_u16));
2381
2382 /*
2383 * Write vendor_data_length, this field is right after
2384 * vendor_data_offset, and is completely redundant, but it exists
2385 * nonetheless.
2386 */
2388 dst + sizeof(uacpi_u16),
2389 &vendor_data_length,
2390 sizeof(vendor_data_length)
2391 );
2392
2393 // Finally write the data itself
2395 dst_base + vendor_data_offset,
2396 vendor_data,
2397 vendor_data_length
2398 );
2399 break;
2400 }
2401
2403 uacpi_u8 serial_type = *src;
2404 *dst = serial_type;
2405
2406 ctx->st = validate_aml_serial_type(serial_type);
2407 if (uacpi_unlikely_error(ctx->st))
2409
2410 if (uacpi_unlikely(resource->type !=
2411 aml_serial_to_native_type(serial_type))) {
2413 "native serial resource type %d doesn't match expected %d",
2414 resource->type, aml_serial_to_native_type(serial_type)
2415 );
2418 }
2419
2420 // Rebase the end pointer & size now that we know the serial type
2421 resource_end = PTR_AT(
2422 resource_end,
2424 );
2425 base_aml_size_with_header += aml_serial_resource_to_extra_aml_size[
2426 serial_type
2427 ];
2428
2429 accumulator = resource->serial_bus_common.vendor_data_length;
2430 if (accumulator == 0)
2431 break;
2432
2433 // Copy vendor data
2435 dst_base + base_aml_size_with_header,
2436 resource_end,
2437 accumulator
2438 );
2439 break;
2440 }
2441
2443 }
2444 }
2445}
2446
2448 uacpi_resources *native_resources, void *aml_buffer
2449)
2450{
2452 struct resource_conversion_ctx ctx = { 0 };
2453
2454 ctx.buf = aml_buffer;
2455
2457 native_resources, do_native_resource_to_aml, &ctx
2458 );
2460 // An end tag is always included
2462
2463 do_native_resource_to_aml(&ctx, &end_tag);
2465 }
2467 return ret;
2468
2469 return ctx.st;
2470}
2471
2473 void *opaque, uacpi_resource *resource
2474)
2475{
2476 struct resource_conversion_ctx *ctx = opaque;
2477 const struct uacpi_resource_spec *spec;
2478 uacpi_size size_for_this;
2479
2480 // resource->type is sanitized to be valid here by the iteration function
2482
2483 size_for_this = aml_size_for_native_resource(resource, spec);
2484 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
2485 uacpi_error("invalid aml size for native resource: %zu",
2486 size_for_this);
2489 }
2490
2491 ctx->size += size_for_this;
2493}
2494
2496 uacpi_resources *resources, uacpi_object **out_template
2497)
2498{
2501 void *buffer;
2502 struct resource_conversion_ctx ctx = { 0 };
2503
2506 );
2508 // An end tag is always included
2510
2511 accumulate_aml_buffer_size(&ctx, &end_tag);
2513 }
2515 return ret;
2516 if (uacpi_unlikely_error(ctx.st))
2517 return ctx.st;
2518
2519 // Same reasoning as native_resource_from_aml
2520 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
2521 uacpi_error("bug: bogus target aml resource buffer size %zu", ctx.size);
2523 }
2524
2528
2530 if (uacpi_unlikely(obj == UACPI_NULL)) {
2531 uacpi_free(buffer, ctx.size);
2533 }
2534
2535 obj->buffer->data = buffer;
2536 obj->buffer->size = ctx.size;
2537
2541
2542 if (ret == UACPI_STATUS_OK)
2543 *out_template = obj;
2544
2545 return ret;
2546}
2547
2550)
2551{
2553 uacpi_object *res_template;
2555
2558 return ret;
2559
2560 args.objects = &res_template;
2561 args.count = 1;
2562 ret = uacpi_eval(device, "_SRS", &args, UACPI_NULL);
2563
2564 uacpi_object_unref(res_template);
2565 return ret;
2566}
2567
2568#endif // !UACPI_BAREBONES_MODE
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
Definition: align.cpp:48
void user(int argc, const char *argv[])
Definition: cmds.c:1350
void intr(void)
Definition: main.c:258
static PDB_INFORMATION information
Definition: db.cpp:179
const WCHAR * vendor
Definition: db.cpp:873
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
method
Definition: dragdrop.c:54
#define ACPI_RESOURCE_START_DEPENDENT
Definition: acpi.h:1233
#define ACPI_SMALL_ITEM_NAME_MASK
Definition: acpi.h:1225
#define ACPI_SERIAL_TYPE_MAX
Definition: acpi.h:1462
#define ACPI_RESOURCE_END_TAG
Definition: acpi.h:1239
#define ACPI_RESOURCE_SERIAL_CONNECTION
Definition: acpi.h:1254
#define ACPI_RESOURCE_ADDRESS32
Definition: acpi.h:1247
#define ACPI_RESOURCE_FIXED_DMA
Definition: acpi.h:1237
#define ACPI_SERIAL_TYPE_CSI2
Definition: acpi.h:1461
#define ACPI_RESOURCE_PIN_CONFIGURATION
Definition: acpi.h:1255
#define ACPI_RESOURCE_ADDRESS16
Definition: acpi.h:1248
#define ACPI_RESOURCE_CLOCK_INPUT
Definition: acpi.h:1259
#define ACPI_RESOURCE_IRQ
Definition: acpi.h:1231
#define ACPI_RESOURCE_VENDOR_TYPE0
Definition: acpi.h:1238
#define ACPI_RESOURCE_GPIO_CONNECTION
Definition: acpi.h:1252
#define ACPI_SERIAL_TYPE_SPI
Definition: acpi.h:1459
#define ACPI_SMALL_ITEM_NAME_IDX
Definition: acpi.h:1224
#define ACPI_RESOURCE_PIN_GROUP_FUNCTION
Definition: acpi.h:1257
#define ACPI_RESOURCE_PIN_GROUP
Definition: acpi.h:1256
#define ACPI_RESOURCE_VENDOR_TYPE1
Definition: acpi.h:1244
#define ACPI_RESOURCE_GENERIC_REGISTER
Definition: acpi.h:1243
#define ACPI_RESOURCE_MEMORY32
Definition: acpi.h:1245
#define ACPI_RESOURCE_IO
Definition: acpi.h:1235
#define ACPI_RESOURCE_PIN_FUNCTION
Definition: acpi.h:1253
#define ACPI_SMALL_ITEM_LENGTH_MASK
Definition: acpi.h:1226
#define ACPI_SERIAL_TYPE_I2C
Definition: acpi.h:1458
#define ACPI_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: acpi.h:1258
#define ACPI_LARGE_ITEM
Definition: acpi.h:1222
#define ACPI_RESOURCE_ADDRESS64
Definition: acpi.h:1250
#define ACPI_RESOURCE_DMA
Definition: acpi.h:1232
#define ACPI_RESOURCE_END_DEPENDENT
Definition: acpi.h:1234
#define ACPI_RESOURCE_ADDRESS64_EXTENDED
Definition: acpi.h:1251
#define ACPI_RESOURCE_FIXED_MEMORY32
Definition: acpi.h:1246
#define ACPI_SERIAL_TYPE_UART
Definition: acpi.h:1460
#define ACPI_LARGE_ITEM_NAME_MASK
Definition: acpi.h:1228
#define ACPI_RESOURCE_EXTENDED_IRQ
Definition: acpi.h:1249
#define ACPI_RESOURCE_MEMORY24
Definition: acpi.h:1242
#define ACPI_RESOURCE_FIXED_IO
Definition: acpi.h:1236
uacpi_u16 uacpi_gpe_triggering triggering
Definition: event.h:117
#define UACPI_UNUSED(x)
Definition: helpers.h:7
#define uacpi_error(...)
Definition: log.h:36
#define uacpi_warn(...)
Definition: log.h:35
@ UACPI_AML_RESOURCE_KIND_LARGE
Definition: resources.h:52
@ UACPI_AML_RESOURCE_KIND_SMALL
Definition: resources.h:51
uacpi_aml_resource
Definition: resources.h:8
@ UACPI_AML_RESOURCE_END_TAG
Definition: resources.h:20
@ UACPI_AML_RESOURCE_PIN_GROUP
Definition: resources.h:37
@ UACPI_AML_RESOURCE_FIXED_MEMORY32
Definition: resources.h:27
@ UACPI_AML_RESOURCE_ADDRESS32
Definition: resources.h:28
@ UACPI_AML_RESOURCE_PIN_CONFIGURATION
Definition: resources.h:36
@ UACPI_AML_RESOURCE_FIXED_IO
Definition: resources.h:17
@ UACPI_AML_RESOURCE_MEMORY24
Definition: resources.h:23
@ UACPI_AML_RESOURCE_TYPE_INVALID
Definition: resources.h:9
@ UACPI_AML_RESOURCE_VENDOR_TYPE0
Definition: resources.h:19
@ UACPI_AML_RESOURCE_PIN_FUNCTION
Definition: resources.h:34
@ UACPI_AML_RESOURCE_IO
Definition: resources.h:16
@ UACPI_AML_RESOURCE_FIXED_DMA
Definition: resources.h:18
@ UACPI_AML_RESOURCE_DMA
Definition: resources.h:13
@ UACPI_AML_RESOURCE_PIN_GROUP_FUNCTION
Definition: resources.h:38
@ UACPI_AML_RESOURCE_GPIO_CONNECTION
Definition: resources.h:33
@ UACPI_AML_RESOURCE_EXTENDED_IRQ
Definition: resources.h:30
@ UACPI_AML_RESOURCE_GENERIC_REGISTER
Definition: resources.h:24
@ UACPI_AML_RESOURCE_END_DEPENDENT
Definition: resources.h:15
@ UACPI_AML_RESOURCE_VENDOR_TYPE1
Definition: resources.h:25
@ UACPI_AML_RESOURCE_IRQ
Definition: resources.h:12
@ UACPI_AML_RESOURCE_ADDRESS64_EXTENDED
Definition: resources.h:32
@ UACPI_AML_RESOURCE_ADDRESS64
Definition: resources.h:31
@ UACPI_AML_RESOURCE_ADDRESS16
Definition: resources.h:29
@ UACPI_AML_RESOURCE_START_DEPENDENT
Definition: resources.h:14
@ UACPI_AML_RESOURCE_CLOCK_INPUT
Definition: resources.h:40
@ UACPI_AML_RESOURCE_SERIAL_CONNECTION
Definition: resources.h:35
@ UACPI_AML_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: resources.h:39
@ UACPI_AML_RESOURCE_MEMORY32
Definition: resources.h:26
@ UACPI_AML_RESOURCE_MAX
Definition: resources.h:41
uacpi_iteration_decision(* uacpi_aml_resource_iteration_callback)(void *, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *)
Definition: resources.h:306
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_8
Definition: resources.h:69
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_2
Definition: resources.h:85
@ UACPI_RESOURCE_CONVERT_OPCODE_PIN_TABLE
Definition: resources.h:203
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_16
Definition: resources.h:70
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_1
Definition: resources.h:84
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_3
Definition: resources.h:86
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_6
Definition: resources.h:87
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_AML_SIZE_32
Definition: resources.h:138
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_LABEL
Definition: resources.h:179
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE_NO_INDEX
Definition: resources.h:178
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_PIN_TABLE_LENGTH
Definition: resources.h:191
@ UACPI_RESOURCE_CONVERT_OPCODE_SERIAL_TYPE_SPECIFIC
Definition: resources.h:237
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE
Definition: resources.h:177
@ UACPI_RESOURCE_CONVERT_OPCODE_VENDOR_DATA
Definition: resources.h:219
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED
Definition: resources.h:45
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED_OR_ONE_LESS
Definition: resources.h:46
@ UACPI_AML_RESOURCE_SIZE_KIND_VARIABLE
Definition: resources.h:47
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
#define uacpi_memcpy
Definition: stdlib.h:34
#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_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
void uacpi_buffer_to_view(uacpi_buffer *, uacpi_data_view *)
Definition: types.c:1043
uacpi_status uacpi_namespace_node_is(const uacpi_namespace_node *node, uacpi_object_type type, uacpi_bool *out)
Definition: namespace.c:825
#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
char uacpi_char
Definition: types.h:44
uint16_t uacpi_u16
Definition: types.h:20
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
#define UACPI_TRUE
Definition: types.h:29
#define UACPI_EXCLUSIVE
Definition: resources.h:99
uacpi_resource_type
Definition: resources.h:11
@ UACPI_RESOURCE_TYPE_PIN_GROUP_CONFIGURATION
Definition: resources.h:52
@ UACPI_RESOURCE_TYPE_ADDRESS32
Definition: resources.h:22
@ UACPI_RESOURCE_TYPE_START_DEPENDENT
Definition: resources.h:30
@ UACPI_RESOURCE_TYPE_SERIAL_UART_CONNECTION
Definition: resources.h:45
@ UACPI_RESOURCE_TYPE_VENDOR_SMALL
Definition: resources.h:34
@ UACPI_RESOURCE_TYPE_PIN_FUNCTION
Definition: resources.h:48
@ UACPI_RESOURCE_TYPE_EXTENDED_IRQ
Definition: resources.h:13
@ UACPI_RESOURCE_TYPE_MEMORY32
Definition: resources.h:27
@ UACPI_RESOURCE_TYPE_END_DEPENDENT
Definition: resources.h:31
@ UACPI_RESOURCE_TYPE_IO
Definition: resources.h:18
@ UACPI_RESOURCE_TYPE_SERIAL_I2C_CONNECTION
Definition: resources.h:43
@ UACPI_RESOURCE_TYPE_FIXED_DMA
Definition: resources.h:16
@ UACPI_RESOURCE_TYPE_GENERIC_REGISTER
Definition: resources.h:39
@ UACPI_RESOURCE_TYPE_ADDRESS16
Definition: resources.h:21
@ UACPI_RESOURCE_TYPE_SERIAL_SPI_CONNECTION
Definition: resources.h:44
@ UACPI_RESOURCE_TYPE_PIN_GROUP
Definition: resources.h:50
@ UACPI_RESOURCE_TYPE_MAX
Definition: resources.h:57
@ UACPI_RESOURCE_TYPE_IRQ
Definition: resources.h:12
@ UACPI_RESOURCE_TYPE_PIN_CONFIGURATION
Definition: resources.h:49
@ UACPI_RESOURCE_TYPE_FIXED_IO
Definition: resources.h:19
@ UACPI_RESOURCE_TYPE_VENDOR_LARGE
Definition: resources.h:37
@ UACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION
Definition: resources.h:51
@ UACPI_RESOURCE_TYPE_END_TAG
Definition: resources.h:56
@ UACPI_RESOURCE_TYPE_ADDRESS64
Definition: resources.h:23
@ UACPI_RESOURCE_TYPE_CLOCK_INPUT
Definition: resources.h:54
@ UACPI_RESOURCE_TYPE_SERIAL_CSI2_CONNECTION
Definition: resources.h:46
@ UACPI_RESOURCE_TYPE_GPIO_CONNECTION
Definition: resources.h:40
@ UACPI_RESOURCE_TYPE_ADDRESS64_EXTENDED
Definition: resources.h:24
@ UACPI_RESOURCE_TYPE_MEMORY24
Definition: resources.h:26
@ UACPI_RESOURCE_TYPE_FIXED_MEMORY32
Definition: resources.h:28
@ UACPI_RESOURCE_TYPE_DMA
Definition: resources.h:15
#define UACPI_ACCEPTABLE
Definition: resources.h:314
#define UACPI_POLARITY_ACTIVE_HIGH
Definition: resources.h:94
@ UACPI_RESOURCE_LENGTH_KIND_DONT_CARE
Definition: resources.h:84
@ UACPI_RESOURCE_LENGTH_KIND_ONE_LESS
Definition: resources.h:85
@ UACPI_RESOURCE_LENGTH_KIND_FULL
Definition: resources.h:86
#define UACPI_GPIO_CONNECTION_IO
Definition: resources.h:345
uacpi_iteration_decision(* uacpi_resource_iteration_callback)(void *user, uacpi_resource *resource)
Definition: resources.h:664
#define UACPI_TRIGGERING_EDGE
Definition: resources.h:90
#define UACPI_GPIO_CONNECTION_INTERRUPT
Definition: resources.h:344
#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_INTERNAL_ERROR
Definition: status.h:21
@ UACPI_STATUS_AML_INVALID_RESOURCE
Definition: status.h:42
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_NO_RESOURCE_END_TAG
Definition: status.h:26
@ UACPI_STATUS_OK
Definition: status.h:11
uacpi_iteration_decision
Definition: types.h:28
@ UACPI_ITERATION_DECISION_BREAK
Definition: types.h:30
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
@ UACPI_OBJECT_BUFFER
Definition: types.h:114
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
return ret
Definition: mutex.c:147
static const struct uacpi_resource_convert_instruction convert_io[]
Definition: resources.c:672
#define OP(short_code,...)
Definition: resources.c:580
const struct uacpi_resource_spec aml_resources[UACPI_AML_RESOURCE_MAX+1]
Definition: resources.c:1097
static const uacpi_u8 aml_resource_to_type[256]
Definition: resources.c:19
static const struct uacpi_resource_convert_instruction convert_pin_group[]
Definition: resources.c:939
static const struct uacpi_resource_convert_instruction convert_vendor_type1[]
Definition: resources.c:702
static const struct uacpi_resource_convert_instruction convert_memory32[]
Definition: resources.c:715
static uacpi_size size_for_aml_resource_source(uacpi_resource_source *source, uacpi_bool with_index)
Definition: resources.c:273
static const struct uacpi_resource_convert_instruction convert_gpio_connection[]
Definition: resources.c:868
static uacpi_resource_type aml_serial_to_native_type(uacpi_u8 type)
Definition: resources.c:1667
uacpi_status uacpi_get_possible_resources(uacpi_namespace_node *device, uacpi_resources **out_resources)
Definition: resources.c:2102
#define NATIVE_F(short_native_name, field)
Definition: resources.c:597
#define LARGE_RESOURCE_BASE
Definition: resources.c:12
static uacpi_iteration_decision do_native_resource_to_aml(void *opaque, uacpi_resource *resource)
Definition: resources.c:2191
static uacpi_size size_for_aml_extended_irq(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:344
#define IMM(value)
Definition: resources.c:600
static const struct uacpi_resource_convert_instruction convert_irq_to_native[]
Definition: resources.c:606
static const uacpi_u8 aml_serial_resource_to_extra_native_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:544
static const struct uacpi_resource_convert_instruction convert_fixed_memory32[]
Definition: resources.c:723
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
Definition: resources.c:742
#define ARG0(value)
Definition: resources.c:601
static const uacpi_u8 type_to_aml_resource[]
Definition: resources.c:52
static uacpi_iteration_decision conditional_continue(struct resource_conversion_ctx *ctx)
Definition: resources.c:1563
uacpi_status uacpi_find_aml_resource_end_tag(uacpi_data_view buffer, uacpi_size *out_offset)
Definition: resources.c:1528
#define LARGE_ITEM_HEADER_SIZE
Definition: resources.c:118
static uacpi_iteration_decision accumulate_native_buffer_size(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1942
uacpi_status uacpi_get_current_resources(uacpi_namespace_node *device, uacpi_resources **out_resources)
Definition: resources.c:2095
#define ARG2(value)
Definition: resources.c:603
static uacpi_size size_for_aml_irq(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:156
static uacpi_size size_for_aml_start_dependent(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:190
uacpi_status uacpi_for_each_resource(uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2117
#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct,...)
Definition: resources.c:1063
static const struct uacpi_resource_convert_instruction convert_fixed_io[]
Definition: resources.c:681
#define END()
Definition: resources.c:586
static const struct uacpi_resource_convert_instruction convert_vendor_type0[]
Definition: resources.c:696
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
Definition: resources.c:852
static uacpi_iteration_decision do_aml_resource_to_native(void *opaque, uacpi_u8 *data, uacpi_u16 aml_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1675
uacpi_status uacpi_for_each_aml_resource(uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
Definition: resources.c:1425
void uacpi_free_resources(uacpi_resources *resources)
Definition: resources.c:2058
uacpi_status uacpi_native_resources_to_aml(uacpi_resources *resources, uacpi_object **out_template)
Definition: resources.c:2495
static const struct uacpi_resource_convert_instruction convert_clock_input[]
Definition: resources.c:834
static enum uacpi_aml_resource get_aml_resource_type(uacpi_u8 raw_byte)
Definition: resources.c:1369
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml[]
Definition: resources.c:663
#define AML_F(short_aml_name, field)
Definition: resources.c:591
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
Definition: resources.c:950
uacpi_status uacpi_native_resources_from_aml(uacpi_data_view aml_buffer, uacpi_resources **out_resources)
Definition: resources.c:1982
#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type)
Definition: resources.c:531
static uacpi_size native_size_for_aml_resource(uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1516
#define L(x)
Definition: resources.c:13
static uacpi_size size_for_aml_pin_group(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:491
static uacpi_status get_aml_resource_size(uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
Definition: resources.c:1382
static uacpi_size size_for_aml_vendor(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:230
#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type)
Definition: resources.c:527
uacpi_status uacpi_get_device_resources(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2109
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_native[]
Definition: resources.c:644
static const struct uacpi_resource_convert_instruction convert_pin_configuration[]
Definition: resources.c:921
static uacpi_status validate_aml_serial_type(uacpi_u8 type)
Definition: resources.c:1414
#define PTR_AT(ptr, offset)
Definition: resources.c:1638
static uacpi_iteration_decision accumulate_aml_buffer_size(void *opaque, uacpi_resource *resource)
Definition: resources.c:2472
static const struct uacpi_resource_convert_instruction convert_pin_group_function[]
Definition: resources.c:964
uacpi_status uacpi_set_resources(uacpi_namespace_node *device, uacpi_resources *resources)
Definition: resources.c:2548
#define NATIVE_OFFSET(res, offset)
Definition: resources.c:1640
static const uacpi_u8 aml_resource_kind_to_header_size[2]
Definition: resources.c:120
static uacpi_size aml_size_for_native_resource(uacpi_resource *resource, const struct uacpi_resource_spec *spec)
Definition: resources.c:2182
static const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:536
#define CHECK_AML_OFFSET(offset, what)
Definition: resources.c:1663
static const struct uacpi_resource_convert_instruction convert_generic_register[]
Definition: resources.c:734
static const struct uacpi_resource_convert_instruction convert_generic_serial_bus[]
Definition: resources.c:994
static const struct uacpi_resource_convert_instruction convert_address64_extended[]
Definition: resources.c:804
static uacpi_iteration_decision find_end(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1501
static uacpi_size aml_size_with_header(const struct uacpi_resource_spec *spec)
Definition: resources.c:125
uacpi_status uacpi_for_each_device_resource(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2157
static const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
Definition: resources.c:84
#define NATIVE_O(short_name, field)
Definition: resources.c:594
static uacpi_size extra_size_for_serial_connection(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:551
static const struct uacpi_resource_convert_instruction convert_pin_group_configuration[]
Definition: resources.c:978
#define SMALL_ITEM_HEADER_SIZE
Definition: resources.c:117
static uacpi_size extra_size_for_native_pin_group(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:464
static uacpi_size extra_size_for_native_vendor(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:221
void uacpi_free_resource(uacpi_resource *resource)
Definition: resources.c:2066
static uacpi_size extra_size_for_resource_source(uacpi_size base_size, uacpi_size reported_size)
Definition: resources.c:257
uacpi_status uacpi_get_resource_from_buffer(uacpi_data_view aml_buffer, uacpi_resource **out_resource)
Definition: resources.c:2024
static uacpi_size extra_size_for_native_irq_or_dma(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:131
#define DEFINE_ADDRESS_CONVERSION(width)
Definition: resources.c:789
static const struct uacpi_resource_convert_instruction convert_extended_irq[]
Definition: resources.c:814
static uacpi_size aml_size_for_serial_connection(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:565
#define CONVERSION_OPCODES_COMMON(native_buf)
Definition: resources.c:1572
static const struct uacpi_resource_spec * resource_spec_from_native(uacpi_resource *resource)
Definition: resources.c:2175
static uacpi_size extra_size_for_native_address_or_clock_input(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:292
static uacpi_size size_for_aml_gpio_or_pins(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:413
static uacpi_status native_resources_to_aml(uacpi_resources *native_resources, void *aml_buffer)
Definition: resources.c:2447
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
Definition: resources.c:775
#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( aml_type_enum, native_type_enum, aml_struct,...)
Definition: resources.c:1074
static uacpi_size extra_size_for_native_gpio_or_pins(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:358
static uacpi_status eval_resource_helper(uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
Definition: resources.c:1962
static const struct uacpi_resource_convert_instruction convert_dma[]
Definition: resources.c:634
#define DECODE_SOURCE_INDEX(short_aml_name)
Definition: resources.c:848
static const struct uacpi_resource_convert_instruction convert_memory24[]
Definition: resources.c:708
static const struct uacpi_resource_convert_instruction convert_pin_function[]
Definition: resources.c:904
static uacpi_status extract_native_resources_from_method(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2074
static uacpi_size size_for_aml_address_or_clock_input(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:300
#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct,...)
Definition: resources.c:1086
static uacpi_size extra_size_for_extended_irq(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:329
const struct uacpi_resource_convert_instruction convert_irq_to_aml[]
Definition: resources.c:623
static const struct uacpi_resource_convert_instruction convert_fixed_dma[]
Definition: resources.c:687
unsigned char irq
Definition: dsp.h:13
static void write_status(LPCWSTR lpFmt,...)
Definition: dwnl.c:45
uint32_t serial
Definition: fsck.fat.h:29
FxCmResList * resources
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
GLuint res
Definition: glext.h:9613
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLuint address
Definition: glext.h:9393
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
GLenum GLenum dst
Definition: glext.h:6340
GLuint divisor
Definition: glext.h:6313
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLboolean GLuint group
Definition: glext.h:11120
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
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 GLint GLint j
Definition: glfuncs.h:250
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
#define resource
Definition: kernel32.h:9
struct task_struct * current
Definition: linux.c:32
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR label[]
Definition: itemdlg.c:1546
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:72
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:72
static LARGE_INTEGER * frequency
Definition: time.c:38
static UINT array_size
Definition: msctf.cpp:39
direction
Definition: netio.c:882
#define UNREACHABLE
static OBJECT_ATTRIBUTES *static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:95
int This channels
Definition: rdpsnd_libao.c:37
#define args
Definition: format.c:66
Definition: match.c:390
Definition: devices.h:37
Definition: regsvr.c:104
DWORD index
Definition: pdh_main.c:175
union uacpi_resource_convert_instruction::@689 f1
union uacpi_resource_convert_instruction::@691 f3
union uacpi_resource_convert_instruction::@690 f2
uacpi_resource_source source
Definition: resources.h:405
uacpi_size(* size_for_aml)(const struct uacpi_resource_spec *, uacpi_resource *)
Definition: resources.h:298
uacpi_u8 native_type
Definition: resources.h:268
uacpi_u16 aml_size
Definition: resources.h:276
const struct uacpi_resource_convert_instruction * to_aml
Definition: resources.h:303
const struct uacpi_resource_convert_instruction * to_native
Definition: resources.h:302
uacpi_u16 native_size
Definition: resources.h:283
uacpi_u8 size_kind
Definition: resources.h:270
uacpi_size(* extra_size_for_native)(const struct uacpi_resource_spec *, void *, uacpi_size)
Definition: resources.h:290
uacpi_u8 resource_kind
Definition: resources.h:269
uacpi_u32 type
Definition: resources.h:605
uacpi_status uacpi_eval_simple_buffer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
Definition: uacpi.c:971
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:709
Definition: dlist.c:348
Definition: pdh_main.c:96
#define const
Definition: zconf.h:233