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.
This commit is contained in:
+36
-29
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user