ReactOS 0.4.17-dev-683-g0dafdc5
tables.c File Reference
Include dependency graph for tables.c:

Go to the source code of this file.

Classes

struct  table_search_ctx
 
struct  table_ctl_request
 
struct  register_description
 

Macros

#define ENSURE_TABLES_ONLINE()
 
#define TABLE_CTL_SET_FLAGS   (1 << 0)
 
#define TABLE_CTL_CLEAR_FLAGS   (1 << 1)
 
#define TABLE_CTL_VALIDATE_SET_FLAGS   (1 << 2)
 
#define TABLE_CTL_VALIDATE_CLEAR_FLAGS   (1 << 3)
 
#define TABLE_CTL_GET   (1 << 4)
 
#define TABLE_CTL_PUT   (1 << 5)
 
#define fadt_offset(field)   uacpi_offsetof(struct acpi_fadt, field)
 

Enumerations

enum  search_type { SEARCH_TYPE_BY_ID , SEARCH_TYPE_MATCH }
 

Functions

 DYNAMIC_ARRAY_WITH_INLINE_STORAGE (DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL(table_array, DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL(struct uacpi_installed_table, UACPI_STATIC_TABLE_ARRAY_LEN)
 
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_install_with_origin_unlocked (void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
 
 UACPI_PACKED (struct uacpi_rxsdt { struct acpi_sdt_hdr hdr;uacpi_u8 ptr_bytes[];})
 
static uacpi_status initialize_from_rxsdt (uacpi_phys_addr rxsdt_addr, uacpi_size entry_size)
 
static uacpi_status initialize_from_rsdp (void)
 
uacpi_size uacpi_table_count (void)
 
uacpi_status uacpi_setup_early_table_access (void *temporary_buffer, uacpi_size buffer_size)
 
static uacpi_iteration_decision warn_if_early_referenced (void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
 
uacpi_status uacpi_initialize_tables (void)
 
void uacpi_deinitialize_tables (void)
 
uacpi_status uacpi_set_table_installation_handler (uacpi_table_installation_handler handler)
 
static uacpi_status initialize_fadt (const void *)
 
static uacpi_u8 table_checksum (void *table, uacpi_size size)
 
uacpi_status uacpi_verify_table_checksum (void *table, uacpi_size size, uacpi_u8 *out_flags)
 
static bool skip_due_to_bad_csum (struct uacpi_installed_table *tbl)
 
uacpi_bool uacpi_signatures_match (const void *const lhs, const void *const rhs)
 
uacpi_status uacpi_check_table_signature (void *table, const uacpi_char *expect)
 
static uacpi_status table_alloc (struct uacpi_installed_table **out_tbl, uacpi_size *out_idx)
 
static uacpi_status get_external_table_header (uacpi_phys_addr phys_addr, struct acpi_sdt_hdr *out_hdr)
 
static uacpi_status table_ref_unlocked (struct uacpi_installed_table *tbl)
 
static uacpi_status table_unref_unlocked (struct uacpi_installed_table *tbl)
 
static void table_info_by_index_unchecked (uacpi_size idx, uacpi_table_info *out_info)
 
uacpi_status uacpi_table_info_get_by_index (uacpi_size idx, uacpi_table_info *out_info)
 
uacpi_status uacpi_for_each_table (uacpi_table_iteration_callback cb, void *user)
 
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)
 
static uacpi_status handle_table_override (uacpi_table_installation_disposition disposition, uacpi_u64 address, uacpi_table *out_table)
 
uacpi_status uacpi_table_install_physical_with_origin (uacpi_phys_addr phys, enum uacpi_table_origin origin, uacpi_table *out_table)
 
uacpi_status uacpi_table_install_with_origin (void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
 
uacpi_status uacpi_table_install (void *virt, uacpi_table *out_table)
 
uacpi_status uacpi_table_install_physical (uacpi_phys_addr addr, uacpi_table *out_table)
 
uacpi_status uacpi_for_each_installed_table (uacpi_size base_idx, uacpi_installed_table_iteration_callback cb, void *user)
 
static uacpi_iteration_decision do_search_tables (void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
 
uacpi_status uacpi_table_match (uacpi_size base_idx, uacpi_table_match_callback cb, uacpi_table *out_table)
 
static uacpi_status find_table (uacpi_size idx, uacpi_size nth, const uacpi_table_identifiers *id, uacpi_table *out_table)
 
static uacpi_status find_table_by_signature (const uacpi_char *signature_string, uacpi_size idx, uacpi_size nth, uacpi_table *out_table)
 
uacpi_status uacpi_table_find_by_signature_at (const uacpi_char *signature, uacpi_size idx, uacpi_table *out_table)
 
uacpi_status uacpi_table_find_nth_by_signature (const uacpi_char *signature, uacpi_size nth, uacpi_table *out_table)
 
uacpi_status uacpi_table_find_by_signature (const uacpi_char *signature_string, struct uacpi_table *out_table)
 
uacpi_status uacpi_table_find_next_with_same_signature (uacpi_table *in_out_table)
 
uacpi_status uacpi_table_find (const uacpi_table_identifiers *id, uacpi_table *out_table)
 
static uacpi_status table_ctl (uacpi_size idx, struct table_ctl_request *req)
 
uacpi_status uacpi_table_load_with_cause (uacpi_size idx, enum uacpi_table_load_cause cause)
 
uacpi_status uacpi_table_load (uacpi_size idx)
 
void uacpi_table_mark_as_loaded (uacpi_size idx)
 
uacpi_status uacpi_table_get_by_index (uacpi_size idx, uacpi_table *out_table)
 
uacpi_status uacpi_table_ref_by_index (uacpi_size index)
 
uacpi_status uacpi_table_ref (uacpi_table *tbl)
 
uacpi_status uacpi_table_unref_by_index (uacpi_size index)
 
uacpi_status uacpi_table_unref (uacpi_table *tbl)
 
static void fadt_ensure_correct_revision (struct acpi_fadt *fadt)
 
static void gas_init_system_io (struct acpi_gas *gas, uacpi_u64 address, uacpi_u8 byte_size)
 
static voidfadt_relative (uacpi_size offset)
 
static void convert_registers_to_gas (void)
 
static void split_one_block (struct acpi_gas *src, struct acpi_gas *dst0, struct acpi_gas *dst1)
 
static void split_event_blocks (void)
 
uacpi_status uacpi_table_fadt (struct acpi_fadt **out_fadt)
 
uacpi_status uacpi_for_each_subtable (struct acpi_sdt_hdr *hdr, size_t hdr_size, uacpi_subtable_iteration_callback cb, void *user)
 

Variables

uacpi_u16 fadt_version_sizes []
 
static struct register_description fadt_registers []
 

Macro Definition Documentation

◆ ENSURE_TABLES_ONLINE

#define ENSURE_TABLES_ONLINE ( )
Value:
do { \
if (!early_table_access) \
UACPI_ENSURE_INIT_LEVEL_AT_LEAST( \
); \
} while (0)
@ UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED
Definition: types.h:72

Definition at line 29 of file tables.c.

◆ fadt_offset

#define fadt_offset (   field)    uacpi_offsetof(struct acpi_fadt, field)

Definition at line 1415 of file tables.c.

◆ TABLE_CTL_CLEAR_FLAGS

#define TABLE_CTL_CLEAR_FLAGS   (1 << 1)

Definition at line 1188 of file tables.c.

◆ TABLE_CTL_GET

#define TABLE_CTL_GET   (1 << 4)

Definition at line 1191 of file tables.c.

◆ TABLE_CTL_PUT

#define TABLE_CTL_PUT   (1 << 5)

Definition at line 1192 of file tables.c.

◆ TABLE_CTL_SET_FLAGS

#define TABLE_CTL_SET_FLAGS   (1 << 0)

Definition at line 1187 of file tables.c.

◆ TABLE_CTL_VALIDATE_CLEAR_FLAGS

#define TABLE_CTL_VALIDATE_CLEAR_FLAGS   (1 << 3)

Definition at line 1190 of file tables.c.

◆ TABLE_CTL_VALIDATE_SET_FLAGS

#define TABLE_CTL_VALIDATE_SET_FLAGS   (1 << 2)

Definition at line 1189 of file tables.c.

Enumeration Type Documentation

◆ search_type

Enumerator
SEARCH_TYPE_BY_ID 
SEARCH_TYPE_MATCH 

Definition at line 1001 of file tables.c.

1001 {
1004};
@ SEARCH_TYPE_MATCH
Definition: tables.c:1003
@ SEARCH_TYPE_BY_ID
Definition: tables.c:1002

Function Documentation

◆ convert_registers_to_gas()

static void convert_registers_to_gas ( void  )
static

Definition at line 1469 of file tables.c.

1470{
1471 uacpi_size i;
1472 struct register_description *desc;
1473 struct acpi_gas *gas;
1474 uacpi_u32 legacy_addr;
1476
1477 for (i = 0; i < UACPI_ARRAY_SIZE(fadt_registers); ++i) {
1478 desc = &fadt_registers[i];
1479
1480 legacy_addr = *(uacpi_u32*)fadt_relative(desc->offset);
1481 length = *(uacpi_u8*)fadt_relative(desc->length_offset);
1482 gas = fadt_relative(desc->xoffset);
1483
1484 if (gas->address)
1485 continue;
1486
1487 gas_init_system_io(gas, legacy_addr, length);
1488 }
1489}
#define UACPI_ARRAY_SIZE(arr)
Definition: helpers.h:5
size_t uacpi_size
Definition: types.h:37
uint32_t uacpi_u32
Definition: types.h:21
uint8_t uacpi_u8
Definition: types.h:19
static void gas_init_system_io(struct acpi_gas *gas, uacpi_u64 address, uacpi_u8 byte_size)
Definition: tables.c:1398
static void * fadt_relative(uacpi_size offset)
Definition: tables.c:1464
static struct register_description fadt_registers[]
Definition: tables.c:1421
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
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204

Referenced by initialize_fadt().

◆ do_search_tables()

static uacpi_iteration_decision do_search_tables ( void user,
struct uacpi_installed_table tbl,
uacpi_size  idx 
)
static

Definition at line 1018 of file tables.c.

1021{
1022 struct table_search_ctx *ctx = user;
1025
1026 switch (ctx->search_type) {
1027 case SEARCH_TYPE_BY_ID: {
1028 const uacpi_table_identifiers *id = ctx->id;
1029
1030 if (!uacpi_signatures_match(&id->signature, tbl->hdr.signature))
1032 if (id->oemid[0] != '\0' &&
1033 uacpi_memcmp(id->oemid, tbl->hdr.oemid, sizeof(id->oemid)) != 0)
1035
1036 if (id->oem_table_id[0] != '\0' &&
1037 uacpi_memcmp(id->oem_table_id, tbl->hdr.oem_table_id,
1038 sizeof(id->oem_table_id)) != 0)
1040
1041 break;
1042 }
1043
1044 case SEARCH_TYPE_MATCH:
1045 if (!ctx->match_cb(tbl))
1047 break;
1048
1049 default:
1052 }
1053
1054 // Match, but we were asked for an nth table
1055 if (ctx->to_skip) {
1056 ctx->to_skip--;
1058 }
1059
1060 ret = table_ref_unlocked(tbl);
1062 out_table = ctx->out_table;
1063 out_table->ptr = tbl->ptr;
1064 out_table->index = idx;
1065 ctx->status = ret;
1067 }
1068
1069 /*
1070 * Don't abort nor propagate bad checksums, just pretend this table never
1071 * existed and go on with the search.
1072 */
1075
1076 ctx->status = ret;
1078}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
unsigned int idx
Definition: utils.c:41
#define uacpi_memcmp
Definition: stdlib.h:61
#define uacpi_likely_success(expr)
Definition: status.h:53
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_BAD_CHECKSUM
Definition: status.h:14
@ UACPI_ITERATION_DECISION_BREAK
Definition: types.h:30
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
return ret
Definition: mutex.c:147
uacpi_bool uacpi_signatures_match(const void *const lhs, const void *const rhs)
Definition: tables.c:464
static uacpi_status table_ref_unlocked(struct uacpi_installed_table *tbl)
Definition: tables.c:529
GLuint id
Definition: glext.h:5910
uacpi_table * out_table
Definition: tables.c:1012
struct acpi_sdt_hdr hdr
Definition: tables.h:11
void * ptr
Definition: tables.h:28
uacpi_size index
Definition: tables.h:33

Referenced by find_table(), and uacpi_table_match().

◆ DYNAMIC_ARRAY_WITH_INLINE_STORAGE()

DYNAMIC_ARRAY_WITH_INLINE_STORAGE ( DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL table_array,
DYNAMIC_ARRAY_WITH_INLINE_STORAGE_IMPL struct uacpi_installed_table,
UACPI_STATIC_TABLE_ARRAY_LEN   
)

Definition at line 7 of file tables.c.

24{
25 return early_table_access ||
27}
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17

◆ fadt_ensure_correct_revision()

static void fadt_ensure_correct_revision ( struct acpi_fadt *  fadt)
static

Definition at line 1366 of file tables.c.

1367{
1368 uacpi_size current_rev, rev;
1369
1370 current_rev = fadt->hdr.revision;
1371
1372 for (rev = 0; rev < UACPI_ARRAY_SIZE(fadt_version_sizes); ++rev) {
1373 if (fadt->hdr.length <= fadt_version_sizes[rev])
1374 break;
1375 }
1376
1379 "FADT revision (%zu) is likely greater than the last "
1380 "supported, reducing to %zu", current_rev, rev
1381 );
1382 fadt->hdr.revision = rev;
1383 return;
1384 }
1385
1386 rev++;
1387
1388 if (current_rev != rev && !(rev == 3 && current_rev == 4)) {
1389 uacpi_warn(
1390 "FADT length %u doesn't match expected for revision %zu, "
1391 "assuming version %zu", fadt->hdr.length, current_rev,
1392 rev
1393 );
1394 fadt->hdr.revision = rev;
1395 }
1396}
int rev
Definition: sort.c:17
#define uacpi_trace(...)
Definition: log.h:33
#define uacpi_warn(...)
Definition: log.h:35
uacpi_u16 fadt_version_sizes[]
Definition: tables.c:1362

Referenced by initialize_fadt().

◆ fadt_relative()

static void * fadt_relative ( uacpi_size  offset)
static

Definition at line 1464 of file tables.c.

1465{
1466 return ((uacpi_u8*)&g_uacpi_rt_ctx.fadt) + offset;
1467}
GLintptr offset
Definition: glext.h:5920

Referenced by convert_registers_to_gas().

◆ find_table()

static uacpi_status find_table ( uacpi_size  idx,
uacpi_size  nth,
const uacpi_table_identifiers id,
uacpi_table out_table 
)
static

Definition at line 1101 of file tables.c.

1105{
1107 struct table_search_ctx ctx = { 0 };
1108
1109 ctx.id = id;
1110 ctx.out_table = out_table;
1111 ctx.search_type = SEARCH_TYPE_BY_ID;
1112 ctx.to_skip = nth;
1113 ctx.status = UACPI_STATUS_NOT_FOUND;
1114
1117 return ret;
1118
1119 return ctx.status;
1120}
#define uacpi_unlikely_error(expr)
Definition: status.h:49
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
uacpi_status uacpi_for_each_installed_table(uacpi_size base_idx, uacpi_installed_table_iteration_callback cb, void *user)
Definition: tables.c:971
static uacpi_iteration_decision do_search_tables(void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
Definition: tables.c:1018

Referenced by find_table_by_signature(), uacpi_table_find(), and uacpi_table_find_next_with_same_signature().

◆ find_table_by_signature()

static uacpi_status find_table_by_signature ( const uacpi_char signature_string,
uacpi_size  idx,
uacpi_size  nth,
uacpi_table out_table 
)
static

Definition at line 1122 of file tables.c.

1126{
1127 struct uacpi_table_identifiers id = { 0 };
1128
1130
1131 id.signature.text[0] = signature_string[0];
1132 id.signature.text[1] = signature_string[1];
1133 id.signature.text[2] = signature_string[2];
1134 id.signature.text[3] = signature_string[3];
1135
1136 return find_table(idx, nth, &id, out_table);
1137}
#define ENSURE_TABLES_ONLINE()
Definition: tables.c:29
static uacpi_status find_table(uacpi_size idx, uacpi_size nth, const uacpi_table_identifiers *id, uacpi_table *out_table)
Definition: tables.c:1101

Referenced by uacpi_table_find_by_signature(), uacpi_table_find_by_signature_at(), and uacpi_table_find_nth_by_signature().

◆ gas_init_system_io()

static void gas_init_system_io ( struct acpi_gas *  gas,
uacpi_u64  address,
uacpi_u8  byte_size 
)
static

Definition at line 1398 of file tables.c.

1401{
1402 gas->address = address;
1403 gas->address_space_id = UACPI_ADDRESS_SPACE_SYSTEM_IO;
1404 gas->register_bit_width = UACPI_MIN(255, byte_size * 8);
1405 gas->register_bit_offset = 0;
1406 gas->access_size = 0;
1407}
#define UACPI_MIN(x, y)
Definition: stdlib.h:102
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
Definition: types.h:44
GLuint address
Definition: glext.h:9393

Referenced by convert_registers_to_gas(), and split_one_block().

◆ get_external_table_header()

static uacpi_status get_external_table_header ( uacpi_phys_addr  phys_addr,
struct acpi_sdt_hdr *  out_hdr 
)
static

Definition at line 513 of file tables.c.

516{
517 void *virt;
518
519 virt = uacpi_kernel_map(phys_addr, sizeof(*out_hdr));
520 if (uacpi_unlikely(virt == UACPI_MAP_FAILED))
522
523 uacpi_memcpy(out_hdr, virt, sizeof(*out_hdr));
524
525 uacpi_kernel_unmap(virt, sizeof(*out_hdr));
526 return UACPI_STATUS_OK;
527}
#define uacpi_memcpy
Definition: stdlib.h:34
#define uacpi_unlikely(expr)
Definition: compiler.h:88
@ UACPI_STATUS_MAPPING_FAILED
Definition: status.h:12
@ UACPI_STATUS_OK
Definition: status.h:11
#define UACPI_MAP_FAILED
Definition: kernel_api.h:13
void uacpi_kernel_unmap(void *addr, uacpi_size len)
Definition: uacpiosl.c:198
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
Definition: uacpiosl.c:191

Referenced by table_install_physical_with_origin_unlocked().

◆ handle_table_override()

static uacpi_status handle_table_override ( uacpi_table_installation_disposition  disposition,
uacpi_u64  address,
uacpi_table out_table 
)
static

Definition at line 762 of file tables.c.

766{
768
769 switch (disposition) {
774 out_table
775 );
776 return ret;
782 out_table
783 );
784 default:
785 uacpi_error("invalid table installation disposition %d", disposition);
787 }
788}
#define uacpi_error(...)
Definition: log.h:36
#define UACPI_NULL
Definition: types.h:33
uacpi_uintptr uacpi_virt_addr
Definition: types.h:36
@ UACPI_STATUS_INTERNAL_ERROR
Definition: status.h:21
uacpi_u64 uacpi_phys_addr
Definition: types.h:17
static uacpi_status table_install_with_origin_unlocked(void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
Definition: tables.c:883
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)
Definition: tables.c:790
#define UACPI_VIRT_ADDR_TO_PTR(vaddr)
Definition: utilities.h:21
@ UACPI_TABLE_INSTALLATION_DISPOSITON_PHYSICAL_OVERRIDE
Definition: tables.h:160
@ UACPI_TABLE_INSTALLATION_DISPOSITON_VIRTUAL_OVERRIDE
Definition: tables.h:154
@ UACPI_TABLE_ORIGIN_HOST_VIRTUAL
Definition: tables.h:198
@ UACPI_TABLE_ORIGIN_HOST_PHYSICAL
Definition: tables.h:193

Referenced by table_install_physical_with_origin_unlocked(), and table_install_with_origin_unlocked().

◆ initialize_fadt()

static uacpi_status initialize_fadt ( const void virt)
static

Definition at line 1523 of file tables.c.

1524{
1526 struct acpi_fadt *fadt = &g_uacpi_rt_ctx.fadt;
1527 const struct acpi_sdt_hdr *hdr = virt;
1528
1529 /*
1530 * Here we (roughly) follow ACPICA initialization sequence to make sure we
1531 * handle potential BIOS quirks with garbage inside FADT correctly.
1532 */
1533
1534 uacpi_memcpy(fadt, hdr, UACPI_MIN(sizeof(*fadt), hdr->length));
1535
1536#ifndef UACPI_REDUCED_HARDWARE
1537 g_uacpi_rt_ctx.is_hardware_reduced = fadt->flags & ACPI_HW_REDUCED_ACPI;
1538#endif
1539
1541
1542 /*
1543 * These are reserved prior to version 3, so zero them out to work around
1544 * BIOS implementations that might dirty these.
1545 */
1546 if (fadt->hdr.revision <= 2) {
1547 fadt->preferred_pm_profile = 0;
1548 fadt->pstate_cnt = 0;
1549 fadt->cst_cnt = 0;
1550 fadt->iapc_boot_arch = 0;
1551 }
1552
1553 if (!fadt->x_dsdt)
1554 fadt->x_dsdt = fadt->dsdt;
1555
1556 if (fadt->x_dsdt) {
1560 );
1563 return ret;
1564 }
1565
1566 /*
1567 * Unconditionally use 32 bit FACS if it exists, as 64 bit FACS is known
1568 * to cause issues on some firmware:
1569 * https://bugzilla.kernel.org/show_bug.cgi?id=74021
1570 *
1571 * Note that we don't install it here as FACS needs permanent mapping, which
1572 * we might not be able to obtain at this point in case of early table
1573 * access.
1574 */
1575 if (fadt->firmware_ctrl)
1576 fadt->x_firmware_ctrl = fadt->firmware_ctrl;
1577
1580#ifndef UACPI_BAREBONES_MODE
1582#endif
1583 }
1584
1585 fadt_available = true;
1586 return UACPI_STATUS_OK;
1587}
#define ACPI_DSDT_SIGNATURE
Definition: acpi.h:23
#define ACPI_HW_REDUCED_ACPI
Definition: acpi.h:728
static uacpi_bool uacpi_is_hardware_reduced(void)
Definition: context.h:100
@ UACPI_STATUS_OVERRIDDEN
Definition: status.h:30
static void convert_registers_to_gas(void)
Definition: tables.c:1469
static void fadt_ensure_correct_revision(struct acpi_fadt *fadt)
Definition: tables.c:1366
static void split_event_blocks(void)
Definition: tables.c:1508
char hdr[14]
Definition: iptest.cpp:33
@ UACPI_TABLE_ORIGIN_FIRMWARE_PHYSICAL
Definition: tables.h:181

Referenced by verify_and_install_table().

◆ initialize_from_rsdp()

static uacpi_status initialize_from_rsdp ( void  )
static

Definition at line 171 of file tables.c.

172{
174 uacpi_phys_addr rsdp_phys;
175 struct acpi_rsdp *rsdp;
176 uacpi_phys_addr rxsdt;
177 uacpi_size rxsdt_entry_size;
178
179 g_uacpi_rt_ctx.is_rev1 = UACPI_TRUE;
180
181 ret = uacpi_kernel_get_rsdp(&rsdp_phys);
183 return ret;
184
185 rsdp = uacpi_kernel_map(rsdp_phys, sizeof(struct acpi_rsdp));
186 if (rsdp == UACPI_MAP_FAILED)
188
189 dump_table_header(rsdp_phys, rsdp);
190
191 if (rsdp->revision > 1 && rsdp->xsdt_addr &&
193 {
194 rxsdt = uacpi_truncate_phys_addr_with_warn(rsdp->xsdt_addr);
195 rxsdt_entry_size = 8;
196 } else {
197 rxsdt = (uacpi_phys_addr)rsdp->rsdt_addr;
198 rxsdt_entry_size = 4;
199 }
200
201 uacpi_kernel_unmap(rsdp, sizeof(struct acpi_rsdp));
202
203 if (!rxsdt) {
204 uacpi_error("both RSDT & XSDT tables are NULL!");
206 }
207
208 return initialize_from_rxsdt(rxsdt, rxsdt_entry_size);
209}
static uacpi_bool uacpi_check_flag(uacpi_u64 flag)
Definition: context.h:90
#define UACPI_TRUE
Definition: types.h:29
static uacpi_status initialize_from_rxsdt(uacpi_phys_addr rxsdt_addr, uacpi_size entry_size)
Definition: tables.c:111
static uacpi_phys_addr uacpi_truncate_phys_addr_with_warn(uacpi_u64 large_addr)
Definition: utilities.h:8
uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out_rsdp_address)
Definition: uacpiosl.c:204
#define UACPI_FLAG_BAD_XSDT
Definition: uacpi.h:86

Referenced by uacpi_initialize_tables(), and uacpi_setup_early_table_access().

◆ initialize_from_rxsdt()

static uacpi_status initialize_from_rxsdt ( uacpi_phys_addr  rxsdt_addr,
uacpi_size  entry_size 
)
static

Definition at line 111 of file tables.c.

113{
114 struct uacpi_rxsdt *rxsdt;
115 uacpi_size i, entry_bytes, map_len = sizeof(*rxsdt);
116 uacpi_phys_addr entry_addr;
118
119 rxsdt = uacpi_kernel_map(rxsdt_addr, map_len);
120 if (rxsdt == UACPI_MAP_FAILED)
122
123 dump_table_header(rxsdt_addr, rxsdt);
124
126 entry_size == 8 ? ACPI_XSDT_SIGNATURE : ACPI_RSDT_SIGNATURE);
128 goto error_out;
129
130 map_len = rxsdt->hdr.length;
131 uacpi_kernel_unmap(rxsdt, sizeof(*rxsdt));
132
133 if (uacpi_unlikely(map_len < (sizeof(*rxsdt) + entry_size)))
135
136 // Make sure length is aligned to entry size so we don't OOB
137 entry_bytes = map_len - sizeof(*rxsdt);
138 entry_bytes &= ~(entry_size - 1);
139
140 rxsdt = uacpi_kernel_map(rxsdt_addr, map_len);
141 if (uacpi_unlikely(rxsdt == UACPI_MAP_FAILED))
143
144 ret = uacpi_verify_table_checksum(rxsdt, map_len, UACPI_NULL);
146 goto error_out;
147
148 for (i = 0; i < entry_bytes; i += entry_size) {
149 uacpi_u64 entry_phys_addr_large = 0;
150 uacpi_memcpy(&entry_phys_addr_large, &rxsdt->ptr_bytes[i], entry_size);
151
152 if (!entry_phys_addr_large)
153 continue;
154
155 entry_addr = uacpi_truncate_phys_addr_with_warn(entry_phys_addr_large);
158 );
161 goto error_out;
162 }
163
165
166error_out:
167 uacpi_kernel_unmap(rxsdt, map_len);
168 return ret;
169}
#define ACPI_XSDT_SIGNATURE
Definition: acpi.h:15
#define ACPI_RSDT_SIGNATURE
Definition: acpi.h:14
uint64_t uacpi_u64
Definition: types.h:22
@ UACPI_STATUS_INVALID_TABLE_LENGTH
Definition: status.h:16
uacpi_status uacpi_verify_table_checksum(void *table, uacpi_size size, uacpi_u8 *out_flags)
Definition: tables.c:426
uacpi_status uacpi_check_table_signature(void *table, const uacpi_char *expect)
Definition: tables.c:469
uacpi_status uacpi_table_install_physical_with_origin(uacpi_phys_addr phys, enum uacpi_table_origin origin, uacpi_table *out_table)
Definition: tables.c:865

Referenced by initialize_from_rsdp().

◆ skip_due_to_bad_csum()

static bool skip_due_to_bad_csum ( struct uacpi_installed_table tbl)
static

Definition at line 458 of file tables.c.

459{
462}
uacpi_u8 flags
Definition: tables.h:16
#define UACPI_TABLE_CSUM_BAD
Definition: tables.h:257
#define UACPI_FLAG_BAD_CSUM_FATAL
Definition: uacpi.h:75

Referenced by table_ctl(), table_ref_unlocked(), and uacpi_for_each_installed_table().

◆ split_event_blocks()

static void split_event_blocks ( void  )
static

Definition at line 1508 of file tables.c.

1509{
1511 &g_uacpi_rt_ctx.fadt.x_pm1a_evt_blk,
1512 &g_uacpi_rt_ctx.pm1a_status_blk,
1513 &g_uacpi_rt_ctx.pm1a_enable_blk
1514 );
1516 &g_uacpi_rt_ctx.fadt.x_pm1b_evt_blk,
1517 &g_uacpi_rt_ctx.pm1b_status_blk,
1518 &g_uacpi_rt_ctx.pm1b_enable_blk
1519 );
1520}
static void split_one_block(struct acpi_gas *src, struct acpi_gas *dst0, struct acpi_gas *dst1)
Definition: tables.c:1492

Referenced by initialize_fadt().

◆ split_one_block()

static void split_one_block ( struct acpi_gas *  src,
struct acpi_gas *  dst0,
struct acpi_gas *  dst1 
)
static

Definition at line 1492 of file tables.c.

1495{
1496 uacpi_size byte_length;
1497
1498 if (src->address == 0)
1499 return;
1500
1501 byte_length = src->register_bit_width / 8;
1502 byte_length /= 2;
1503
1504 gas_init_system_io(dst0, src->address, byte_length);
1505 gas_init_system_io(dst1, src->address + byte_length, byte_length);
1506}
GLenum src
Definition: glext.h:6340

Referenced by split_event_blocks().

◆ table_alloc()

static uacpi_status table_alloc ( struct uacpi_installed_table **  out_tbl,
uacpi_size out_idx 
)
static

Definition at line 492 of file tables.c.

495{
496 struct uacpi_installed_table *tbl;
497
498 if (early_table_access &&
499 table_array_size(&tables) == table_array_capacity(&tables)) {
500 uacpi_warn("early table access buffer capacity exhausted!");
502 }
503
504 tbl = table_array_alloc(&tables);
505 if (uacpi_unlikely(tbl == UACPI_NULL))
507
508 *out_tbl = tbl;
509 *out_idx = table_array_size(&tables) - 1;
510 return UACPI_STATUS_OK;
511}
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
struct nls_table * tables
Definition: nls_base.c:22

Referenced by verify_and_install_table().

◆ table_checksum()

static uacpi_u8 table_checksum ( void table,
uacpi_size  size 
)
static

Definition at line 414 of file tables.c.

415{
417 uacpi_u8 csum = 0;
419
420 for (i = 0; i < size; ++i)
421 csum += bytes[i];
422
423 return csum;
424}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
GLsizeiptr size
Definition: glext.h:5919
Definition: ffs.h:52

Referenced by uacpi_verify_table_checksum().

◆ table_ctl()

static uacpi_status table_ctl ( uacpi_size  idx,
struct table_ctl_request req 
)
static

Definition at line 1205 of file tables.c.

1206{
1208 struct uacpi_installed_table *tbl;
1209
1211
1214 return ret;
1215
1216 if (uacpi_unlikely(table_array_size(&tables) <= idx)) {
1218 "requested invalid table index %zu (%zu tables installed)",
1219 idx, table_array_size(&tables)
1220 );
1222 goto out;
1223 }
1224
1225 tbl = table_array_at(&tables, idx);
1228
1230 uacpi_u8 mask = req->expect_set;
1231
1232 if (uacpi_unlikely((tbl->flags & mask) != mask)) {
1234 "unexpected table '%.4s' flags %02X, expected %02X to be set",
1235 tbl->hdr.signature, tbl->flags, mask
1236 );
1238 goto out;
1239 }
1240 }
1241
1243 uacpi_u8 mask = req->expect_clear;
1244
1245 if (uacpi_unlikely((tbl->flags & mask) != 0)) {
1247 "unexpected table '%.4s' flags %02X, expected %02X "
1248 "to be clear", tbl->hdr.signature, tbl->flags, mask
1249 );
1251 goto out;
1252 }
1253 }
1254
1255 if (req->type & TABLE_CTL_GET) {
1256 ret = table_ref_unlocked(tbl);
1258 goto out;
1259
1260 req->out_tbl = tbl->ptr;
1261 }
1262
1263 if (req->type & TABLE_CTL_PUT) {
1266 goto out;
1267 }
1268
1269 if (req->type & TABLE_CTL_SET_FLAGS)
1270 tbl->flags |= req->set;
1271 if (req->type & TABLE_CTL_CLEAR_FLAGS)
1272 tbl->flags &= ~req->clear;
1273
1274out:
1276 return ret;
1277}
static uacpi_status uacpi_acquire_native_mutex_may_be_null(uacpi_handle mtx)
Definition: mutex.h:34
static uacpi_status uacpi_release_native_mutex_may_be_null(uacpi_handle mtx)
Definition: mutex.h:44
@ UACPI_STATUS_ALREADY_EXISTS
Definition: status.h:20
#define TABLE_CTL_GET
Definition: tables.c:1191
#define TABLE_CTL_VALIDATE_CLEAR_FLAGS
Definition: tables.c:1190
#define TABLE_CTL_VALIDATE_SET_FLAGS
Definition: tables.c:1189
static bool skip_due_to_bad_csum(struct uacpi_installed_table *tbl)
Definition: tables.c:458
#define TABLE_CTL_PUT
Definition: tables.c:1192
#define TABLE_CTL_CLEAR_FLAGS
Definition: tables.c:1188
#define TABLE_CTL_SET_FLAGS
Definition: tables.c:1187
static uacpi_status table_unref_unlocked(struct uacpi_installed_table *tbl)
Definition: tables.c:573
GLenum GLint GLuint mask
Definition: glext.h:6028
uacpi_u8 expect_clear
Definition: tables.c:1198
void * out_tbl
Definition: tables.c:1202
uacpi_u8 type
Definition: tables.c:1195
uacpi_u8 expect_set
Definition: tables.c:1197
uacpi_u8 set
Definition: tables.c:1199
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by uacpi_table_get_by_index(), uacpi_table_load_with_cause(), uacpi_table_mark_as_loaded(), uacpi_table_ref_by_index(), and uacpi_table_unref_by_index().

◆ table_info_by_index_unchecked()

static void table_info_by_index_unchecked ( uacpi_size  idx,
uacpi_table_info out_info 
)
static

Definition at line 604 of file tables.c.

607{
608 struct uacpi_installed_table *tbl;
609
610 tbl = table_array_at(&tables, idx);
611
612 out_info->idx = idx;
613 out_info->size = tbl->hdr.length;
615 out_info->signature, tbl->hdr.signature,
616 sizeof(out_info->signature)
617 );
618 out_info->origin = tbl->origin;
619 out_info->flags = tbl->flags;
620 out_info->reference_count = tbl->reference_count;
621
622 if (out_info->origin & (UACPI_TABLE_ORIGIN_HOST_VIRTUAL |
624 out_info->virt_addr = tbl->ptr;
625 } else {
626 out_info->phys_addr = tbl->phys_addr;
627 }
628}
uacpi_phys_addr phys_addr
Definition: tables.h:10
uacpi_u16 reference_count
Definition: tables.h:14
uacpi_u8 origin
Definition: tables.h:17
uacpi_char signature[4]
Definition: tables.h:232
uacpi_u16 reference_count
Definition: tables.h:267
uacpi_u8 origin
Definition: tables.h:237
void * virt_addr
Definition: tables.h:226
uacpi_phys_addr phys_addr
Definition: tables.h:217
uacpi_size size
Definition: tables.h:210
uacpi_size idx
Definition: tables.h:205
uacpi_u8 flags
Definition: tables.h:262
@ UACPI_TABLE_ORIGIN_FIRMWARE_VIRTUAL
Definition: tables.h:188

Referenced by uacpi_for_each_table(), and uacpi_table_info_get_by_index().

◆ table_install_physical_with_origin_unlocked()

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

Definition at line 790 of file tables.c.

794{
795 struct acpi_sdt_hdr hdr;
796 void *virt = UACPI_NULL;
798
801 return ret;
802
803 if (uacpi_unlikely(hdr.length < sizeof(struct acpi_sdt_hdr))) {
805 "bogus table '%.4s' (0x%016"UACPI_PRIX64") size: %u bytes",
806 hdr.signature, UACPI_FMT64(phys), hdr.length
807 );
808 }
809
810 if (expected_signature != UACPI_NULL) {
811 ret = uacpi_check_table_signature(&hdr, expected_signature);
813 return ret;
814 }
815
816 if (installation_handler != UACPI_NULL || out_table != UACPI_NULL) {
817 virt = uacpi_kernel_map(phys, hdr.length);
818 if (uacpi_unlikely(virt == UACPI_MAP_FAILED))
820 }
821
823 installation_handler != UACPI_NULL) {
824 uacpi_u64 override;
826
827 disposition = installation_handler(virt, &override);
828
829 switch (disposition) {
831 break;
834 "table '%.4s' (0x%016"UACPI_PRIX64") installation denied "
835 "by host", hdr.signature, UACPI_FMT64(phys)
836 );
838 goto out;
839
840 default:
842 "table '%.4s' (0x%016"UACPI_PRIX64") installation "
843 "overridden by host", hdr.signature, UACPI_FMT64(phys)
844 );
845
846 ret = handle_table_override(disposition, override, out_table);
849
850 goto out;
851 }
852 }
853
854 ret = verify_and_install_table(&hdr, phys, virt, origin, out_table);
855out:
856 // We don't unmap only in this case
857 if (ret == UACPI_STATUS_OK && out_table != UACPI_NULL)
858 return ret;
859
860 if (virt != UACPI_NULL)
861 uacpi_kernel_unmap(virt, hdr.length);
862 return UACPI_STATUS_OK;
863}
#define uacpi_info(...)
Definition: log.h:34
#define UACPI_PRIX64
Definition: types.h:61
#define UACPI_FMT64(val)
Definition: types.h:62
@ UACPI_STATUS_DENIED
Definition: status.h:31
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)
Definition: tables.c:695
static uacpi_status handle_table_override(uacpi_table_installation_disposition disposition, uacpi_u64 address, uacpi_table *out_table)
Definition: tables.c:762
static uacpi_status get_external_table_header(uacpi_phys_addr phys_addr, struct acpi_sdt_hdr *out_hdr)
Definition: tables.c:513
voidpf uLong int origin
Definition: ioapi.h:144
uacpi_table_installation_disposition
Definition: tables.h:139
@ UACPI_TABLE_INSTALLATION_DISPOSITON_DENY
Definition: tables.h:148
@ UACPI_TABLE_INSTALLATION_DISPOSITON_ALLOW
Definition: tables.h:141

Referenced by handle_table_override(), initialize_fadt(), uacpi_initialize_tables(), and uacpi_table_install_physical_with_origin().

◆ table_install_with_origin_unlocked()

static uacpi_status table_install_with_origin_unlocked ( void virt,
enum uacpi_table_origin  origin,
uacpi_table out_table 
)
static

Definition at line 883 of file tables.c.

886{
887 struct acpi_sdt_hdr *hdr = virt;
888
889 if (uacpi_unlikely(hdr->length < sizeof(struct acpi_sdt_hdr))) {
890 uacpi_error("invalid table '%.4s' (%p) size: %u",
891 hdr->signature, virt, hdr->length);
893 }
894
895#ifndef UACPI_BAREBONES_MODE
897 installation_handler != UACPI_NULL) {
898 uacpi_u64 override;
900
901 disposition = installation_handler(virt, &override);
902
903 switch (disposition) {
905 break;
908 "table "UACPI_PRI_TBL_HDR" installation denied by host",
910 );
911 return UACPI_STATUS_DENIED;
912
913 default: {
916 "table "UACPI_PRI_TBL_HDR" installation overridden by host",
918 );
919
920 ret = handle_table_override(disposition, override, out_table);
923
924 return ret;
925 }
926 }
927 }
928#endif
929
931 hdr, 0, virt, origin, out_table
932 );
933}
#define UACPI_PRI_TBL_HDR
Definition: tables.h:58
#define UACPI_FMT_TBL_HDR(hdr)
Definition: tables.h:59

Referenced by handle_table_override(), and uacpi_table_install_with_origin().

◆ table_ref_unlocked()

static uacpi_status table_ref_unlocked ( struct uacpi_installed_table tbl)
static

Definition at line 529 of file tables.c.

530{
531 switch (tbl->reference_count) {
532 case 0: {
534
537
540 break;
541
542 tbl->ptr = uacpi_kernel_map(tbl->phys_addr, tbl->hdr.length);
545
546 if (!(tbl->flags & UACPI_TABLE_CSUM_CHECKED)) {
548 tbl->ptr, tbl->hdr.length, &tbl->flags
549 );
551 uacpi_kernel_unmap(tbl->ptr, tbl->hdr.length);
552 tbl->ptr = UACPI_NULL;
553 return ret;
554 }
555 }
556 break;
557 }
558 case 0xFFFF - 1:
560 "too many references for "UACPI_PRI_TBL_HDR
561 ", mapping permanently", UACPI_FMT_TBL_HDR(&tbl->hdr)
562 );
563 break;
564 default:
565 break;
566 }
567
568 if (uacpi_likely(tbl->reference_count != 0xFFFF))
569 tbl->reference_count++;
570 return UACPI_STATUS_OK;
571}
#define uacpi_likely(expr)
Definition: compiler.h:89
#define UACPI_TABLE_CSUM_CHECKED
Definition: tables.h:249

Referenced by do_search_tables(), and table_ctl().

◆ table_unref_unlocked()

static uacpi_status table_unref_unlocked ( struct uacpi_installed_table tbl)
static

Definition at line 573 of file tables.c.

574{
575 switch (tbl->reference_count) {
576 case 0:
578 "tried to unref table "UACPI_PRI_TBL_HDR" with no references",
580 );
582 case 1:
585 break;
586
587 uacpi_kernel_unmap(tbl->ptr, tbl->hdr.length);
588 tbl->ptr = UACPI_NULL;
589 break;
590 case 0xFFFF:
591 /*
592 * Consider the reference count (overflow) of 0xFFFF to be a permanently
593 * mapped table as we don't know the actual number of references.
594 */
595 return UACPI_STATUS_OK;
596 default:
597 break;
598 }
599
600 tbl->reference_count--;
601 return UACPI_STATUS_OK;
602}

Referenced by table_ctl().

◆ uacpi_check_table_signature()

uacpi_status uacpi_check_table_signature ( void table,
const uacpi_char expect 
)

Definition at line 469 of file tables.c.

470{
472
475 struct acpi_sdt_hdr *hdr = table;
476
479 lvl = UACPI_LOG_ERROR;
480 }
481
483 lvl,
484 "invalid table "UACPI_PRI_TBL_HDR" signature (expected '%.4s')",
486 );
487 }
488
489 return ret;
490}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
#define uacpi_log_lvl(lvl, fmt,...)
Definition: log.h:22
uacpi_log_level
Definition: log.h:7
@ UACPI_LOG_ERROR
Definition: log.h:35
@ UACPI_LOG_WARN
Definition: log.h:29
@ UACPI_STATUS_INVALID_SIGNATURE
Definition: status.h:15
#define UACPI_FLAG_BAD_TBL_SIGNATURE_FATAL
Definition: uacpi.h:81

Referenced by initialize_from_rxsdt(), and table_install_physical_with_origin_unlocked().

◆ uacpi_deinitialize_tables()

void uacpi_deinitialize_tables ( void  )

Definition at line 351 of file tables.c.

352{
354
355 for (i = 0; i < table_array_size(&tables); ++i) {
356 struct uacpi_installed_table *tbl = table_array_at(&tables, i);
357
358 switch (tbl->origin) {
359#ifndef UACPI_BAREBONES_MODE
361 uacpi_free(tbl->ptr, tbl->hdr.length);
362 break;
363#endif
366 if (tbl->reference_count != 0)
367 uacpi_kernel_unmap(tbl->ptr, tbl->hdr.length);
368 break;
369 default:
370 break;
371 }
372 }
373
374 if (early_table_access) {
375 uacpi_memzero(&tables, sizeof(tables));
376 early_table_access = UACPI_FALSE;
377 } else {
378 table_array_clear(&tables);
379 }
380
381 installation_handler = UACPI_NULL;
382 fadt_available = UACPI_FALSE;
383
384#ifndef UACPI_BAREBONES_MODE
385 if (table_mutex)
386 uacpi_kernel_free_mutex(table_mutex);
387
388 table_mutex = UACPI_NULL;
389#endif
390}
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
#define uacpi_free(mem, _)
Definition: stdlib.h:96
#define UACPI_FALSE
Definition: types.h:30
void uacpi_kernel_free_mutex(uacpi_handle)
Definition: uacpiosl.c:146

Referenced by uacpi_setup_early_table_access(), and uacpi_state_reset().

◆ uacpi_for_each_installed_table()

uacpi_status uacpi_for_each_installed_table ( uacpi_size  base_idx,
uacpi_installed_table_iteration_callback  cb,
void user 
)

Definition at line 971 of file tables.c.

974{
977 struct uacpi_installed_table *tbl;
979
981
984 return ret;
985
986 for (idx = base_idx; idx < table_array_size(&tables); ++idx) {
987 tbl = table_array_at(&tables, idx);
988
990 continue;
991
992 dec = cb(user, tbl, idx);
994 break;
995 }
996
998 return ret;
999}
ios_base &_STLP_CALL dec(ios_base &__s)
Definition: _ios_base.h:321
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
uacpi_iteration_decision
Definition: types.h:28

Referenced by find_table(), uacpi_initialize_tables(), and uacpi_table_match().

◆ uacpi_for_each_subtable()

uacpi_status uacpi_for_each_subtable ( struct acpi_sdt_hdr *  hdr,
size_t  hdr_size,
uacpi_subtable_iteration_callback  cb,
void user 
)

Iterate every subtable of a table such as MADT or SRAT.

'hdr' is the pointer to the main table, 'hdr_size' is the number of bytes in the table before the beginning of the subtable records. 'cb' is the callback invoked for each subtable with the 'user' context pointer passed for every invocation.

Example usage: uacpi_table tbl;

uacpi_table_find_by_signature(ACPI_MADT_SIGNATURE, &tbl); uacpi_for_each_subtable( tbl.hdr, sizeof(struct acpi_madt), parse_madt, NULL );

Definition at line 1600 of file tables.c.

1604{
1605 void *cursor;
1606 size_t bytes_left;
1607
1608 cursor = UACPI_PTR_ADD(hdr, hdr_size);
1609 bytes_left = hdr->length - hdr_size;
1610
1611 if (uacpi_unlikely(bytes_left > hdr->length))
1613
1614 while (bytes_left > sizeof(struct acpi_entry_hdr)) {
1615 struct acpi_entry_hdr *subtable_hdr = cursor;
1616
1617 if (uacpi_unlikely(subtable_hdr->length > bytes_left ||
1618 subtable_hdr->length < sizeof(*subtable_hdr))) {
1620 "corrupted '%.4s' subtable length: %u (%zu bytes left)",
1621 hdr->signature, subtable_hdr->length, bytes_left
1622 );
1624 }
1625
1626 switch (cb(user, subtable_hdr)) {
1628 break;
1630 return UACPI_STATUS_OK;
1631 default:
1633 }
1634
1635 cursor = UACPI_PTR_ADD(cursor, subtable_hdr->length);
1636 bytes_left -= subtable_hdr->length;
1637 }
1638
1639 if (uacpi_unlikely(bytes_left != 0)) {
1640 uacpi_warn(
1641 "found %zu stray bytes in table '%.4s'",
1642 bytes_left, hdr->signature
1643 );
1644 }
1645
1646 return UACPI_STATUS_OK;
1647}
const char cursor[]
Definition: icontest.c:13
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23

◆ uacpi_for_each_table()

uacpi_status uacpi_for_each_table ( uacpi_table_iteration_callback  cb,
void user 
)

Iterate every installed table on the system.

The provided callback receives the information about each table in the 'info' pointer. A table may be mapped by client code if needed via uacpi_table_get_by_index().

Note that this is a low level helper that iterates every installed table, even tables that are unreachable via uacpi_table_find() etc. due to bad checksum.

Definition at line 658 of file tables.c.

661{
663 uacpi_size num_tables, i = 0;
665
667
668 for (;;) {
671 return ret;
672
673 // Number of tables may have increased while we were in the callback
674 num_tables = table_array_size(&tables);
675 if (i >= num_tables) {
677 return ret;
678 }
679
681
684 return ret;
685
687 break;
688
689 i++;
690 }
691
692 return UACPI_STATUS_OK;
693}
static void table_info_by_index_unchecked(uacpi_size idx, uacpi_table_info *out_info)
Definition: tables.c:604

◆ uacpi_initialize_tables()

uacpi_status uacpi_initialize_tables ( void  )

Definition at line 279 of file tables.c.

280{
281 if (early_table_access) {
282 uacpi_size num_tables;
283
285
286 // Reallocate the user buffer into a normal heap array
287 num_tables = table_array_size(&tables);
288 if (num_tables > table_array_inline_capacity(&tables)) {
289 void *new_buf;
290
291 /*
292 * Allocate a new buffer with size equal to exactly the number of
293 * dynamic tables (that live in the user provided temporary buffer).
294 */
295 num_tables -= table_array_inline_capacity(&tables);
296 new_buf = uacpi_kernel_alloc(
297 sizeof(struct uacpi_installed_table) * num_tables
298 );
299 if (uacpi_unlikely(new_buf == UACPI_NULL))
301
302 uacpi_memcpy(new_buf, tables.dynamic_storage,
303 sizeof(struct uacpi_installed_table) * num_tables);
304 tables.dynamic_storage = new_buf;
305 tables.dynamic_capacity = num_tables;
306 } else {
307 /*
308 * User-provided temporary buffer was not used at all, just remove
309 * any references to it.
310 */
311 tables.dynamic_storage = UACPI_NULL;
312 tables.dynamic_capacity = 0;
313 }
314
315 early_table_access = UACPI_FALSE;
316 } else {
318
321 return ret;
322 }
323
325 struct acpi_fadt *fadt = &g_uacpi_rt_ctx.fadt;
326 uacpi_table tbl;
327
328 if (fadt->x_firmware_ctrl) {
330
332 fadt->x_firmware_ctrl, UACPI_TABLE_ORIGIN_FIRMWARE_PHYSICAL,
334 );
337 return ret;
338
339 g_uacpi_rt_ctx.facs = tbl.ptr;
340 }
341 }
342
343 table_mutex = uacpi_kernel_create_mutex();
344 if (uacpi_unlikely(table_mutex == UACPI_NULL))
346
347 return UACPI_STATUS_OK;
348}
#define ACPI_FACS_SIGNATURE
Definition: acpi.h:18
static uacpi_iteration_decision warn_if_early_referenced(void *user, struct uacpi_installed_table *tbl, uacpi_size idx)
Definition: tables.c:263
static uacpi_status initialize_from_rsdp(void)
Definition: tables.c:171
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
uacpi_handle uacpi_kernel_create_mutex(void)
Definition: uacpiosl.c:139

Referenced by uacpi_initialize().

◆ UACPI_PACKED()

UACPI_PACKED ( struct uacpi_rxsdt { struct acpi_sdt_hdr hdr;uacpi_u8 ptr_bytes[];}  )

Definition at line 74 of file tables.c.

74 {
75 struct acpi_sdt_hdr hdr;
76 uacpi_u8 ptr_bytes[];
77})
78
79static void dump_table_header(
80 uacpi_phys_addr phys_addr, void *hdr
81)
82{
83 struct acpi_sdt_hdr *sdt = hdr;
84
87 "FACS 0x%016"UACPI_PRIX64" %08X", UACPI_FMT64(phys_addr),
88 sdt->length
89 );
90 return;
91 }
92
94 struct acpi_rsdp *rsdp = hdr;
95
97 "RSDP 0x%016"UACPI_PRIX64" %08X v%02X (%6.6s)",
98 UACPI_FMT64(phys_addr), rsdp->revision >= 2 ? rsdp->length : 20,
99 rsdp->revision, rsdp->oemid
100 );
101 return;
102 }
103
105 "%.4s 0x%016"UACPI_PRIX64" %08X v%02X (%6.6s %8.8s)",
106 sdt->signature, UACPI_FMT64(phys_addr), sdt->length, sdt->revision,
107 sdt->oemid, sdt->oem_table_id
108 );
109}
#define ACPI_RSDP_SIGNATURE
Definition: acpi.h:13

◆ uacpi_set_table_installation_handler()

uacpi_status uacpi_set_table_installation_handler ( uacpi_table_installation_handler  handler)

Set a handler that is invoked for each table before it gets installed.

Depending on the return value, the table is either allowed to be installed as-is, denied, or overriden with a new one.

Definition at line 392 of file tables.c.

395{
397
400 return ret;
401
402 if (installation_handler != UACPI_NULL && handler != UACPI_NULL)
403 goto out;
404
405 installation_handler = handler;
406
407out:
409 return ret;
410}
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512

◆ uacpi_setup_early_table_access()

uacpi_status uacpi_setup_early_table_access ( void temporary_buffer,
uacpi_size  buffer_size 
)

Set up early access to the table subsystem. What this means is:

  • uacpi_table_find() and similar API becomes usable before the call to uacpi_initialize().
  • No kernel API besides logging and map/unmap will be invoked at this stage, allowing for heap and scheduling to still be fully offline.
  • The provided 'temporary_buffer' will be used as a temporary storage for the internal metadata about the tables (list, reference count, addresses, sizes, etc).
  • The 'temporary_buffer' is replaced with a normal heap buffer allocated via uacpi_kernel_alloc() after the call to uacpi_initialize() and can therefore be reclaimed by the kernel.

The 'temporary_buffer' is expected to be aligned on the native pointer size boundary (4 on a 32-bit system, 8 on a 64-bit system), although any misalignment is handled gracefully and does not result in an error.

The approximate overhead per table is 56 bytes, so a buffer of 4096 bytes yields about 73 tables in terms of capacity. uACPI also has an internal static buffer for tables, "UACPI_STATIC_TABLE_ARRAY_LEN", which is configured as 16 descriptors in length by default.

This function is used to initialize the barebones mode, see UACPI_BAREBONES_MODE in config.h for more information.

Definition at line 216 of file tables.c.

219{
221 uacpi_virt_addr buffer_addr, aligned_buffer_addr;
222
223#ifndef UACPI_BAREBONES_MODE
225#endif
226 if (uacpi_unlikely(early_table_access))
228
230
232 aligned_buffer_addr = UACPI_ALIGN_UP(
233 buffer_addr, UACPI_POINTER_SIZE, uacpi_virt_addr
234 );
235 if (buffer_addr != aligned_buffer_addr) {
236 uacpi_size stripped_bytes;
237
238 stripped_bytes = aligned_buffer_addr - buffer_addr;
240 "fixed up misaligned early tables buffer (%zu bytes stripped)",
241 stripped_bytes
242 );
243
244 buffer_size -= UACPI_MIN(stripped_bytes, buffer_size);
245 temporary_buffer = UACPI_VIRT_ADDR_TO_PTR(aligned_buffer_addr);
246 }
247
250
251 tables.dynamic_storage = temporary_buffer;
252 tables.dynamic_capacity = buffer_size / sizeof(struct uacpi_installed_table);
253 early_table_access = UACPI_TRUE;
254
258
259 return ret;
260}
#define UACPI_ENSURE_INIT_LEVEL_IS(lvl)
Definition: context.h:141
void uacpi_logger_initialize(void)
Definition: uacpi.c:36
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106
@ UACPI_STATUS_INIT_LEVEL_MISMATCH
Definition: status.h:23
@ UACPI_INIT_LEVEL_EARLY
Definition: types.h:66
void uacpi_deinitialize_tables(void)
Definition: tables.c:351
#define UACPI_PTR_TO_VIRT_ADDR(ptr)
Definition: utilities.h:20
wchar_t const *const size_t const buffer_size
Definition: stat.cpp:95

◆ uacpi_signatures_match()

uacpi_bool uacpi_signatures_match ( const void *const  lhs,
const void *const  rhs 
)

Definition at line 464 of file tables.c.

465{
466 return uacpi_memcmp(lhs, rhs, sizeof(uacpi_object_name)) == 0;
467}

Referenced by do_search_tables(), match_ssdt_or_psdt(), uacpi_check_table_signature(), and verify_and_install_table().

◆ uacpi_table_count()

uacpi_size uacpi_table_count ( void  )

Returns the number of tables stored in the internal array via 'out_count'. This includes all firmware-provided, dynamically loaded, as well as client-installed tables via 'uacpi_table_install' etc.

Definition at line 211 of file tables.c.

212{
213 return table_array_size(&tables);
214}

◆ uacpi_table_fadt()

uacpi_status uacpi_table_fadt ( struct acpi_fadt **  out_fadt)

Returns the pointer to a sanitized internal version of FADT.

The revision is guaranteed to be correct. All of the registers are converted to GAS format. Fields that might contain garbage are cleared.

Definition at line 1589 of file tables.c.

1590{
1592
1593 if (!fadt_available)
1595
1596 *out_fadt = &g_uacpi_rt_ctx.fadt;
1597 return UACPI_STATUS_OK;
1598}

◆ uacpi_table_find()

uacpi_status uacpi_table_find ( const uacpi_table_identifiers id,
uacpi_table out_table 
)

Definition at line 1178 of file tables.c.

1181{
1183
1184 return find_table(0, 0, id, out_table);
1185}

Referenced by handle_create_data_region(), and handle_load_table().

◆ uacpi_table_find_by_signature()

uacpi_status uacpi_table_find_by_signature ( const uacpi_char signature,
uacpi_table out_table 
)

Helpers for finding tables.

for find_by_signature: 'signature' is an array of 4 characters, a null terminator is not necessary and can be omitted (especially useful for non-C language bindings)

for find_by_signature_at: 'offset' specifies the base index in the internal array where to start searching for the table

for find_nth_by_signature: This works exactly like find_by_signature, but finds the nth copy of the specified table in the firmware enumeration order

'out_table' is a pointer to a caller allocated uacpi_table structure that receives the table pointer & its internal index in case the call was successful.

NOTE: The returned table's reference count is incremented by 1, which keeps its mapping alive forever unless uacpi_table_unref() is called for this table later on. Calling uacpi_table_find_next_with_same_signature() on a table also drops its reference count by 1, so if you want to keep it mapped you must manually call uacpi_table_ref() beforehand.

Definition at line 1153 of file tables.c.

1156{
1157 return find_table_by_signature(signature_string, 0, 0, out_table);
1158}
static uacpi_status find_table_by_signature(const uacpi_char *signature_string, uacpi_size idx, uacpi_size nth, uacpi_table *out_table)
Definition: tables.c:1122

Referenced by uacpi_namespace_load().

◆ uacpi_table_find_by_signature_at()

uacpi_status uacpi_table_find_by_signature_at ( const uacpi_char signature,
uacpi_size  idx,
uacpi_table out_table 
)

Definition at line 1139 of file tables.c.

1142{
1143 return find_table_by_signature(signature, idx, 0, out_table);
1144}

◆ uacpi_table_find_next_with_same_signature()

uacpi_status uacpi_table_find_next_with_same_signature ( uacpi_table in_out_table)

Definition at line 1160 of file tables.c.

1163{
1164 struct uacpi_table_identifiers id = { 0 };
1165
1167
1168 if (uacpi_unlikely(in_out_table->ptr == UACPI_NULL))
1170
1171 uacpi_memcpy(&id.signature, in_out_table->hdr->signature,
1172 sizeof(id.signature));
1173 uacpi_table_unref(in_out_table);
1174
1175 return find_table(in_out_table->index + 1, 0, &id, in_out_table);
1176}
uacpi_status uacpi_table_unref(uacpi_table *tbl)
Definition: tables.c:1357
struct acpi_sdt_hdr * hdr
Definition: tables.h:29

◆ uacpi_table_find_nth_by_signature()

uacpi_status uacpi_table_find_nth_by_signature ( const uacpi_char signature,
uacpi_size  nth,
uacpi_table out_table 
)

Definition at line 1146 of file tables.c.

1149{
1150 return find_table_by_signature(signature, 0, nth, out_table);
1151}

◆ uacpi_table_get_by_index()

uacpi_status uacpi_table_get_by_index ( uacpi_size  idx,
uacpi_table out_table 
)

Returns a table by its index in the internal table array.

The number of available tables can be queried via 'uacpi_table_count()'.

NOTE: Even if a table is present, this may still fail with UACPI_STATUS_BAD_CHECKSUM in case UACPI_FLAG_BAD_CSUM_FATAL is enabled.

Definition at line 1318 of file tables.c.

1319{
1321 struct table_ctl_request req = {
1323 };
1324
1325 ret = table_ctl(idx, &req);
1327 return ret;
1328
1329 out_table->ptr = req.out_tbl;
1330 out_table->index = idx;
1331 return UACPI_STATUS_OK;
1332}
static uacpi_status table_ctl(uacpi_size idx, struct table_ctl_request *req)
Definition: tables.c:1205

◆ uacpi_table_info_get_by_index()

uacpi_status uacpi_table_info_get_by_index ( uacpi_size  idx,
uacpi_table_info out_info 
)

Definition at line 630 of file tables.c.

633{
635
637
640 return ret;
641
642 if (uacpi_unlikely(table_array_size(&tables) <= idx)) {
644 "requested invalid table index %zu (%zu tables installed)",
645 idx, table_array_size(&tables)
646 );
648 goto out;
649 }
650
652
653out:
655 return ret;
656}

◆ uacpi_table_install()

uacpi_status uacpi_table_install ( void virt,
uacpi_table out_table 
)

Install a table from either a virtual or a physical address. The table is simply stored in the internal table array, and not loaded by the interpreter (see uacpi_table_load).

The table is optionally returned via 'out_table'.

Manual calls to uacpi_table_install are not subject to filtering via the table installation callback (if any).

Definition at line 951 of file tables.c.

952{
954
956 virt, UACPI_TABLE_ORIGIN_HOST_VIRTUAL, out_table
957 );
958}
uacpi_status uacpi_table_install_with_origin(void *virt, enum uacpi_table_origin origin, uacpi_table *out_table)
Definition: tables.c:935

◆ uacpi_table_install_physical()

uacpi_status uacpi_table_install_physical ( uacpi_phys_addr  addr,
uacpi_table out_table 
)

Definition at line 960 of file tables.c.

963{
965
968 );
969}
GLenum const GLvoid * addr
Definition: glext.h:9621

◆ uacpi_table_install_physical_with_origin()

uacpi_status uacpi_table_install_physical_with_origin ( uacpi_phys_addr  phys,
enum uacpi_table_origin  origin,
uacpi_table out_table 
)

Definition at line 865 of file tables.c.

868{
870
873 return ret;
874
876 phys, origin, UACPI_NULL, out_table
877 );
879
880 return ret;
881}

Referenced by initialize_from_rxsdt(), and uacpi_table_install_physical().

◆ uacpi_table_install_with_origin()

uacpi_status uacpi_table_install_with_origin ( void virt,
enum uacpi_table_origin  origin,
uacpi_table out_table 
)

Definition at line 935 of file tables.c.

938{
940
943 return ret;
944
946
948 return ret;
949}

Referenced by handle_load(), and uacpi_table_install().

◆ uacpi_table_load()

uacpi_status uacpi_table_load ( uacpi_size  index)

Load a previously installed table by feeding it to the interpreter.

Definition at line 1303 of file tables.c.

1304{
1306}
uacpi_status uacpi_table_load_with_cause(uacpi_size idx, enum uacpi_table_load_cause cause)
Definition: tables.c:1280
@ UACPI_TABLE_LOAD_CAUSE_HOST
Definition: interpreter.h:13

◆ uacpi_table_load_with_cause()

uacpi_status uacpi_table_load_with_cause ( uacpi_size  idx,
enum uacpi_table_load_cause  cause 
)

Definition at line 1280 of file tables.c.

1283{
1285 struct table_ctl_request req = {
1288 .set = UACPI_TABLE_LOADED,
1289 .expect_clear = UACPI_TABLE_LOADED,
1290 };
1291
1292 ret = table_ctl(idx, &req);
1294 return ret;
1295
1296 ret = uacpi_execute_table(req.out_tbl, cause);
1297
1298 req.type = TABLE_CTL_PUT;
1299 table_ctl(idx, &req);
1300 return ret;
1301}
uacpi_status uacpi_execute_table(void *, enum uacpi_table_load_cause cause)
Definition: interpreter.c:1612
#define UACPI_TABLE_LOADED
Definition: tables.h:243

Referenced by uacpi_namespace_load(), and uacpi_table_load().

◆ uacpi_table_mark_as_loaded()

void uacpi_table_mark_as_loaded ( uacpi_size  idx)

Definition at line 1308 of file tables.c.

1309{
1310 struct table_ctl_request req = {
1312 };
1313
1314 table_ctl(idx, &req);
1315}

Referenced by handle_load(), and handle_load_table().

◆ uacpi_table_match()

uacpi_status uacpi_table_match ( uacpi_size  base_idx,
uacpi_table_match_callback  cb,
uacpi_table out_table 
)

Definition at line 1081 of file tables.c.

1084{
1086 struct table_search_ctx ctx = { 0 };
1087
1088 ctx.match_cb = cb;
1089 ctx.search_type = SEARCH_TYPE_MATCH;
1090 ctx.out_table = out_table;
1091 ctx.status = UACPI_STATUS_NOT_FOUND;
1092
1095 return ret;
1096
1097 return ctx.status;
1098}

Referenced by uacpi_namespace_load().

◆ uacpi_table_ref()

uacpi_status uacpi_table_ref ( uacpi_table tbl)

Increment/decrement a table's reference count. The table is unmapped when the reference count drops to 0.

Definition at line 1343 of file tables.c.

1344{
1345 return uacpi_table_ref_by_index(tbl->index);
1346}
uacpi_status uacpi_table_ref_by_index(uacpi_size index)
Definition: tables.c:1334

◆ uacpi_table_ref_by_index()

uacpi_status uacpi_table_ref_by_index ( uacpi_size  index)

Definition at line 1334 of file tables.c.

1335{
1336 struct table_ctl_request req = {
1338 };
1339
1340 return table_ctl(index, &req);
1341}
GLuint index
Definition: glext.h:6031

Referenced by uacpi_table_ref().

◆ uacpi_table_unref()

uacpi_status uacpi_table_unref ( uacpi_table tbl)

Definition at line 1357 of file tables.c.

1358{
1359 return uacpi_table_unref_by_index(tbl->index);
1360}
uacpi_status uacpi_table_unref_by_index(uacpi_size index)
Definition: tables.c:1348

Referenced by free_op_region(), handle_load(), handle_load_table(), uacpi_namespace_load(), and uacpi_table_find_next_with_same_signature().

◆ uacpi_table_unref_by_index()

uacpi_status uacpi_table_unref_by_index ( uacpi_size  index)

Definition at line 1348 of file tables.c.

1349{
1350 struct table_ctl_request req = {
1352 };
1353
1354 return table_ctl(index, &req);
1355}

Referenced by uacpi_table_unref().

◆ uacpi_verify_table_checksum()

uacpi_status uacpi_verify_table_checksum ( void table,
uacpi_size  size,
uacpi_u8 out_flags 
)

Definition at line 426 of file tables.c.

429{
432
434 if (out_flags != UACPI_NULL)
435 *out_flags |= UACPI_TABLE_CSUM_CHECKED;
436
437 if (uacpi_unlikely(csum != 0)) {
439 struct acpi_sdt_hdr *hdr = table;
440
441 if (out_flags != UACPI_NULL)
442 *out_flags |= UACPI_TABLE_CSUM_BAD;
443
446 lvl = UACPI_LOG_ERROR;
447 }
448
450 lvl, "invalid table "UACPI_PRI_TBL_HDR" checksum %d!",
452 );
453 }
454
455 return ret;
456}
static uacpi_u8 table_checksum(void *table, uacpi_size size)
Definition: tables.c:414

Referenced by initialize_from_rxsdt(), table_ref_unlocked(), and verify_and_install_table().

◆ verify_and_install_table()

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 
)
static

Definition at line 695 of file tables.c.

699{
702 uacpi_bool is_fadt;
704 uacpi_u8 flags = 0;
705
706 is_fadt = uacpi_signatures_match(hdr->signature, ACPI_FADT_SIGNATURE);
707
708 /*
709 * FACS is the only(?) table without a checksum because it has OSPM
710 * writable fields. Don't try to validate it here.
711 */
714 } else if (uacpi_check_flag(UACPI_FLAG_PROACTIVE_TBL_CSUM) || is_fadt ||
715 out_table != UACPI_NULL) {
716 void *mapping = virt_addr;
717
718 // We may already have a valid mapping, reuse it if we do
719 if (mapping == UACPI_NULL)
723
726 if (is_fadt)
728 }
729
730 if (virt_addr == UACPI_NULL)
732
734 return ret;
735 }
736
738 g_uacpi_rt_ctx.is_rev1 = hdr->revision < 2;
739
740 ret = table_alloc(&table, &idx);
742 return ret;
743
744 dump_table_header(phys_addr, hdr);
745
746 uacpi_memcpy(&table->hdr, hdr, sizeof(*hdr));
747 table->reference_count = 0;
748 table->phys_addr = phys_addr;
749 table->ptr = virt_addr;
750 table->flags = flags;
751 table->origin = origin;
752
753 if (out_table == UACPI_NULL)
754 return UACPI_STATUS_OK;
755
756 table->reference_count++;
757 out_table->ptr = virt_addr;
758 out_table->index = idx;
759 return UACPI_STATUS_OK;
760}
#define ACPI_FADT_SIGNATURE
Definition: acpi.h:17
bool uacpi_bool
Definition: types.h:31
static uacpi_status initialize_fadt(const void *)
Definition: tables.c:1523
static uacpi_status table_alloc(struct uacpi_installed_table **out_tbl, uacpi_size *out_idx)
Definition: tables.c:492
GLbitfield flags
Definition: glext.h:7161
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
#define UACPI_FLAG_PROACTIVE_TBL_CSUM
Definition: uacpi.h:107

Referenced by table_install_physical_with_origin_unlocked(), and table_install_with_origin_unlocked().

◆ warn_if_early_referenced()

static uacpi_iteration_decision warn_if_early_referenced ( void user,
struct uacpi_installed_table tbl,
uacpi_size  idx 
)
static

Definition at line 263 of file tables.c.

266{
268
269 if (uacpi_unlikely(tbl->reference_count != 0)) {
271 "table "UACPI_PRI_TBL_HDR" (%zu) still has %d early reference(s)!",
273 );
274 }
275
277}
#define UACPI_UNUSED(x)
Definition: helpers.h:7

Referenced by uacpi_initialize_tables().

Variable Documentation

◆ fadt_registers

struct register_description fadt_registers[]
static

Definition at line 1421 of file tables.c.

Referenced by convert_registers_to_gas().

◆ fadt_version_sizes

uacpi_u16 fadt_version_sizes[]
Initial value:
= {
116, 132, 244, 244, 268, 276
}

Definition at line 1362 of file tables.c.

Referenced by fadt_ensure_correct_revision().