Commit 9a1ae804 authored by Bob Moore's avatar Bob Moore Committed by Rafael J. Wysocki
Browse files

ACPICA: Fixes for acpiExec namespace init file

This is the result of squashing the following ACPICA commit ID's:
6803997e5b4f3635cea6610b51ff69e29d251de3
f31cdf8bfda22fe265c1a176d0e33d311c82a7f7

This change fixes several problems with the support for the
acpi_exec namespace init file (-fi option). Specifically, it
fixes AE_ALREADY_EXISTS errors, as well as various seg faults.

Link: https://github.com/acpica/acpica/commit/f31cdf8b
Link: https://github.com/acpica/acpica/commit/6803997e


Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarErik Kaneda <erik.kaneda@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 88055d8f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -256,6 +256,8 @@ u32
acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
			      char *full_path, u32 path_size, u8 no_trailing);

void acpi_ns_normalize_pathname(char *original_path);

char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
				      u8 no_trailing);

+7 −9
Original line number Diff line number Diff line
@@ -468,17 +468,15 @@ char *acpi_db_get_next_token(char *string,
		return (NULL);
	}

	/* Remove any spaces at the beginning */
	/* Remove any spaces at the beginning, ignore blank lines */

	if (*string == ' ') {
		while (*string && (*string == ' ')) {
	while (*string && isspace(*string)) {
		string++;
	}

	if (!(*string)) {
		return (NULL);
	}
	}

	switch (*string) {
	case '"':
@@ -570,7 +568,7 @@ char *acpi_db_get_next_token(char *string,

		/* Find end of token */

		while (*string && (*string != ' ')) {
		while (*string && !isspace(*string)) {
			string++;
		}
		break;
+33 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@
#include "acinterp.h"
#include "acnamesp.h"
#include "acdebug.h"
#ifdef ACPI_EXEC_APP
#include "aecommon.h"
#endif

#define _COMPONENT          ACPI_DISPATCHER
ACPI_MODULE_NAME("dswexec")
@@ -329,6 +332,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
	u32 op_class;
	union acpi_parse_object *next_op;
	union acpi_parse_object *first_arg;
#ifdef ACPI_EXEC_APP
	char *namepath;
	union acpi_operand_object *obj_desc;
#endif

	ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state);

@@ -537,6 +544,32 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)

			status =
			    acpi_ds_eval_buffer_field_operands(walk_state, op);
			if (ACPI_FAILURE(status)) {
				break;
			}
#ifdef ACPI_EXEC_APP
			/*
			 * acpi_exec support for namespace initialization file (initialize
			 * buffer_fields in this code.)
			 */
			namepath =
			    acpi_ns_get_external_pathname(op->common.node);
			status = ae_lookup_init_file_entry(namepath, &obj_desc);
			if (ACPI_SUCCESS(status)) {
				status =
				    acpi_ex_write_data_to_field(obj_desc,
								op->common.
								node->object,
								NULL);
				if ACPI_FAILURE
					(status) {
					ACPI_EXCEPTION((AE_INFO, status,
							"While writing to buffer field"));
					}
			}
			ACPI_FREE(namepath);
			status = AE_OK;
#endif
			break;

		case AML_TYPE_CREATE_OBJECT:
+0 −2
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@
#include "acdispat.h"
#include "acinterp.h"
#include "acnamesp.h"

#ifdef ACPI_ASL_COMPILER
#include "acdisasm.h"
#endif
@@ -399,7 +398,6 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
	union acpi_parse_object *op;
	acpi_object_type object_type;
	acpi_status status = AE_OK;

#ifdef ACPI_ASL_COMPILER
	u8 param_count;
#endif
+35 −0
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
#include "acinterp.h"
#include "acnamesp.h"
#include "acevents.h"
#ifdef ACPI_EXEC_APP
#include "aecommon.h"
#endif

#define _COMPONENT          ACPI_DISPATCHER
ACPI_MODULE_NAME("dswload2")
@@ -373,6 +376,10 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
	struct acpi_namespace_node *new_node;
	u32 i;
	u8 region_space;
#ifdef ACPI_EXEC_APP
	union acpi_operand_object *obj_desc;
	char *namepath;
#endif

	ACPI_FUNCTION_TRACE(ds_load2_end_op);

@@ -466,6 +473,11 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
		 * be evaluated later during the execution phase
		 */
		status = acpi_ds_create_buffer_field(op, walk_state);
		if (ACPI_FAILURE(status)) {
			ACPI_EXCEPTION((AE_INFO, status,
					"CreateBufferField failure"));
			goto cleanup;
			}
		break;

	case AML_TYPE_NAMED_FIELD:
@@ -604,6 +616,29 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
		case AML_NAME_OP:

			status = acpi_ds_create_node(walk_state, node, op);
			if (ACPI_FAILURE(status)) {
				goto cleanup;
			}
#ifdef ACPI_EXEC_APP
			/*
			 * acpi_exec support for namespace initialization file (initialize
			 * Name opcodes in this code.)
			 */
			namepath = acpi_ns_get_external_pathname(node);
			status = ae_lookup_init_file_entry(namepath, &obj_desc);
			if (ACPI_SUCCESS(status)) {

				/* Detach any existing object, attach new object */

				if (node->object) {
					acpi_ns_detach_object(node);
				}
				acpi_ns_attach_object(node, obj_desc,
						      obj_desc->common.type);
			}
			ACPI_FREE(namepath);
			status = AE_OK;
#endif
			break;

		case AML_METHOD_OP:
Loading