ReactOS 0.4.17-dev-684-ga6524ef
uacpi.h File Reference
#include <uacpi/types.h>
#include <uacpi/status.h>
#include <uacpi/kernel_api.h>
#include <uacpi/namespace.h>
Include dependency graph for uacpi.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define UACPI_MAJOR   6
 
#define UACPI_MINOR   0
 
#define UACPI_PATCH   1
 
#define UACPI_STUB_IF_REDUCED_HARDWARE(fn)   fn;
 
#define UACPI_ALWAYS_ERROR_FOR_REDUCED_HARDWARE(fn)   fn;
 
#define UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE(fn)   fn;
 
#define UACPI_FLAG_BAD_CSUM_FATAL   (1ull << 0)
 
#define UACPI_FLAG_BAD_TBL_SIGNATURE_FATAL   (1ull << 1)
 
#define UACPI_FLAG_BAD_XSDT   (1ull << 2)
 
#define UACPI_FLAG_NO_ACPI_MODE   (1ull << 3)
 
#define UACPI_FLAG_NO_OSI   (1ull << 4)
 
#define UACPI_FLAG_PROACTIVE_TBL_CSUM   (1ull << 5)
 

Functions

uacpi_status uacpi_setup_early_table_access (void *temporary_buffer, uacpi_size buffer_size)
 
uacpi_bool uacpi_table_subsystem_available (void)
 
uacpi_status uacpi_is_platform_reduced_hardware (uacpi_bool *out_value)
 
uacpi_status uacpi_initialize (uacpi_u64 flags)
 
uacpi_status uacpi_namespace_load (void)
 
uacpi_status uacpi_namespace_initialize (void)
 
uacpi_init_level uacpi_get_current_init_level (void)
 
uacpi_status uacpi_eval (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
 
uacpi_status uacpi_execute (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args)
 
uacpi_status uacpi_execute_simple (uacpi_namespace_node *parent, const uacpi_char *path)
 
uacpi_status uacpi_eval_typed (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object_type_bits ret_mask, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple_typed (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object_type_bits ret_mask, uacpi_object **ret)
 
uacpi_status uacpi_eval_integer (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_u64 *out_value)
 
uacpi_status uacpi_eval_simple_integer (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_u64 *out_value)
 
uacpi_status uacpi_eval_string_or_buffer (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple_string_or_buffer (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
 
uacpi_status uacpi_eval_string (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple_string (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
 
uacpi_status uacpi_eval_buffer (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple_buffer (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
 
uacpi_status uacpi_eval_package (uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
 
uacpi_status uacpi_eval_simple_package (uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
 
uacpi_status uacpi_get_aml_bitness (uacpi_u8 *out_bitness)
 
 UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE (uacpi_status uacpi_enter_acpi_mode(void)) UACPI_ALWAYS_ERROR_FOR_REDUCED_HARDWARE(uacpi_status uacpi_leave_acpi_mode(void)) uacpi_status uacpi_acquire_global_lock(uacpi_u16 timeout
 
uacpi_status uacpi_release_global_lock (uacpi_u32 seq)
 
void uacpi_state_reset (void)
 

Variables

uacpi_u32out_seq
 

Macro Definition Documentation

◆ UACPI_ALWAYS_ERROR_FOR_REDUCED_HARDWARE

#define UACPI_ALWAYS_ERROR_FOR_REDUCED_HARDWARE (   fn )    fn;

Definition at line 27 of file uacpi.h.

◆ UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE

#define UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE (   fn )    fn;

Definition at line 28 of file uacpi.h.

◆ UACPI_FLAG_BAD_CSUM_FATAL

#define UACPI_FLAG_BAD_CSUM_FATAL   (1ull << 0)

Bad table checksum should be considered a fatal error (table load is fully aborted in this case)

Definition at line 75 of file uacpi.h.

◆ UACPI_FLAG_BAD_TBL_SIGNATURE_FATAL

#define UACPI_FLAG_BAD_TBL_SIGNATURE_FATAL   (1ull << 1)

Unexpected table signature should be considered a fatal error (table load is fully aborted in this case)

Definition at line 81 of file uacpi.h.

◆ UACPI_FLAG_BAD_XSDT

#define UACPI_FLAG_BAD_XSDT   (1ull << 2)

Force uACPI to use RSDT even for later revisions

Definition at line 86 of file uacpi.h.

◆ UACPI_FLAG_NO_ACPI_MODE

#define UACPI_FLAG_NO_ACPI_MODE   (1ull << 3)

If this is set, ACPI mode is not entered during the call to uacpi_initialize. The caller is expected to enter it later at their own discretion by using uacpi_enter_acpi_mode().

Definition at line 93 of file uacpi.h.

◆ UACPI_FLAG_NO_OSI

#define UACPI_FLAG_NO_OSI   (1ull << 4)

Don't create the _OSI method when building the namespace. Only enable this if you're certain that having this method breaks your AML blob, a more atomic/granular interface management is available via osi.h

Definition at line 100 of file uacpi.h.

◆ UACPI_FLAG_PROACTIVE_TBL_CSUM

#define UACPI_FLAG_PROACTIVE_TBL_CSUM   (1ull << 5)

Validate table checksums at installation time instead of first use. Note that this makes uACPI map the entire table at once, which not all hosts are able to handle at early init.

Definition at line 107 of file uacpi.h.

◆ UACPI_MAJOR

#define UACPI_MAJOR   6

Definition at line 8 of file uacpi.h.

◆ UACPI_MINOR

#define UACPI_MINOR   0

Definition at line 9 of file uacpi.h.

◆ UACPI_PATCH

#define UACPI_PATCH   1

Definition at line 10 of file uacpi.h.

◆ UACPI_STUB_IF_REDUCED_HARDWARE

#define UACPI_STUB_IF_REDUCED_HARDWARE (   fn)    fn;

Definition at line 26 of file uacpi.h.

Function Documentation

◆ UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE()

UACPI_ALWAYS_OK_FOR_REDUCED_HARDWARE ( uacpi_status   uacpi_enter_acpi_modevoid)

Helpers for entering & leaving ACPI mode. Note that ACPI mode is entered automatically during the call to uacpi_initialize(). Attempt to acquire the global lock for 'timeout' milliseconds. 0xFFFF implies infinite wait.

On success, 'out_seq' is set to a unique sequence number for the current acquire transaction. This number is used for validation during release.

◆ uacpi_eval()

uacpi_status uacpi_eval ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object **  ret 
)

Evaluate an object within the namespace and get back its value. Either root or path must be valid. A value of NULL for 'parent' implies uacpi_namespace_root() relative lookups, unless 'path' is already absolute.

Definition at line 709 of file uacpi.c.

713{
718
720 return ret;
721
724 return ret;
725
726 if (path != UACPI_NULL) {
730 &node
731 );
733 goto out_read_unlock;
734 } else {
735 node = parent;
736 }
737
739 if (uacpi_unlikely(obj == UACPI_NULL)) {
741 goto out_read_unlock;
742 }
743
744 if (obj->type != UACPI_OBJECT_METHOD) {
745 uacpi_object *new_obj;
746
747 if (uacpi_unlikely(out_obj == UACPI_NULL))
748 goto out_read_unlock;
749
751 if (uacpi_unlikely(new_obj == UACPI_NULL)) {
753 goto out_read_unlock;
754 }
755
758 );
760 uacpi_object_unref(new_obj);
761 goto out_read_unlock;
762 }
763 *out_obj = new_obj;
764
765 out_read_unlock:
767 return ret;
768 }
769
770 method = obj->method;
773
774 // Upgrade to a write-lock since we're about to run a method
777 goto out_no_write_lock;
778
781
782out_no_write_lock:
784 return ret;
785}
method
Definition: dragdrop.c:54
uacpi_status uacpi_namespace_write_unlock(void)
Definition: namespace.c:51
@ UACPI_PERMANENT_ONLY_YES
Definition: namespace.h:90
uacpi_status uacpi_namespace_read_unlock(void)
Definition: namespace.c:41
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
Definition: namespace.c:646
uacpi_status uacpi_namespace_read_lock(void)
Definition: namespace.c:36
@ UACPI_SHOULD_LOCK_NO
Definition: namespace.h:94
uacpi_status uacpi_namespace_write_lock(void)
Definition: namespace.c:46
@ UACPI_MAY_SEARCH_ABOVE_PARENT_NO
Definition: namespace.h:84
uacpi_status uacpi_namespace_node_resolve(uacpi_namespace_node *scope, const uacpi_char *path, enum uacpi_should_lock, enum uacpi_may_search_above_parent, enum uacpi_permanent_only, uacpi_namespace_node **out_node)
Definition: namespace.c:491
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
uacpi_status uacpi_object_assign(uacpi_object *dst, uacpi_object *src, enum uacpi_assign_behavior)
Definition: types.c:1372
void uacpi_method_unref(uacpi_control_method *)
Definition: types.c:655
@ UACPI_ASSIGN_BEHAVIOR_DEEP_COPY
Definition: types.h:276
#define uacpi_unlikely(expr)
Definition: compiler.h:88
#define UACPI_NULL
Definition: types.h:33
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_OBJECT_METHOD
Definition: types.h:119
@ UACPI_OBJECT_UNINITIALIZED
Definition: types.h:111
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
uacpi_status uacpi_execute_control_method(uacpi_namespace_node *scope, uacpi_control_method *method, const uacpi_object_array *args, uacpi_object **ret)
Definition: interpreter.c:6150
uacpi_u32 uacpi_shareable_ref(uacpi_handle)
Definition: shareable.c:31
Definition: match.c:390
Definition: dlist.c:348

Referenced by eval_sleep_helper(), ini_eval(), uacpi_eval_simple(), uacpi_eval_typed(), uacpi_execute(), uacpi_execute_simple(), uacpi_set_interrupt_model(), and uacpi_set_resources().

◆ uacpi_eval_buffer()

uacpi_status uacpi_eval_buffer ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object **  ret 
)

A shorthand for uacpi_eval_typed with UACPI_OBJECT_BUFFER_BIT.

Use uacpi_object_get_buffer to retrieve the resulting buffer data.

Definition at line 961 of file uacpi.c.

965{
966 return uacpi_eval_typed(
968 );
969}
@ UACPI_OBJECT_BUFFER_BIT
Definition: types.h:137
uacpi_status uacpi_eval_typed(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object_type_bits ret_mask, uacpi_object **out_obj)
Definition: uacpi.c:854

◆ uacpi_eval_integer()

uacpi_status uacpi_eval_integer ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_u64 out_value 
)

A shorthand for uacpi_eval_typed with UACPI_OBJECT_INTEGER_BIT.

Definition at line 892 of file uacpi.c.

896{
897 uacpi_object *int_obj;
899
902 );
904 return ret;
905
906 *out_value = int_obj->integer;
907 uacpi_object_unref(int_obj);
908
909 return UACPI_STATUS_OK;
910}
@ UACPI_STATUS_OK
Definition: status.h:11
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:135
uacpi_u64 integer
Definition: types.h:253

Referenced by uacpi_eval_adr(), uacpi_eval_simple_integer(), and uacpi_eval_sta().

◆ uacpi_eval_package()

uacpi_status uacpi_eval_package ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object **  ret 
)

A shorthand for uacpi_eval_typed with UACPI_OBJECT_PACKAGE_BIT.

Use uacpi_object_get_package to retrieve the resulting object array.

Definition at line 980 of file uacpi.c.

984{
985 return uacpi_eval_typed(
987 );
988}
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:138

◆ uacpi_eval_simple()

uacpi_status uacpi_eval_simple ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object **  ret 
)

Definition at line 787 of file uacpi.c.

790{
792}
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **out_obj)
Definition: uacpi.c:709

◆ uacpi_eval_simple_buffer()

uacpi_status uacpi_eval_simple_buffer ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object **  ret 
)

Definition at line 971 of file uacpi.c.

974{
975 return uacpi_eval_typed(
977 );
978}

Referenced by eval_resource_helper().

◆ uacpi_eval_simple_integer()

uacpi_status uacpi_eval_simple_integer ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_u64 out_value 
)

Definition at line 912 of file uacpi.c.

915{
916 return uacpi_eval_integer(parent, path, UACPI_NULL, out_value);
917}
uacpi_status uacpi_eval_integer(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_u64 *out_value)
Definition: uacpi.c:892

Referenced by pci_region_attach().

◆ uacpi_eval_simple_package()

uacpi_status uacpi_eval_simple_package ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object **  ret 
)

Definition at line 990 of file uacpi.c.

993{
994 return uacpi_eval_typed(
996 );
997}

◆ uacpi_eval_simple_string()

uacpi_status uacpi_eval_simple_string ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object **  ret 
)

Definition at line 952 of file uacpi.c.

955{
956 return uacpi_eval_typed(
958 );
959}
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:136

◆ uacpi_eval_simple_string_or_buffer()

uacpi_status uacpi_eval_simple_string_or_buffer ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object **  ret 
)

Definition at line 931 of file uacpi.c.

◆ uacpi_eval_simple_typed()

uacpi_status uacpi_eval_simple_typed ( uacpi_namespace_node parent,
const uacpi_char path,
uacpi_object_type_bits  ret_mask,
uacpi_object **  ret 
)

Definition at line 884 of file uacpi.c.

888{
889 return uacpi_eval_typed(parent, path, UACPI_NULL, ret_mask, ret);
890}

◆ uacpi_eval_string()

uacpi_status uacpi_eval_string ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object **  ret 
)

A shorthand for uacpi_eval_typed with UACPI_OBJECT_STRING_BIT.

Use uacpi_object_get_string to retrieve the resulting buffer data.

Definition at line 942 of file uacpi.c.

946{
947 return uacpi_eval_typed(
949 );
950}

◆ uacpi_eval_string_or_buffer()

uacpi_status uacpi_eval_string_or_buffer ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object **  ret 
)

A shorthand for uacpi_eval_typed with UACPI_OBJECT_BUFFER_BIT | UACPI_OBJECT_STRING_BIT

Use uacpi_object_get_string_or_buffer to retrieve the resulting buffer data.

Definition at line 919 of file uacpi.c.

923{
924 return uacpi_eval_typed(
925 parent, path, args,
927 ret
928 );
929}

◆ uacpi_eval_typed()

uacpi_status uacpi_eval_typed ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args,
uacpi_object_type_bits  ret_mask,
uacpi_object **  ret 
)

Same as uacpi_eval, but the return value type is validated against the 'ret_mask'. UACPI_STATUS_TYPE_MISMATCH is returned on error.

Definition at line 854 of file uacpi.c.

859{
863
864 if (uacpi_unlikely(out_obj == UACPI_NULL))
866
869 return ret;
870
871 if (obj != UACPI_NULL)
872 returned_type = obj->type;
873
874 if (ret_mask && (ret_mask & (1 << returned_type)) == 0) {
875 trace_invalid_return_type(parent, path, ret_mask, returned_type);
878 }
879
880 *out_obj = obj;
881 return UACPI_STATUS_OK;
882}
@ UACPI_STATUS_TYPE_MISMATCH
Definition: status.h:22
uacpi_object_type
Definition: types.h:110
static void trace_invalid_return_type(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object_type_bits expected_mask, uacpi_object_type actual_type)
Definition: uacpi.c:822

Referenced by get_slp_type_for_state(), uacpi_eval_buffer(), uacpi_eval_cid(), uacpi_eval_cls(), uacpi_eval_dstate_method_template(), uacpi_eval_hid(), uacpi_eval_integer(), uacpi_eval_package(), uacpi_eval_simple_buffer(), uacpi_eval_simple_package(), uacpi_eval_simple_string(), uacpi_eval_simple_string_or_buffer(), uacpi_eval_simple_typed(), uacpi_eval_string(), uacpi_eval_string_or_buffer(), uacpi_eval_uid(), and uacpi_get_pci_routing_table().

◆ uacpi_execute()

uacpi_status uacpi_execute ( uacpi_namespace_node parent,
const uacpi_char path,
const uacpi_object_array args 
)

Same as uacpi_eval() but without a return value.

Definition at line 794 of file uacpi.c.

798{
800}

◆ uacpi_execute_simple()

uacpi_status uacpi_execute_simple ( uacpi_namespace_node parent,
const uacpi_char path 
)

Definition at line 802 of file uacpi.c.

805{
807}

◆ uacpi_get_aml_bitness()

uacpi_status uacpi_get_aml_bitness ( uacpi_u8 out_bitness)

Get the bitness of the currently loaded AML code according to the DSDT.

Returns either 32 or 64.

Definition at line 999 of file uacpi.c.

1000{
1002
1003 *out_bitness = g_uacpi_rt_ctx.is_rev1 ? 32 : 64;
1004 return UACPI_STATUS_OK;
1005}
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
@ UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED
Definition: types.h:72
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17

Referenced by uacpi_object_create_integer_safe().

◆ uacpi_get_current_init_level()

uacpi_init_level uacpi_get_current_init_level ( void  )

Definition at line 310 of file uacpi.c.

311{
312 return g_uacpi_rt_ctx.init_level;
313}

Referenced by uacpi_initialize_opregion_node().

◆ uacpi_initialize()

uacpi_status uacpi_initialize ( uacpi_u64  flags)

Initializes the uACPI subsystem, iterates & records all relevant RSDT/XSDT tables. Enters ACPI mode.

'flags' is any combination of UACPI_FLAG_* above

Definition at line 315 of file uacpi.c.

316{
318
320
321#ifdef UACPI_KERNEL_INITIALIZATION
322 ret = uacpi_kernel_initialize(UACPI_INIT_LEVEL_EARLY);
324 return ret;
325#endif
326
328 g_uacpi_rt_ctx.last_sleep_typ_a = UACPI_SLEEP_TYP_INVALID;
329 g_uacpi_rt_ctx.last_sleep_typ_b = UACPI_SLEEP_TYP_INVALID;
332 g_uacpi_rt_ctx.flags = flags;
333
335
336 if (g_uacpi_rt_ctx.loop_timeout_seconds == 0)
338 if (g_uacpi_rt_ctx.max_call_stack_depth == 0)
340
343 goto out_fatal_error;
344
347 goto out_fatal_error;
348
351 goto out_fatal_error;
352
355 goto out_fatal_error;
356
359 goto out_fatal_error;
360
363 goto out_fatal_error;
364
367 goto out_fatal_error;
368
370
373
374 return UACPI_STATUS_OK;
375
376out_fatal_error:
378 return ret;
379}
#define UACPI_ENSURE_INIT_LEVEL_IS(lvl)
Definition: context.h:141
static uacpi_bool uacpi_check_flag(uacpi_u64 flag)
Definition: context.h:90
#define UACPI_SLEEP_TYP_INVALID
Definition: context.h:34
uacpi_status uacpi_initialize_namespace(void)
Definition: namespace.c:156
uacpi_status uacpi_initialize_registers(void)
Definition: registers.c:456
#define UACPI_DEFAULT_MAX_CALL_STACK_DEPTH
Definition: config.h:48
#define UACPI_DEFAULT_LOOP_TIMEOUT_SECONDS
Definition: config.h:39
@ UACPI_INIT_LEVEL_EARLY
Definition: types.h:66
uacpi_status uacpi_initialize_events_early(void)
Definition: event.c:2173
GLbitfield flags
Definition: glext.h:7161
uacpi_status uacpi_initialize_notify(void)
Definition: notify.c:14
uacpi_status uacpi_initialize_opregion(void)
Definition: opregion.c:15
void uacpi_install_default_address_space_handlers(void)
uacpi_status uacpi_initialize_interfaces(void)
Definition: osi.c:90
uacpi_status uacpi_initialize_tables(void)
Definition: tables.c:279
void uacpi_state_reset(void)
Definition: uacpi.c:133
void uacpi_logger_initialize(void)
Definition: uacpi.c:36
void uacpi_context_set_max_call_stack_depth(uacpi_u32 depth)
Definition: uacpi.c:180
static void enter_acpi_mode_initial(void)
Definition: uacpi.c:302
void uacpi_context_set_loop_timeout(uacpi_u32 seconds)
Definition: uacpi.c:172
#define UACPI_FLAG_NO_ACPI_MODE
Definition: uacpi.h:93

Referenced by ACPIInitUACPI().

◆ uacpi_is_platform_reduced_hardware()

uacpi_status uacpi_is_platform_reduced_hardware ( uacpi_bool out_value)

Returns UACPI_TRUE via 'out_value' if the current platform is reduced ACPI hardware, UACPI_FALSE otherwise.

This getter becomes available along with the table subsystem, use uacpi_table_subsystem_available() to check.

Definition at line 19 of file uacpi.c.

20{
23
24 *out_value = uacpi_is_hardware_reduced();
25 return UACPI_STATUS_OK;
26}
static uacpi_bool uacpi_is_hardware_reduced(void)
Definition: context.h:100
@ UACPI_STATUS_INIT_LEVEL_MISMATCH
Definition: status.h:23
uacpi_bool uacpi_table_subsystem_available(void)

◆ uacpi_namespace_initialize()

uacpi_status uacpi_namespace_initialize ( void  )

Initializes all the necessary objects in the namespaces by calling _STA/_INI etc.

Definition at line 620 of file uacpi.c.

621{
622 struct ns_init_context ctx = { 0 };
624 uacpi_u64 begin_ts, end_ts;
628
630
631#ifdef UACPI_KERNEL_INITIALIZATION
632 ret = uacpi_kernel_initialize(UACPI_INIT_LEVEL_NAMESPACE_LOADED);
634 goto out;
635#endif
636
637 /*
638 * Initialization order here is identical to ACPICA because ACPI
639 * specification doesn't really have any detailed steps that explain
640 * how to do it.
641 */
642
644
646
647 // Step 1 - Execute \_INI
648 ini_eval(&ctx, root);
649
650 // Step 2 - Execute \_SB._INI
651 ini_eval(
653 );
654
655 /*
656 * Step 3 - Run _REG methods for all globally installed
657 * address space handlers.
658 */
660 if (handlers) {
661 handler = handlers->head;
662
663 while (handler) {
666
667 handler = handler->next;
668 }
669 }
670
671 // Step 4 - Run all other _STA and _INI methods
675 );
676
678
679 if (uacpi_likely(!g_uacpi_rt_ctx.bad_timesource)) {
681 "namespace initialization done in %"UACPI_PRIu64"ms: "
682 "%zu devices, %zu thermal zones",
683 UACPI_FMT64(elapsed_ms(begin_ts, end_ts)),
684 ctx.devices, ctx.thermal_zones
685 );
686 } else {
688 "namespace initialization done: %zu devices, %zu thermal zones",
689 ctx.devices, ctx.thermal_zones
690 );
691 }
692
694 "_STA calls: %zu (%zu errors), _INI calls: %zu (%zu errors)",
695 ctx.sta_executed, ctx.sta_errors, ctx.ini_executed,
696 ctx.ini_errors
697 );
698
700#ifdef UACPI_KERNEL_INITIALIZATION
701 ret = uacpi_kernel_initialize(UACPI_INIT_LEVEL_NAMESPACE_INITIALIZED);
702out:
705#endif
706 return ret;
707}
struct _root root
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
#define uacpi_trace(...)
Definition: log.h:33
#define uacpi_info(...)
Definition: log.h:34
uacpi_namespace_node * uacpi_namespace_get_predefined(uacpi_predefined_namespace)
Definition: namespace.c:269
#define UACPI_MAX_DEPTH_ANY
Definition: namespace.h:102
@ UACPI_PREDEFINED_NAMESPACE_SB
Definition: namespace.h:20
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:264
uacpi_status uacpi_namespace_for_each_child(uacpi_namespace_node *parent, uacpi_iteration_callback descending_callback, uacpi_iteration_callback ascending_callback, uacpi_object_type_bits type_mask, uacpi_u32 max_depth, void *user)
Definition: namespace.c:948
#define uacpi_likely(expr)
Definition: compiler.h:89
uint64_t uacpi_u64
Definition: types.h:22
#define UACPI_FMT64(val)
Definition: types.h:62
#define UACPI_PRIu64
Definition: types.h:59
@ UACPI_OBJECT_ANY_BIT
Definition: types.h:152
@ UACPI_INIT_LEVEL_NAMESPACE_INITIALIZED
Definition: types.h:84
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:78
static xmlCharEncodingHandlerPtr * handlers
Definition: encoding.c:1380
uacpi_address_space_handlers * uacpi_node_get_address_space_handlers(uacpi_namespace_node *node)
Definition: opregion.c:170
uacpi_bool uacpi_address_space_handler_is_default(uacpi_address_space_handler *handler)
Definition: opregion.c:413
uacpi_u64 uacpi_kernel_get_nanoseconds_since_boot(void)
Definition: uacpiosl.c:35
uacpi_status uacpi_reg_all_opregions(uacpi_namespace_node *device_node, enum uacpi_address_space space)
Definition: opregion.c:590
static void ini_eval(struct ns_init_context *ctx, uacpi_namespace_node *node)
Definition: uacpi.c:535
static uacpi_u64 elapsed_ms(uacpi_u64 begin_ns, uacpi_u64 end_ns)
Definition: uacpi.c:406
static uacpi_iteration_decision do_sta_ini(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: uacpi.c:566
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

◆ uacpi_namespace_load()

uacpi_status uacpi_namespace_load ( void  )

Parses & executes all of the DSDT/SSDT tables. Initializes the event subsystem.

Definition at line 437 of file uacpi.c.

438{
439 struct uacpi_table tbl;
441 uacpi_u64 begin_ts, end_ts;
442 struct table_load_stats st = { 0 };
443 uacpi_size cur_index;
444
446
447#ifdef UACPI_KERNEL_INITIALIZATION
448 ret = uacpi_kernel_initialize(UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED);
450 goto out_fatal_error;
451#endif
452
454
457 uacpi_error("unable to find DSDT: %s", uacpi_status_to_string(ret));
458 goto out_fatal_error;
459 }
460
464 st.failure_counter++;
465 }
466 st.load_counter++;
467 uacpi_table_unref(&tbl);
468
469 for (cur_index = 0;; cur_index = tbl.index + 1) {
470 ret = uacpi_table_match(cur_index, match_ssdt_or_psdt, &tbl);
471 if (ret != UACPI_STATUS_OK) {
473 goto out_fatal_error;
474
475 break;
476 }
477
481 st.failure_counter++;
482 }
483 st.load_counter++;
484 uacpi_table_unref(&tbl);
485 }
486
488 g_uacpi_rt_ctx.bad_timesource = warn_on_bad_timesource(begin_ts, end_ts);
489
490 if (uacpi_unlikely(st.failure_counter != 0 || g_uacpi_rt_ctx.bad_timesource)) {
492 "loaded %u AML blob%s (%u error%s)",
493 st.load_counter, st.load_counter > 1 ? "s" : "", st.failure_counter,
494 st.failure_counter == 1 ? "" : "s"
495 );
496 } else {
497 uacpi_u64 ops = g_uacpi_rt_ctx.opcodes_executed;
498 uacpi_u64 ops_per_sec = ops * UACPI_NANOSECONDS_PER_SEC;
499
500 ops_per_sec /= end_ts - begin_ts;
501
503 "successfully loaded %u AML blob%s, %"UACPI_PRIu64" ops in "
504 "%"UACPI_PRIu64"ms (avg %"UACPI_PRIu64"/s)",
505 st.load_counter, st.load_counter > 1 ? "s" : "",
506 UACPI_FMT64(ops), UACPI_FMT64(elapsed_ms(begin_ts, end_ts)),
507 UACPI_FMT64(ops_per_sec)
508 );
509 }
510
513 uacpi_error("event initialization failed: %s",
515 goto out_fatal_error;
516 }
517
519 return UACPI_STATUS_OK;
520
521out_fatal_error:
523 return ret;
524}
#define ACPI_DSDT_SIGNATURE
Definition: acpi.h:23
#define uacpi_error(...)
Definition: log.h:36
@ UACPI_LOG_ERROR
Definition: log.h:35
@ UACPI_LOG_WARN
Definition: log.h:29
size_t uacpi_size
Definition: types.h:37
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
uacpi_status uacpi_initialize_events(void)
Definition: event.c:2195
uacpi_status uacpi_table_load_with_cause(uacpi_size idx, enum uacpi_table_load_cause cause)
Definition: tables.c:1280
uacpi_status uacpi_table_match(uacpi_size base_idx, uacpi_table_match_callback, uacpi_table *out_table)
Definition: tables.c:1081
#define UACPI_NANOSECONDS_PER_SEC
Definition: utilities.h:45
@ UACPI_TABLE_LOAD_CAUSE_INIT
Definition: interpreter.h:12
uacpi_u32 failure_counter
Definition: uacpi.c:383
uacpi_u32 load_counter
Definition: uacpi.c:382
uacpi_status uacpi_table_unref(uacpi_table *)
Definition: tables.c:1357
uacpi_status uacpi_table_find_by_signature(const uacpi_char *signature, uacpi_table *out_table)
Definition: tables.c:1153
static uacpi_bool match_ssdt_or_psdt(struct uacpi_installed_table *tbl)
Definition: uacpi.c:397
static void trace_table_load_failure(struct acpi_sdt_hdr *tbl, uacpi_log_level lvl, uacpi_status ret)
Definition: uacpi.c:386
static uacpi_bool warn_on_bad_timesource(uacpi_u64 begin_ts, uacpi_u64 end_ts)
Definition: uacpi.c:411
const uacpi_char * uacpi_status_to_string(uacpi_status st)
Definition: uacpi.c:60

◆ uacpi_release_global_lock()

uacpi_status uacpi_release_global_lock ( uacpi_u32  seq)

Definition at line 179 of file mutex.c.

180{
182
183 if (uacpi_unlikely(!g_uacpi_rt_ctx.global_lock_acquired ||
184 seq != g_uacpi_rt_ctx.global_lock_seq_num))
186
187 g_uacpi_rt_ctx.global_lock_acquired = UACPI_FALSE;
189 uacpi_release_native_mutex(g_uacpi_rt_ctx.global_lock_mutex->handle);
190
191 return UACPI_STATUS_OK;
192}
static uacpi_status uacpi_release_native_mutex(uacpi_handle mtx)
Definition: mutex.h:25
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17
#define UACPI_FALSE
Definition: types.h:30
static void uacpi_release_global_lock_to_firmware(void)
Definition: mutex.c:106

◆ 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}
void uacpi_logger_initialize(void)
Definition: uacpi.c:36
#define uacpi_warn(...)
Definition: log.h:35
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106
#define UACPI_MIN(x, y)
Definition: stdlib.h:102
uacpi_uintptr uacpi_virt_addr
Definition: types.h:36
#define UACPI_TRUE
Definition: types.h:29
void uacpi_deinitialize_tables(void)
Definition: tables.c:351
static uacpi_status initialize_from_rsdp(void)
Definition: tables.c:171
struct nls_table * tables
Definition: nls_base.c:22
#define UACPI_PTR_TO_VIRT_ADDR(ptr)
Definition: utilities.h:20
#define UACPI_VIRT_ADDR_TO_PTR(vaddr)
Definition: utilities.h:21
wchar_t const *const size_t const buffer_size
Definition: stat.cpp:95

◆ uacpi_state_reset()

void uacpi_state_reset ( void  )

Reset the global uACPI state by freeing all internally allocated data structures & resetting any global variables. After this call, uACPI must be re-initialized from scratch to be used again.

This is called by uACPI automatically if a fatal error occurs during a call to uacpi_initialize/uacpi_namespace_load etc. in order to prevent accidental use of partially uninitialized subsystems.

Definition at line 133 of file uacpi.c.

134{
135#ifndef UACPI_BAREBONES_MODE
141#endif
142
144
145#ifndef UACPI_BAREBONES_MODE
146
147#ifndef UACPI_REDUCED_HARDWARE
148 if (g_uacpi_rt_ctx.was_in_legacy_mode)
150#endif
151
153
154#ifndef UACPI_REDUCED_HARDWARE
155 if (g_uacpi_rt_ctx.global_lock_event)
156 uacpi_kernel_free_event(g_uacpi_rt_ctx.global_lock_event);
157 if (g_uacpi_rt_ctx.global_lock_spinlock)
158 uacpi_kernel_free_spinlock(g_uacpi_rt_ctx.global_lock_spinlock);
159#endif
160
161#endif // !UACPI_BAREBONES_MODE
162
164
165#if defined(UACPI_KERNEL_INITIALIZATION) && !defined(UACPI_BAREBONES_MODE)
166 uacpi_kernel_deinitialize();
167#endif
168}
void uacpi_deinitialize_namespace(void)
Definition: namespace.c:205
void uacpi_deinitialize_registers(void)
Definition: registers.c:465
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
void uacpi_deinitialize_events(void)
Definition: event.c:2246
void uacpi_deinitialize_notify(void)
Definition: notify.c:23
void uacpi_deinitialize_opregion(void)
Definition: opregion.c:20
void uacpi_deinitialize_interfaces(void)
Definition: osi.c:106
void uacpi_deinitialize_tables(void)
Definition: tables.c:351
void uacpi_kernel_free_event(uacpi_handle)
Definition: uacpiosl.c:60
void uacpi_kernel_free_spinlock(uacpi_handle)
Definition: uacpiosl.c:92
uacpi_status uacpi_leave_acpi_mode(void)
Definition: uacpi.c:297

Referenced by uacpi_initialize(), uacpi_namespace_initialize(), and uacpi_namespace_load().

◆ uacpi_table_subsystem_available()

uacpi_bool uacpi_table_subsystem_available ( void  )

Returns UACPI_TRUE if the table subsystem is available for use by the kernel. This happens after a successful call to either uacpi_initialize(...) or uacpi_setup_early_table_access(...).

Referenced by uacpi_is_platform_reduced_hardware().

Variable Documentation

◆ out_seq

uacpi_u32* out_seq

Definition at line 271 of file uacpi.h.

Referenced by uacpi_acquire_global_lock().