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

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

ACPICA: Move predefined repair code to new file, no functional change



New file is nsrepair.c. This is in preparation for additional
errror correcting code.

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 3ce804ed
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -28,7 +28,7 @@ acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o
acpi-y += nsaccess.o  nsload.o    nssearch.o  nsxfeval.o \
acpi-y += nsaccess.o  nsload.o    nssearch.o  nsxfeval.o \
	 nsalloc.o   nseval.o    nsnames.o   nsutils.o   nsxfname.o \
	 nsalloc.o   nseval.o    nsnames.o   nsutils.o   nsxfname.o \
	 nsdump.o    nsinit.o    nsobject.o  nswalk.o    nsxfobj.o  \
	 nsdump.o    nsinit.o    nsobject.o  nswalk.o    nsxfobj.o  \
	 nsparse.o   nspredef.o
	 nsparse.o   nspredef.o  nsrepair.o


acpi-$(ACPI_FUTURE_USAGE) += nsdumpdv.o
acpi-$(ACPI_FUTURE_USAGE) += nsdumpdv.o


+17 −0
Original line number Original line Diff line number Diff line
@@ -73,6 +73,14 @@
#define ACPI_NS_WALK_UNLOCK         0x01
#define ACPI_NS_WALK_UNLOCK         0x01
#define ACPI_NS_WALK_TEMP_NODES     0x02
#define ACPI_NS_WALK_TEMP_NODES     0x02


/* Object is not a package element */

#define ACPI_NOT_PACKAGE_ELEMENT    ACPI_UINT32_MAX

/* Always emit warning message, not dependent on node flags */

#define ACPI_WARN_ALWAYS            0

/*
/*
 * nsinit - Namespace initialization
 * nsinit - Namespace initialization
 */
 */
@@ -261,6 +269,15 @@ acpi_status
acpi_ns_get_attached_data(struct acpi_namespace_node *node,
acpi_ns_get_attached_data(struct acpi_namespace_node *node,
			  acpi_object_handler handler, void **data);
			  acpi_object_handler handler, void **data);


/*
 * nsrepair - return object repair for predefined methods/objects
 */
acpi_status
acpi_ns_repair_object(struct acpi_predefined_data *data,
		      u32 expected_btypes,
		      u32 package_index,
		      union acpi_operand_object **return_object_ptr);

/*
/*
 * nssearch - Namespace searching and entry
 * nssearch - Namespace searching and entry
 */
 */
+2 −118
Original line number Original line Diff line number Diff line
@@ -91,12 +91,6 @@ static acpi_status
acpi_ns_check_reference(struct acpi_predefined_data *data,
acpi_ns_check_reference(struct acpi_predefined_data *data,
			union acpi_operand_object *return_object);
			union acpi_operand_object *return_object);


static acpi_status
acpi_ns_repair_object(struct acpi_predefined_data *data,
		      u32 expected_btypes,
		      u32 package_index,
		      union acpi_operand_object **return_object_ptr);

static void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes);
static void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes);


/*
/*
@@ -111,14 +105,6 @@ static const char *acpi_rtype_names[] = {
	"/Reference",
	"/Reference",
};
};


/* Object is not a package element */

#define ACPI_NOT_PACKAGE_ELEMENT    ACPI_UINT32_MAX

/* Always emit warning message, not dependent on node flags */

#define ACPI_WARN_ALWAYS            0

/*******************************************************************************
/*******************************************************************************
 *
 *
 * FUNCTION:    acpi_ns_check_predefined_names
 * FUNCTION:    acpi_ns_check_predefined_names
@@ -580,8 +566,8 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
	case ACPI_PTYPE2_COUNT:
	case ACPI_PTYPE2_COUNT:


		/*
		/*
		 * These types all return a single package that consists of a variable
		 * These types all return a single package that consists of a
		 * number of sub-packages
		 * variable number of sub-packages.
		 */
		 */
		for (i = 0; i < count; i++) {
		for (i = 0; i < count; i++) {
			sub_package = *elements;
			sub_package = *elements;
@@ -977,108 +963,6 @@ acpi_ns_check_reference(struct acpi_predefined_data *data,
	return (AE_AML_OPERAND_TYPE);
	return (AE_AML_OPERAND_TYPE);
}
}


/*******************************************************************************
 *
 * FUNCTION:    acpi_ns_repair_object
 *
 * PARAMETERS:  Data            - Pointer to validation data structure
 *              expected_btypes - Object types expected
 *              package_index   - Index of object within parent package (if
 *                                applicable - ACPI_NOT_PACKAGE_ELEMENT
 *                                otherwise)
 *              return_object_ptr - Pointer to the object returned from the
 *                                evaluation of a method or object
 *
 * RETURN:      Status. AE_OK if repair was successful.
 *
 * DESCRIPTION: Attempt to repair/convert a return object of a type that was
 *              not expected.
 *
 ******************************************************************************/

static acpi_status
acpi_ns_repair_object(struct acpi_predefined_data *data,
		      u32 expected_btypes,
		      u32 package_index,
		      union acpi_operand_object **return_object_ptr)
{
	union acpi_operand_object *return_object = *return_object_ptr;
	union acpi_operand_object *new_object;
	acpi_size length;

	switch (return_object->common.type) {
	case ACPI_TYPE_BUFFER:

		/* Does the method/object legally return a string? */

		if (!(expected_btypes & ACPI_RTYPE_STRING)) {
			return (AE_AML_OPERAND_TYPE);
		}

		/*
		 * Have a Buffer, expected a String, convert. Use a to_string
		 * conversion, no transform performed on the buffer data. The best
		 * example of this is the _BIF method, where the string data from
		 * the battery is often (incorrectly) returned as buffer object(s).
		 */
		length = 0;
		while ((length < return_object->buffer.length) &&
		       (return_object->buffer.pointer[length])) {
			length++;
		}

		/* Allocate a new string object */

		new_object = acpi_ut_create_string_object(length);
		if (!new_object) {
			return (AE_NO_MEMORY);
		}

		/*
		 * Copy the raw buffer data with no transform. String is already NULL
		 * terminated at Length+1.
		 */
		ACPI_MEMCPY(new_object->string.pointer,
			    return_object->buffer.pointer, length);

		/*
		 * If the original object is a package element, we need to:
		 * 1. Set the reference count of the new object to match the
		 *    reference count of the old object.
		 * 2. Decrement the reference count of the original object.
		 */
		if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
			new_object->common.reference_count =
			    return_object->common.reference_count;

			if (return_object->common.reference_count > 1) {
				return_object->common.reference_count--;
			}

			ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
					      data->node_flags,
					      "Converted Buffer to expected String at index %u",
					      package_index));
		} else {
			ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
					      data->node_flags,
					      "Converted Buffer to expected String"));
		}

		/* Delete old object, install the new return object */

		acpi_ut_remove_reference(return_object);
		*return_object_ptr = new_object;
		data->flags |= ACPI_OBJECT_REPAIRED;
		return (AE_OK);

	default:
		break;
	}

	return (AE_AML_OPERAND_TYPE);
}

/*******************************************************************************
/*******************************************************************************
 *
 *
 * FUNCTION:    acpi_ns_get_expected_types
 * FUNCTION:    acpi_ns_get_expected_types
+151 −0
Original line number Original line Diff line number Diff line
/******************************************************************************
 *
 * Module Name: nsrepair - Repair for objects returned by predefined methods
 *
 *****************************************************************************/

/*
 * Copyright (C) 2000 - 2009, Intel Corp.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#include <acpi/acpi.h>
#include "accommon.h"
#include "acnamesp.h"
#include "acpredef.h"

#define _COMPONENT          ACPI_NAMESPACE
ACPI_MODULE_NAME("nsrepair")

/*******************************************************************************
 *
 * FUNCTION:    acpi_ns_repair_object
 *
 * PARAMETERS:  Data                - Pointer to validation data structure
 *              expected_btypes     - Object types expected
 *              package_index       - Index of object within parent package (if
 *                                    applicable - ACPI_NOT_PACKAGE_ELEMENT
 *                                    otherwise)
 *              return_object_ptr   - Pointer to the object returned from the
 *                                    evaluation of a method or object
 *
 * RETURN:      Status. AE_OK if repair was successful.
 *
 * DESCRIPTION: Attempt to repair/convert a return object of a type that was
 *              not expected.
 *
 ******************************************************************************/
acpi_status
acpi_ns_repair_object(struct acpi_predefined_data *data,
		      u32 expected_btypes,
		      u32 package_index,
		      union acpi_operand_object **return_object_ptr)
{
	union acpi_operand_object *return_object = *return_object_ptr;
	union acpi_operand_object *new_object;
	acpi_size length;

	switch (return_object->common.type) {
	case ACPI_TYPE_BUFFER:

		/* Does the method/object legally return a string? */

		if (!(expected_btypes & ACPI_RTYPE_STRING)) {
			return (AE_AML_OPERAND_TYPE);
		}

		/*
		 * Have a Buffer, expected a String, convert. Use a to_string
		 * conversion, no transform performed on the buffer data. The best
		 * example of this is the _BIF method, where the string data from
		 * the battery is often (incorrectly) returned as buffer object(s).
		 */
		length = 0;
		while ((length < return_object->buffer.length) &&
		       (return_object->buffer.pointer[length])) {
			length++;
		}

		/* Allocate a new string object */

		new_object = acpi_ut_create_string_object(length);
		if (!new_object) {
			return (AE_NO_MEMORY);
		}

		/*
		 * Copy the raw buffer data with no transform. String is already NULL
		 * terminated at Length+1.
		 */
		ACPI_MEMCPY(new_object->string.pointer,
			    return_object->buffer.pointer, length);

		/*
		 * If the original object is a package element, we need to:
		 * 1. Set the reference count of the new object to match the
		 *    reference count of the old object.
		 * 2. Decrement the reference count of the original object.
		 */
		if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
			new_object->common.reference_count =
			    return_object->common.reference_count;

			if (return_object->common.reference_count > 1) {
				return_object->common.reference_count--;
			}

			ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
					      data->node_flags,
					      "Converted Buffer to expected String at index %u",
					      package_index));
		} else {
			ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
					      data->node_flags,
					      "Converted Buffer to expected String"));
		}

		/* Delete old object, install the new return object */

		acpi_ut_remove_reference(return_object);
		*return_object_ptr = new_object;
		data->flags |= ACPI_OBJECT_REPAIRED;
		return (AE_OK);

	default:
		break;
	}

	return (AE_AML_OPERAND_TYPE);
}