Commit 0444e8f6 authored by Bob Moore's avatar Bob Moore Committed by Len Brown

ACPICA: Fix: Predefined object repair executed only once

This fixes a problem where the code that attempts to repair/convert
an object of incorrect type is only executed on the first time the
predefined method is called. The mechanism that disables warnings
on subsequent calls was interfering with the repair mechanism.
ACPICA BZ 781.

http://acpica.org/bugzilla/show_bug.cgi?id=781Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent cf02cd47
...@@ -369,6 +369,19 @@ union acpi_predefined_info { ...@@ -369,6 +369,19 @@ union acpi_predefined_info {
struct acpi_package_info3 ret_info3; struct acpi_package_info3 ret_info3;
}; };
/* Data block used during object validation */
struct acpi_predefined_data {
char *pathname;
const union acpi_predefined_info *predefined;
u32 flags;
u8 node_flags;
};
/* Defines for Flags field above */
#define ACPI_OBJECT_REPAIRED 1
/* /*
* Bitmapped return value types * Bitmapped return value types
* Note: the actual data types must be contiguous, a loop in nspredef.c * Note: the actual data types must be contiguous, a loop in nspredef.c
......
...@@ -340,6 +340,7 @@ ...@@ -340,6 +340,7 @@
*/ */
#define ACPI_ERROR_NAMESPACE(s, e) acpi_ns_report_error (AE_INFO, s, e); #define ACPI_ERROR_NAMESPACE(s, e) acpi_ns_report_error (AE_INFO, s, e);
#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ns_report_method_error (AE_INFO, s, n, p, e); #define ACPI_ERROR_METHOD(s, n, p, e) acpi_ns_report_method_error (AE_INFO, s, n, p, e);
#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist
#else #else
...@@ -347,6 +348,7 @@ ...@@ -347,6 +348,7 @@
#define ACPI_ERROR_NAMESPACE(s, e) #define ACPI_ERROR_NAMESPACE(s, e)
#define ACPI_ERROR_METHOD(s, n, p, e) #define ACPI_ERROR_METHOD(s, n, p, e)
#define ACPI_WARN_PREDEFINED(plist)
#endif /* ACPI_NO_ERROR_MESSAGES */ #endif /* ACPI_NO_ERROR_MESSAGES */
/* /*
......
...@@ -475,6 +475,12 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position); ...@@ -475,6 +475,12 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position);
acpi_status acpi_status
acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer); acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer);
void ACPI_INTERNAL_VAR_XFACE
acpi_ut_predefined_warning(const char *module_name,
u32 line_number,
char *pathname,
u8 node_flags, const char *format, ...);
/* Values for Base above (16=Hex, 10=Decimal) */ /* Values for Base above (16=Hex, 10=Decimal) */
#define ACPI_ANY_BASE 0 #define ACPI_ANY_BASE 0
......
This diff is collapsed.
...@@ -50,6 +50,11 @@ ...@@ -50,6 +50,11 @@
#define _COMPONENT ACPI_UTILITIES #define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME("utmisc") ACPI_MODULE_NAME("utmisc")
/*
* Common suffix for messages
*/
#define ACPI_COMMON_MSG_SUFFIX \
acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name, line_number)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_validate_exception * FUNCTION: acpi_ut_validate_exception
...@@ -1065,8 +1070,7 @@ acpi_error(const char *module_name, u32 line_number, const char *format, ...) ...@@ -1065,8 +1070,7 @@ acpi_error(const char *module_name, u32 line_number, const char *format, ...)
va_start(args, format); va_start(args, format);
acpi_os_vprintf(format, args); acpi_os_vprintf(format, args);
acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name, ACPI_COMMON_MSG_SUFFIX;
line_number);
va_end(args); va_end(args);
} }
...@@ -1080,8 +1084,7 @@ acpi_exception(const char *module_name, ...@@ -1080,8 +1084,7 @@ acpi_exception(const char *module_name,
va_start(args, format); va_start(args, format);
acpi_os_vprintf(format, args); acpi_os_vprintf(format, args);
acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name, ACPI_COMMON_MSG_SUFFIX;
line_number);
va_end(args); va_end(args);
} }
...@@ -1094,8 +1097,7 @@ acpi_warning(const char *module_name, u32 line_number, const char *format, ...) ...@@ -1094,8 +1097,7 @@ acpi_warning(const char *module_name, u32 line_number, const char *format, ...)
va_start(args, format); va_start(args, format);
acpi_os_vprintf(format, args); acpi_os_vprintf(format, args);
acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name, ACPI_COMMON_MSG_SUFFIX;
line_number);
va_end(args); va_end(args);
} }
...@@ -1116,3 +1118,46 @@ ACPI_EXPORT_SYMBOL(acpi_error) ...@@ -1116,3 +1118,46 @@ ACPI_EXPORT_SYMBOL(acpi_error)
ACPI_EXPORT_SYMBOL(acpi_exception) ACPI_EXPORT_SYMBOL(acpi_exception)
ACPI_EXPORT_SYMBOL(acpi_warning) ACPI_EXPORT_SYMBOL(acpi_warning)
ACPI_EXPORT_SYMBOL(acpi_info) ACPI_EXPORT_SYMBOL(acpi_info)
/*******************************************************************************
*
* FUNCTION: acpi_ut_predefined_warning
*
* PARAMETERS: module_name - Caller's module name (for error output)
* line_number - Caller's line number (for error output)
* Pathname - Full pathname to the node
* node_flags - From Namespace node for the method/object
* Format - Printf format string + additional args
*
* RETURN: None
*
* DESCRIPTION: Warnings for the predefined validation module. Messages are
* only emitted the first time a problem with a particular
* method/object is detected. This prevents a flood of error
* messages for methods that are repeatedly evaluated.
*
******************************************************************************/
void ACPI_INTERNAL_VAR_XFACE
acpi_ut_predefined_warning(const char *module_name,
u32 line_number,
char *pathname,
u8 node_flags, const char *format, ...)
{
va_list args;
/*
* Warning messages for this method/object will be disabled after the
* first time a validation fails or an object is successfully repaired.
*/
if (node_flags & ANOBJ_EVALUATED) {
return;
}
acpi_os_printf("ACPI Warning for %s: ", pathname);
va_start(args, format);
acpi_os_vprintf(format, args);
ACPI_COMMON_MSG_SUFFIX;
va_end(args);
}
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