Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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=781



Signed-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
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -369,6 +369,19 @@ union acpi_predefined_info {
	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
 * Note: the actual data types must be contiguous, a loop in nspredef.c
+2 −0
Original line number Diff line number Diff line
@@ -340,6 +340,7 @@
 */
#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_WARN_PREDEFINED(plist)     acpi_ut_predefined_warning plist

#else

@@ -347,6 +348,7 @@

#define ACPI_ERROR_NAMESPACE(s, e)
#define ACPI_ERROR_METHOD(s, n, p, e)
#define ACPI_WARN_PREDEFINED(plist)
#endif		/* ACPI_NO_ERROR_MESSAGES */

/*
+6 −0
Original line number Diff line number Diff line
@@ -475,6 +475,12 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position);
acpi_status
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) */

#define ACPI_ANY_BASE        0
+205 −164

File changed.

Preview size limit exceeded, changes collapsed.

+51 −6
Original line number Diff line number Diff line
@@ -50,6 +50,11 @@
#define _COMPONENT          ACPI_UTILITIES
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
@@ -1065,8 +1070,7 @@ acpi_error(const char *module_name, u32 line_number, const char *format, ...)

	va_start(args, format);
	acpi_os_vprintf(format, args);
	acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name,
		       line_number);
	ACPI_COMMON_MSG_SUFFIX;
	va_end(args);
}

@@ -1080,8 +1084,7 @@ acpi_exception(const char *module_name,

	va_start(args, format);
	acpi_os_vprintf(format, args);
	acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name,
		       line_number);
	ACPI_COMMON_MSG_SUFFIX;
	va_end(args);
}

@@ -1094,8 +1097,7 @@ acpi_warning(const char *module_name, u32 line_number, const char *format, ...)

	va_start(args, format);
	acpi_os_vprintf(format, args);
	acpi_os_printf(" %8.8X %s-%u\n", ACPI_CA_VERSION, module_name,
		       line_number);
	ACPI_COMMON_MSG_SUFFIX;
	va_end(args);
}

@@ -1116,3 +1118,46 @@ ACPI_EXPORT_SYMBOL(acpi_error)
ACPI_EXPORT_SYMBOL(acpi_exception)
ACPI_EXPORT_SYMBOL(acpi_warning)
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);
}