diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h index 3c733f9117..98f6bbce8b 100644 --- a/headers/os/drivers/ACPI.h +++ b/headers/os/drivers/ACPI.h @@ -32,6 +32,10 @@ struct acpi_module_info { status_t (*get_next_entry) (uint32 object_type, const char *base, char *result, size_t len, void **counter); status_t (*get_device_hid) (const char *path, char *hid); uint32 (*get_object_type) (const char *path); + + /* Control method execution and data acquisition */ + + status_t (*evaluate_object) (const char *object, void *return_value, size_t buf_len); }; diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c b/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c index fa97205813..08b884e4fc 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c @@ -21,6 +21,8 @@ status_t get_next_entry (uint32 object_type, const char *base, char *result, siz status_t get_device_hid (const char *path, char *hid); uint32 get_object_type (const char *path); +status_t evaluate_object (const char *object, void *return_value, size_t buf_len); + struct acpi_module_info acpi_module = { { { @@ -177,3 +179,14 @@ uint32 get_object_type (const char *path) { AcpiGetType(handle,&type); return type; } + +status_t evaluate_object (const char *object, void *return_value, size_t buf_len) { + ACPI_BUFFER buffer; + ACPI_STATUS status; + + buffer.Pointer = return_value; + buffer.Length = buf_len; + + status = AcpiEvaluateObject(NULL,object,NULL,&buffer); + return (status == AE_OK) ? B_OK : B_ERROR; +}