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

Commit 7f0c826a authored by Lin Ming's avatar Lin Ming Committed by Len Brown
Browse files

ACPICA: Add support for module-level executable AML code

Add limited support for executable AML code that exists outside
of any control method. This type of code has been illegal since
ACPI 2.0.  The code must exist in an If/Else/While block. All AML
tables are supported, including tables that are dynamically loaded.
ACPICA BZ 762.

http://acpica.org/bugzilla/show_bug.cgi?id=762



Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 999e08f9
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -295,6 +295,7 @@ extern char const *acpi_gbl_exception_names_ctrl[];
ACPI_EXTERN struct acpi_namespace_node acpi_gbl_root_node_struct;
ACPI_EXTERN struct acpi_namespace_node acpi_gbl_root_node_struct;
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_root_node;
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_root_node;
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_fadt_gpe_device;
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_fadt_gpe_device;
ACPI_EXTERN union acpi_operand_object *acpi_gbl_module_code_list;


extern const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES];
extern const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES];
extern const struct acpi_predefined_names
extern const struct acpi_predefined_names
+2 −0
Original line number Original line Diff line number Diff line
@@ -196,6 +196,8 @@ acpi_ns_dump_objects(acpi_object_type type,
 */
 */
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);


void acpi_ns_exec_module_code_list(void);

/*
/*
 * nspredef - Support for predefined/reserved names
 * nspredef - Support for predefined/reserved names
 */
 */
+1 −0
Original line number Original line Diff line number Diff line
@@ -98,6 +98,7 @@
#define AOPOBJ_SETUP_COMPLETE       0x10
#define AOPOBJ_SETUP_COMPLETE       0x10
#define AOPOBJ_SINGLE_DATUM         0x20
#define AOPOBJ_SINGLE_DATUM         0x20
#define AOPOBJ_INVALID              0x40	/* Used if host OS won't allow an op_region address */
#define AOPOBJ_INVALID              0x40	/* Used if host OS won't allow an op_region address */
#define AOPOBJ_MODULE_LEVEL         0x80


/******************************************************************************
/******************************************************************************
 *
 *
+2 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,8 @@
#define ACPI_PARSE_DEFERRED_OP          0x0100
#define ACPI_PARSE_DEFERRED_OP          0x0100
#define ACPI_PARSE_DISASSEMBLE          0x0200
#define ACPI_PARSE_DISASSEMBLE          0x0200


#define ACPI_PARSE_MODULE_LEVEL         0x0400

/******************************************************************************
/******************************************************************************
 *
 *
 * Parser interfaces
 * Parser interfaces
+12 −6
Original line number Original line Diff line number Diff line
@@ -123,9 +123,12 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
		flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
		flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
		    ACPI_NS_ERROR_IF_FOUND;
		    ACPI_NS_ERROR_IF_FOUND;


		/* Mark node temporary if we are executing a method */
		/*

		 * Mark node temporary if we are executing a normal control
		if (walk_state->method_node) {
		 * method. (Don't mark if this is a module-level code method)
		 */
		if (walk_state->method_node &&
		    !(walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
			flags |= ACPI_NS_TEMPORARY;
			flags |= ACPI_NS_TEMPORARY;
		}
		}


@@ -456,9 +459,12 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
	flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
	flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
	    ACPI_NS_ERROR_IF_FOUND;
	    ACPI_NS_ERROR_IF_FOUND;


	/* Mark node(s) temporary if we are executing a method */
	/*

	 * Mark node(s) temporary if we are executing a normal control
	if (walk_state->method_node) {
	 * method. (Don't mark if this is a module-level code method)
	 */
	if (walk_state->method_node &&
	    !(walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
		flags |= ACPI_NS_TEMPORARY;
		flags |= ACPI_NS_TEMPORARY;
	}
	}


Loading