Commit ef42e53f authored by Bob Moore's avatar Bob Moore Committed by Rafael J. Wysocki

ACPICA: Interpreter: Add warning if 64-bit constant appears in 32-bit table.

Some ASL compilers allow 64-bit constants within a 32-bit table
(DSDT version == 1). When encountered, emit a warning that the
constant will be truncated to 32 bits. This is potentially a
serious problem in the ACPI table(s).
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 3e5621a7
...@@ -458,7 +458,7 @@ void acpi_ex_reacquire_interpreter(void); ...@@ -458,7 +458,7 @@ void acpi_ex_reacquire_interpreter(void);
void acpi_ex_relinquish_interpreter(void); void acpi_ex_relinquish_interpreter(void);
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc); u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc);
void acpi_ex_acquire_global_lock(u32 rule); void acpi_ex_acquire_global_lock(u32 rule);
......
...@@ -703,7 +703,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -703,7 +703,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
/* Truncate value if we are executing from a 32-bit ACPI table */ /* Truncate value if we are executing from a 32-bit ACPI table */
#ifndef ACPI_NO_METHOD_EXECUTION #ifndef ACPI_NO_METHOD_EXECUTION
acpi_ex_truncate_for32bit_table(obj_desc); (void)acpi_ex_truncate_for32bit_table(obj_desc);
#endif #endif
break; break;
...@@ -725,8 +725,18 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -725,8 +725,18 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
case AML_TYPE_LITERAL: case AML_TYPE_LITERAL:
obj_desc->integer.value = op->common.value.integer; obj_desc->integer.value = op->common.value.integer;
#ifndef ACPI_NO_METHOD_EXECUTION #ifndef ACPI_NO_METHOD_EXECUTION
acpi_ex_truncate_for32bit_table(obj_desc); if (acpi_ex_truncate_for32bit_table(obj_desc)) {
/* Warn if we found a 64-bit constant in a 32-bit table */
ACPI_WARNING((AE_INFO,
"Truncated 64-bit constant found in 32-bit table: %8.8X%8.8X => %8.8X",
ACPI_FORMAT_UINT64(op->common.
value.integer),
(u32)obj_desc->integer.value));
}
#endif #endif
break; break;
......
...@@ -149,7 +149,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -149,7 +149,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
/* Truncate the predicate to 32-bits if necessary */ /* Truncate the predicate to 32-bits if necessary */
acpi_ex_truncate_for32bit_table(local_obj_desc); (void)acpi_ex_truncate_for32bit_table(local_obj_desc);
/* /*
* Save the result of the predicate evaluation on * Save the result of the predicate evaluation on
...@@ -706,7 +706,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -706,7 +706,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
* ACPI 2.0 support for 64-bit integers: Truncate numeric * ACPI 2.0 support for 64-bit integers: Truncate numeric
* result value if we are executing from a 32-bit ACPI table * result value if we are executing from a 32-bit ACPI table
*/ */
acpi_ex_truncate_for32bit_table(walk_state->result_obj); (void)acpi_ex_truncate_for32bit_table(walk_state->result_obj);
/* /*
* Check if we just completed the evaluation of a * Check if we just completed the evaluation of a
......
...@@ -176,7 +176,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, ...@@ -176,7 +176,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
/* Save the Result */ /* Save the Result */
acpi_ex_truncate_for32bit_table(return_desc); (void)acpi_ex_truncate_for32bit_table(return_desc);
*result_desc = return_desc; *result_desc = return_desc;
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
......
...@@ -253,7 +253,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc, ...@@ -253,7 +253,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
/* Truncate value if we are executing from a 32-bit ACPI table */ /* Truncate value if we are executing from a 32-bit ACPI table */
acpi_ex_truncate_for32bit_table(dest_desc); (void)acpi_ex_truncate_for32bit_table(dest_desc);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
......
...@@ -202,35 +202,39 @@ void acpi_ex_relinquish_interpreter(void) ...@@ -202,35 +202,39 @@ void acpi_ex_relinquish_interpreter(void)
* *
* PARAMETERS: obj_desc - Object to be truncated * PARAMETERS: obj_desc - Object to be truncated
* *
* RETURN: none * RETURN: TRUE if a truncation was performed, FALSE otherwise.
* *
* DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
* 32-bit, as determined by the revision of the DSDT. * 32-bit, as determined by the revision of the DSDT.
* *
******************************************************************************/ ******************************************************************************/
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc) u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
{ {
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
/* /*
* Object must be a valid number and we must be executing * Object must be a valid number and we must be executing
* a control method. NS node could be there for AML_INT_NAMEPATH_OP. * a control method. Object could be NS node for AML_INT_NAMEPATH_OP.
*/ */
if ((!obj_desc) || if ((!obj_desc) ||
(ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) || (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) ||
(obj_desc->common.type != ACPI_TYPE_INTEGER)) { (obj_desc->common.type != ACPI_TYPE_INTEGER)) {
return; return (FALSE);
} }
if (acpi_gbl_integer_byte_width == 4) { if ((acpi_gbl_integer_byte_width == 4) &&
(obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) {
/* /*
* We are running a method that exists in a 32-bit ACPI table. * We are executing in a 32-bit ACPI table.
* Truncate the value to 32 bits by zeroing out the upper 32-bit field * Truncate the value to 32 bits by zeroing out the upper 32-bit field
*/ */
obj_desc->integer.value &= (u64) ACPI_UINT32_MAX; obj_desc->integer.value &= (u64)ACPI_UINT32_MAX;
return (TRUE);
} }
return (FALSE);
} }
/******************************************************************************* /*******************************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment