dswload.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 715 行 · 第 1/2 页

C
715
字号
/****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks *              $Revision: 62 $ * *****************************************************************************//* *  Copyright (C) 2000 - 2002, R. Byron Moore * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "acpi.h"#include "acparser.h"#include "amlcode.h"#include "acdispat.h"#include "acinterp.h"#include "acnamesp.h"#include "acevents.h"#define _COMPONENT          ACPI_DISPATCHER	 ACPI_MODULE_NAME    ("dswload")/******************************************************************************* * * FUNCTION:    Acpi_ds_init_callbacks * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Pass_number     - 1, 2, or 3 * * RETURN:      Status * * DESCRIPTION: Init walk state callbacks * ******************************************************************************/acpi_statusacpi_ds_init_callbacks (	acpi_walk_state         *walk_state,	u32                     pass_number){	switch (pass_number) {	case 1:		walk_state->parse_flags       = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE;		walk_state->descending_callback = acpi_ds_load1_begin_op;		walk_state->ascending_callback = acpi_ds_load1_end_op;		break;	case 2:		walk_state->parse_flags       = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE;		walk_state->descending_callback = acpi_ds_load2_begin_op;		walk_state->ascending_callback = acpi_ds_load2_end_op;		break;	case 3:		walk_state->parse_flags      |= ACPI_PARSE_EXECUTE  | ACPI_PARSE_DELETE_TREE;		walk_state->descending_callback = acpi_ds_exec_begin_op;		walk_state->ascending_callback = acpi_ds_exec_end_op;		break;	default:		return (AE_BAD_PARAMETER);	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ds_load1_begin_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been reached in the *                                walk;  Arguments have not been evaluated yet. * * RETURN:      Status * * DESCRIPTION: Descending callback used during the loading of ACPI tables. * ******************************************************************************/acpi_statusacpi_ds_load1_begin_op (	acpi_walk_state         *walk_state,	acpi_parse_object       **out_op){	acpi_parse_object       *op;	acpi_namespace_node     *node;	acpi_status             status;	acpi_object_type        object_type;	NATIVE_CHAR             *path;	ACPI_FUNCTION_NAME ("Ds_load1_begin_op");	op = walk_state->op;	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state));	if (op && (op->opcode == AML_INT_NAMEDFIELD_OP)) {		ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state));	}	/* We are only interested in opcodes that have an associated name */	if (walk_state->op) {	   if (!(walk_state->op_info->flags & AML_NAMED)) {			*out_op = op;			return (AE_OK);		}		/* Check if this object has already been installed in the namespace */		if (op->node) {			*out_op = op;			return (AE_OK);		}	}	path = acpi_ps_get_next_namestring (&walk_state->parser_state);	/* Map the raw opcode into an internal object type */	object_type = walk_state->op_info->object_type;	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,		"State=%p Op=%p Type=%x\n", walk_state, op, object_type));	/*	 * Enter the named type into the internal namespace.  We enter the name	 * as we go downward in the parse tree.  Any necessary subobjects that involve	 * arguments to the opcode must be created as we go back up the parse tree later.	 */	status = acpi_ns_lookup (walk_state->scope_info, path, object_type,			  ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, walk_state, &(node));	if (ACPI_FAILURE (status)) {		return (status);	}	if (!op) {		/* Create a new op */		op = acpi_ps_alloc_op (walk_state->opcode);		if (!op) {			return (AE_NO_MEMORY);		}	}	/* Initialize */	((acpi_parse2_object *)op)->name = node->name.integer;	/*	 * Put the Node in the "op" object that the parser uses, so we	 * can get it again quickly when this scope is closed	 */	op->node = node;	acpi_ps_append_arg (acpi_ps_get_parent_scope (&walk_state->parser_state), op);	*out_op = op;	return (status);}/******************************************************************************* * * FUNCTION:    Acpi_ds_load1_end_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been completed in the *                                walk;  Arguments have now been evaluated. * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the loading of the namespace, *              both control methods and everything else. * ******************************************************************************/acpi_statusacpi_ds_load1_end_op (	acpi_walk_state         *walk_state){	acpi_parse_object       *op;	acpi_object_type        object_type;	ACPI_FUNCTION_NAME ("Ds_load1_end_op");	op = walk_state->op;	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state));	/* We are only interested in opcodes that have an associated name */	if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {		return (AE_OK);	}	/* Get the object type to determine if we should pop the scope */	object_type = walk_state->op_info->object_type;	if (walk_state->op_info->flags & AML_FIELD) {		if (walk_state->opcode == AML_FIELD_OP         ||			walk_state->opcode == AML_BANK_FIELD_OP    ||			walk_state->opcode == AML_INDEX_FIELD_OP) {			acpi_ds_init_field_objects (op, walk_state);		}		return (AE_OK);	}	if (op->opcode == AML_REGION_OP) {		/*Status = */acpi_ex_create_region (((acpi_parse2_object *) op)->data,				  ((acpi_parse2_object *) op)->length,						 (ACPI_ADR_SPACE_TYPE) ((op->value.arg)->value.integer), walk_state);	}	if (op->opcode == AML_NAME_OP) {		/* For Name opcode, get the object type from the argument */		if (op->value.arg) {			object_type = (acpi_ps_get_opcode_info ((op->value.arg)->opcode))->object_type;			op->node->type = (u8) object_type;		}	}	/* Pop the scope stack */	if (acpi_ns_opens_scope (object_type)) {		ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",			acpi_ut_get_type_name (object_type), op));		acpi_ds_scope_stack_pop (walk_state);	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ds_load2_begin_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been reached in the *                                walk;  Arguments have not been evaluated yet. * * RETURN:      Status * * DESCRIPTION: Descending callback used during the loading of ACPI tables. * ******************************************************************************/acpi_statusacpi_ds_load2_begin_op (	acpi_walk_state         *walk_state,	acpi_parse_object       **out_op){	acpi_parse_object       *op;	acpi_namespace_node     *node;	acpi_status             status;	acpi_object_type        object_type;	NATIVE_CHAR             *buffer_ptr;	void                    *original = NULL;	ACPI_FUNCTION_NAME ("Ds_load2_begin_op");	op = walk_state->op;	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state));	if (op) {		/* We only care about Namespace opcodes here */		if ((!(walk_state->op_info->flags & AML_NSOPCODE) && (walk_state->opcode != AML_INT_NAMEPATH_OP)) ||			(!(walk_state->op_info->flags & AML_NAMED))) {			return (AE_OK);		}		/*		 * Get the name we are going to enter or lookup in the namespace		 */		if (walk_state->opcode == AML_INT_NAMEPATH_OP) {			/* For Namepath op, get the path string */			buffer_ptr = op->value.string;			if (!buffer_ptr) {				/* No name, just exit */				return (AE_OK);			}		}		else {			/* Get name from the op */			buffer_ptr = (NATIVE_CHAR *) &((acpi_parse2_object *)op)->name;		}	}	else {		/* Get the namestring from the raw AML */		buffer_ptr = acpi_ps_get_next_namestring (&walk_state->parser_state);	}	/* Map the opcode into an internal object type */	object_type = walk_state->op_info->object_type;	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,		"State=%p Op=%p Type=%x\n", walk_state, op, object_type));	if (walk_state->opcode == AML_FIELD_OP         ||		walk_state->opcode == AML_BANK_FIELD_OP    ||		walk_state->opcode == AML_INDEX_FIELD_OP) {		node = NULL;		status = AE_OK;	}	else if (walk_state->opcode == AML_INT_NAMEPATH_OP) {		/*		 * The Name_path is an object reference to an existing object. Don't enter the		 * name into the namespace, but look it up for use later		 */		status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,				  ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node));	}	else {		if (op && op->node) {			original = op->node;			node = op->node;			if (acpi_ns_opens_scope (object_type)) {				status = acpi_ds_scope_stack_push (node, object_type, walk_state);				if (ACPI_FAILURE (status)) {					return (status);				}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?