ReactOS 0.4.17-dev-736-g75e91de
resources.c File Reference
Include dependency graph for resources.c:

Go to the source code of this file.

Classes

struct  resource_conversion_ctx
 

Macros

#define LARGE_RESOURCE_BASE   (ACPI_RESOURCE_END_TAG + 1)
 
#define L(x)   (x + LARGE_RESOURCE_BASE)
 
#define SMALL_ITEM_HEADER_SIZE   sizeof(struct acpi_small_item)
 
#define LARGE_ITEM_HEADER_SIZE   sizeof(struct acpi_large_item)
 
#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type)
 
#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type)
 
#define OP(short_code, ...)
 
#define END()   OP(END)
 
#define AML_O(short_aml_name, field)    uacpi_offsetof(struct acpi_resource_##short_aml_name, field)
 
#define AML_F(short_aml_name, field)    .f1.aml_offset = AML_O(short_aml_name, field)
 
#define NATIVE_O(short_name, field)    uacpi_offsetof(uacpi_resource_##short_name, field)
 
#define NATIVE_F(short_native_name, field)    .f2.native_offset = NATIVE_O(short_native_name, field)
 
#define IMM(value)   .f3.imm = value
 
#define ARG0(value)   .f1.arg0 = (value)
 
#define ARG1(value)   .f2.arg1 = (value)
 
#define ARG2(value)   .f3.arg2 = (value)
 
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
 
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
 
#define DEFINE_ADDRESS_CONVERSION(width)
 
#define DECODE_SOURCE_INDEX(short_aml_name)
 
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
 
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
 
#define NATIVE_RESOURCE_HEADER_SIZE   8
 
#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct, ...)
 
#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( aml_type_enum, native_type_enum, aml_struct, ...)
 
#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct, ...)
 
#define CONVERSION_OPCODES_COMMON(native_buf)
 
#define PTR_AT(ptr, offset)   (void*)((uacpi_u8*)(ptr) + (offset))
 
#define NATIVE_OFFSET(res, offset)    PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))
 
#define NATIVE_FIELD(res, name, field)    NATIVE_OFFSET(res, NATIVE_O(name, field))
 
#define CHECK_AML_OOB(offset, prefix, what)
 
#define CHECK_AML_OFFSET_BASE(offset, what)
 
#define CHECK_AML_OFFSET(offset, what)
 

Functions

static uacpi_size aml_size_with_header (const struct uacpi_resource_spec *spec)
 
static uacpi_size extra_size_for_native_irq_or_dma (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_irq (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size size_for_aml_start_dependent (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_vendor (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_vendor (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_resource_source (uacpi_size base_size, uacpi_size reported_size)
 
static uacpi_size size_for_aml_resource_source (uacpi_resource_source *source, uacpi_bool with_index)
 
static uacpi_size extra_size_for_native_address_or_clock_input (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_address_or_clock_input (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_extended_irq (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_extended_irq (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_gpio_or_pins (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_gpio_or_pins (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_pin_group (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_pin_group (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_serial_connection (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size aml_size_for_serial_connection (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static enum uacpi_aml_resource get_aml_resource_type (uacpi_u8 raw_byte)
 
static uacpi_status get_aml_resource_size (uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
 
static uacpi_status validate_aml_serial_type (uacpi_u8 type)
 
uacpi_status uacpi_for_each_aml_resource (uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
 
static uacpi_iteration_decision find_end (void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
 
static uacpi_size native_size_for_aml_resource (uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
 
uacpi_status uacpi_find_aml_resource_end_tag (uacpi_data_view buffer, uacpi_size *out_offset)
 
static uacpi_iteration_decision conditional_continue (struct resource_conversion_ctx *ctx)
 
static uacpi_resource_type aml_serial_to_native_type (uacpi_u8 type)
 
static uacpi_iteration_decision do_aml_resource_to_native (void *opaque, uacpi_u8 *data, uacpi_u16 aml_size, const struct uacpi_resource_spec *spec)
 
static uacpi_iteration_decision accumulate_native_buffer_size (void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
 
static uacpi_status eval_resource_helper (uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
 
uacpi_status uacpi_native_resources_from_aml (uacpi_data_view aml_buffer, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_resource_from_buffer (uacpi_data_view aml_buffer, uacpi_resource **out_resource)
 
void uacpi_free_resources (uacpi_resources *resources)
 
void uacpi_free_resource (uacpi_resource *resource)
 
static uacpi_status extract_native_resources_from_method (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_current_resources (uacpi_namespace_node *device, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_possible_resources (uacpi_namespace_node *device, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_device_resources (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
 
uacpi_status uacpi_for_each_resource (uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
 
uacpi_status uacpi_for_each_device_resource (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resource_iteration_callback cb, void *user)
 
static const struct uacpi_resource_specresource_spec_from_native (uacpi_resource *resource)
 
static uacpi_size aml_size_for_native_resource (uacpi_resource *resource, const struct uacpi_resource_spec *spec)
 
static uacpi_iteration_decision do_native_resource_to_aml (void *opaque, uacpi_resource *resource)
 
static uacpi_status native_resources_to_aml (uacpi_resources *native_resources, void *aml_buffer)
 
static uacpi_iteration_decision accumulate_aml_buffer_size (void *opaque, uacpi_resource *resource)
 
uacpi_status uacpi_native_resources_to_aml (uacpi_resources *resources, uacpi_object **out_template)
 
uacpi_status uacpi_set_resources (uacpi_namespace_node *device, uacpi_resources *resources)
 

Variables

static const uacpi_u8 aml_resource_to_type [256]
 
static const uacpi_u8 type_to_aml_resource []
 
static const uacpi_u8 native_resource_to_type [UACPI_RESOURCE_TYPE_MAX+1]
 
static const uacpi_u8 aml_resource_kind_to_header_size [2]
 
static const uacpi_u8 aml_serial_resource_to_extra_aml_size [ACPI_SERIAL_TYPE_MAX+1]
 
static const uacpi_u8 aml_serial_resource_to_extra_native_size [ACPI_SERIAL_TYPE_MAX+1]
 
static const struct uacpi_resource_convert_instruction convert_irq_to_native []
 
const struct uacpi_resource_convert_instruction convert_irq_to_aml []
 
static const struct uacpi_resource_convert_instruction convert_dma []
 
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_native []
 
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml []
 
static const struct uacpi_resource_convert_instruction convert_io []
 
static const struct uacpi_resource_convert_instruction convert_fixed_io []
 
static const struct uacpi_resource_convert_instruction convert_fixed_dma []
 
static const struct uacpi_resource_convert_instruction convert_vendor_type0 []
 
static const struct uacpi_resource_convert_instruction convert_vendor_type1 []
 
static const struct uacpi_resource_convert_instruction convert_memory24 []
 
static const struct uacpi_resource_convert_instruction convert_memory32 []
 
static const struct uacpi_resource_convert_instruction convert_fixed_memory32 []
 
static const struct uacpi_resource_convert_instruction convert_generic_register []
 
static const struct uacpi_resource_convert_instruction convert_address64_extended []
 
static const struct uacpi_resource_convert_instruction convert_extended_irq []
 
static const struct uacpi_resource_convert_instruction convert_clock_input []
 
static const struct uacpi_resource_convert_instruction convert_gpio_connection []
 
static const struct uacpi_resource_convert_instruction convert_pin_function []
 
static const struct uacpi_resource_convert_instruction convert_pin_configuration []
 
static const struct uacpi_resource_convert_instruction convert_pin_group []
 
static const struct uacpi_resource_convert_instruction convert_pin_group_function []
 
static const struct uacpi_resource_convert_instruction convert_pin_group_configuration []
 
static const struct uacpi_resource_convert_instruction convert_generic_serial_bus []
 
const struct uacpi_resource_spec aml_resources [UACPI_AML_RESOURCE_MAX+1]
 

Macro Definition Documentation

◆ AML_F

#define AML_F (   short_aml_name,
  field 
)     .f1.aml_offset = AML_O(short_aml_name, field)

Definition at line 591 of file resources.c.

◆ AML_O

#define AML_O (   short_aml_name,
  field 
)     uacpi_offsetof(struct acpi_resource_##short_aml_name, field)

Definition at line 588 of file resources.c.

◆ AML_SERIAL_RESOURCE_EXTRA_SIZE

#define AML_SERIAL_RESOURCE_EXTRA_SIZE (   type)
Value:
(sizeof(struct acpi_resource_serial_##type) \
- sizeof(struct acpi_resource_serial))
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList

Definition at line 527 of file resources.c.

◆ ARG0

#define ARG0 (   value)    .f1.arg0 = (value)

Definition at line 601 of file resources.c.

◆ ARG1

#define ARG1 (   value)    .f2.arg1 = (value)

Definition at line 602 of file resources.c.

◆ ARG2

#define ARG2 (   value)    .f3.arg2 = (value)

Definition at line 603 of file resources.c.

◆ CHECK_AML_OFFSET

#define CHECK_AML_OFFSET (   offset,
  what 
)
Value:
CHECK_AML_OOB(offset, "end of ", what) \
CHECK_AML_OFFSET_BASE(offset, what)
#define CHECK_AML_OOB(offset, prefix, what)
Definition: resources.c:1646
GLintptr offset
Definition: glext.h:5920

Definition at line 1663 of file resources.c.

◆ CHECK_AML_OFFSET_BASE

#define CHECK_AML_OFFSET_BASE (   offset,
  what 
)
Value:
if (uacpi_unlikely(offset < base_aml_size_with_header)) { \
uacpi_error( \
"invalid " what " offset: %zu, expected at least %u", \
(uacpi_size)offset, base_aml_size_with_header); \
}
#define uacpi_unlikely(expr)
Definition: compiler.h:88
size_t uacpi_size
Definition: types.h:37
@ UACPI_STATUS_AML_INVALID_RESOURCE
Definition: status.h:42
@ UACPI_ITERATION_DECISION_BREAK
Definition: types.h:30

Definition at line 1654 of file resources.c.

◆ CHECK_AML_OOB

#define CHECK_AML_OOB (   offset,
  prefix,
  what 
)
Value:
if (uacpi_unlikely(offset > ((uacpi_u32)aml_size + header_size))) { \
uacpi_error(prefix what " is OOB: %zu > %u", \
(uacpi_size)offset, (uacpi_u32)aml_size + header_size); \
}
uint32_t uacpi_u32
Definition: types.h:21
Character const *const prefix
Definition: tempnam.cpp:195

Definition at line 1646 of file resources.c.

◆ CONVERSION_OPCODES_COMMON

#define CONVERSION_OPCODES_COMMON (   native_buf)

Definition at line 1572 of file resources.c.

◆ CONVERT_GENERAL_ADDRESS_FLAGS

#define CONVERT_GENERAL_ADDRESS_FLAGS (   addr_type)
Value:
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.direction), IMM(0)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.decode_type), IMM(1)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.fixed_min_address), IMM(2)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.fixed_max_address), IMM(3)) \
#define OP(short_code,...)
Definition: resources.c:580
#define NATIVE_F(short_native_name, field)
Definition: resources.c:597
#define IMM(value)
Definition: resources.c:600
#define AML_F(short_aml_name, field)
Definition: resources.c:591

Definition at line 775 of file resources.c.

◆ CONVERT_TYPE_SPECIFIC_FLAGS

#define CONVERT_TYPE_SPECIFIC_FLAGS (   addr_type)

Definition at line 742 of file resources.c.

◆ DECODE_PIN_GROUP_RES_SOURCES

#define DECODE_PIN_GROUP_RES_SOURCES (   postfix)
Value:
DECODE_SOURCE_INDEX(pin_group_##postfix), \
OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(pin_group_##postfix, source), \
AML_F(pin_group_##postfix, source_offset), \
ARG2(AML_O(pin_group_##postfix, source_lable_offset))), \
OP(LOAD_16_NATIVE, NATIVE_F(pin_group_##postfix, source.length)), \
OP(RESOURCE_LABEL, NATIVE_F(pin_group_##postfix, label), \
AML_F(pin_group_##postfix, source_lable_offset), \
ARG2(AML_O(pin_group_##postfix, vendor_data_offset))), \
OP(VENDOR_DATA, AML_F(pin_group_##postfix, vendor_data_offset), \
NATIVE_F(pin_group_##postfix, vendor_data_length), \
ARG2(NATIVE_O(pin_group_##postfix, vendor_data)))
#define AML_O(short_aml_name, field)
Definition: resources.c:588
#define ARG2(value)
Definition: resources.c:603
#define NATIVE_O(short_name, field)
Definition: resources.c:594
#define DECODE_SOURCE_INDEX(short_aml_name)
Definition: resources.c:848
static const WCHAR label[]
Definition: itemdlg.c:1546

Definition at line 950 of file resources.c.

◆ DECODE_RES_PIN_TBL_AND_VENDOR_DATA

#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA (   short_aml_name,
  res_opcode,
  offset_field,
  res_field 
)
Value:
OP(LOAD_PIN_TABLE_LENGTH, AML_F(short_aml_name, offset_field), \
NATIVE_F(short_aml_name, pin_table_length)), \
OP(RESOURCE_##res_opcode, NATIVE_F(short_aml_name, res_field), \
AML_F(short_aml_name, offset_field), \
ARG2(AML_O(short_aml_name, vendor_data_offset))), \
OP(PIN_TABLE, AML_F(short_aml_name, pin_table_offset), \
NATIVE_F(short_aml_name, pin_table_length), \
ARG2(NATIVE_O(short_aml_name, pin_table))), \
OP(VENDOR_DATA, AML_F(short_aml_name, vendor_data_offset), \
NATIVE_F(short_aml_name, vendor_data_length), \
ARG2(NATIVE_O(short_aml_name, vendor_data)))

Definition at line 852 of file resources.c.

◆ DECODE_SOURCE_INDEX

#define DECODE_SOURCE_INDEX (   short_aml_name)
Value:
OP(FIELD_8, AML_F(short_aml_name, source_index), \
NATIVE_F(short_aml_name, source.index)) \
DWORD index
Definition: pdh_main.c:175

Definition at line 848 of file resources.c.

◆ DEFINE_ADDRESS_CONVERSION

#define DEFINE_ADDRESS_CONVERSION (   width)
Value:
static const struct uacpi_resource_convert_instruction \
convert_address##width[] = { \
CONVERT_GENERAL_ADDRESS_FLAGS(address##width), \
OP(FIELD_##width, AML_F(address##width, granularity), \
NATIVE_F(address##width, granularity), IMM(5)), \
OP(RESOURCE_SOURCE, NATIVE_F(address##width, source)), \
CONVERT_TYPE_SPECIFIC_FLAGS(address##width), \
};
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint address
Definition: glext.h:9393

Definition at line 789 of file resources.c.

◆ DEFINE_LARGE_AML_RESOURCE

#define DEFINE_LARGE_AML_RESOURCE (   aml_type_enum,
  native_type_enum,
  aml_struct,
  native_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_LARGE, \
.aml_size = sizeof(aml_struct) - LARGE_ITEM_HEADER_SIZE, \
.native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}
@ UACPI_AML_RESOURCE_KIND_LARGE
Definition: resources.h:52
#define LARGE_ITEM_HEADER_SIZE
Definition: resources.c:118
#define NATIVE_RESOURCE_HEADER_SIZE
Definition: resources.c:1061

Definition at line 1086 of file resources.c.

◆ DEFINE_SMALL_AML_RESOURCE

#define DEFINE_SMALL_AML_RESOURCE (   aml_type_enum,
  native_type_enum,
  aml_struct,
  native_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
.aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
.native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}
@ UACPI_AML_RESOURCE_KIND_SMALL
Definition: resources.h:51
#define SMALL_ITEM_HEADER_SIZE
Definition: resources.c:117

Definition at line 1063 of file resources.c.

◆ DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR

#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR (   aml_type_enum,
  native_type_enum,
  aml_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
.aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
.native_size = NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}

Definition at line 1074 of file resources.c.

◆ END

#define END ( )    OP(END)

Definition at line 586 of file resources.c.

◆ IMM

#define IMM (   value)    .f3.imm = value

Definition at line 600 of file resources.c.

◆ L

#define L (   x)    (x + LARGE_RESOURCE_BASE)

◆ LARGE_ITEM_HEADER_SIZE

#define LARGE_ITEM_HEADER_SIZE   sizeof(struct acpi_large_item)

Definition at line 118 of file resources.c.

◆ LARGE_RESOURCE_BASE

#define LARGE_RESOURCE_BASE   (ACPI_RESOURCE_END_TAG + 1)

Definition at line 12 of file resources.c.

◆ NATIVE_F

#define NATIVE_F (   short_native_name,
  field 
)     .f2.native_offset = NATIVE_O(short_native_name, field)

Definition at line 597 of file resources.c.

◆ NATIVE_FIELD

#define NATIVE_FIELD (   res,
  name,
  field 
)     NATIVE_OFFSET(res, NATIVE_O(name, field))

Definition at line 1643 of file resources.c.

◆ NATIVE_O

#define NATIVE_O (   short_name,
  field 
)     uacpi_offsetof(uacpi_resource_##short_name, field)

Definition at line 594 of file resources.c.

◆ NATIVE_OFFSET

#define NATIVE_OFFSET (   res,
  offset 
)     PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))

Definition at line 1640 of file resources.c.

◆ NATIVE_RESOURCE_HEADER_SIZE

#define NATIVE_RESOURCE_HEADER_SIZE   8

Definition at line 1061 of file resources.c.

◆ NATIVE_SERIAL_RESOURCE_EXTRA_SIZE

#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE (   type)
Value:
(sizeof(uacpi_resource_##type##_connection) \

Definition at line 531 of file resources.c.

◆ OP

#define OP (   short_code,
  ... 
)
Value:
{ \
.code = UACPI_RESOURCE_CONVERT_OPCODE_##short_code, \
__VA_ARGS__ \
}

Definition at line 580 of file resources.c.

◆ PTR_AT

#define PTR_AT (   ptr,
  offset 
)    (void*)((uacpi_u8*)(ptr) + (offset))

Definition at line 1638 of file resources.c.

◆ SMALL_ITEM_HEADER_SIZE

#define SMALL_ITEM_HEADER_SIZE   sizeof(struct acpi_small_item)

Definition at line 117 of file resources.c.

Function Documentation

◆ accumulate_aml_buffer_size()

static uacpi_iteration_decision accumulate_aml_buffer_size ( void opaque,
uacpi_resource resource 
)
static

Definition at line 2472 of file resources.c.

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}
#define uacpi_error(...)
Definition: log.h:36
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
static uacpi_size aml_size_for_native_resource(uacpi_resource *resource, const struct uacpi_resource_spec *spec)
Definition: resources.c:2182
static const struct uacpi_resource_spec * resource_spec_from_native(uacpi_resource *resource)
Definition: resources.c:2175

Referenced by uacpi_native_resources_to_aml().

◆ accumulate_native_buffer_size()

static uacpi_iteration_decision accumulate_native_buffer_size ( void opaque,
uacpi_u8 data,
uacpi_u16  resource_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1942 of file resources.c.

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}
static uacpi_iteration_decision conditional_continue(struct resource_conversion_ctx *ctx)
Definition: resources.c:1563
static uacpi_size native_size_for_aml_resource(uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1516
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ aml_serial_to_native_type()

static uacpi_resource_type aml_serial_to_native_type ( uacpi_u8  type)
static

Definition at line 1667 of file resources.c.

1670{
1671 return (type - ACPI_SERIAL_TYPE_I2C) +
1673}
#define ACPI_SERIAL_TYPE_I2C
Definition: acpi.h:1458
@ UACPI_RESOURCE_TYPE_SERIAL_I2C_CONNECTION
Definition: resources.h:43

Referenced by do_aml_resource_to_native(), and do_native_resource_to_aml().

◆ aml_size_for_native_resource()

static uacpi_size aml_size_for_native_resource ( uacpi_resource resource,
const struct uacpi_resource_spec spec 
)
static

Definition at line 2182 of file resources.c.

2185{
2186 return spec->size_for_aml ?
2187 spec->size_for_aml(spec, resource) :
2189}
static uacpi_size aml_size_with_header(const struct uacpi_resource_spec *spec)
Definition: resources.c:125
uacpi_size(* size_for_aml)(const struct uacpi_resource_spec *, uacpi_resource *)
Definition: resources.h:298

Referenced by accumulate_aml_buffer_size(), and do_native_resource_to_aml().

◆ aml_size_for_serial_connection()

static uacpi_size aml_size_for_serial_connection ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 565 of file resources.c.

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}
static const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:536
GLsizeiptr size
Definition: glext.h:5919
uacpi_resource_source source
Definition: resources.h:405

◆ aml_size_with_header()

◆ conditional_continue()

static uacpi_iteration_decision conditional_continue ( struct resource_conversion_ctx ctx)
static

Definition at line 1563 of file resources.c.

1566{
1567 return ctx->just_one ? UACPI_ITERATION_DECISION_BREAK :
1569}

Referenced by accumulate_native_buffer_size(), and do_aml_resource_to_native().

◆ do_aml_resource_to_native()

static uacpi_iteration_decision do_aml_resource_to_native ( void opaque,
uacpi_u8 data,
uacpi_u16  aml_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1675 of file resources.c.

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}
@ 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
#define uacpi_memcpy
Definition: stdlib.h:34
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
Definition: stdlib.c:112
#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
static uacpi_resource_type aml_serial_to_native_type(uacpi_u8 type)
Definition: resources.c:1667
static const uacpi_u8 aml_serial_resource_to_extra_native_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:544
#define PTR_AT(ptr, offset)
Definition: resources.c:1638
#define NATIVE_OFFSET(res, offset)
Definition: resources.c:1640
#define CHECK_AML_OFFSET(offset, what)
Definition: resources.c:1663
#define CONVERSION_OPCODES_COMMON(native_buf)
Definition: resources.c:1572
GLenum src
Definition: glext.h:6340
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
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
static PVOID ptr
Definition: dispmode.c:27
union uacpi_resource_convert_instruction::@687 f1
union uacpi_resource_convert_instruction::@688 f2
union uacpi_resource_convert_instruction::@689 f3
uacpi_u8 native_type
Definition: resources.h:268
const struct uacpi_resource_convert_instruction * to_native
Definition: resources.h:302
uacpi_u16 native_size
Definition: resources.h:283
Definition: pdh_main.c:96

Referenced by uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ do_native_resource_to_aml()

static uacpi_iteration_decision do_native_resource_to_aml ( void opaque,
uacpi_resource resource 
)
static

Definition at line 2191 of file resources.c.

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}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define ACPI_SMALL_ITEM_NAME_IDX
Definition: acpi.h:1224
#define ACPI_LARGE_ITEM
Definition: acpi.h:1222
#define uacpi_unlikely_error(expr)
Definition: status.h:49
static const uacpi_u8 type_to_aml_resource[]
Definition: resources.c:52
static uacpi_status validate_aml_serial_type(uacpi_u8 type)
Definition: resources.c:1414
static UINT array_size
Definition: msctf.cpp:39
const struct uacpi_resource_convert_instruction * to_aml
Definition: resources.h:303

Referenced by native_resources_to_aml().

◆ eval_resource_helper()

static uacpi_status eval_resource_helper ( uacpi_namespace_node node,
const uacpi_char method,
uacpi_object **  out_obj 
)
static

Definition at line 1962 of file resources.c.

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}
method
Definition: dragdrop.c:54
uacpi_status uacpi_namespace_node_is(const uacpi_namespace_node *node, uacpi_object_type type, uacpi_bool *out)
Definition: namespace.c:825
bool uacpi_bool
Definition: types.h:31
uacpi_status
Definition: status.h:10
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
return ret
Definition: mutex.c:147
uacpi_status uacpi_eval_simple_buffer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
Definition: uacpi.c:971
Definition: dlist.c:348

Referenced by extract_native_resources_from_method().

◆ extra_size_for_extended_irq()

static uacpi_size extra_size_for_extended_irq ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 329 of file resources.c.

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}
static uacpi_size extra_size_for_resource_source(uacpi_size base_size, uacpi_size reported_size)
Definition: resources.c:257
unsigned char irq
Definition: dsp.h:13

◆ extra_size_for_native_address_or_clock_input()

static uacpi_size extra_size_for_native_address_or_clock_input ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 292 of file resources.c.

295{
298}
#define UACPI_UNUSED(x)
Definition: helpers.h:7

◆ extra_size_for_native_gpio_or_pins()

static uacpi_size extra_size_for_native_gpio_or_pins ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 358 of file resources.c.

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}
@ UACPI_AML_RESOURCE_PIN_GROUP
Definition: resources.h:37
@ UACPI_AML_RESOURCE_PIN_CONFIGURATION
Definition: resources.h:36
@ UACPI_AML_RESOURCE_PIN_FUNCTION
Definition: resources.h:34
@ UACPI_AML_RESOURCE_GPIO_CONNECTION
Definition: resources.h:33
GLboolean GLuint group
Definition: glext.h:11120
Definition: regsvr.c:104

◆ extra_size_for_native_irq_or_dma()

static uacpi_size extra_size_for_native_irq_or_dma ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 131 of file resources.c.

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}
@ UACPI_AML_RESOURCE_IRQ
Definition: resources.h:12

◆ extra_size_for_native_pin_group()

static uacpi_size extra_size_for_native_pin_group ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 464 of file resources.c.

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}
@ UACPI_AML_RESOURCE_PIN_GROUP_FUNCTION
Definition: resources.h:38
@ UACPI_AML_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: resources.h:39
GLenum func
Definition: glext.h:6028

◆ extra_size_for_native_vendor()

static uacpi_size extra_size_for_native_vendor ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 221 of file resources.c.

224{
225 UACPI_UNUSED(spec);
227 return size;
228}

◆ extra_size_for_resource_source()

static uacpi_size extra_size_for_resource_source ( uacpi_size  base_size,
uacpi_size  reported_size 
)
static

Definition at line 257 of file resources.c.

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}
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106

Referenced by extra_size_for_extended_irq(), and extra_size_for_native_address_or_clock_input().

◆ extra_size_for_serial_connection()

static uacpi_size extra_size_for_serial_connection ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 551 of file resources.c.

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}
uint32_t serial
Definition: fsck.fat.h:29

◆ extract_native_resources_from_method()

static uacpi_status extract_native_resources_from_method ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resources **  out_resources 
)
static

Definition at line 2074 of file resources.c.

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}
void uacpi_buffer_to_view(uacpi_buffer *, uacpi_data_view *)
Definition: types.c:1043
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
uacpi_status uacpi_native_resources_from_aml(uacpi_data_view aml_buffer, uacpi_resources **out_resources)
Definition: resources.c:1982
static uacpi_status eval_resource_helper(uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
Definition: resources.c:1962
GLuint buffer
Definition: glext.h:5915
Definition: devices.h:37

Referenced by uacpi_for_each_device_resource(), uacpi_get_current_resources(), uacpi_get_device_resources(), and uacpi_get_possible_resources().

◆ find_end()

static uacpi_iteration_decision find_end ( void opaque,
uacpi_u8 data,
uacpi_u16  resource_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1501 of file resources.c.

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}
@ UACPI_AML_RESOURCE_END_TAG
Definition: resources.h:20

Referenced by uacpi_find_aml_resource_end_tag().

◆ get_aml_resource_size()

static uacpi_status get_aml_resource_size ( uacpi_u8 data,
uacpi_size  bytes_left,
uacpi_u16 out_size 
)
static

Definition at line 1382 of file resources.c.

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}
#define ACPI_SMALL_ITEM_LENGTH_MASK
Definition: acpi.h:1226
@ UACPI_STATUS_OK
Definition: status.h:11
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:72

Referenced by uacpi_for_each_aml_resource().

◆ get_aml_resource_type()

static enum uacpi_aml_resource get_aml_resource_type ( uacpi_u8  raw_byte)
static

Definition at line 1369 of file resources.c.

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}
#define ACPI_SMALL_ITEM_NAME_MASK
Definition: acpi.h:1225
#define ACPI_LARGE_ITEM_NAME_MASK
Definition: acpi.h:1228
static const uacpi_u8 aml_resource_to_type[256]
Definition: resources.c:19
#define LARGE_RESOURCE_BASE
Definition: resources.c:12

Referenced by uacpi_for_each_aml_resource().

◆ native_resources_to_aml()

static uacpi_status native_resources_to_aml ( uacpi_resources native_resources,
void aml_buffer 
)
static

Definition at line 2447 of file resources.c.

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}
@ UACPI_RESOURCE_TYPE_END_TAG
Definition: resources.h:56
@ UACPI_STATUS_NO_RESOURCE_END_TAG
Definition: status.h:26
static uacpi_iteration_decision do_native_resource_to_aml(void *opaque, uacpi_resource *resource)
Definition: resources.c:2191
uacpi_status uacpi_for_each_resource(uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2117
uacpi_u32 type
Definition: resources.h:605

Referenced by uacpi_native_resources_to_aml().

◆ native_size_for_aml_resource()

static uacpi_size native_size_for_aml_resource ( uacpi_u8 data,
uacpi_u16  size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1516 of file resources.c.

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}
uacpi_size(* extra_size_for_native)(const struct uacpi_resource_spec *, void *, uacpi_size)
Definition: resources.h:290

Referenced by accumulate_native_buffer_size(), and do_aml_resource_to_native().

◆ resource_spec_from_native()

static const struct uacpi_resource_spec * resource_spec_from_native ( uacpi_resource resource)
static

Definition at line 2175 of file resources.c.

2178{
2180}
const struct uacpi_resource_spec aml_resources[UACPI_AML_RESOURCE_MAX+1]
Definition: resources.c:1097
static const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
Definition: resources.c:84

Referenced by accumulate_aml_buffer_size(), and do_native_resource_to_aml().

◆ size_for_aml_address_or_clock_input()

static uacpi_size size_for_aml_address_or_clock_input ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 300 of file resources.c.

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}
@ UACPI_RESOURCE_TYPE_ADDRESS32
Definition: resources.h:22
@ UACPI_RESOURCE_TYPE_ADDRESS16
Definition: resources.h:21
@ UACPI_RESOURCE_TYPE_ADDRESS64
Definition: resources.h:23
@ UACPI_RESOURCE_TYPE_CLOCK_INPUT
Definition: resources.h:54
static uacpi_size size_for_aml_resource_source(uacpi_resource_source *source, uacpi_bool with_index)
Definition: resources.c:273

◆ size_for_aml_extended_irq()

static uacpi_size size_for_aml_extended_irq ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 344 of file resources.c.

347{
348 uacpi_resource_extended_irq *irq = &resource->extended_irq;
350
352 size += irq->num_irqs * 4;
354
355 return size;
356}

◆ size_for_aml_gpio_or_pins()

static uacpi_size size_for_aml_gpio_or_pins ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 413 of file resources.c.

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}
GLuint res
Definition: glext.h:9613

◆ size_for_aml_irq()

static uacpi_size size_for_aml_irq ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 156 of file resources.c.

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}
#define uacpi_warn(...)
Definition: log.h:35
#define UACPI_EXCLUSIVE
Definition: resources.h:99
#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_TRIGGERING_EDGE
Definition: resources.h:90

◆ size_for_aml_pin_group()

static uacpi_size size_for_aml_pin_group ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 491 of file resources.c.

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}

◆ size_for_aml_resource_source()

static uacpi_size size_for_aml_resource_source ( uacpi_resource_source source,
uacpi_bool  with_index 
)
static

Definition at line 273 of file resources.c.

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}

Referenced by size_for_aml_address_or_clock_input(), and size_for_aml_extended_irq().

◆ size_for_aml_start_dependent()

static uacpi_size size_for_aml_start_dependent ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 190 of file resources.c.

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}
#define UACPI_ACCEPTABLE
Definition: resources.h:314

◆ size_for_aml_vendor()

static uacpi_size size_for_aml_vendor ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 230 of file resources.c.

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}
@ UACPI_RESOURCE_TYPE_VENDOR_LARGE
Definition: resources.h:37

◆ uacpi_find_aml_resource_end_tag()

uacpi_status uacpi_find_aml_resource_end_tag ( uacpi_data_view  buffer,
uacpi_size out_offset 
)

Definition at line 1528 of file resources.c.

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}
uacpi_status uacpi_for_each_aml_resource(uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
Definition: resources.c:1425
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

Referenced by handle_concatenate_res().

◆ uacpi_for_each_aml_resource()

uacpi_status uacpi_for_each_aml_resource ( uacpi_data_view  buffer,
uacpi_aml_resource_iteration_callback  cb,
void user 
)

Definition at line 1425 of file resources.c.

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}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
uacpi_aml_resource
Definition: resources.h:8
@ UACPI_AML_RESOURCE_TYPE_INVALID
Definition: resources.h:9
@ UACPI_AML_RESOURCE_SERIAL_CONNECTION
Definition: resources.h:35
@ 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
@ UACPI_STATUS_INTERNAL_ERROR
Definition: status.h:21
uacpi_iteration_decision
Definition: types.h:28
static enum uacpi_aml_resource get_aml_resource_type(uacpi_u8 raw_byte)
Definition: resources.c:1369
static uacpi_status get_aml_resource_size(uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
Definition: resources.c:1382
uacpi_u8 size_kind
Definition: resources.h:270

Referenced by uacpi_find_aml_resource_end_tag(), uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ uacpi_for_each_device_resource()

uacpi_status uacpi_for_each_device_resource ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resource_iteration_callback  cb,
void user 
)

A shorthand for uacpi_get_device_resources() + uacpi_for_each_resource().

Use if you don't actually want to save the 'resources' list, but simply want to iterate it once to extract the resources you care about and then free it right away.

Definition at line 2157 of file resources.c.

2161{
2164
2167 return ret;
2168
2171
2172 return ret;
2173}
void uacpi_free_resources(uacpi_resources *resources)
Definition: resources.c:2058
static uacpi_status extract_native_resources_from_method(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2074
FxCmResList * resources

◆ uacpi_for_each_resource()

uacpi_status uacpi_for_each_resource ( uacpi_resources resources,
uacpi_resource_iteration_callback  cb,
void user 
)

A convenience helper for iterating over the resource list returned by any of the uacpi_get_*_resources functions.

Definition at line 2117 of file resources.c.

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}
@ UACPI_RESOURCE_TYPE_MAX
Definition: resources.h:57
struct task_struct * current
Definition: linux.c:32

Referenced by native_resources_to_aml(), uacpi_for_each_device_resource(), and uacpi_native_resources_to_aml().

◆ uacpi_free_resource()

void uacpi_free_resource ( uacpi_resource resource)

Definition at line 2066 of file resources.c.

2067{
2068 if (resource == UACPI_NULL)
2069 return;
2070
2071 uacpi_free(resource, resource->length);
2072}
#define uacpi_free(mem, _)
Definition: stdlib.h:96

Referenced by uacpi_get_resource_from_buffer().

◆ uacpi_free_resources()

void uacpi_free_resources ( uacpi_resources resources)

Definition at line 2058 of file resources.c.

2059{
2060 if (resources == UACPI_NULL)
2061 return;
2062
2063 uacpi_free(resources, sizeof(uacpi_resources) + resources->length);
2064}

Referenced by uacpi_for_each_device_resource(), and uacpi_native_resources_from_aml().

◆ uacpi_get_current_resources()

uacpi_status uacpi_get_current_resources ( uacpi_namespace_node device,
uacpi_resources **  out_resources 
)

Evaluate the _CRS method for a 'device' and get the returned resource list via 'out_resources'.

NOTE: the returned buffer must be released via uacpi_free_resources()

If you don't need to keep the resource array for later use you can uacpi_for_each_device_resource(device, "_CRS", ...) instead, which takes care of iteration & memory management on its own.

Definition at line 2095 of file resources.c.

2098{
2099 return extract_native_resources_from_method(device, "_CRS", out_resources);
2100}

◆ uacpi_get_device_resources()

uacpi_status uacpi_get_device_resources ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resources **  out_resources 
)

Evaluate an arbitrary method that is expected to return an AML resource buffer for a 'device' and get the returned resource list via 'out_resources'.

NOTE: the returned buffer must be released via uacpi_free_resources()

If you don't need to keep the resource array for later use you can uacpi_for_each_device_resource(device, method, ...) instead, which takes care of iteration & memory management on its own.

Definition at line 2109 of file resources.c.

2113{
2114 return extract_native_resources_from_method(device, method, out_resources);
2115}

◆ uacpi_get_possible_resources()

uacpi_status uacpi_get_possible_resources ( uacpi_namespace_node device,
uacpi_resources **  out_resources 
)

Evaluate the _PRS method for a 'device' and get the returned resource list via 'out_resources'.

NOTE: the returned buffer must be released via uacpi_free_resources()

If you don't need to keep the resource array for later use you can uacpi_for_each_device_resource(device, "_PRS", ...) instead, which takes care of iteration & memory management on its own.

Definition at line 2102 of file resources.c.

2105{
2106 return extract_native_resources_from_method(device, "_PRS", out_resources);
2107}

◆ uacpi_get_resource_from_buffer()

uacpi_status uacpi_get_resource_from_buffer ( uacpi_data_view  aml_buffer,
uacpi_resource **  out_resource 
)

Convert a single AML-encoded resource to native format.

This should be used for converting Connection() fields (passed during IO on GeneralPurposeIO or GenericSerialBus operation regions) or other similar buffers with only one resource to native format.

NOTE: the returned buffer must be released via uacpi_free_resource()

Definition at line 2024 of file resources.c.

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}
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
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
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
void uacpi_free_resource(uacpi_resource *resource)
Definition: resources.c:2066
#define resource
Definition: kernel32.h:9

◆ uacpi_native_resources_from_aml()

uacpi_status uacpi_native_resources_from_aml ( uacpi_data_view  aml_buffer,
uacpi_resources **  out_resources 
)

Definition at line 1982 of file resources.c.

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}
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23

Referenced by extract_native_resources_from_method().

◆ uacpi_native_resources_to_aml()

uacpi_status uacpi_native_resources_to_aml ( uacpi_resources resources,
uacpi_object **  out_template 
)

Definition at line 2495 of file resources.c.

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}
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
@ UACPI_OBJECT_BUFFER
Definition: types.h:114
static uacpi_iteration_decision accumulate_aml_buffer_size(void *opaque, uacpi_resource *resource)
Definition: resources.c:2472
static uacpi_status native_resources_to_aml(uacpi_resources *native_resources, void *aml_buffer)
Definition: resources.c:2447

Referenced by uacpi_set_resources().

◆ uacpi_set_resources()

uacpi_status uacpi_set_resources ( uacpi_namespace_node device,
uacpi_resources resources 
)

Set the configuration to be used by the 'device' by calling its _SRS method.

Note that this expects 'resources' in the normal 'uacpi_resources' format, and not the raw AML resources bytestream, the conversion to the latter is done automatically by this API. If you want to _SRS a raw AML resources bytestream, use 'uacpi_execute' or similar API directly.

Definition at line 2548 of file resources.c.

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}
uacpi_status uacpi_native_resources_to_aml(uacpi_resources *resources, uacpi_object **out_template)
Definition: resources.c:2495
#define args
Definition: format.c:66
Definition: match.c:390
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:709

◆ validate_aml_serial_type()

static uacpi_status validate_aml_serial_type ( uacpi_u8  type)
static

Definition at line 1414 of file resources.c.

1415{
1418 uacpi_error("invalid/unsupported serial connection type %d", type);
1420 }
1421
1422 return UACPI_STATUS_OK;
1423}
#define ACPI_SERIAL_TYPE_CSI2
Definition: acpi.h:1461

Referenced by do_native_resource_to_aml(), and uacpi_for_each_aml_resource().

Variable Documentation

◆ aml_resource_kind_to_header_size

◆ aml_resource_to_type

const uacpi_u8 aml_resource_to_type[256]
static

Definition at line 19 of file resources.c.

Referenced by get_aml_resource_type().

◆ aml_resources

◆ aml_serial_resource_to_extra_aml_size

const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
static

◆ aml_serial_resource_to_extra_native_size

◆ convert_address64_extended

const struct uacpi_resource_convert_instruction convert_address64_extended[]
static
Initial value:
= {
CONVERT_GENERAL_ADDRESS_FLAGS(address64_extended),
OP(FIELD_8, AML_F(address64_extended, revision_id),
NATIVE_F(address64_extended, revision_id)),
OP(FIELD_64, AML_F(address64_extended, granularity),
NATIVE_F(address64_extended, granularity), IMM(6)),
CONVERT_TYPE_SPECIFIC_FLAGS(address64_extended),
}
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
Definition: resources.c:742
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
Definition: resources.c:775

Definition at line 804 of file resources.c.

◆ convert_clock_input

const struct uacpi_resource_convert_instruction convert_clock_input[]
static
Initial value:
= {
OP(FIELD_8, AML_F(clock_input, revision_id),
NATIVE_F(clock_input, revision_id)),
OP(BIT_FIELD_1, AML_F(clock_input, flags), NATIVE_F(clock_input, frequency),
IMM(0)),
OP(BIT_FIELD_2, AML_F(clock_input, flags), NATIVE_F(clock_input, scale),
IMM(1)),
OP(FIELD_16, AML_F(clock_input, divisor), NATIVE_F(clock_input, divisor)),
OP(FIELD_32, AML_F(clock_input, numerator), NATIVE_F(clock_input, numerator)),
OP(FIELD_8, AML_F(clock_input, source_index), NATIVE_F(clock_input, source.index)),
OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(clock_input, source)),
END(),
}
#define END()
Definition: resources.c:586
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLuint divisor
Definition: glext.h:6313
GLbitfield flags
Definition: glext.h:7161
static LARGE_INTEGER * frequency
Definition: time.c:38

Definition at line 834 of file resources.c.

◆ convert_dma

Initial value:
= {
OP(PACKED_ARRAY_8, AML_F(dma, channel_mask), NATIVE_F(dma, channels),
ARG2(NATIVE_O(dma, num_channels))),
OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, transfer_type), IMM(0)),
OP(BIT_FIELD_1, AML_F(dma, flags), NATIVE_F(dma, bus_master_status), IMM(2)),
OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, channel_speed), IMM(5)),
END(),
}
int This channels
Definition: rdpsnd_libao.c:37

Definition at line 634 of file resources.c.

◆ convert_extended_irq

const struct uacpi_resource_convert_instruction convert_extended_irq[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, direction), IMM(0)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, triggering), IMM(1)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, polarity), IMM(2)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, sharing), IMM(3)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, wake_capability), IMM(4)),
OP(LOAD_8_STORE, AML_F(extended_irq, num_irqs),
NATIVE_F(extended_irq, num_irqs), IMM(4)),
OP(RESOURCE_SOURCE, NATIVE_F(extended_irq, source)),
OP(FIELD_8, AML_F(extended_irq, irqs), NATIVE_F(extended_irq, irqs)),
END(),
}
uacpi_u16 uacpi_gpe_triggering triggering
Definition: event.h:117
direction
Definition: netio.c:882
static OBJECT_ATTRIBUTES *static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:95

Definition at line 814 of file resources.c.

◆ convert_fixed_dma

const struct uacpi_resource_convert_instruction convert_fixed_dma[]
static
Initial value:
= {
OP(FIELD_16, AML_F(fixed_dma, request_line),
NATIVE_F(fixed_dma, request_line)),
OP(FIELD_16, AML_F(fixed_dma, channel), NATIVE_F(fixed_dma, channel)),
OP(FIELD_8, AML_F(fixed_dma, transfer_width),
NATIVE_F(fixed_dma, transfer_width)),
END(),
}

Definition at line 687 of file resources.c.

◆ convert_fixed_io

const struct uacpi_resource_convert_instruction convert_fixed_io[]
static
Initial value:
= {
OP(FIELD_16, AML_F(fixed_io, address), NATIVE_F(fixed_io, address)),
OP(FIELD_8, AML_F(fixed_io, length), NATIVE_F(fixed_io, length)),
END(),
}

Definition at line 681 of file resources.c.

◆ convert_fixed_memory32

const struct uacpi_resource_convert_instruction convert_fixed_memory32[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(fixed_memory32, information),
NATIVE_F(fixed_memory32, write_status), IMM(0)),
OP(FIELD_32, AML_F(fixed_memory32, address),
NATIVE_F(fixed_memory32, address)),
OP(FIELD_32, AML_F(fixed_memory32, length),
NATIVE_F(fixed_memory32, length)),
END(),
}
static PDB_INFORMATION information
Definition: db.cpp:179
static void write_status(LPCWSTR lpFmt,...)
Definition: dwnl.c:45

Definition at line 723 of file resources.c.

◆ convert_generic_register

const struct uacpi_resource_convert_instruction convert_generic_register[]
static
Initial value:
= {
OP(FIELD_8, AML_F(generic_register, address_space_id),
NATIVE_F(generic_register, address_space_id), IMM(4)),
OP(FIELD_64, AML_F(generic_register, address),
NATIVE_F(generic_register, address)),
END(),
}

Definition at line 734 of file resources.c.

◆ convert_generic_serial_bus

const struct uacpi_resource_convert_instruction convert_generic_serial_bus[]
static

Definition at line 994 of file resources.c.

◆ convert_gpio_connection

const struct uacpi_resource_convert_instruction convert_gpio_connection[]
static

Definition at line 868 of file resources.c.

◆ convert_io

Initial value:
= {
OP(BIT_FIELD_1, AML_F(io, information), NATIVE_F(io, decode_type)),
OP(FIELD_16, AML_F(io, minimum), NATIVE_F(io, minimum)),
OP(FIELD_16, AML_F(io, maximum), NATIVE_F(io, maximum)),
OP(FIELD_8, AML_F(io, length), NATIVE_F(io, length)),
END(),
}
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
Definition: align.cpp:48
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:72

Definition at line 672 of file resources.c.

◆ convert_irq_to_aml

Initial value:
= {
OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
ARG2(NATIVE_O(irq, num_irqs))),
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
END(),
}
#define ARG0(value)
Definition: resources.c:601

Definition at line 623 of file resources.c.

◆ convert_irq_to_native

const struct uacpi_resource_convert_instruction convert_irq_to_native[]
static
Initial value:
= {
OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
ARG2(NATIVE_O(irq, num_irqs))),
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(6)),
OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
END(),
OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
END(),
}

Definition at line 606 of file resources.c.

◆ convert_memory24

const struct uacpi_resource_convert_instruction convert_memory24[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(memory24, information),
NATIVE_F(memory24, write_status), IMM(0)),
OP(FIELD_16, AML_F(memory24, minimum), NATIVE_F(memory24, minimum), IMM(4)),
END(),
}

Definition at line 708 of file resources.c.

◆ convert_memory32

const struct uacpi_resource_convert_instruction convert_memory32[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(memory32, information),
NATIVE_F(memory32, write_status), IMM(0)),
OP(FIELD_32, AML_F(memory32, minimum), NATIVE_F(memory32, minimum), IMM(4)),
END(),
}

Definition at line 715 of file resources.c.

◆ convert_pin_configuration

const struct uacpi_resource_convert_instruction convert_pin_configuration[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_configuration, revision_id),
NATIVE_F(pin_configuration, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
NATIVE_F(pin_configuration, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
NATIVE_F(pin_configuration, direction), IMM(1)),
OP(FIELD_8, AML_F(pin_configuration, type),
NATIVE_F(pin_configuration, type)),
OP(FIELD_32, AML_F(pin_configuration, value),
NATIVE_F(pin_configuration, value)),
DECODE_SOURCE_INDEX(pin_configuration),
pin_configuration, SOURCE_NO_INDEX, source_offset, source
),
END(),
}
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
Definition: resources.c:852

Definition at line 921 of file resources.c.

◆ convert_pin_function

const struct uacpi_resource_convert_instruction convert_pin_function[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_function, revision_id),
NATIVE_F(pin_function, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_function, flags),
NATIVE_F(pin_function, sharing), IMM(0)),
OP(FIELD_8, AML_F(pin_function, pull_configuration),
NATIVE_F(pin_function, pull_configuration)),
OP(FIELD_16, AML_F(pin_function, function_number),
NATIVE_F(pin_function, function_number)),
DECODE_SOURCE_INDEX(pin_function),
pin_function, SOURCE_NO_INDEX, source_offset, source
),
END(),
}

Definition at line 904 of file resources.c.

◆ convert_pin_group

const struct uacpi_resource_convert_instruction convert_pin_group[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group, revision_id),
NATIVE_F(pin_group, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group, flags),
NATIVE_F(pin_group, direction), IMM(0)),
pin_group, LABEL, source_lable_offset, label
),
END(),
}

Definition at line 939 of file resources.c.

◆ convert_pin_group_configuration

const struct uacpi_resource_convert_instruction convert_pin_group_configuration[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group_configuration, revision_id),
NATIVE_F(pin_group_configuration, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
NATIVE_F(pin_group_configuration, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
NATIVE_F(pin_group_configuration, direction), IMM(1)),
OP(FIELD_8, AML_F(pin_group_configuration, type),
NATIVE_F(pin_group_configuration, type)),
OP(FIELD_32, AML_F(pin_group_configuration, value),
NATIVE_F(pin_group_configuration, value)),
END(),
}
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
Definition: resources.c:950

Definition at line 978 of file resources.c.

◆ convert_pin_group_function

const struct uacpi_resource_convert_instruction convert_pin_group_function[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group_function, revision_id),
NATIVE_F(pin_group_function, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
NATIVE_F(pin_group_function, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
NATIVE_F(pin_group_function, direction), IMM(1)),
OP(FIELD_16, AML_F(pin_group_function, function),
NATIVE_F(pin_group_function, function)),
END(),
}

Definition at line 964 of file resources.c.

◆ convert_start_dependent_to_aml

const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml[]
static
Initial value:
= {
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(1)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, compatibility), IMM(0)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, performance), IMM(2)),
END(),
}

Definition at line 663 of file resources.c.

◆ convert_start_dependent_to_native

const struct uacpi_resource_convert_instruction convert_start_dependent_to_native[]
static
Initial value:
= {
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(4)),
OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, compatibility), IMM(0)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, performance), IMM(2)),
END(),
OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
OP(SET_TO_IMM, NATIVE_F(start_dependent, compatibility),
OP(SET_TO_IMM, NATIVE_F(start_dependent, performance),
END(),
}

Definition at line 644 of file resources.c.

◆ convert_vendor_type0

const struct uacpi_resource_convert_instruction convert_vendor_type0[]
static
Initial value:
= {
OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
OP(FIELD_8, AML_F(vendor_defined_type0, byte_data), NATIVE_F(vendor, data)),
END(),
}
const WCHAR * vendor
Definition: db.cpp:873

Definition at line 696 of file resources.c.

◆ convert_vendor_type1

const struct uacpi_resource_convert_instruction convert_vendor_type1[]
static
Initial value:
= {
OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
OP(FIELD_8, AML_F(vendor_defined_type1, byte_data), NATIVE_F(vendor, data)),
END(),
}

Definition at line 702 of file resources.c.

◆ native_resource_to_type

const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
static

Definition at line 84 of file resources.c.

Referenced by resource_spec_from_native().

◆ type_to_aml_resource

const uacpi_u8 type_to_aml_resource[]
static

Definition at line 52 of file resources.c.

Referenced by do_native_resource_to_aml().