From 2bd8cdc16ba6292d6d13ddf871a101e86b2fd43f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 24 Oct 2013 14:22:39 +0200 Subject: [PATCH] acpi: switch acpi_object from a struct to a union * this way the size of acpi_object_type matches the size of ACPI_OBJECT for 32-bit and 64-bit builds. * adjust users of the type acpi_object_type. --- headers/os/drivers/ACPI.h | 65 ++++++++++--------- .../bus_managers/acpi/EmbeddedController.cpp | 14 ++-- .../bus_managers/acpi/EmbeddedController.h | 2 +- .../power/acpi_battery/acpi_battery.cpp | 46 ++++++------- src/system/kernel/arch/x86/ioapic.cpp | 2 +- .../kernel/arch/x86/irq_routing_table.cpp | 2 +- 6 files changed, 69 insertions(+), 62 deletions(-) diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h index d601af7501..7c2147d6e0 100644 --- a/headers/os/drivers/ACPI.h +++ b/headers/os/drivers/ACPI.h @@ -11,7 +11,7 @@ typedef struct acpi_module_info acpi_module_info; -typedef struct acpi_object_type acpi_object_type; +typedef union acpi_object_type acpi_object_type; #define B_ACPI_MODULE_NAME "bus_managers/acpi/v1" @@ -83,36 +83,43 @@ enum { /* ACPI control method arg type */ -struct acpi_object_type { +union acpi_object_type { uint32 object_type; - union { + struct { + uint32 object_type; uint64 integer; - struct { - uint32 len; - char *string; /* You have to allocate string space yourself */ - } string; - struct { - size_t length; - void *buffer; - } buffer; - struct { - uint32 count; - acpi_object_type *objects; - } package; - struct { - uint32 actual_type; - acpi_handle handle; - } reference; - struct { - uint32 cpu_id; - int pblk_address; - size_t pblk_length; - } processor; - struct { - uint32 min_power_state; - uint32 resource_order; - } power_resource; - } data; + } integer; + struct { + uint32 object_type; + uint32 len; + char *string; /* You have to allocate string space yourself */ + } string; + struct { + uint32 object_type; + uint32 length; + void *buffer; + } buffer; + struct { + uint32 object_type; + uint32 count; + acpi_object_type *objects; + } package; + struct { + uint32 object_type; + uint32 actual_type; + acpi_handle handle; + } reference; + struct { + uint32 object_type; + uint32 cpu_id; + acpi_io_address pblk_address; + uint32 pblk_length; + } processor; + struct { + uint32 object_type; + uint32 min_power_state; + uint32 resource_order; + } power_resource; }; diff --git a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp index 40dc31c017..8e1ea4afc1 100644 --- a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp @@ -81,7 +81,7 @@ acpi_GetInteger(acpi_device_module_info* acpi, acpi_device& acpiCookie, status_t status = acpi->evaluate_method(acpiCookie, path, NULL, &buf); if (status == B_OK) { if (object.object_type == ACPI_TYPE_INTEGER) - *number = object.data.integer; + *number = object.integer.integer; else status = B_BAD_VALUE; } @@ -99,7 +99,7 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope, switch (obj->object_type) { case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_ANY: - return obj->data.reference.handle; + return obj->reference.handle; case ACPI_TYPE_STRING: { @@ -107,7 +107,7 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope, // scope can be NULL. // TODO: This may not always be the case. acpi_handle handle; - if (acpi->get_handle(scope, obj->data.string.string, &handle) + if (acpi->get_handle(scope, obj->string.string, &handle) == B_OK) return handle; } @@ -120,10 +120,10 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope, status_t acpi_PkgInt(acpi_object_type* res, int idx, int* dst) { - acpi_object_type* obj = &res->data.package.objects[idx]; + acpi_object_type* obj = &res->package.objects[idx]; if (obj == NULL || obj->object_type != ACPI_TYPE_INTEGER) return B_BAD_VALUE; - *dst = obj->data.integer; + *dst = obj->integer.integer; return B_OK; } @@ -336,13 +336,13 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) switch (obj->object_type) { case ACPI_TYPE_INTEGER: sc->ec_gpehandle = NULL; - sc->ec_gpebit = obj->data.integer; + sc->ec_gpebit = obj->integer.integer; break; case ACPI_TYPE_PACKAGE: if (!ACPI_PKG_VALID(obj, 2)) goto error; sc->ec_gpehandle = acpi_GetReference(sc->ec_acpi_module, NULL, - &obj->data.package.objects[0]); + &obj->package.objects[0]); if (sc->ec_gpehandle == NULL || acpi_PkgInt32(obj, 1, (uint32*)&sc->ec_gpebit) != B_OK) goto error; diff --git a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.h b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.h index c9ad95d58e..2630bbf52a 100644 --- a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.h +++ b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.h @@ -128,7 +128,7 @@ typedef uint8 EC_EVENT; #define ACPI_PKG_VALID(pkg, size) \ ((pkg) != NULL && (pkg)->object_type == ACPI_TYPE_PACKAGE && \ - (pkg)->data.package.count >= (size)) + (pkg)->package.count >= (size)) /* diff --git a/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp b/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp index 1aca862156..f24724bb8b 100644 --- a/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp +++ b/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp @@ -76,26 +76,26 @@ ReadBatteryStatus(battery_driver_cookie* cookie, object = (acpi_object_type*)buffer.pointer; if (object->object_type != ACPI_TYPE_PACKAGE - || object->data.package.count < 4) { + || object->package.count < 4) { status = B_ERROR; goto exit; } - pointer = object->data.package.objects; + pointer = object->package.objects; batteryStatus->state = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : BATTERY_CRITICAL_STATE; + ? pointer->integer.integer : BATTERY_CRITICAL_STATE; pointer++; batteryStatus->current_rate = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryStatus->capacity = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryStatus->voltage = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; /* If key values are all < 0, it is likely that the battery slot is empty * or the battery is damaged. Set BATTERY_CRITICAL_STATE @@ -131,68 +131,68 @@ ReadBatteryInfo(battery_driver_cookie* cookie, object = (acpi_object_type*)buffer.pointer; if (object->object_type != ACPI_TYPE_PACKAGE - || object->data.package.count < 13) { + || object->package.count < 13) { status = B_ERROR; goto exit; } - pointer = object->data.package.objects; + pointer = object->package.objects; batteryInfo->power_unit = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->design_capacity = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->last_full_charge = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->technology = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->design_voltage = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->design_capacity_warning = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->design_capacity_low = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->capacity_granularity_1 = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; batteryInfo->capacity_granularity_2 = (pointer->object_type == ACPI_TYPE_INTEGER) - ? pointer->data.integer : -1; + ? pointer->integer.integer : -1; pointer++; strlcpy(batteryInfo->model_number, (pointer->object_type == ACPI_TYPE_STRING) - ? pointer->data.string.string : "", sizeof(batteryInfo->model_number)); + ? pointer->string.string : "", sizeof(batteryInfo->model_number)); pointer++; strlcpy(batteryInfo->serial_number, (pointer->object_type == ACPI_TYPE_STRING) - ? pointer->data.string.string : "", sizeof(batteryInfo->serial_number)); + ? pointer->string.string : "", sizeof(batteryInfo->serial_number)); pointer++; strlcpy(batteryInfo->type, (pointer->object_type == ACPI_TYPE_STRING) - ? pointer->data.string.string : "", sizeof(batteryInfo->type)); + ? pointer->string.string : "", sizeof(batteryInfo->type)); pointer++; strlcpy(batteryInfo->oem_info, (pointer->object_type == ACPI_TYPE_STRING) - ? pointer->data.string.string : "", sizeof(batteryInfo->oem_info)); + ? pointer->string.string : "", sizeof(batteryInfo->oem_info)); exit: free(buffer.pointer); @@ -207,7 +207,7 @@ EstimatedRuntime(battery_driver_cookie* cookie, acpi_battery_info* info) acpi_object_type argument; argument.object_type = ACPI_TYPE_INTEGER; - argument.data.integer = info->current_rate; + argument.integer.integer = info->current_rate; acpi_objects arguments; arguments.count = 1; @@ -231,7 +231,7 @@ EstimatedRuntime(battery_driver_cookie* cookie, acpi_battery_info* info) if (returnObject->object_type != ACPI_TYPE_INTEGER) return -1; - int result = returnObject->data.integer; + int result = returnObject->integer.integer; return result; } diff --git a/src/system/kernel/arch/x86/ioapic.cpp b/src/system/kernel/arch/x86/ioapic.cpp index 28d5ba871b..20bf4a48ed 100644 --- a/src/system/kernel/arch/x86/ioapic.cpp +++ b/src/system/kernel/arch/x86/ioapic.cpp @@ -612,7 +612,7 @@ acpi_set_interrupt_model(acpi_module_info* acpiModule, uint32 interruptModel) { acpi_object_type model; model.object_type = ACPI_TYPE_INTEGER; - model.data.integer = interruptModel; + model.integer.integer = interruptModel; acpi_objects parameter; parameter.count = 1; diff --git a/src/system/kernel/arch/x86/irq_routing_table.cpp b/src/system/kernel/arch/x86/irq_routing_table.cpp index c3637a36b6..68cfd1be99 100644 --- a/src/system/kernel/arch/x86/irq_routing_table.cpp +++ b/src/system/kernel/arch/x86/irq_routing_table.cpp @@ -346,7 +346,7 @@ evaluate_integer(acpi_module_info* acpi, acpi_handle handle, if (result.object_type != ACPI_TYPE_INTEGER) return B_BAD_TYPE; - value = result.data.integer; + value = result.integer.integer; return B_OK; }