1#pragma once
2
3#include <uacpi/internal/context.h>
4#include <uacpi/internal/interpreter.h>
5#include <uacpi/types.h>
6#include <uacpi/status.h>
7#include <uacpi/tables.h>
8
9enum uacpi_table_origin {
10#ifndef UACPI_BAREBONES_MODE
11 UACPI_TABLE_ORIGIN_FIRMWARE_VIRTUAL = 0,
12#endif
13 UACPI_TABLE_ORIGIN_FIRMWARE_PHYSICAL = 1,
14
15 UACPI_TABLE_ORIGIN_HOST_VIRTUAL,
16 UACPI_TABLE_ORIGIN_HOST_PHYSICAL,
17};
18
19struct uacpi_installed_table {
20 uacpi_phys_addr phys_addr;
21 struct acpi_sdt_hdr hdr;
22 void *ptr;
23
24 uacpi_u16 reference_count;
25
26#define UACPI_TABLE_LOADED (1 << 0)
27#define UACPI_TABLE_CSUM_VERIFIED (1 << 1)
28#define UACPI_TABLE_INVALID (1 << 2)
29 uacpi_u8 flags;
30 uacpi_u8 origin;
31};
32
33uacpi_status uacpi_initialize_tables(void);
34void uacpi_deinitialize_tables(void);
35
36uacpi_bool uacpi_signatures_match(const void *const lhs, const void *const rhs);
37uacpi_status uacpi_check_table_signature(void *table, const uacpi_char *expect);
38uacpi_status uacpi_verify_table_checksum(void *table, uacpi_size size);
39
40uacpi_status uacpi_table_install_physical_with_origin(
41 uacpi_phys_addr phys, enum uacpi_table_origin origin, uacpi_table *out_table
42);
43uacpi_status uacpi_table_install_with_origin(
44 void *virt, enum uacpi_table_origin origin, uacpi_table *out_table
45);
46
47#ifndef UACPI_BAREBONES_MODE
48void uacpi_table_mark_as_loaded(uacpi_size idx);
49
50uacpi_status uacpi_table_load_with_cause(
51 uacpi_size idx, enum uacpi_table_load_cause cause
52);
53#endif // !UACPI_BAREBONES_MODE
54
55typedef uacpi_iteration_decision (*uacpi_table_iteration_callback)
56 (void *user, struct uacpi_installed_table *tbl, uacpi_size idx);
57
58uacpi_status uacpi_for_each_table(
59 uacpi_size base_idx, uacpi_table_iteration_callback, void *user
60);
61
62typedef uacpi_bool (*uacpi_table_match_callback)
63 (struct uacpi_installed_table *tbl);
64
65uacpi_status uacpi_table_match(
66 uacpi_size base_idx, uacpi_table_match_callback, uacpi_table *out_table
67);
68
69#define UACPI_PRI_TBL_HDR "'%.4s' (OEM ID '%.6s' OEM Table ID '%.8s')"
70#define UACPI_FMT_TBL_HDR(hdr) (hdr)->signature, (hdr)->oemid, (hdr)->oem_table_id
71