9#ifndef UACPI_BAREBONES_MODE
43 span->length -= delta;
55 dst_ptr =
dst->data + (
dst->index / 8);
56 src_ptr =
src->data + (
src->index / 8);
58 dst_count =
dst->length;
59 dst_shift =
dst->index & 7;
61 src_count =
src->length;
62 src_shift =
src->index & 7;
69 bits = *src_ptr >> src_shift;
71 if (src_shift && src_count > (
uacpi_u32)(8 - src_shift))
72 bits |= *(src_ptr + 1) << (8 - src_shift);
75 bits &= (1 << src_count) - 1;
83 dst_mask = (dst_count < 8 ? (1 << dst_count) - 1 : 0xFF) << dst_shift;
84 *dst_ptr = (*dst_ptr & ~dst_mask) | ((
bits << dst_shift) & dst_mask);
86 if (dst_shift && dst_count > (
uacpi_u32)(8 - dst_shift)) {
88 *(dst_ptr + 1) &= ~dst_mask;
89 *(dst_ptr + 1) |= (
bits >> (8 - dst_shift)) & dst_mask;
92 dst_count = dst_count > 8 ? dst_count - 8 : 0;
103 .length =
field->bit_length,
104 .const_data =
field->backing->data,
118 if (!(
field->bit_index & 7)) {
142 .length =
field->bit_length,
143 .data =
field->backing->data,
154 if (!(
field->bit_index & 7)) {
163 tail_shift =
field->bit_length & 7;
167 uacpi_u8 last_shift = 8 - tail_shift;
170 dst[
count - 1] |= (last_byte >> tail_shift) << tail_shift;
186 if (
field->lock_rule) {
194 switch (
field->kind) {
242 if (
field->lock_rule)
247#define OPREGION_IO_U64(x) (union uacpi_opregion_io_data) { .integer = x }
249#define SERIAL_HEADER_SIZE 2
250#define IPMI_DATA_SIZE 64
271 switch (
field->attributes) {
276 size_for_protocol += 1;
281 size_for_protocol += 2;
285 size_for_protocol +=
field->access_length;
292 size_for_protocol += 255;
297 "unsupported field@%p access attribute %d\n",
336 field->region,
"attempted access to deleted",
ret
340 region =
obj->op_region;
342 switch (region->
space) {
346 &in_out,
buf.const_data,
sizeof(in_out),
buf.length
362 field->region,
"attempted to read from a write-only",
ret
392 .buffer = wtr_buffer,
401 *wtr_response = wtr_buffer;
430 field->bit_offset_within_first_byte +
field->bit_length,
434 reads_to_do /= width_access_bits;
436 while (reads_to_do-- > 0) {
438 bits_left, width_access_bits - src_span.
index
449 bits_left -= src_span.
length;
453 byte_offset +=
field->access_width_bytes;
473 wtr_response, &did_handle
486 if (
field->bit_offset_within_first_byte == 0 &&
487 field_byte_length <= field->access_width_bytes)
499 if (
size >= field_byte_length)
528 bits_left =
field->bit_length;
533 width_access_bits - dst_span.
index, bits_left
536 if (dst_span.
index != 0 || dst_span.
length < width_access_bits) {
537 switch (
field->update_rule) {
568 bits_left -= dst_span.
length;
570 byte_offset +=
field->access_width_bytes;
589 wtr_response, &did_handle
604 goto out_basic_field;
633 goto out_basic_field;
651 *out_length =
field->bit_length;
667 if (gas->register_bit_offset == 0 &&
670 access_bit_width = gas->register_bit_width;
671 }
else if (gas->access_size) {
672 access_bit_width = gas->access_size * 8;
677 (gas->register_bit_offset + gas->register_bit_width) - 1
679 access_bit_width = 1 << msb;
681 if (access_bit_width <= 8) {
682 access_bit_width = 8;
689 gas->address, access_bit_width / 8,
uacpi_u64
691 access_bit_width /= 2;
702 const struct acpi_gas *gas,
uacpi_u8 *access_bit_width,
716 uacpi_warn(
"unsupported GAS address space '%s' (%d)\n",
718 gas->address_space_id);
722 if (gas->access_size > 4) {
723 uacpi_warn(
"unsupported GAS access size %d\n",
730 total_width = gas->register_bit_offset + gas->register_bit_width;
735 "GAS register total width is too large: %zu\n", total_width
740 *bit_width = total_width;
766 if (access_byte_width < 8)
784 offset += access_byte_width;
804 if (access_byte_width < 8)
820 offset += access_byte_width;
837 uacpi_u8 access_bit_width, total_width;
863 out_mapped->
bit_offset = gas->register_bit_offset;
1010 "invalid SystemIO read %p@%zu width=%d\n",
1039 "invalid SystemIO write %p@%zu width=%d\n",
1069 "invalid PCI_Config read %p@%zu width=%d\n",
1098 "invalid PCI_Config write %p@%zu width=%d\n",
uacpi_status uacpi_acquire_aml_mutex(uacpi_mutex *, uacpi_u16 timeout)
uacpi_status uacpi_release_aml_mutex(uacpi_mutex *)
struct uacpi_runtime_context g_uacpi_rt_ctx
uacpi_object * uacpi_namespace_node_get_object_typed(const uacpi_namespace_node *node, uacpi_object_type_bits type_mask)
#define UACPI_ALIGN_UP(x, val, type)
#define UACPI_IS_POWER_OF_TWO(x, type)
#define UACPI_IS_ALIGNED(x, val, type)
#define uacpi_free(mem, _)
uacpi_u8 uacpi_bit_scan_backward(uacpi_u64)
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
@ UACPI_UPDATE_RULE_PRESERVE
@ UACPI_UPDATE_RULE_WRITE_AS_ZEROES
@ UACPI_UPDATE_RULE_WRITE_AS_ONES
@ UACPI_FIELD_UNIT_KIND_NORMAL
@ UACPI_FIELD_UNIT_KIND_BANK
@ UACPI_FIELD_UNIT_KIND_INDEX
#define uacpi_likely_success(expr)
#define uacpi_unlikely_error(expr)
@ UACPI_STATUS_INVALID_ARGUMENT
@ UACPI_STATUS_UNIMPLEMENTED
@ UACPI_STATUS_OUT_OF_MEMORY
@ UACPI_STATUS_AML_INCOMPATIBLE_OBJECT_TYPE
@ UACPI_STATUS_MAPPING_FAILED
const uacpi_char * uacpi_address_space_to_string(uacpi_address_space space)
@ UACPI_OBJECT_OPERATION_REGION_BIT
@ UACPI_ACCESS_ATTRIBUTE_WORD
@ UACPI_ACCESS_ATTRIBUTE_PROCESS_CALL
@ UACPI_ACCESS_ATTRIBUTE_BLOCK_PROCESS_CALL
@ UACPI_ACCESS_ATTRIBUTE_BYTE
@ UACPI_ACCESS_ATTRIBUTE_QUICK
@ UACPI_ACCESS_ATTRIBUTE_SEND_RECEIVE
@ UACPI_ACCESS_ATTRIBUTE_RAW_BYTES
@ UACPI_ACCESS_ATTRIBUTE_BLOCK
@ UACPI_ACCESS_ATTRIBUTE_RAW_PROCESS_BYTES
@ UACPI_ACCESS_ATTRIBUTE_BYTES
@ UACPI_ADDRESS_SPACE_IPMI
@ UACPI_ADDRESS_SPACE_PRM
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
@ UACPI_ADDRESS_SPACE_GENERAL_PURPOSE_IO
@ UACPI_ADDRESS_SPACE_FFIXEDHW
@ UACPI_ADDRESS_SPACE_GENERIC_SERIAL_BUS
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
@ UACPI_ADDRESS_SPACE_SMBUS
static uacpi_size bit_span_offset(struct bit_span *span, uacpi_size bits)
static void bit_copy(struct bit_span *dst, struct bit_span *src)
uacpi_status uacpi_pci_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
static uacpi_status access_field_unit(uacpi_field_unit *field, uacpi_u32 offset, uacpi_region_op op, union uacpi_opregion_io_data data)
uacpi_size uacpi_round_up_bits_to_bytes(uacpi_size bit_length)
uacpi_status uacpi_map_gas(const struct acpi_gas *gas, uacpi_mapped_gas **out_mapped)
uacpi_status uacpi_pci_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
static void do_misaligned_buffer_read(const uacpi_buffer_field *field, uacpi_u8 *dst)
static uacpi_status wtr_buffer_size(uacpi_field_unit *field, uacpi_address_space space, uacpi_size *out_size)
#define SERIAL_HEADER_SIZE
void uacpi_write_buffer_field(uacpi_buffer_field *field, const void *src, uacpi_size size)
uacpi_status uacpi_field_unit_get_bit_length(struct uacpi_field_unit *field, uacpi_size *out_length)
void uacpi_unmap_gas(uacpi_mapped_gas *gas)
static uacpi_status write_generic_field_unit(uacpi_field_unit *field, const void *src, uacpi_size size)
static void cut_misaligned_tail(uacpi_u8 *data, uacpi_size offset, uacpi_u32 bit_length)
uacpi_status uacpi_system_io_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
static uacpi_status do_read_misaligned_field_unit(uacpi_field_unit *field, uacpi_u8 *dst, uacpi_size size)
uacpi_status uacpi_gas_write_mapped(const uacpi_mapped_gas *gas, uacpi_u64 in_value)
#define OPREGION_IO_U64(x)
void uacpi_read_buffer_field(const uacpi_buffer_field *field, void *dst)
static void do_write_misaligned_buffer_field(uacpi_buffer_field *field, const void *src, uacpi_size size)
uacpi_status uacpi_system_memory_read(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
void uacpi_unmap_gas_nofree(uacpi_mapped_gas *gas)
uacpi_status uacpi_field_unit_get_read_type(struct uacpi_field_unit *field, uacpi_object_type *out_type)
uacpi_status uacpi_system_io_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
uacpi_status uacpi_gas_write(const struct acpi_gas *gas, uacpi_u64 in_value)
uacpi_status uacpi_map_gas_noalloc(const struct acpi_gas *gas, uacpi_mapped_gas *out_mapped)
static void unmap_gas_io(uacpi_handle io_handle, uacpi_size size)
uacpi_status uacpi_system_memory_write(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
uacpi_status uacpi_read_field_unit(uacpi_field_unit *field, void *dst, uacpi_size size, uacpi_data_view *wtr_response)
static uacpi_u8 gas_get_access_bit_width(const struct acpi_gas *gas)
uacpi_status uacpi_gas_read(const struct acpi_gas *gas, uacpi_u64 *out_value)
static uacpi_status gas_validate(const struct acpi_gas *gas, uacpi_u8 *access_bit_width, uacpi_u8 *bit_width)
uacpi_status uacpi_gas_read_mapped(const uacpi_mapped_gas *gas, uacpi_u64 *out_value)
uacpi_status uacpi_write_field_unit(uacpi_field_unit *field, const void *src, uacpi_size size, uacpi_data_view *wtr_response)
static uacpi_status handle_special_field(uacpi_field_unit *field, uacpi_data_view buf, uacpi_region_op op, uacpi_data_view *wtr_response, uacpi_bool *did_handle)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLsizei width
GLenum GLenum GLvoid GLvoid GLvoid * span
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
GLenum GLenum GLenum GLenum mapping
void uacpi_trace_region_error(uacpi_namespace_node *node, uacpi_char *message, uacpi_status ret)
uacpi_bool uacpi_is_buffer_access_address_space(uacpi_address_space space)
uacpi_status uacpi_dispatch_opregion_io(uacpi_field_unit *field, uacpi_u32 offset, uacpi_region_op op, union uacpi_opregion_io_data data)
#define UACPI_PTR_ADD(ptr, value)
uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle *out_handle)
uacpi_status uacpi_kernel_pci_write16(uacpi_handle device, uacpi_size offset, uacpi_u16 value)
uacpi_status uacpi_kernel_pci_read8(uacpi_handle device, uacpi_size offset, uacpi_u8 *value)
void * uacpi_kernel_alloc(uacpi_size size)
uacpi_status uacpi_kernel_io_write8(uacpi_handle, uacpi_size offset, uacpi_u8 in_value)
uacpi_status uacpi_kernel_pci_read16(uacpi_handle device, uacpi_size offset, uacpi_u16 *value)
uacpi_status uacpi_kernel_io_read32(uacpi_handle, uacpi_size offset, uacpi_u32 *out_value)
uacpi_status uacpi_kernel_pci_read32(uacpi_handle device, uacpi_size offset, uacpi_u32 *value)
uacpi_status uacpi_kernel_io_write32(uacpi_handle, uacpi_size offset, uacpi_u32 in_value)
uacpi_status uacpi_kernel_io_read8(uacpi_handle, uacpi_size offset, uacpi_u8 *out_value)
uacpi_status uacpi_kernel_pci_write8(uacpi_handle device, uacpi_size offset, uacpi_u8 value)
void uacpi_kernel_unmap(void *addr, uacpi_size len)
uacpi_status uacpi_kernel_io_write16(uacpi_handle, uacpi_size offset, uacpi_u16 in_value)
uacpi_status uacpi_kernel_io_read16(uacpi_handle, uacpi_size offset, uacpi_u16 *out_value)
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
void uacpi_kernel_io_unmap(uacpi_handle handle)
uacpi_status uacpi_kernel_pci_write32(uacpi_handle device, uacpi_size offset, uacpi_u32 value)
double __cdecl remainder(double, double)
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
const uacpi_u8 * const_data
uacpi_u8 access_bit_width
void(* unmap)(uacpi_handle, uacpi_size)
uacpi_status(* write)(uacpi_handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
uacpi_status(* read)(uacpi_handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out