18#ifndef UACPI_BAREBONES_MODE
22#define ENSURE_TABLES_ONLINE() \
24 if (!early_table_access) \
25 UACPI_ENSURE_INIT_LEVEL_AT_LEAST( \
26 UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED \
42#define table_mutex UACPI_NULL
43#define uacpi_acquire_native_mutex_may_be_null dummy_mutex_acquire_release
44#define uacpi_release_native_mutex_may_be_null dummy_mutex_acquire_release
46#define ENSURE_TABLES_ONLINE() \
48 if (!early_table_access) \
49 return UACPI_STATUS_INIT_LEVEL_MISMATCH; \
63 struct acpi_sdt_hdr
hdr;
71 struct acpi_sdt_hdr *sdt =
hdr;
82 struct acpi_rsdp *rsdp =
hdr;
86 UACPI_FMT64(phys_addr), rsdp->length, rsdp->revision,
94 sdt->signature,
UACPI_FMT64(phys_addr), sdt->length, sdt->revision,
95 sdt->oemid, sdt->oem_table_id
102 struct uacpi_rxsdt *rxsdt;
103 uacpi_size i, entry_bytes, map_len =
sizeof(*rxsdt);
118 map_len = rxsdt->hdr.length;
125 entry_bytes = map_len -
sizeof(*rxsdt);
126 entry_bytes &= ~(entry_size - 1);
136 for (
i = 0;
i < entry_bytes;
i += entry_size) {
138 uacpi_memcpy(&entry_phys_addr_large, &rxsdt->ptr_bytes[
i], entry_size);
140 if (!entry_phys_addr_large)
163 struct acpi_rsdp *rsdp;
179 if (rsdp->revision > 1 && rsdp->xsdt_addr &&
183 rxsdt_entry_size = 8;
186 rxsdt_entry_size = 4;
192 uacpi_error(
"both RSDT & XSDT tables are NULL!\n");
205#ifndef UACPI_BAREBONES_MODE
227#ifndef UACPI_BAREBONES_MODE
246 if (early_table_access) {
252 num_tables = table_array_size(&
tables);
253 if (num_tables > table_array_inline_capacity(&
tables)) {
260 num_tables -= table_array_inline_capacity(&
tables);
269 tables.dynamic_storage = new_buf;
270 tables.dynamic_capacity = num_tables;
277 tables.dynamic_capacity = 0;
293 if (fadt->x_firmware_ctrl) {
320 for (
i = 0;
i < table_array_size(&
tables); ++
i) {
324#ifndef UACPI_BAREBONES_MODE
339 if (early_table_access) {
343 table_array_clear(&
tables);
348#ifndef UACPI_BAREBONES_MODE
369 installation_handler =
handler;
449 if (early_table_access &&
450 table_array_size(&
tables) == table_array_capacity(&
tables)) {
451 uacpi_warn(
"early table access buffer capacity exhausted!\n");
455 tbl = table_array_alloc(&
tables);
460 *out_idx = table_array_size(&
tables) - 1;
609 table->reference_count = 0;
611 table->ptr = virt_addr;
618 table->reference_count++;
619 out_table->
ptr = virt_addr;
631 switch (disposition) {
647 uacpi_error(
"invalid table installation disposition %d\n", disposition);
657 struct acpi_sdt_hdr
hdr;
688 disposition = installation_handler(virt, &
override);
690 switch (disposition) {
695 "table '%.4s' (0x016%"UACPI_PRIX64") installation denied "
748 struct acpi_sdt_hdr *
hdr = virt;
751 uacpi_error(
"invalid table '%.4s' (%p) size: %u\n",
752 hdr->signature, virt,
hdr->length);
756#ifndef UACPI_BAREBONES_MODE
762 disposition = installation_handler(virt, &
override);
764 switch (disposition) {
886 switch (
ctx->search_type) {
892 if (
id->oemid[0] !=
'\0' &&
896 if (
id->oem_table_id[0] !=
'\0' &&
898 sizeof(
id->oem_table_id)) != 0)
905 if (!
ctx->match_cb(tbl))
934#ifndef UACPI_BAREBONES_MODE
1007 sizeof(
id.signature));
1022#define TABLE_CTL_SET_FLAGS (1 << 0)
1023#define TABLE_CTL_CLEAR_FLAGS (1 << 1)
1024#define TABLE_CTL_VALIDATE_SET_FLAGS (1 << 2)
1025#define TABLE_CTL_VALIDATE_CLEAR_FLAGS (1 << 3)
1026#define TABLE_CTL_GET (1 << 4)
1027#define TABLE_CTL_PUT (1 << 5)
1053 "requested invalid table index %zu (%zu tables installed)\n",
1069 "unexpected table '%.4s' flags %02X, expected %02X to be set\n",
1082 "unexpected table '%.4s' flags %02X, expected %02X "
1107 tbl->
flags &= ~req->clear;
1114#ifndef UACPI_BAREBONES_MODE
1154 .type = TABLE_CTL_GET
1161 .type = TABLE_CTL_PUT
1166 116, 132, 244, 244, 268, 276
1173 current_rev = fadt->hdr.revision;
1182 "FADT revision (%zu) is likely greater than the last "
1183 "supported, reducing to %zu\n", current_rev,
rev
1185 fadt->hdr.revision =
rev;
1191 if (current_rev !=
rev && !(
rev == 3 && current_rev == 4)) {
1193 "FADT length %u doesn't match expected for revision %zu, "
1194 "assuming version %zu\n", fadt->hdr.length, current_rev,
1197 fadt->hdr.revision =
rev;
1207 gas->register_bit_width =
UACPI_MIN(255, byte_size * 8);
1208 gas->register_bit_offset = 0;
1209 gas->access_size = 0;
1218#define fadt_offset(field) uacpi_offsetof(struct acpi_fadt, field)
1276 struct acpi_gas *gas;
1294#ifndef UACPI_BAREBONES_MODE
1296 struct acpi_gas *
src,
struct acpi_gas *dst0,
struct acpi_gas *dst1
1301 if (
src->address == 0)
1304 byte_length =
src->register_bit_width / 8;
1330 const struct acpi_sdt_hdr *
hdr = virt;
1339#if !defined(UACPI_REDUCED_HARDWARE) && !defined(UACPI_BAREBONES_MODE)
1349 if (fadt->hdr.revision <= 2) {
1350 fadt->preferred_pm_profile = 0;
1351 fadt->pstate_cnt = 0;
1353 fadt->iapc_boot_arch = 0;
1357 fadt->x_dsdt = fadt->dsdt;
1378 if (fadt->firmware_ctrl)
1379 fadt->x_firmware_ctrl = fadt->firmware_ctrl;
1383#ifndef UACPI_BAREBONES_MODE
ios_base &_STLP_CALL dec(ios_base &__s)
static unsigned char bytes[4]
void user(int argc, const char *argv[])
static uacpi_status uacpi_acquire_native_mutex_may_be_null(uacpi_handle mtx)
static uacpi_status uacpi_release_native_mutex_may_be_null(uacpi_handle mtx)
UINT(* handler)(MSIPACKAGE *)
#define ACPI_FACS_SIGNATURE
#define ACPI_RSDP_SIGNATURE
#define ACPI_XSDT_SIGNATURE
#define ACPI_DSDT_SIGNATURE
#define ACPI_HW_REDUCED_ACPI
#define ACPI_FADT_SIGNATURE
#define ACPI_RSDT_SIGNATURE
#define UACPI_ENSURE_INIT_LEVEL_IS(lvl)
static uacpi_bool uacpi_check_flag(uacpi_u64 flag)
static uacpi_bool uacpi_is_hardware_reduced(void)
struct uacpi_runtime_context g_uacpi_rt_ctx
#define UACPI_ARRAY_SIZE(arr)
void uacpi_logger_initialize(void)
#define uacpi_log_lvl(lvl,...)
#define uacpi_memzero(ptr, size)
#define uacpi_free(mem, _)
#define uacpi_likely_success(expr)
#define uacpi_unlikely_error(expr)
@ UACPI_STATUS_INVALID_ARGUMENT
@ UACPI_STATUS_INTERNAL_ERROR
@ UACPI_STATUS_OUT_OF_MEMORY
@ UACPI_STATUS_OVERRIDDEN
@ UACPI_STATUS_INVALID_TABLE_LENGTH
@ UACPI_STATUS_INVALID_SIGNATURE
@ UACPI_STATUS_ALREADY_EXISTS
@ UACPI_STATUS_MAPPING_FAILED
@ UACPI_STATUS_INIT_LEVEL_MISMATCH
@ UACPI_STATUS_BAD_CHECKSUM
@ UACPI_ITERATION_DECISION_BREAK
@ UACPI_ITERATION_DECISION_CONTINUE
uacpi_u64 uacpi_phys_addr
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
static uacpi_status initialize_from_rxsdt(uacpi_phys_addr rxsdt_addr, uacpi_size entry_size)
static uacpi_u8 table_checksum(void *table, uacpi_size size)
static uacpi_status verify_and_install_table(struct acpi_sdt_hdr *hdr, uacpi_phys_addr phys_addr, void *virt_addr, enum uacpi_table_origin origin, uacpi_table *out_table)
uacpi_status uacpi_table_fadt(struct acpi_fadt **out_fadt)
#define TABLE_CTL_VALIDATE_CLEAR_FLAGS
#define TABLE_CTL_VALIDATE_SET_FLAGS
#define ENSURE_TABLES_ONLINE()
static void gas_init_system_io(struct acpi_gas *gas, uacpi_u64 address, uacpi_u8 byte_size)
uacpi_status uacpi_table_find(const uacpi_table_identifiers *id, uacpi_table *out_table)
static uacpi_status initialize_fadt(const void *)
uacpi_u16 fadt_version_sizes[]
uacpi_bool uacpi_signatures_match(const void *const lhs, const void *const rhs)
static uacpi_status table_install_with_origin_unlocked(void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
uacpi_status uacpi_table_find_next_with_same_signature(uacpi_table *in_out_table)
static uacpi_status find_table(uacpi_size base_idx, const uacpi_table_identifiers *id, uacpi_table *out_table)
static uacpi_iteration_decision warn_if_early_referenced(void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
uacpi_status uacpi_table_load_with_cause(uacpi_size idx, enum uacpi_table_load_cause cause)
uacpi_status uacpi_table_install_with_origin(void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
void uacpi_deinitialize_tables(void)
static uacpi_status handle_table_override(uacpi_table_installation_disposition disposition, uacpi_u64 address, uacpi_table *out_table)
#define TABLE_CTL_CLEAR_FLAGS
#define TABLE_CTL_SET_FLAGS
uacpi_status uacpi_table_unref(uacpi_table *tbl)
uacpi_status uacpi_table_install(void *virt, uacpi_table *out_table)
static uacpi_status table_ctl(uacpi_size idx, struct table_ctl_request *req)
uacpi_status uacpi_initialize_tables(void)
static uacpi_status table_unref_unlocked(struct uacpi_installed_table *tbl)
static uacpi_iteration_decision do_search_tables(void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
uacpi_status uacpi_table_load(uacpi_size idx)
static uacpi_status table_alloc(struct uacpi_installed_table **out_tbl, uacpi_size *out_idx)
static void * fadt_relative(uacpi_size offset)
static void convert_registers_to_gas(void)
uacpi_status uacpi_table_find_by_signature(const uacpi_char *signature_string, struct uacpi_table *out_table)
uacpi_status uacpi_table_ref(uacpi_table *tbl)
static struct register_description fadt_registers[]
uacpi_status uacpi_table_match(uacpi_size base_idx, uacpi_table_match_callback cb, uacpi_table *out_table)
static uacpi_status get_external_table_header(uacpi_phys_addr phys_addr, struct acpi_sdt_hdr *out_hdr)
uacpi_status uacpi_check_table_signature(void *table, const uacpi_char *expect)
static uacpi_status initialize_from_rsdp(void)
uacpi_status uacpi_table_install_physical(uacpi_phys_addr addr, uacpi_table *out_table)
static void fadt_ensure_correct_revision(struct acpi_fadt *fadt)
static uacpi_status table_install_physical_with_origin_unlocked(uacpi_phys_addr phys, enum uacpi_table_origin origin, const uacpi_char *expected_signature, uacpi_table *out_table)
static uacpi_status table_ref_unlocked(struct uacpi_installed_table *tbl)
#define fadt_offset(field)
static void split_event_blocks(void)
uacpi_status uacpi_set_table_installation_handler(uacpi_table_installation_handler handler)
void uacpi_table_mark_as_loaded(uacpi_size idx)
uacpi_status uacpi_table_install_physical_with_origin(uacpi_phys_addr phys, enum uacpi_table_origin origin, uacpi_table *out_table)
static void dump_table_header(uacpi_phys_addr phys_addr, void *hdr)
static void split_one_block(struct acpi_gas *src, struct acpi_gas *dst0, struct acpi_gas *dst1)
uacpi_status uacpi_verify_table_checksum(void *table, uacpi_size size)
uacpi_status uacpi_setup_early_table_access(void *temporary_buffer, uacpi_size buffer_size)
uacpi_status uacpi_for_each_table(uacpi_size base_idx, uacpi_table_iteration_callback cb, void *user)
struct nls_table * tables
#define DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL(name, type, prefix)
#define DYNAMIC_ARRAY_WITH_INLINE_STORAGE(name, type, inline_capacity)
GLuint GLsizei GLsizei * length
GLenum const GLvoid * addr
GLenum GLenum GLenum GLenum mapping
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
#define UACPI_TABLE_CSUM_VERIFIED
#define UACPI_PRI_TBL_HDR
uacpi_iteration_decision(* uacpi_table_iteration_callback)(void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
#define UACPI_TABLE_LOADED
#define UACPI_FMT_TBL_HDR(hdr)
@ UACPI_TABLE_ORIGIN_HOST_VIRTUAL
@ UACPI_TABLE_ORIGIN_HOST_PHYSICAL
@ UACPI_TABLE_ORIGIN_FIRMWARE_PHYSICAL
@ UACPI_TABLE_ORIGIN_FIRMWARE_VIRTUAL
#define UACPI_TABLE_INVALID
uacpi_bool(* uacpi_table_match_callback)(struct uacpi_installed_table *tbl)
static uacpi_phys_addr uacpi_truncate_phys_addr_with_warn(uacpi_u64 large_addr)
#define UACPI_VIRT_ADDR_TO_PTR(vaddr)
uacpi_status uacpi_execute_table(void *, enum uacpi_table_load_cause cause)
@ UACPI_TABLE_LOAD_CAUSE_HOST
void * uacpi_kernel_alloc(uacpi_size size)
uacpi_handle uacpi_kernel_create_mutex(void)
void uacpi_kernel_free_mutex(uacpi_handle)
void uacpi_kernel_unmap(void *addr, uacpi_size len)
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out_rsdp_address)
static const WCHAR desc[]
static HMODULE MODULEINFO DWORD cb
wchar_t const *const size_t const buffer_size
const uacpi_table_identifiers * id
uacpi_table_match_callback match_cb
uacpi_phys_addr phys_addr
uacpi_u16 reference_count
uacpi_object_name signature
struct acpi_sdt_hdr * hdr
uacpi_table_installation_disposition
@ UACPI_TABLE_INSTALLATION_DISPOSITON_DENY
@ UACPI_TABLE_INSTALLATION_DISPOSITON_PHYSICAL_OVERRIDE
@ UACPI_TABLE_INSTALLATION_DISPOSITON_VIRTUAL_OVERRIDE
@ UACPI_TABLE_INSTALLATION_DISPOSITON_ALLOW
uacpi_table_installation_disposition(* uacpi_table_installation_handler)(struct acpi_sdt_hdr *hdr, uacpi_u64 *out_override_address)
#define UACPI_FLAG_BAD_CSUM_FATAL
#define UACPI_FLAG_BAD_XSDT
#define UACPI_FLAG_PROACTIVE_TBL_CSUM
#define UACPI_FLAG_BAD_TBL_SIGNATURE_FATAL
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out